termlings cms is a file-based content app for collections, entries, draft workflows, scheduled publishes, and local output files.
Everything stays inside the workspace:
.termlings/store/cms/
collections.json
entries/
blog/
pages/
docs/
changelog/
publish/
<collection>/<slug>.md
<collection>/<slug>.json
history.jsonl
Inspect the contract first:
termlings cms schema
termlings cms schema createRead actions use --params and --json:
termlings cms collections --json
termlings cms list --params '{"collection":"blog","status":"draft","limit":25}' --json
termlings cms show --params '{"id":"entry_abc123"}' --json
termlings cms publish --params '{"id":"entry_abc123"}' --json
termlings cms archive --params '{"id":"entry_abc123"}' --json
termlings cms history --params '{"limit":25}' --jsonWrite actions use --stdin-json:
printf '%s\n' '{"id":"resources","title":"Resources"}' \
| termlings cms collection-create --stdin-json --json
printf '%s\n' '{"collection":"blog","title":"Launch Week Recap","slug":"launch-week-recap"}' \
| termlings cms create --stdin-json --json
printf '%s\n' '{"id":"entry_abc123","body":"# Launch Week Recap"}' \
| termlings cms body --stdin-json --json
printf '%s\n' '{"id":"entry_abc123","key":"seo_title","value":"Launch Week Recap | Termlings"}' \
| termlings cms field --stdin-json --json
printf '%s\n' '{"id":"entry_abc123","at":"2026-03-10T09:00:00+01:00"}' \
| termlings cms schedule --stdin-json --jsonblogpagesdocschangelog
Add custom collections with collection-create --stdin-json.
draftscheduledpublishedarchivedfailed
Scheduled publishes are executed by the shared scheduler:
termlings scheduler --daemonOr run due publishes once with termlings cms run-due --json.
Publishing writes:
.termlings/store/cms/publish/<collection>/<slug>.md.termlings/store/cms/publish/<collection>/<slug>.json
The markdown file includes a small frontmatter block plus the body content, so it can feed static-site or export workflows later.
cmsis local-first and provider-free. It does not depend on an external CMS.socialcan promote published CMS entries.mediacan generate attached assets separately and you can reference them through CMS fields.cmsuses the shared app activity feed for create/update/schedule/publish events.
Disable CMS globally in .termlings/workspace.json:
{
"apps": {
"defaults": {
"cms": false
}
}
}See docs/APPS.md for app availability rules.