Contributing to developer documentation
This is the contributor checklist for adding or updating Fliplet developer documentation. Lint errors in the build pipeline link back to this page, so what’s here is what CI is checking for.
The reference reading underneath this checklist is docs/CLAUDE.md — the canonical schema for frontmatter, the build pipeline, and the rules for what NOT to add. This page is the human-facing walkthrough.
Adding a new package doc
When you add a new fliplet-* package, follow this 10-step checklist:
-
Start from the template. Copy
_templates/doc-template.md(or_templates/js-api.mdfor a JavaScript API reference) todocs/API/fliplet-<package>.md. Filename must match the npm package name, prefixed withfliplet-. - Set the required frontmatter. Every doc needs:
title:matching the H1 with backticks stripped — the Jekyll layout printstitle:as literal text in the page header, so backticks would render as\Fliplet.X`instead of formatted code. Body H1 keeps the backticks for code formatting; frontmattertitle:does not. Example:title: Fliplet.Paymentsin frontmatter;#Fliplet.Payments` in body. Lint enforces this.description:1–2 sentences, ≤160 chars, standalonetype:one ofapi-reference/guide/how-to/concept/tutorial/reference/integrationtags:first tag is the canonical area (js-api,rest-api, etc.), then 1–5 specifics, lowercase dash-separatedv3_relevant: true(default; setfalseonly for clearly V1-only content)deprecated: false(default)
- Add
capabilities:— 6–12 lowercase keywords. Describe what this API does in user-facing terms (“stripe”, “barcode scan”, “send email”), including named third-party services where relevant. The V3 AI builder uses these to anchor user-described capabilities to your API without asearch_librariesround-trip. Examples:capabilities: [stripe, checkout, subscription, recurring billing, refund, webhook, customer portal, payment intent, ecommerce] capabilities: [barcode scan, qr code, ean, upc, code 128, code 39, camera scanner] - Add
category:— pick exactly one. Allowed values (seedocs/v3/capabilitiesfor what’s in each):data— persistence, query, real-time, encryption, offline storageidentity— auth, sessions, biometrics, profile, orgs, tokenscommunications— email / SMS / push, chat, websocketsmedia— upload, transform, audio, scanning, barcodenative— native-only APIs (Cordova bridge)commerce— payments, subscriptions, app store / play store metadataintegration— REST API, OAuth, webhooksautomation— AI, app actions runtime, hooks, schedulinganalytics— event tracking, custom metrics, page views (user behaviour)observability— logs, error capture, audit trails (app health — distinct fromanalytics)framework— runtime, registry, environment, widget, locale, dynamic loading (framework-level glue)navigation— screen navigation, URL routing, screen listingmeta— residual catch-all (app metadata, encoding helpers, error parsing, common functions). Keep small — ifmetaexceeds 6-8 entries, propose a split rather than letting it absorb new entries
Pick the dominant facet. A cross-cutting API like
Fliplet.Notifications(communications + native) pickscommunicationsbecause that’s how end-users describe what it does. - Set
exclude_from_v3_catalog: trueONLY if the package shouldn’t appear in the V3 builder’s anchored prompt. Cases where exclusion is correct:- The package is a UI primitive replaced by the V3 design system (
fliplet-ui-*,fliplet-table,fliplet-modal) - The package is deprecated, V1-only, or a redirect stub
- The doc is meta (overview pages, framework docs)
Most installable docs SHOULD be in the catalog. Add a one-line
notes:field too if the exclusion needs context. - The package is a UI primitive replaced by the V3 design system (
-
Write the intro paragraph between H1 and the first H2. The
llms.txtextractor and the agent-skills/SKILL.md generators both depend on prose between the title and the first subheading. Don’t jump straight from# Titleinto## Subheading. -
Document each public method with a runnable code example. Code examples must work — the V3 AI builder follows the docs literally. Verify signatures against
~/Sites/fliplet/api/public/assets/<package>/source before publishing. -
Verify the doc against source. For JS APIs, cross-check every method name, parameter list, and return shape against the package source. If a method exists in source but isn’t documented, decide whether it’s public-API-worthy (document) or internal (omit). Don’t document methods that don’t exist.
- Run
--strictlocally. Fromdocs/:node bin/build-agent-indexes.mjs --strictFix any errors before opening a PR. The lint will catch:
- Empty/non-lowercase/duplicate
capabilities[]tokens - Tokens >40 chars (likely a missing comma)
- Tokens that start with
[(bracket-mismatch in your YAML flow list) - Missing
category:or values outside the allowed enum - Standard frontmatter violations from
validateFrontmatter - Broken internal cross-links (from
validateCrossLinks— see “Internal links” below)
- Empty/non-lowercase/duplicate
- Open the PR. CF Pages will build a branch preview. Visit the preview URL to confirm:
- Your doc renders with the right layout
- It appears under the correct section on
/v3/capabilities(auto-generated index) - The
.well-known/llms-v3-libraries.jsondiff in the PR shows your new entry with the rightcategory,capabilities, andpreloadedflag
Updating an existing doc
The same rules apply with two adjustments:
- Don’t change
title:casually — the V3 AI builder embeds the namespace title in its system prompt; renaming silently shifts what the agent recognises. - Don’t reorder
capabilities[]— the field is hashed downstream; reordering = diff churn without semantic change.
Internal links
Write internal cross-links the natural way — directory-relative to the target’s
.md, exactly as Jekyll and the published site resolve them:
[joins](datasources/joins)— bare, relative to the current doc’s directory[routing](../routing)— parent-relative[guides](/Quickstart)— root-absolute- A full
https://developers.fliplet.com/API/...mdURL also works
--strict runs validateCrossLinks, which resolves each link the way CF Pages
serves clean URLs (.md/.html/extensionless all map to the .md source) and
fails the build if the target file doesn’t exist — that’s how link rot is
caught at review time instead of shipping a dead link. External links (openai,
github, help.fliplet.com, api.fliplet.com, …) and asset links (.png,
.txt, …) are left alone.
Two escape hatches for a deliberate exception (e.g. a forward-reference to a doc landing in a later PR):
- Inline: put
<!-- lint-ignore-link -->anywhere on the link’s line. - Whole-target: add it to
LINK_ALLOWLISTinbin/build-agent-indexes.mjs.
Note the asymmetry: AI skills (
src/v3/ai/skills/, Studio repo) auto-resolve relative sibling links at load time and silently drop unresolvable ones, whereas these docs fail the build on a broken link. They differ on purpose — the skills bundle is fully in memory at load, the docs validator runs statically over the file tree. Don’t assume one’s behaviour from the other.
Where does each thing live?
docs/API/fliplet-*.md— installable packages (catalog:preloaded: false)docs/API/core/*.md— ambient namespaces preloaded viafliplet-core(catalog:preloaded: true)docs/API/components/*.md— components framework (not in V3 catalog)docs/API/helpers/*.md— helpers framework (not in V3 catalog)docs/REST-API/*.md— REST endpoints (not in V3 catalog)docs/v3/*.md— V3-specific generated pages (e.g.capabilities.md— do not hand-edit)
What gets generated, what doesn’t
bin/build-agent-indexes.mjs runs on every CF Pages deploy and regenerates these on every push:
.well-known/llms.txt— per-page index.well-known/llms-full.txt— concatenated content.well-known/llms-v3-libraries.json— the V3 library catalog.well-known/agent-skills/*— cluster-shaped skill registryv3/capabilities.md— the auto-generated capabilities index
You can edit any of these manually but the next build will overwrite. The single source of truth is your doc’s frontmatter + body.
See also
docs/CLAUDE.md— full schema, build pipeline, “what NOT to add”docs/v3/capabilities— the live capabilities index (auto-generated fromcategory:frontmatter)