slcli — Storylane CLI
Bulk-edit Storylane demos from the command line.
slcli lets you export a demo's text and AI voiceovers to an Excel spreadsheet, edit them offline, and push the changes back. It's significantly faster than clicking through every widget in the web UI when a demo has more than a handful of steps.
Unofficial. This tool talks to Storylane's private API — the same one their web app uses — and is not endorsed by Storylane. Behaviour may break if their API changes.
Install
pipx install storylane-cli
Or with uv:
uv tool install storylane-cli
The installed command is slcli (the PyPI package name is namespaced, but the binary stays short).
Or run without installing
For a one-off invocation, uvx fetches and executes the package ephemerally:
uvx storylane-cli login
uvx storylane-cli export <project-id>
Under uvx the command is storylane-cli rather than slcli, since uvx runs the script whose name matches the package.
Quick start
# 1. Log in once (the auth token is cached in your OS keyring).
slcli login
# 2. Export a demo's text content to an Excel file.
slcli export <project-id>
# 3. Open output/texts.xlsx, fill in the `new text` and/or `new voiceover`
# columns on the rows you want to change. The other columns are protected.
# 4. Push the edits back.
slcli update
The project ID is the UUID in the demo's URL inside the Storylane web app — e.g. https://app.storylane.io/project/78f4ee34-51fd-11f1-84bd-e41fd5b9abcb.
Commands
slcli login
Prompts for your Storylane email and password, calls POST /api/v1/login, and stores the returned bearer token in your OS keyring (macOS Keychain, Windows Credential Manager, or Secret Service on Linux). All subsequent commands use the cached token silently.
slcli login # interactive
slcli login --email you@corp.com # skip the email prompt
slcli logout
Clears the cached token from the keyring.
slcli export <project-id>
Fetches the project and writes output/texts.xlsx with one row per widget. Columns include the widget's HTML and markdown text, the page URL, the CTA label, and two empty editable columns: new text and new voiceover. The sheet is locked except for those two columns, so you can't accidentally damage the metadata columns that slcli update uses to identify widgets.
slcli export <project-id>
slcli export -x demo-edits.xlsx <project-id> # custom output path
slcli export -o ./dump <project-id> # also save the raw API JSON
slcli update
Reads an edited xlsx and PATCHes each widget that has a non-empty new text or new voiceover cell. Markdown in new text is rendered to HTML before being sent. new voiceover cells trigger a TTS regeneration: the text goes to Storylane's TTS endpoint, the resulting mp3 is uploaded through their S3 bucket, and the widget's audio_url, media_duration, and transcription_options.prompt are updated together.
The project ID is read from the xlsx — no need to repeat it.
slcli update # read output/texts.xlsx
slcli update -x demo-edits.xlsx # custom input
slcli update --yes # skip the confirmation prompt
slcli update --voice-name brian # voice for widgets that have none
slcli update --voice-name matilda --voice-override # force this voice everywhere
slcli update --voice-id nPczCjzI2devNBz1zQrb # by id if you prefer
By default, when a widget already has an assigned voice, slcli update keeps it and --voice-name / --voice-id only apply as a fallback for widgets that have no voice yet. Pass --voice-override to force the CLI-provided voice everywhere.
slcli voices
Lists the TTS voices available in your Storylane account (typically over 100). Useful for finding a voice_id or a voice_name.
slcli voices # pretty table on stdout
slcli voices -x voices.xlsx # browsable spreadsheet, includes preview_url
slcli voices --all # include legacy/deprecated voices
How it works
slcli authenticates by POST /api/v1/login and reuses the returned auth_token as a bearer token for the rest of Storylane's private API. The token lives in your OS keyring; --key overrides it for one-off invocations without touching the cache.
- Export pulls
GET /api/v1/company/projects/<id>plus thepagesandthemesendpoints, then writes the xlsx using save-as-xlsx. - Update reads the xlsx with
openpyxl, converts markdown withmarkdown-it-py, regenerates audio viaPOST /api/v1/ai/transcriptions→ S3 upload →POST /api/v1/uploads, computesmedia_durationlocally withmutagen, and PATCHes each widget at/api/v1/company/projects/<pid>/flows/<fid>/widgets/<wid>. - Voices is a thin wrapper around
GET /api/v1/ai/transcriptions/voices.
If a request returns 401, slcli prints a hint telling you to run slcli logout (which clears the stale token so the next command re-prompts via slcli login).
License
MIT — see LICENSE.
Metadata
Release files for storylane-cli 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| storylane_cli-0.1.1.tar.gz | 9.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| storylane_cli-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.2 kB
Release files / storylane_cli-0.1.1.tar.gz
| Download URL | storylane_cli-0.1.1.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
55393ba8ef32ca3611776dca58edb3322246899bcbb47fb46c2baf3e7764a1c0
|
|
BLAKE2b-256 checksum How to use checksums |
78936628c6c5dcd288b64c2342a7eeaed2f61e3b1c19b194db31ac1328f02d3c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / storylane_cli-0.1.1-py3-none-any.whl
| Download URL | storylane_cli-0.1.1-py3-none-any.whl |
|---|---|
| Size | 10.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e2bf9515b3fd76b3a6097e4b83ffddfd1acc752e68e086480b46a4f4cca1a3a2
|
|
BLAKE2b-256 checksum How to use checksums |
782610af0b1101d13b5b5f50a4bdf15d38aba981a64fdd21ee6b195e58dcdf55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for storylane-cli 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.