Skip to main content

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.

Goal

By the end of this page you’ll have a public share URL pointing at a presentation you uploaded with the slideless CLI — either a single self-contained HTML file or a folder with images, videos, or 3D assets.

Prerequisites

  • Node.js 20+ (node --version to check)
  • An email you can check
  • A deck to share. Either a single HTML file, or a folder with an index.html plus sibling assets. See the Generate with Claude guide if you need to make one.
No Slideless account yet? That’s fine. Step 2 creates one.

Step 1 — Install the CLI

npm install -g slideless
slideless --version
If npm install -g is blocked, npx slideless ... works for any command.

Step 2 — Request a signup code

slideless auth signup-request --email you@example.com
This emails a 6-digit code to you@example.com and exits. The email arrives in a few seconds. See cli/auth if you hit any error.

Step 3 — Complete signup

Check your inbox for the code, then (--first-name is required):
slideless auth signup-complete --email you@example.com --code 123456 --first-name "Alex"
Output:
✓ Signup complete

  Name:          Alex
  Organization:  Alex's workspace
  Org ID:        4XYwOrZ8...
  Profile:       alexs-workspace (now active)
  API key:       cko_xxxx...  (scopes: presentations:write, presentations:read)

  Try it:  slideless whoami
Your cko_ key is now stored in ~/.config/slideless/config.json (mode 0600) and set as the active profile. You can pass extra flags like --last-name "Morgan", --company "Acme", --brand-primary "#0a0a0a", or --logo ./logo.png to fill in user/organization details at the same time — see cli/auth for the full list.

Step 4 — Push your first presentation

Option A: single HTML file

Save a minimal deck.html:
<!doctype html>
<html><head><title>Hello</title></head>
<body><h1>Hello, Slideless</h1></body></html>
Upload it:
slideless push ./deck.html --title "My first deck"

Option B: folder with assets

Create a folder:
my-deck/
├── index.html
├── styles.css
└── images/
    └── hero.png
index.html:
<!doctype html>
<html>
<head><link rel="stylesheet" href="./styles.css"></head>
<body>
  <img src="./images/hero.png" alt="Hero">
  <h1>Hello, Slideless</h1>
</body>
</html>
Upload the folder — the CLI walks it, hashes every file, and uploads only what’s missing on the backend (later pushes will skip unchanged files):
slideless push ./my-deck --title "My first deck"
Either way the output looks like:
📦 Deck:  ./my-deck
📝 Entry: index.html
📁 Files: 3 (42 KB)

  → Prechecking…
  ↑ [1/3] images/hero.png (38 KB)
  ↑ [2/3] index.html (287 B)
  ↑ [3/3] styles.css (154 B)
  → Committing version…

✓ Presentation pushed

  Share ID:        0192f1c3-...
  Version:         1
  Assets uploaded: 3
  Assets deduped:  0
  Total bytes:     42 KB
A slideless.json was also written at the folder root. That’s how the CLI knows the folder is a Slideless deck — subsequent slideless push calls from here re-publish in place. Don’t edit or delete it.

Step 5 — Mint a public viewer URL

The push created the deck but didn’t publish it. Mint a viewer token:
slideless share 0192f1c3-...
✓ Share URL minted

  Token ID:   0192f1c3-...
  Share URL:  https://app.slideless.ai/share/0192f1c3-...?token=...
Paste the Share URL into a new browser tab. You’ll see your HTML rendered inside the Slideless viewer chrome: fullscreen toggle, download menu, “Made with Slideless” footer. Open it on your phone too. The same URL works everywhere.

Step 6 — Watch the view count

slideless list
Each time the share URL is opened, totalViews ticks up. For per-token view counts:
slideless get 0192f1c3-...

Updating in place

Edit your deck (change the HTML, swap an image), then re-publish from the same folder:
slideless push ./my-deck
The CLI reads slideless.json from the folder, recognises this as an update, and bumps the version. Recipients see the new content on next load. The URL doesn’t change, the view count is preserved, and only files whose contents actually changed re-upload — the rest are deduplicated. A one-image swap on a 200 MB deck transfers ~the size of that one image, not 200 MB.

Pick it up on another device

Already pushed on your laptop and want to keep iterating from your desktop? On the second machine:
slideless pull 0192f1c3-... ./my-deck
cd my-deck
# edit freely…
slideless push
pull writes the same slideless.json at the root so push knows which deck to update. See Collaboration for the conflict model when two machines push concurrently.

Pin a recipient to a specific version

If you emailed v3 to investors and then fixed a typo in v4, you might want the investors to stay on v3 — their token can be frozen:
slideless pin 0192f1c3-... <tokenId> --to-version 3
Put them back on auto-update:
slideless pin 0192f1c3-... <tokenId> --latest
Recipients can never see other versions by URL manipulation — only the owner can browse history. See Versioning.

What just happened

StepBehind the scenes
SignupA Firebase Auth user, a users/{uid} doc, a one-owner organization, and a cko_… key were created atomically; the raw key was returned once and saved locally
Uploaded deckThe CLI hashed every file, precheck’d with the backend, uploaded only the missing blobs (content-addressed by SHA-256), and committed a version manifest
Opened share URLSlideless served the entry HTML plus its assets from private Cloud Storage, inside a sandboxed iframe, and incremented the per-token view counter

Alternative: paste a key from the dashboard

If you already created a key in app.slideless.aiOrganization → API Keys, skip the OTP flow and paste it:
npm install -g slideless
slideless login
# paste the cko_ key when prompted (input is masked)
This does the same thing as signup-complete / login-complete: verifies the key, saves a profile at ~/.config/slideless/config.json, and makes it the active one. Continue from Step 4.

Next steps