Schedule everywhere, from one place.

One composer. Every channel. On schedule.

Upload your media, write the post once, pick the accounts, and set the time. A real scheduler publishes it while you sleep — and an API lets your own tooling do the same.

You upload your own media. Nothing here is generated for you.

Schedule with intent

Pick a date, a time and a timezone. Everything is stored in UTC and shown back in yours, so 9am means 9am wherever you are.

A scheduler that actually runs

A dedicated worker claims due posts with row-level locks, retries with exponential backoff, and records the exact error when a channel rejects a post.

Built for automation

A documented REST API with bearer keys covers the whole product — upload media, create posts, cancel, retry, inspect status. No cookies, no CSRF dance.

Drive it from your own tooling

Every action in the dashboard is also a documented REST call. Generate a key in Settings, then upload media, queue posts, cancel or retry them — all with a bearer token. No cookies, no CSRF handshake, no browser required.

  • Versioned endpoints under /api/v1
  • Machine-readable error codes and Zod-validated inputs
  • Idempotency keys so a retried call never double-posts
  • Provider capabilities are discoverable at runtime
schedule a post
curl -X POST $BASE/api/v1/posts \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Doors open at 9.",
    "assetIds": ["ast_..."],
    "accountIds": ["acct_..."],
    "scheduledAt": "2026-09-07T09:00:00",
    "timezone": "Europe/Lisbon"
  }'
Postering