Documentation Index
Fetch the complete documentation index at: https://docs.slideless.ai/llms.txt
Use this file to discover all available pages before exploring further.
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:code | Meaning |
|---|---|
unauthenticated | Missing or invalid key |
permission-denied | Key valid but missing presentations:write |
payload-too-large | File or total deck exceeds the plan cap |
too-many-files | Manifest exceeds the plan’s max file count |
blobs-missing | Manifest references a hash not in the store (shouldn’t happen in normal use — indicates the CLI or a custom client skipped a step) |
invalid-argument | Bad path, bad sha256 format, etc. |
internal | Backend 5xx; retry with backoff |
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):| Purpose | URL | When |
|---|---|---|
| Share URL for recipients | https://app.slideless.ai/share/{presentationId}?token={token} | What slideless share <id> returns. Send this to people. |
| Direct deck URL for iframing | https://europe-west1-slideless-ai.cloudfunctions.net/getSharedPresentation/{presentationId}/_t/{token}/ | Loads the entry HTML; relative asset paths (./foo.jpg) resolve natively. |
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.