changelog.md, formatted for reading. Agents: fetch the source, https://cloudish.ai/changelog.md. It's the same document, and the one to use.
Cloudish changelog
Every change to the documents agents read (SKILL.md, credits.md, instances.md, replicas.md, container.md and llms.txt) and to API behavior agents rely on. Newest first. SKILL.md's "Last updated" date is the newest entry's.
2026-11-01
- SKILL.md section 0's example
aliasis<alias>, not<project-name>: it only labels the key (the{alias}half of every project path), so minting one never waits on a project name. The paragraph says you get the name or a close variant, and can rename it later withPATCH /api/v1/me. - Section 0 no longer leans on a project that doesn't exist yet at mint time: the alias is "a short name for what you're deploying", and an existing key is one "for this work" rather than "for this project".
- SKILL.md section 1 ends with how to take a deployment down:
DELETE /api/v1/projects/{owner}/{name}stops the container and its billing, and the same name deployed again starts fresh; a volume is deleted with the project, so its data is gone.
2026-10-26
- On a datacenter with a GPU, an app can have it: \
"gpu": true\on deploy, at a flat hourly price while it runs, one GPU app at a time (a \409\\gpu_busy\while another has it). That datacenter's SKILL.md and instances.md describe it; elsewhere nothing changes. - Each app says how it runs, on deploy (SKILL.md section 1): \
"alwaysOn": true\keeps it running, billed around the clock, and starts it as soon as it's deployed; otherwise it sleeps after \sleepAfterMinutes\without requests (15 unless set) and wakes on the next one, or on a \wakeEveryMinutes\schedule, for a bot or worker nothing sends requests to. \PATCH /api/v1/projects/{owner}/{name}\changes them without a redeploy. Both deploy examples show a choice, and the agent makes it. - The key-wide \
PATCH /api/v1/me {"settings": {"idleTimeoutSeconds": ...}}\is no longer documented. It still applies to apps that choose none of these. - An app's \
status\says why it's down: \sleeping\, \out_of_credits\(it starts again once its key has credits) or \stopped\, and its \sleep\how it runs. An always-on app's \runway\adds \alwaysOnHoursLeft\. - Replicas follow their app's \
sleepAfterMinutes\(replicas.md), and instances.md and llms.txt describe the choice.
2026-10-25
PUT /api/v1/projects/{owner}/{name}/secretsalso takes several secrets at once, as a map of names to values like a project'senv, saved all or none and answered as{"secrets": [...]}. One{"name", "value"}is unchanged. A body of neither shape gets a 400 naming both.- Saving or deleting secrets restarts a running app with the new values, and leaves an idle one idle. A secret change used to stop the app instead, or reach it only on its next request.
- SKILL.md's secrets section says all of this, and how to list (
GET …/secrets, names only) and delete them. - SKILL.md's description says "An AI agent creates its own API key", not "An agent": "agent" alone can mean a person.
2026-10-22
- llms.txt no longer links the website's docs for people, and
GET /api/v1/configno longer returns adocsURL: everything an agent needs is in SKILL.md and its companion documents.
2026-10-21
- Minting a key is one
curlagain (SKILL.md section 0), with a sample reply ("key": "cld_****") and what the key is for, with no shell snippet for storing it, and what the reply'sclaimUrldoes: whoever opens it and signs in gets the key in their account. Nothing requires claiming. credits.md points there instead of repeating it, and no longer assumes.envor$CLOUDISH_ALIAS. - The example
aliasis<project-name>, not<project-folder-name>: a folder's name can say more about the machine than the project. - SKILL.md's intro no longer says Cloudish has no user-facing product (the website has a dashboard): everything from getting a key to deploying takes only the calls it shows, with nothing to install and no account to create.
- llms.txt is written for an agent choosing where to deploy: what it needs to finish a deploy with no human (a key, payment, a build, proof it worked, a URL), what runs, what it costs (from the same rates as instances.md), when another platform fits better, and AI Deploy Bench, an open-source benchmark run by Cloudish. It's the only llms.txt: the website serves a copy of it, so it no longer links the website's.
2026-10-20
- SKILL.md's description no longer claims tasks that are only about choosing a host; it applies to deploying, hosting or putting an app online, and to tasks naming Cloudish.
- SKILL.md states two rules up front: never print keys or secrets into chat, source or logs, and never report a deploy as succeeded until the build reached
succeededand the app's logs show it listening; its URL is worth trying, but some environments can't reach the apps' domain. - SKILL.md section 0 mints a key with the same snippet as credits.md, so its example no longer prints the key;
aliasis in the example body, optional, and. ./.envloads the key in each shell. - credits.md saves a new key to
.envwithout capturingcurl's output in$( ): the response goes to a temporary.env.new-key.jsonthatjqreads andrmremoves, so the key still never shows in the agent's output. It still mints only when.envhas no key, writes nothing when the request fails, gitignores.envand the temporary file first, and the alias (the project folder's name) is optional. - The example image is pinned (
ghcr.io/acme/my-app:1.0.0), and the intro and Postgres steps are reworded; what they say is unchanged. refis the plugin, directory or link SKILL.md came from (claude-plugin,chatgpt-plugin,producthunt, ...), left out rather than guessed; it no longer asks foruser.- SKILL.md no longer points to
GET /search; llms.txt still lists it. Each document takes?links=relative, which links the others as files beside it and leaves out SKILL.md's datacenter section, for copies bundled into a plugin. - SKILL.md's credit transfer example is the parent key funding a sub-agent's key (
$PARENT_API_KEY), not a stranger's key. GET /search?q=your+questionsearches these documents and lists every section with any of the words. SKILL.md and llms.txt mention it. A path with no document on it is now a404(the same JSON pointer as before), not a200.- A key never goes below zero. Usage is charged only up to the balance it holds; whatever runs past that is never owed, so credits added after running out all land. credits.md says so under "Checking a balance".
POST /api/v1/keystakes an optionalmodelnext toagentandref, andrefcan now be how you found Cloudish (chatgpt-plugin,producthunt.com,user). SKILL.md's example shows all three as placeholders; every one is optional.- Runtimes and sub-agents can get child keys, funded by transfer; agents may fund them.
2026-10-19
- Apps on port
80start again; they used to sit on the starting page forever. And when a container is running but nothing accepts connections on itsport, the503now says so and names the port, instead of "timed out waiting for the container to start". - The project owner pays for an app, whoever calls it. A request with your own key used to check your key's balance and could get
402(or the offline page) even though the owner had credits. The402'saliasis now always the owner's. - Request bodies: an app accepts up to 64 MB by default, set per app with
maxBodyMb(up to 1024). Bodies over 1 MiB used to get413from the platform no matter what. cloudish.appis now the official domain for apps: an app'surlishttps://<name>.cloudish.app/. Keeping apps offcloudish.ai, where Cloudish's own account and admin sites live, means no app shares a site with them, which makes hosting apps safer. Olderhttps://<name>.on.<datacenter>.cloudish.ai/URLs keep working; their responses carryDeprecation: trueand aLinkheader with the new URL.subdomain.urlis now an app's permanent URL oncloudish.app,https://<name>.cloudish.app/, which works whichever datacenter serves it: save and share that one. URLs you saved earlier keep working. (subdomain.globalUrl, briefly the field for it, is the same value.)- Names are now global: naming a subdomain answers
409when another datacenter's app already has the name. - App URLs (
subdomain.url, replica URLs) are now oncloudish.app:https://<name>.do.cloudish.app/andhttps://<name>.anton.cloudish.app/. Apps created before this also keep answering on their olderhttps://<name>.on.<datacenter>.cloudish.ai/. - Sign-in (OIDC): build
redirect_urifrom the host the request came in on, not a fixed URL. An app can answer on more than one hostname, and a sign-in has to come back to the one it started on. - Started this changelog. SKILL.md now says when it was last updated and links here.