A background coding agent for your terminal and your scripts
You don't need a ticket. Type what you want done inside a checkout, and Sinatra's hosted agent works on that repository in its own sandbox, then prints its answer and a pull request link if it opened one. Scripts and CI jobs start the same task over HTTP.
From the terminal
Install the CLI with npm i -g sinatra.dev (it needs Node 22 or newer) and run sinatra login. It opens a Sinatra page in your browser; approve it and the CLI is signed in, with no token to copy. Then, inside a checkout: sinatra "fix the flaky retry test".
The CLI works out the repository from the checkout's GitHub remote, or takes -r owner/name. It prints what Sinatra posts until the turn is done, then tells you how to reply. Ctrl-C stops the waiting, not the task. Attach a log or a spec with -f, up to 80 KB of text in all. Later, sinatra reply, sinatra show, sinatra tasks and sinatra stop do what they say.
For scripts, --no-wait --json starts a task and prints it as JSON, and exit codes tell a finished turn (0) from an error (1), a failed, cancelled or paused task (2), and one still working when the CLI stopped waiting (3).
From a script or a CI job
The HTTP API lives at https://api.sinatra.dev and takes a personal access token you create on the dashboard's CLI & API page. POST /v1/workspaces/:id/tasks with a prompt, and optionally a title and a repository, starts a task. Send an Idempotency-Key header and a retry never starts a second one. Follow-ups and the conversation share one endpoint, .../messages (POST to send, GET to read), and stop has its own.
A task started this way is a full Sinatra task: it gets a sandbox, can open a pull request, shows up on the dashboard, and counts against your plan like a Linear ticket or a labeled GitHub issue. The dashboard's task page shows the same conversation, so a teammate can read it and reply there.
Limits worth knowing first
There is no streaming. You poll for new messages, and the conversation holds the agent's answers and questions, not its progress. A message you send while a turn is running doesn't reach the agent mid-run: it waits and runs as the next turn. That's different from Linear, GitHub and Slack, where a mid-run message reaches the running agent.
Each person can have up to 5 CLI, MCP or API tasks starting, running or queued at a time in a workspace, and a sixth start is refused until one finishes its turn. Each token gets 600 reads and 120 writes a minute per endpoint. The agent runs in Sinatra's sandbox on a fresh checkout, never on your machine, so it works from what you've pushed. Replies from the CLI or API go to tasks that started there; a Linear or GitHub task takes its replies where it started.
Where other tools already do this
Starting a hosted run from a script isn't rare. Copilot's cloud agent, Jules, Cursor, Devin and OpenHands each document an API that does it, and Codex and Claude Code start cloud tasks from their own CLIs. If your team already runs one of them, its API is the shorter path. Sinatra makes sense when the same task should also start from a Linear ticket, a GitHub label or Slack, on your own subscription or key. The comparison hub has a row for exactly this, with sources.
Setting it up
Sign in at app.sinatra.dev, install the GitHub App on the repositories Sinatra can work in, and add a Claude or ChatGPT subscription or an API key.
Run npm i -g sinatra.dev, then sinatra login, and approve it in your browser. On a machine without one, use a token instead.
Open CLI & API in the dashboard, name a token and pick when it expires: 30, 90 or 365 days. It's shown once.
Something small and real. Every command, endpoint and error code is in the CLI and API docs.
What it costs
The CLI and the API are on every plan. Free is 1 task at a time, plus 1 queued, with no daily limit and no card. Pro is $20 a month for the whole workspace: 3 tasks at a time, plus 10 queued, any number of people. Bring your own Claude or ChatGPT subscription, or an API key. Sinatra never bills for model usage. That's between you and your provider.
Common questions
How does the CLI know which repository to work on?
Inside a git checkout it uses the checkout's GitHub repository, looking at the origin remote and then upstream, so a fork falls through to the repository it forks. Pass -r owner/name to choose one yourself. Outside a checkout, the agent picks from the repositories connected to your workspace.
Can I use it from CI or over SSH?
Yes. Browser sign-in needs the browser on the same computer, so on a server, a CI runner or a machine you reach over SSH, create a personal access token on the dashboard's CLI & API page and log in with sinatra login --token, or pipe the token in. Scripts can skip the CLI and call the HTTP API with the same token.
Does the API stream the agent's work?
No. You poll the conversation for new messages and check the task's status. The conversation holds the agent's answers and questions, one reply per turn, not its progress. The CLI polls every three seconds.
What happens if my script retries a request?
Send an Idempotency-Key header when you start a task or send a message. A retry with the same key returns the same task, or sends the message once, and never starts a second task. The CLI does this for you.
Is it on the free plan?
Yes, the CLI and the API are on every plan. Free is 1 task at a time, plus 1 queued, with no daily limit and no card. Separately, each person can have up to 5 CLI, MCP and API tasks running or queued at a time in a workspace; your plan's limit still applies. Bring your own Claude or ChatGPT subscription, or an API key.
Working from Claude Code, Cursor, claude.ai or ChatGPT instead? The MCP server starts the same tasks. They also start from Slack, a Linear assignment or the Sinatra label on a GitHub issue.