Quickstart
Install staqly on your computer, connect a channel, write a post and publish it, in about five minutes.
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 itThe 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:
| What | URL | Reachable from |
|---|---|---|
| Dashboard | http://localhost:8080 | this computer (staqly serve); your network with --expose or Docker |
| REST API | http://localhost:3333 (contract at /openapi.yaml) | this computer only (127.0.0.1) |
| MCP (Streamable HTTP) | http://localhost:3333/mcp | this 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) - ✔ ConnectedThen 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.