Developer portal
How to drive this platform from another program: create an application, deploy a compose file to it, and read back the address the result answers on.
Pages 1 to 4 are the contract for a machine consumer. That means a service which manages applications on somebody's behalf, continuously, with no person at the keyboard for any given call. An API token reaches every part of it, and you need nothing else. There is no session, no cross-site request forgery token, and no HTML in the path.
Sign in with someones.computer is the exception, and says so. It authenticates a person, from your own site, so its credential is an OpenID Connect client rather than an API token, and the flow runs in their browser.
| Page | What it covers |
|---|---|
| Authentication | Getting a token, and what it can do |
| Applications and deploys | Create, upload a bundle, set variables, watch a revision |
| Published ports | Asking for a port, or being given one |
| Reading an address | Where a deployed service actually answers |
| Sign in with someones.computer | Authenticating a person with this platform, from your own site |
Examples using {{ example:… }} are a test
Any request or response body written as an {{ example:… }} placeholder isn't
written by hand. It's a fixture under app/tests/contracts/api/, compared
byte-for-byte against a live response by the test suite, and this portal
renders the same file. A documented example that stopped being true is a
failing build rather than a page nobody noticed—the same technique the
/health contract already uses after a documented shape and an asserted shape
drifted apart for a day.
That means you can copy one of those and expect it to match what you get, down to the null fields. Not every body on these pages goes through the placeholder yet—Applications and deploys still has two hand-typed request bodies with no backing fixture—so treat a body without the placeholder as illustrative rather than asserted.
For AI agents
An AI agent asked to "use someones.computer" starts at /llms.txt
(prose) or /.well-known/mcp.json (the same facts as
data). Neither needs a credential. Both point at the Model Context
Protocol (MCP) endpoint (/_mcp) and the device-authorization flow that
gets a first ApiToken without a human ever pasting one by hand. A Claude
Code skill that drives the whole sequence lives at
clients/claude-code-skill
in the main repo. See
docs/mcp.md
in the main repo for the full tool surface and the token-bootstrap sequence.
A client with a native "Add Connector" button (Claude Desktop, Claude Code)
doesn't need the device flow at all: /_mcp also answers as an OAuth 2.1
protected resource—point the connector at this platform's origin and it
registers and authorizes itself. See
docs/mcp-oauth.md
in the main repo.
The shape of the API
Two prefixes, both bearer-token only:
| Prefix | For |
|---|---|
/cli/… |
Everything a consumer drives: organizations, applications, variables, endpoints |
/applications/{slug}/bundle |
The compose + build-context upload that creates a revision |
API Platform's /api also exists—a bearer token reaches it too, since #1418.
But it's a different, JSON-LD/Hydra-shaped surface describing the same
resources, not an alternative path to /cli. It exists to be machine-readable
(OpenAPI 3, /api/docs) rather than hand-documented, and is what the
generated client SDKs below are generated from.
Existing clients
Four consumers already speak the /cli contract, if writing your own is more
than you need: the sc CLI, sc-tray (the menu-bar
client), the Terraform/OpenTofu provider (declarative
applications, variables, managed services and bindings), and the
PR-environment GitHub/Forgejo
Action
(a composite action wrapping sc deploy/sc stop for one job per repo). None
of the four use /api—they predate it, and /cli remains the contract this
portal documents by hand.
Client SDKs
Four generated clients for /api—not /cli—one per language, each its
own repo:
| Language | Package | Repo |
|---|---|---|
| PHP | someones-computer/sdk-php (Composer) |
sdk-php |
| Go | github.com/someones-computer/sdk-go |
sdk-go |
| TypeScript | @someones-computer/sdk-js (npm) |
sdk-js |
| Python | someones-computer-sdk (PyPI) |
sdk-python |
Every operation takes the same bearer ApiToken as /cli—see
Authentication. /sdks is the public page for
these (install snippets, links, one mascot per language); see
docs/sdk-generation.md
in the main repo for how they're generated and regenerated, and their
current rough edges (default-generated method names, not yet published to a
package registry).
Base URL and versioning
Every path on these pages is relative to the install you are talking to —
https://someones.computer for the public one. There is no version prefix. The
contract grows by adding fields. A consumer must ignore fields it doesn't
recognise rather than failing on them, because new ones will appear.