Core concepts
Posting
Compose → approve → schedule → publish. AI is assistive and never autonomous: every draft requires a human sign-off before it can ship to a connected account, and every step is audited.
The lifecycle
A post moves through explicit states. AI helps with the first step; humans own the gate:
- compose — create a draft from one source. Optionally reformat per network (X thread, LinkedIn long-form, IG caption…) with assistive AI. Lands as a
draft. - approve — a human reviews the per-network variants and approves. This is the mandatory gate; nothing ships without it.
- schedule — set a run time per target; durable jobs are enqueued.
- publish — the worker publishes at the scheduled time (or immediately). The result, success or failure, is recorded.
Compose once, adapt per network
One source asset becomes platform-native variants, with each network's length, media, and threading constraints enforced automatically:
# from a file, reformatted per network into a draft
$ socializer compose --from launch.md --networks linkedin,x,bluesky
# inspect the rendered per-network variants before approving
$ socializer posts show post_01h…Over the API, create the draft then (re)generate variants:
curl -X POST https://socializer.co/api/v1/posts \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{ "body": "We shipped Socializer 🚀", "targets": [{ "profile_id": "prof_…" }] }'
# regenerate network-specific variants
curl -X POST https://socializer.co/api/v1/posts/post_…/reformat \
-H "Authorization: Bearer sk_live_…" \
-d '{ "networks": ["x", "linkedin"] }'Approve — the human gate
Approval records the approver in the audit log. Until a post is approved it cannot be scheduled or published to a connected account:
$ socializer approve post_01h…Schedule & publish
Schedule per target — the worker runs durable jobs at the run time. Or publish now. Every write supports --dry-run (?dry_run=true over HTTP) to preview the exact payload without sending anything:
# schedule for later
$ socializer schedule post_01h… --at "2026-07-01T09:00:00Z"
# or publish now — preview first
$ socializer post now --profile prof_… --text "Shipping today 🚀" --dry-run
$ socializer post now --profile prof_… --text "Shipping today 🚀"Everything is audited
Every write records the actor (human or agent), the content, the target, and the result — immutable and queryable. Provenance and reversibility are the point: an off-brand post can never reach a client account without a human in the loop, and you can always answer "who posted what, where, and when."
$ socializer audit --action post.published --since 7d --json