Product-code half (fleet gate, capabilities endpoint, offline feature
migration, PREMIUM_FEATURES completion) lives in the dashcaddy repo, branch
dc/DC-165-uniformity — judged as one bundle.
Site edits (all claims verified against product source, see EVIDENCE [9]):
- template count 77 -> 78 EVERYWHERE (page.tsx, features, pricing, docs,
blog bodies + manifest.ts frontmatter per three-way consistency rule,
AppShowcase, DocsLayout, FaqSection). Source of truth:
APP_TEMPLATES keys == 78.
- internal-identifier leak sweep: 85 occurrences of *.sami (internal TLD),
an internal Git host URL, a private venv path, and a server-local repo
path in pricing comment -> replaced with the documented .home style /
generic wording. status.sami replaced by dashcaddy.local (product default
dashboardHost). Verified ZERO remaining in rebuilt out/.
- advertise as Premium (owner decision 2026-10-09): pricing premium list +
FAQ + docs/premium table + two new deep-dive sections (Workflow
Automation: the five bundled ids from bundled-workflows.js; Scheduled
Backups: schedule fields from the /backups/schedule schema, manual
one-click + DR explicitly noted as free).
- calendar widget + hosted-Radicale auto-wiring advertised (features page
chip + new docs/catalog/radicale install guide following house template
structure; syncthing page mirrored for the placeholder conventions).
- Connect AI one-click key flow advertised (features chip).
- MCP card softened: 'entire infrastructure' -> the real tool scope +
pointer to GET /api/v1/capabilities (public ground-truth manifest).
- llms.txt: capabilities endpoint pointer + 'prefer it over static prose'
+ MCP tool examples + premium gate list; robots.txt gains LLMs-Txt line.
- NOTE: a parked unrelated work-in-progress (dc-seo-r8 blog edits) was
stashed before the build and is NOT in this commit.
Build gate: rm -rf .next out && npm run build -> clean, 123 static pages,
out/ greps zero stale counts/leaks.
Round-1 docs claimed things the code does not do. This commit rewrites
all 77 per-template pages + the catalog index to match reality:
CORRECTED:
- REST API payload shape: was {template, subdomain, port, environment}
Real Joi schema (src/utilities/validate.js appDeploy) is
{appId, config: {subdomain, port, mediaPath?, plexClaimToken?, ...}}
All optional fields now documented per-schema.
- Auth methods: was just "Authorization: Bearer" — real middleware
accepts three (TOTP session cookie, Authorization: Bearer JWT,
X-API-Key header). All three now shown.
- Deploy is synchronous: was "poll GET /api/v1/apps/{id}/status" — there
is no status endpoint. Response shape documented as
{success, containerId, url, message, setupInstructions}.
- AI Intent Router: was "starts the deployment" — it returns a
structured intent; the caller must POST /api/v1/apps/deploy to
actually provision. Documented accurately.
- MCP dashcaddy_deploy_app: was treated as full deploy — it only writes
the Caddy route + services.json entry, NOT the container. Documented
as such with manual docker pull as next step.
- Watchtower: was claimed to auto-update every 24h — DashCaddy does NOT
poll for new digests. Watchtower is a separate template with default
schedule 0 0 4 * * * (cron 04:00). Documented.
- Update button: was "Apps → {Name} → Update" — no such endpoint exists.
Manual docker pull + restart now documented.
- Restore-on-install: was "prompt to restore from snapshot during install"
— no such prompt. POST /api/v1/apps/{appId}/restore documented.
- Backups: was "default daily snapshot" — backup schedule is
configurable via backup-config.json, not "nightly" by default.
Volumes ARE included; documented.
- Dashboard menu: was "Apps → Catalog" — actual entry is the
"App Selector" button on the dashboard home. Documented.
- Dashboard URL: status.sami confirmed correct (configurable via
dashboardHost).
Also fixes default port resolution: was using portList[0].split(":")[0]
which leaks "{{PORT}}" literal when the template uses the placeholder.
Now uses t.defaultPort (Joi-validated) first, falling back to portList.
Build: 78 routes prerender as static, TypeScript clean.
Generate one dedicated install page per template in /docs/catalog/<id>/.
Each page covers:
- Prerequisites (with claim-token reminders where applicable)
- Three install paths: dashboard UI, REST API (with curl), AI Intent Router
- Post-install first-run checklist (from the template metadata)
- Volume mounts and persistent data
- Environment variables
- Watchtower auto-update behavior
- Backup inclusion
- Common troubleshooting
- Related services (category-aware cross-links)
Also add /docs/catalog index page grouping all 77 templates by 17
categories, with difficulty badges and popularity-sorted entries.
Sidebar updated to show the new App Catalog entry.
Generated by /tmp/generate-template-docs.js (run from /opt/dashcaddy
in a follow-up to keep content in sync with app-templates.js).