slideless
v0.5.0
Published
Official CLI for the Slideless presentation hosting platform: push, pull, share, invite collaborators, and manage HTML presentations from your terminal.
Downloads
399
Maintainers
Readme
slideless
The official CLI for Slideless — share, update, list, and inspect HTML presentations from your terminal.
Install
npm install -g slidelessQuickstart
# 1. Authenticate
slideless login
# (paste your cko_ key from the dashboard — or use `slideless auth signup-request`
# + `signup-complete` to create an account from the terminal)
# 2a. Share a folder with assets (images, video, 3D models, CSS, JS)
slideless share ./my-deck --title "Q3 Pitch"
# → Returns a public share URL. Relative paths in index.html just work.
# 2b. Or share a single HTML file
slideless share ./my-deck.html --title "Q3 Pitch"
# 3. Update in place (URL stays the same, view counts preserved,
# unchanged assets are deduplicated by SHA-256)
slideless update <shareId> ./my-deck
# 4. Pin a specific recipient to a specific version
slideless pin <shareId> <tokenId> --to-version 2
slideless pin <shareId> <tokenId> --latest # undo
# 5. List your presentations
slideless list
# 6. See details (including per-token view counts + version modes)
slideless get <shareId>Authentication
Two ways to get a cko_ API key:
From the terminal (signup / login without a browser). Email-based OTP flow, designed to work from CI or from an agent:
# First time — creates account, org, and API key in one go slideless auth signup-request --email [email protected] # (check inbox for 6-digit code) slideless auth signup-complete --email [email protected] --code 123456 # Existing account — mints a fresh API key slideless auth login-request --email [email protected] slideless auth login-complete --email [email protected] --code 123456The API key is saved as a profile in
~/.config/slideless/config.jsonand set as active automatically. Pass--company "Acme",--description "...",--brand-primary "#hex",--logo ./logo.png, etc. tosignup-completeto fill org details (all optional; company defaults to "My Organization").From the dashboard. Paste the key from
https://app.slideless.ai→ API Keys intoslideless login.
Three ways to provide a key, resolved in this order:
--api-key <key>flagSLIDELESS_API_KEYenvironment variable- Active profile saved by
slideless login/slideless auth signup-complete/slideless auth login-complete(stored at~/.config/slideless/config.json, mode 0600)
Profiles
Switch between multiple keys (e.g., personal vs team org):
slideless login --name personal
slideless login --name work
slideless use # list profiles
slideless use work # switch active
slideless whoami # show current identityMachine-readable output
Every command supports --json for stable, scriptable output:
slideless list --json
slideless share ./deck.html --title "Demo" --jsonJSON shape:
{ "success": true, "data": { ... } }or on failure:
{ "success": false, "error": { "code": "...", "message": "..." } }Commands
| Command | What it does |
|---|---|
| slideless auth signup-request --email X | Email a signup OTP to a new user. Refuses if the email already has an org. |
| slideless auth signup-complete --email X --code 123456 | Verify the OTP; create user + org + API key; save as active profile. |
| slideless auth login-request --email X | Email a login OTP to an existing user. |
| slideless auth login-complete --email X --code 123456 | Verify the OTP; mint a fresh API key; save as active profile. |
| slideless login | Save an API key and verify it (paste from dashboard). |
| slideless logout [name] | Remove a profile. |
| slideless whoami | Show the active identity. |
| slideless use [name] | List or switch profiles. |
| slideless verify | Validate the active key against the backend. |
| slideless share <path> | Upload a deck (folder or .html). --title required. --entry <file> for folder mode (default index.html). --update <shareId> to replace existing. --strict to fail on unresolved refs. |
| slideless update <shareId> <path> | Replace the deck at an existing share (folder or file). URL unchanged, unchanged files deduplicated. |
| slideless pin <shareId> <tokenId> | Pin a token to a version (--to-version N) or follow latest (--latest). |
| slideless list | List your presentations. |
| slideless get <shareId> | Show details for one presentation, including per-token view counts and version modes. |
| slideless token add <shareId> --name "..." | Mint a new named share token on an existing presentation. |
| slideless revoke <shareId> [--token <tokenId>] | Revoke a single token, or archive the whole presentation. |
| slideless share-email <shareId> --to <email> | Email a deck to up to 20 recipients with per-recipient tracked tokens. |
| slideless config show\|set\|clear | Manage the config file. |
Error codes for agents
Every auth command supports --json and returns a stable error shape with a nextAction string an agent can parse and follow:
{
"success": false,
"status": 409,
"error": {
"code": "USER_ALREADY_HAS_ORGANIZATION",
"message": "This email already has an organization.",
"nextAction": "Run `slideless auth login-request --email [email protected]` to get a new API key instead."
}
}Common codes: EMAIL_INVALID, OTP_RESEND_COOLDOWN (wait ~30 s), OTP_NOT_FOUND, OTP_EXPIRED, OTP_INVALID, OTP_ALREADY_USED, OTP_LOCKED_OUT, OTP_PURPOSE_MISMATCH, USER_ALREADY_HAS_ORGANIZATION, USER_NOT_FOUND, USER_HAS_NO_ORGANIZATION, COMPANY_NAME_TOO_LONG, BRAND_COLOR_INVALID, LOGO_TOO_LARGE, LOGO_INVALID_FORMAT, LOGO_DECODE_FAILED, INVALID_EXPIRES_IN_DAYS, INTERNAL.
Configuration
Stored at ~/.config/slideless/config.json (or $XDG_CONFIG_HOME/slideless/config.json). Permission 0600. Created automatically by slideless login.
| Env var | Purpose |
|---|---|
| SLIDELESS_API_KEY | API key (overrides active profile). |
| SLIDELESS_API_BASE_URL | Override backend URL (e.g. for staging or a local emulator). |
License
MIT
