Docs / Contributing / Adding a technology
Adding a technology
Create one folder. Change no code. That constraint is the whole design.
technologies/<id>/
manifest.json required — everything else is optional
setup.md → a section in docs/setup.md
ios.md android.md → platform subsections of that section
architecture.md → a section in docs/architecture.md
cursor-rule.mdc → .cursor/rules/<id>.mdc, and every other AI tool
claude-skill.md → .claude/skills/<id>/SKILL.md
env.md → .env.example
folders.json → project folders
package.fragment.json → package.json
dependencies.json → dependencies + install commands
detect.json → signals analyze uses to guess this technology
prompts/*.md → prompts/
checklists/*.md → checklists/
templates/** → mirrored into the project root
A missing file means the module contributes nothing to that builder. Nothing is required except the manifest.
The manifest
{
"id": "stripe",
"name": "Stripe",
"category": "payments",
"description": "Card payments and subscriptions.",
"requires": [],
"conflicts": [],
"dependencies": [],
"priority": 45,
"pricing": {
"model": "usage-based",
"notes": "No monthly fee. 2.9% + 30¢ per transaction. Checked 2026-08-07.",
"url": "https://stripe.com/pricing"
}
}→category must exist in config/categories.json. A category with no installed modules is skipped rather than shown empty.
→priority controls order within a category, lower first — it keeps the technology table and the wizard's options stable and intentional as the catalogue grows.
→requires are hard prerequisites, pulled in transitively. conflicts are mutual exclusions. dependencies are soft edges affecting order only.
Conventions inside a module
→claude-skill.md is plain content with no frontmatter — the builder synthesises it from the manifest and the Cursor rule's globs.
→env.md documents variables in a markdown table with Key, Required, Description and Example columns. Prose around the table is ignored.
→architecture.md is rendered verbatim, so a fenced mermaid block shows up exactly as written. There is no separate diagram mechanism to learn.
→detect.json is only needed when dependencies.json has no npm package that uniquely identifies the technology — a CI config, a non-JS framework.
→dependencies.json and package.fragment.json may be templated: they are parsed after rendering, so a module can vary by what else was selected.
→templates/ has three reserved subtrees: root/, github/ and hygiene/. Everything else mirrors to the project root at its own path.
→_name in a template path becomes .name on output — npm rewrites a packaged .gitignore, so sources store _gitignore.
The test suite finds your module on its own
tests/moduleContract.test.ts iterates the directory, so a malformed module fails CI without anyone writing a test for it. Run pnpm docs:tech-table if you added a new category.