Skip to content
Content pipeline

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.

StatusMeaning
DRAFTCreated, not yet ready for review
PENDING_REVIEWWaiting on the Approval screen
APPROVEDApproved for publication
REJECTEDRejected, with the reviewer’s reason
PUBLISHEDPublished by a publisher
ARCHIVEDArchived

Generate

Content reaches review from three places:

  • A Site Audit. Each channel prescription’s suggestions become drafts.
  • You. ContentService.GenerateContent streams a post for one channel and topic. You can set the tone (professional, casual, bold, or educational; the default is professional), 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:

StatusMeaning
pendingWaiting for its time
publishingBeing dispatched now
postedPublished
withheldThe 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.
failedThe 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

ChannelPublisher
BlogA Hugo post on your own website, through GitHub. See Site pipeline.
LinkedInA text-only post on one personal profile. Company pages are not supported.
YouTubeA real upload. Visibility comes from YOUTUBE_PRIVACY_STATUS, and defaults to private.
PodcastInclusion in the podcast RSS feed. Platforms poll the feed.
Book outline (audiobook)The same feed, as its own channel
InstagramNo working publisher yet. The uploader is a stub.
Facebook, X, TikTok, emailNo publisher. A dispatch fails with no publishing integration for channel ... yet.

Creatives

Content → Creatives (/creatives) holds the media attached to content and campaigns.

  • CreateCreative registers an asset you already have: an image prompt, a video script, alt text, dimensions.
  • GenerateCreative generates media and saves it as a creative. It makes video only. Still-image generation was retired, and a still-image request returns Unimplemented: 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.