Manifest
Content, media, target platform, wall-clock schedule, timezone, and account guard form one versionable input.
Offline demo · no login · zero posts
This viewer replays the same manifest shape as the real CLI. Every action below is simulated and no social network is contacted.
60-second deterministic replay
Read the fixture, validate each packet, follow the mock adapter's five steps, then compare demo and live boundaries below.
Architecture
Content, media, target platform, wall-clock schedule, timezone, and account guard form one versionable input.
Rejects missing text/assets, incompatible media counts, duplicate IDs, and unsupported platform/template combinations before a composer opens.
Orders work, injects adapters, resumes verified posts, stops on safety failures, and owns the final run report.
Contain volatile selectors and native-UI details. Core batching and state logic stay independent of either platform.
Workflow and state
Schema, assets, account, and schedule checked.
Text and media placed in the native composer.
Native schedule controls receive the wall-clock value.
The scheduled queue is reconciled as source of truth.
State, screenshots, and outcome remain available for resume.
Verified state and live-queue reconciliation prevent a retry from silently scheduling the same item twice.
If an adapter detects immediate publication, the entire batch aborts and raises an operator alert.
Selector or verification failures stop with precise state; the orchestrator does not loop blindly.
Real, linked code
return {
id: post.id,
platform: post.platform,
status: 'simulated',
steps: labels.map((label, index) => ({
id: index + 1, label, status: 'complete'
}))
};The public replay consumes the real manifest shape and returns the common report contract without importing CDP.
if (core.state.isVerified(postId)) {
core.runLog.append({
postId, action: 'skip', result: 'already-verified'
});
continue;
}A verified item is skipped before any platform action; the durable state survives interrupted batches.
if (error instanceof LivePublishError || error.critical) {
this.alertOperator(error.message);
return this.finish(OUTCOME.ABORTED, error.message);
}A single potentially live post stops the whole batch instead of allowing later items to continue.
Execution boundaries
Demo mode
Local fixture + mock adapter + static report. No Playwright import, CDP, social URL, or external write.
Dry-run mode
Attaches to Chrome and rehearses the native flow, but stubs the terminal schedule click.
Live mode
Requires explicit --live, uses native schedule UI, then verifies each queue.
Quality and limits
Run locally
npm install
npm run demo
npm test
# only after reviewing the batch:
node src/cli.js --batch ./my-week --dry-run