Content pipeline
Content moves through four steps: generate, review, schedule, and
publish. Every piece is a Content row with a status, so you can always see
where it is.
| Status | Meaning |
|---|---|
DRAFT | Created, not yet ready for review |
PENDING_REVIEW | Waiting on the Approval screen |
APPROVED | Approved for publication |
REJECTED | Rejected, with the reviewer’s reason |
PUBLISHED | Published by a publisher |
ARCHIVED | Archived |
Generate
Content reaches review from three places:
- A Site Audit. Each channel prescription’s suggestions become drafts.
- You.
ContentService.GenerateContentstreams a post for one channel and topic. You can set the tone (professional,casual,bold, oreducational; the default isprofessional), audience, language, extra context, a campaign, and a diagnosis to ground it in. The result is saved and goes to review when generation finishes. - The social engine. Once a day it drafts a LinkedIn post, an X thread, and an Instagram caption for each active campaign, grounded in that day’s trending topics. They wait for review like everything else.
Studio pieces (whitepapers, podcasts, and the rest) can be saved as content
with SaveGeneratedContent, so they can be approved and scheduled too. See
Studio.
Review on Approval
Content → Approval (/approval) is a swipe-style review queue.
- Edit changes the title, body, hashtags, or call to action
(
UpdateContent). The item stays pending. - Approve marks it approved (
ApproveContent). - Reject marks it rejected and keeps your reason (
RejectContent).
When you approve a piece whose channel has a publisher, PULSE tries to publish it right away. That happens only if the channel is armed. An approval is consent to the content, not to the channel, and there is no override. See Publishing controls.
Schedule
Content → Schedule (/publishing) lists the queue and lets you schedule
approved content. Pick the content, a channel, and a date and time
(PublishingService.SchedulePost). The screen offers LinkedIn, Instagram,
Facebook, YouTube, and Blog.
Every 30 seconds the publishing worker dispatches posts that are due. Each row ends in one of these states:
| Status | Meaning |
|---|---|
pending | Waiting for its time |
publishing | Being dispatched now |
posted | Published |
withheld | The channel was disarmed when the post came due. This is final: re-arming does not replay old posts. Schedule the content again to re-queue it. |
failed | The dispatch was tried and failed, for example a dead token or a platform quota error |
Every row also carries a reason and a reason_status. A withheld or
failed row with no recorded reason shows reason_status: missing, never a
blank.
Which channels can actually publish
| Channel | Publisher |
|---|---|
| Blog | A Hugo post on your own website, through GitHub. See Site pipeline. |
| A text-only post on one personal profile. Company pages are not supported. | |
| YouTube | A real upload. Visibility comes from YOUTUBE_PRIVACY_STATUS, and defaults to private. |
| Podcast | Inclusion in the podcast RSS feed. Platforms poll the feed. |
| Book outline (audiobook) | The same feed, as its own channel |
| No working publisher yet. The uploader is a stub. | |
| Facebook, X, TikTok, email | No publisher. A dispatch fails with no publishing integration for channel ... yet. |
Creatives
Content → Creatives (/creatives) holds the media attached to content and
campaigns.
CreateCreativeregisters an asset you already have: an image prompt, a video script, alt text, dimensions.GenerateCreativegenerates media and saves it as a creative. It makes video only. Still-image generation was retired, and a still-image request returnsUnimplemented:still-image generation is not available: the image-generation tier was retired.
For video, pick a platform preset: youtube, youtube_shorts,
instagram_reel, instagram_feed, or instagram_story. The preset sets the
resolution and frame rate. You can set the number of scenes (1–100), the frame
rate (12–60, default 30), an avatar, a voice, and a target language. Video needs
the video tool the deployment configures (BINARY_VIDEO_CLI).
Generated files are stored sealed on the server and served from /creatives/
and /media/, only to a signed-in owner or through a link the server signed.
Campaigns
Content → Campaigns (/campaigns) groups content under an objective
(brand_awareness, lead_gen, engagement, or sales), channels, a budget, a
currency, dates, and an audience. You can create, update, archive, and delete
campaigns (CampaignService). Deleting is a soft delete.
A campaign’s status is one of DRAFT, ACTIVE, PAUSED, COMPLETED, and
ARCHIVED. The daily engines work only on active campaigns, so activate a
campaign to start its daily drafts, documents, and episodes.