Stores a recoverable bundle of a site, its files, subdomain and version, in the artifact store, then publishes it and returns the live URL. Each file arrives as text or as base64: text for HTML, CSS and JavaScript, base64 for images, fonts, icons and anything else that is not text. Server code goes in functions, where the path spells the URL, so functions/api/orders.js answers /api/orders and every other URL is served from the files. Routing can be given as static or spa, and when it is not given it is inferred; the reply says which was used. Publishing reads the bundle back out of the store rather than reusing what is in memory, so what gets served is what can be recovered.
Returns a one-time link and a short Node script that posts a built folder to it, for a project a framework built: React or Vue with Vite, Next.js, Nuxt, SvelteKit, Astro. Nothing is built here. The project is built where its code is and the output folder is sent, dist or out or .output/public, text as text and everything else as base64, under the same 4 MB bound. The post stores a version exactly as deploy_site would and publishes nothing; publish_deploy puts it live. Server code is not part of a build, so framework API routes and server rendering do not come across; plain-JavaScript functions are sent beside the folder. The link works once, for fifteen minutes.
Builds a project a framework needs building, React or Vue with Vite, Next.js with output export, Nuxt, from its source on this platform, and stores the result as a version of the site; publish_deploy puts it live. This is the door for an assistant that has no shell, ChatGPT or claude.ai. Nothing is installed from your package.json: the build runs in an isolated sandbox against a toolchain this platform pins, holding no credential of ours and reaching nothing but the package registry, and a dependency outside the toolchain is refused by name with the list in the reply. Server code is not built; files under functions/ pass through as plain-JavaScript functions. A quick build finishes inside the reply; a longer one hands back a job for build_status. The first build for an account, and the first after a quiet spell, takes a minute or two longer while the toolchain is installed. One build at a time per account.
Reports a build start_build started: still running, done with the stored version, or failed with the last lines the build printed. A build takes ten seconds to a few minutes. When it is done, publish_deploy with the site puts the version live.
Publishes a version that is already in the artifact store, the newest one by default or any earlier one by name. Rolling back is publishing an earlier version, which is the same code path a disaster recovery runs, so the rollback is exercised every time anyone deploys.
Takes a site off the air. Visitors stop getting it immediately, and nothing is deleted: every stored version stays where it was, the database is untouched, the site id stays yours, and publish_deploy puts it back on the version that was live. It is the tool for a shop that has closed, a page that went out wrong, or a launch that has to wait — deploying a page that says closed is a different thing, because the old page is still there for anyone holding the URL. One thing does not come back on its own: the values of your secrets live on the script this removes, and this platform cannot read them or copy them, so you set them again once the site is serving. The reply lists them by name.
With no argument, lists the sites this account owns. With a site id, lists every stored version of that site, newest last, marking which one is current. Sites belonging to another account are not listed and cannot be read.
Declares a secret a site’s functions will read as env.NAME, an API key or a webhook signing secret, and returns a link into the panel where you paste the value yourself. The value never passes through the assistant, on purpose: a key in a tool call is a key in the transcript and in every log between, so no tool here takes one. The site has to have been deployed once first, because the value is written by republishing its current version with one more binding; after that every deploy carries it forward without anyone reading it. DATABASE_URL is not one of these.
Lists the secret names a site’s functions can read, and whether each has been given a value yet. Never a value: the platform writes them onto the site and cannot read them back. It is how an assistant checks that a key you were asked to set has arrived before debugging the route that reads it.
Reads back what was deployed: the file list of a stored version, or the contents of one file. It is how a site written in one conversation is changed in a later one, by an assistant that was not there when it was written, and it is how the code leaves here at all. Text comes back as text, including source this platform has no content type for; binary files are listed with their size and fetched from the site itself. It reads only what that version’s own manifest lists, so a path cannot be pointed at anything else.
Keeps a short brief with a site: what it is for, what its tables hold, what you decided and what you want next. read_site shows it above the files, so the next assistant to work on the site — in another conversation or another app — starts from what you meant, not only from the code. Each writing replaces the brief and the earlier ones are kept, so nothing is lost by rewriting it. At most 6,000 characters; never a password or a key.
Says which of your sites have failed in front of visitors recently, or, for one site, which routes failed, when, and how many times — the runtime’s own verdict: 503 means the request was stopped at a resource limit, 500 means the code threw or made too many outbound requests, and those two cannot be told apart. It is not what a function printed; there is still no way to read that. The record is counted per route and per hour, kept seven days, and best-effort: a failure the platform did not hear about is not in it. No query string, header or body is ever kept.