staqlydocs

Quickstart

Install staqly on your computer, connect a channel, write a post and publish it, in about five minutes.

Edit on GitHub

This guide gets Staqly Community Edition (the open-source staqly you run yourself) running on your computer and walks you through the core loop: a post goes into a collection, a channel receives it, and a schedule keeps the collection publishing. You need no account. You only need macOS or Linux for the install script, or Docker on any system.

Get started in five steps

Start staqly

The install script is the recommended way: one binary runs the API, the MCP endpoint, the job queue and the dashboard. Docker is the alternative if you prefer containers.

curl -fsSL https://raw.githubusercontent.com/staqly/staqly/main/scripts/install.sh | sh
staqly serve   # API + MCP + dashboard in one process; Ctrl-C stops it

The install script puts staqly in ~/.local/bin after checking the release checksum. On Windows, download the .zip from the releases. Your data lives in ~/.local/share/staqly. To keep staqly running in the background and start it with your computer, run staqly service install. More in Run the binary.

With Docker, one container runs the pre-built image ghcr.io/staqly/staqly with its data in the volume staqly-data; what each flag does is in Run with Docker.

Either way, staqly is now running here:

WhatURLReachable from
Dashboardhttp://localhost:8080this computer (staqly serve); your network with --expose or Docker
REST APIhttp://localhost:3333 (contract at /openapi.yaml)this computer only (127.0.0.1)
MCP (Streamable HTTP)http://localhost:3333/mcpthis computer only

The workspace is created automatically on first start, and so is the access token: the one key of your install. staqly prints it at every start, with a link that opens the dashboard signed in:

  Open the dashboard:  http://localhost:8080/#token=stk_local_...
  Access token:        stk_local_...

Print it again any time with staqly serve token (Docker: docker exec staqly server token).

Open the dashboard

Open the link staqly printed (http://localhost:8080/#token=...). There is no sign-up and no password:

  • The link signs this browser in. Opened http://localhost:8080 without it? Paste the access token on the sign-in page.
  • Sessions last 30 days; each browser signs in once.
  • To manage posts from your phone, open Connect a device in the signed-in dashboard and scan the QR code. See Phones & tablets.

The dashboard opens on Schedule, the calendar. It is empty until a post has a time.

Connect a channel

A channel is an account staqly publishes to. Open Channels in the sidebar and click Add channel. The drawer shows every platform staqly knows, grouped by kind; the ones not available yet carry a Soon badge. To try the whole loop without any external account, pick Your own automation: a channel that hands each post to your own script or n8n workflow and waits for its result (how that works).

The same from a terminal:

API=http://localhost:3333
export STAQLY_API_KEY=$(staqly serve token)   # Docker: $(docker exec staqly server token)
AUTH="Authorization: Bearer $STAQLY_API_KEY"

curl -s -X POST $API/v1/channels -H "$AUTH" -H 'Content-Type: application/json' \
  -d '{"provider":"custom","name":"My publisher"}'
# → {"id":"ch_7h2kq9xw3nbvd5yhzm6a","provider":"custom","name":"My publisher","status":"connected", ...}

Token platforms take their credentials in fields (a bot token, an app password); what each one needs is in GET /v1/providers. OAuth platforms are connected in the dashboard with Connect with ... once the server has the platform's developer app: for X, put PROVIDER_X_CLIENT_ID and PROVIDER_X_CLIENT_SECRET in the server's environment and restart (X). See Channels.

Write a post and publish it

A post is one piece of content with one target per channel. Posts live in collections, which group related posts and own the schedules. Every workspace starts with a Default collection.

In the dashboard, open Posts and click New post: click the channel avatars, type the text (a counter per channel shows how many characters that platform allows), insert media, and click Publish now, or set a Publish time and click Schedule.

Scripts and agents send the access token:

curl -s -X POST $API/v1/collections -H "$AUTH" -H 'Content-Type: application/json' \
  -d '{"name":"Product updates","description":"Release notes and tips"}'

curl -s -X POST $API/v1/posts -H "$AUTH" -H 'Content-Type: application/json' \
  -d '{"collection":"Product updates","content":"v1.4 is out: schedules, channels and a calendar.","targets":[{"channel_id":"ch_7h2kq9xw3nbvd5yhzm6a"}],"publish_at":"2026-11-03T09:00:00Z","status":"scheduled"}'

The response is the new post:

{
  "id": "post_oalirbz67y4m4cqxq5dw",
  "collection_id": "col_qjuybkx6355nz4no6pqk",
  "collection_name": "Product updates",
  "content": "v1.4 is out: schedules, channels and a calendar.",
  "status": "scheduled",
  "publish_at": "2026-11-03T09:00:00Z",
  "targets": [{ "channel_id": "ch_7h2kq9xw3nbvd5yhzm6a", "channel_name": "My publisher", "provider": "custom", "status": "pending" }],
  "version": 1
}

It now sits on the calendar. At 09:00 UTC on that day a job publishes each target; the post ends published when every channel confirmed, failed when one did not (retry that channel alone). Leave out publish_at and status for a draft, or send "publish_now": true to publish at once.

Connect your agent and set a schedule

Add staqly to your coding agent as an MCP server, with the access token from STAQLY_API_KEY (export STAQLY_API_KEY=$(staqly serve token) first):

claude mcp add --transport http staqly http://localhost:3333/mcp --header "Authorization: Bearer $STAQLY_API_KEY"
claude mcp list        # → staqly: http://localhost:3333/mcp (HTTP) - ✔ Connected

Then ask in plain language:

"Draft five posts about the new release into Product updates, one per weekday." "What is scheduled this week?" "Publish the draft about the calendar now."

Instead of giving each post a time, let the collection do it. Open the collection's Settings, unfold Schedules and click New schedule: At fixed times, 09:00, Monday to Friday, your time zone, the channels, The next waiting post (oldest first). From now on every weekday morning the oldest draft goes out, and when none is left the schedule can Ask my agent for new posts, so your agent sees the request with list_requested_work and fills the collection again. Details: Schedules.

Other clients and options: Connect agents.

Next steps

On this page