Content production
A small but high-traffic Treehouse pillar covering everything the company published or distributed. Four controllers, no public routes — content is authored here and surfaced under Domain A (Public web) once published.
What it covers
- Blog posts — written in a homegrown rich-text editor (TinyMCE-derived). Drafts → scheduled → published lifecycle. About a thousand posts in the table, very few recent.
- Board summaries — the deliverables produced from concluded advisory boards. Authored by Currnt analysts, with an optional AI-assist (see below).
- Marketing assets — landing-page copy, email-campaign templates, social copy. Versioned with revision history.
- AI co-facilitator hooks — the cron that drafts promotional copy and threads it back into boards. The end-to-end story is on its own page: /features/ai-cofacilitator.
Representative routes
| Method | Path | Handler | Notes |
|---|---|---|---|
| GET | /admin/content/posts | PostController.list | Filter by status, author, tag. |
| POST | /admin/content/posts | PostController.create | New draft. |
| GET | /admin/content/posts/:id/edit | PostController.edit | Rich-text editor. |
| POST | /admin/content/posts/:id/publish | PostController.publish | Updates status; clears CDN; queues digest. |
| POST | /admin/content/posts/:id/ai-suggest | PostController.aiSuggest | Calls OpenAI; logs to LLM-trace table. |
| GET | /admin/content/summaries | SummaryController.list | Board summaries; one per closed board. |
| POST | /admin/content/summaries/:id/generate | SummaryController.generate | Triggers AI summarization handler in dispenserd. |
| GET | /admin/content/assets | AssetController.list | Marketing copy library. |
| GET | /admin/content/assets/:id/revisions | AssetController.revisions | Versioned history. |
Headline flow: draft post → published
Step 1: Author clicks "New post" in /admin/content/posts.
Step 2: Writes draft in TinyMCE editor; autosave every 30s.
Step 3: Optional: POST /admin/content/posts/:id/ai-suggest →
OpenAI completion appended to a suggestions panel.
Step 4: Author marks post "ready for review" → notification to editor.
Step 5: Editor approves → POST /admin/content/posts/:id/publish.
Step 6: PostController flips status, fires `publish_post` dispenserd job.
Step 7: dispenserd handler purges CDN, posts to social (when wired),
queues digest email rollup.
Step 8: Post becomes visible at /blog/:slug for public consumption.