| title | ContentForest — Adding a Product |
|---|---|
| status | live |
| owner | Will Lamerton |
Step-by-step for onboarding a new Nano Collective product into ContentForest's release-content pipeline. Operator-facing version of planning.md §7.2.
Before opening a ContentForest PR, the new product needs to exist independently as a real NC project:
- Product repo lives under
Nano-Collectiveand follows the conventions inCreating a New Project(README, LICENSE, MIT, etc.). - At least one tagged GitHub Release is published. The release body is what ContentForest's agent reads to generate the announcement, so an empty release body produces a thin pack — give it real content.
- Product page on the docs site at
https://docs.nanocollective.org/<slug>/. The markdown source (<slug>/index.mdinNano-Collective/docs) needs to be referenced fromllms.txtsoscripts/fetch-refs.tspulls it into_refs/<slug>/docs/at generation time. The agent uses this as the elevator-pitch / brand-accuracy anchor (planning §6.4.1).
The product slug used everywhere — config, content directory, GH repo name, docs URL — should be the same string (lowercase, hyphenated). The four current products use slugs nanocoder, nanotune, get-md, json-up — note nanocoder is one word with no hyphen even though the local folder name nano-coder differs.
-
Edit
config/products.json— append an entry:{ "slug": "<new-product>", "repo": "Nano-Collective/<new-product>" }The
repofield is the fullowner/nameshape used byghandgit clone. Double-check the actual GH repo name (gh repo list Nano-Collectiveif unsure) — slugs and repo names usually match but historically have not (e.g.nanocodervs the localnano-coderfolder). -
(Optional) Override the channel set — if the new product wants a different channel mix than the global default in
config/channels.json, add achannelsfield to the product entry:{ "slug": "<new-product>", "repo": "Nano-Collective/<new-product>", "channels": ["linkedin", "github-discussion"] }Most products won't need this — the default (LinkedIn, X, GitHub Discussion, Reddit) is the right call for general-audience product releases.
-
Open a PR. Standard review, merge. The issue-template product dropdowns are auto-synced — the
sync-release-productsworkflow fires on push tomaintouchingconfig/products.jsonand opens a follow-up PR to add the new slug to.github/ISSUE_TEMPLATE/release-request.yml. No hand-editing required; just merge the follow-up PR when it lands.
Release packs are generated on demand, so once the product is merged (and the dropdown-sync PR has landed), produce the first pack by filing a request:
- Open a Request New Release Content issue.
- Set Product to the new slug and Version to the latest tag (without the
vprefix). - Review the resulting PR.
If the latest release body is thin (e.g. a docs-only patch), expect zero articles and short channel posts — that's correct behaviour, not a failure (planning §6.6 / handoff Don'ts).
Once added, the new product has:
- Release packs generated on demand by filing a Request New Release Content issue.
- One PR per release pack at
content/<new-product>/<version>/, validated automatically. - Visibility on the file viewer at
https://contentforest.nanocollective.org/p/<new-product>/. - The same brand voice + channel rules as every other NC product.
It does not automatically get:
- Posting to social channels (out of scope, planning §14 — every post is copy-pasted by a human).
- Custom personal-account variants per team member (the personal-variant pipeline was removed on 2026-05-01 — see
implementation.mddecision log). - A separate visual identity in the file viewer (the homepage product grid lists every product the same way).
-
pnpm typesandpnpm lintclean (theconfig/products.jsonedit is plain JSON; nothing to break, but the gates run anyway). -
pnpm detect-releases(manual diagnostic) shows the new product's latest release as unprocessed. -
pnpm generate --product <new-product> --version <v> --dry-runsubstitutes cleanly — no{{...}}placeholders left in the prompt body. - (Optional but recommended)
pnpm fetch-refs && pnpm generate --product <new-product> --version <v> --testproduces a sensible pack locally before you file the first release request.