When to use this
You want to upload a presentation from somewhere other than the dashboard or a Claude session. For example:- A CI/CD job that publishes a release deck on every tag
- A cron task that re-publishes a daily metrics deck
- Any custom integration
Prerequisites
- Node.js 20+ on the runner
- An organization API key with
presentations:write(see API keys) - The deck you want to share — a folder or a single
.htmlfile, within your plan’s size caps (see Presentations)
Install the CLI on the runner
npx slideless ... instead.
Authenticate non-interactively
Pass the key through an environment variable. The CLI readsSLIDELESS_API_KEY automatically when no profile is configured:
Push a folder
Single-file alternative
Strict mode for CI
In CI you probably want unresolved references (typos, missing files) to fail the build rather than just warn:Re-publish to the same URL
Ensure the deck folder still contains itsslideless.json (written by the first push), then:
slideless.json, sends expectedBaseVersion, and commits a new version to the same presentationId. Only changed files re-upload — the rest are deduplicated.
If the CI runner doesn’t persist the working copy between runs (fresh clone each time), you have two choices:
- Commit
slideless.jsoninto your repo so it comes back with each clone. - Save the
presentationIdin a CI secret andslideless pull "$SHARE_ID" ./my-deckbefore running your build step, thenslideless push ./my-deck --json.
409 conflict. Pull and retry, or pass --force to overwrite.
The upload protocol under the hood
slideless push is a thin wrapper around three HTTP endpoints:
POST /precheckAssets— send a list of SHA-256 hashes, get back which ones the backend doesn’t have.POST /uploadPresentationAsset— multipart upload of one missing blob (content-addressed; server re-verifies the hash).POST /commitPresentationVersion— send the manifest (list of{path, sha256, size, contentType}), backend validates every hash exists, writes the manifest, bumpscurrentVersion.
Errors
The CLI maps backend HTTP statuses to short codes. Common ones:
Static-scan errors emit
invalid-argument with a details list of the offending references (e.g. ../outside/foo.jpg).
Two URLs, two purposes
Don’t confuse the share URL (what you give recipients) with the direct deck URL (what the dashboard iframe embeds):
The share URL wraps the direct deck URL in chrome (download button, fullscreen toggle, footer). The direct URL is the raw rendering surface.
Next
- CLI command reference — Every command and flag.
- Collaboration — Cross-device push/pull and the conflict model.
- Working with assets — Folder layout, ignore rules, relative path behavior.