Docs/Cloud
Docs/Cloud
Publishing & versions
The immutable-version model, slugs, visibility, tags, and how recipes travel with a publish.
Publishing & versions
A publish takes an HTML file, expands its recipes, and stores a frozen artifact served at a URL. This page covers the model behind that: versions, slugs, visibility, and what actually gets uploaded.
Immutable versions
Every publish and every update creates one new immutable version. Prior versions are frozen and retained; nothing is overwritten in place. A publish mints a new page (version 1) at a fresh URL. An update adds a version to an existing page and keeps the same URL.
shortwind cloud publish ./page.html # -> page, v1, new URL
shortwind cloud update pg_abc123 ./page.html # -> same URL, v2
Use shortwind cloud get <id> to see a page’s full version
history.
Idempotency
Both publish and update accept --idempotency-key. A retry with the same key
returns the same result instead of creating a duplicate version, so an agent can
safely re-send a request after a network hiccup:
shortwind cloud publish ./page.html --idempotency-key launch-2026-07-10
Slugs and URLs
Free pages serve at a per-page subdomain on shortwind.app:
https://<slug>.shortwind.app
Pass --domain <slug> to choose the slug; omit it and one is assigned. If the
slug you want is taken, publish returns a 409 and the CLI prints the id of the
page already holding it, plus the update command to reuse it.
On Pro, a bound custom domain also serves every page at your-domain/<slug>.
See custom domains.
Visibility
Every page is public, unlisted, or private. Set it at publish time with
--visibility, or change it later without republishing:
shortwind cloud publish ./page.html --visibility private
shortwind cloud visibility pg_abc123 public
- public: served to anyone and discoverable.
- unlisted: served to anyone with the URL, not discoverable.
- private: not served publicly.
Tags
Attach tags at publish time (--tag, repeatable) and filter on them in find.
Tags are how an agent groups and re-locates its own pages:
shortwind cloud publish ./page.html --tag launch --tag q3
shortwind cloud find --tag launch
How recipes travel with a publish
Recipes are optional. Plain HTML is uploaded and served untouched. This section
only applies when a page uses @recipe shorthand and you publish from a project
that has a recipes/ directory: Cloud then expands the shorthand server-side,
and the publish carries what the expander needs:
html: your source, with@recipeshorthand still in theclassattributes.lockfile: pins the recipe versions the expansion resolves against.recipes: only the family bodies your page actually touches, not your whole palette.css(optional): extra CSS to include.
The CLI assembles this for you. It reads the palette from the recipes/
directory of the project you run publish in (it walks up from the current
directory to find one); if there is no such project, the palette is empty and
only plain HTML will publish cleanly. The publish itself is the sync: there is no
watcher and no separate sync step. A recipe edit only affects the next publish
that carries it, and published pages stay frozen against the version they
shipped with.
One practical rule: compose pages only from recipes that are actually present. A
recipe that is missing expands to nothing and goes out as raw text. Run
shortwind cloud skill to print the palette available where
you are publishing from.
Multi-page publishes
A single publish can ship more than one page. Pass --bundle and point it at an
entry file; the CLI publishes that file’s whole directory as one linked unit
under a single slug:
shortwind cloud publish ./site/index.html --bundle --domain handbook
- The entry file (
index.htmlabove) serves at the slug root:https://handbook.shortwind.app. - Every other
.htmlfile in the directory serves at its authored path:site/about.htmlbecomeshttps://handbook.shortwind.app/about.html,site/docs/guide.htmlbecomes.../docs/guide.html. - Links between pages are ordinary relative links (
<a href="about.html">,<a href="../index.html">). They resolve exactly as written, because each file is served at the path you authored it at. No rewriting, no absolute URLs.
The whole unit is one page as far as the rest of Cloud is concerned: it has one slug, one visibility, one version, and a takedown or delete affects all of its pages together.
A few constraints for this first release:
.htmlfiles only. CSS, JS, and images in the directory are not bundled yet; style with inline CSS or a CDN (for example the Tailwind CDN) for now.- Relative links only. A root-absolute link (
/about.html) is treated as a site-root link, not a bundle link. - Re-publishing updates in place. Publishing a bundle to a slug your account already owns updates it: the entry keeps its URL, a new immutable version is appended (prior versions retained), and added/removed sub-pages are reflected. A slug held by a non-bundle page, or by a deleted/quarantined one, still 409s.
- Caps: up to 2000 files and 50 MB per bundle.
Finding and removing pages
shortwind cloud find --q "launch" # search your pages
shortwind cloud get pg_abc123 # metadata + version list
shortwind cloud delete pg_abc123 # tombstone the page (prompts unless -y)
Deleting tombstones the page so it stops resolving. See trust & safety for how abuse takedowns differ from a user delete.