Skip to main content

lumio deploy

Upload a built extension bundle to Lumio as a new version. The version starts in draft status and must go through the submission wizard to enter the review process.

Usage​

lumio deploy [-v <version>] [-d <description>] [--breaking] [--draft] [--token <token>]

Example​

# Build first, then deploy
lumio build
lumio deploy -v 1.2.0 -d "Added live score updates from ESPN"

Or let it read the version from lumio.config.json automatically:

lumio deploy -d "Fixed score display alignment"

Options​

FlagAliasDescription
--version <semver>-vVersion string (default: reads from lumio.config.json)
--description <text>-dRelease notes / changelog for this version
--breaking—Flag this version as a breaking change (disables auto-update for existing installs)
--draft—Upload as draft without triggering the submission flow (default behavior — this flag is explicit)
--token <token>—API token for authentication (skips interactive login). Also reads from LUMIO_TOKEN env var
--outdir <path>—Location of the built bundle (default: dist)

Pre-flight checks​

Before uploading, the CLI runs these validation checks:

  1. Sound file format — each file in dist/sounds/ is validated against the supported audio formats (MP3, WAV, OGG, WebM, M4A, AAC, FLAC) and checked for existence
  2. Sound count — the number of sound files is checked against the resolved max_sounds limit (fetched from the API via GET /v1/developer/extensions/{id}/limits)
  3. Per-file size — each sound file is checked against the resolved max_sound_file_size limit
  4. Total storage — the combined size of all sound files is checked against the resolved max_sound_storage_bytes limit
  5. Manifest validation — lumio.config.json is validated against the extension schema

If any check fails, the deploy is blocked with a descriptive error message.

What happens on deploy​

  1. CLI reads lumio.config.json and validates the extension
  2. All built files from dist/ are collected (JS, CSS, HTML, images, fonts, video, audio, JSON, Lottie, source maps)
  3. Sound files placed in dist/sounds/ are registered as extension-bundled sounds — they appear in the account's sound library when the extension is installed
  4. Each file is uploaded individually as a multipart files field alongside source.tar.gz, manifest, and release notes
  5. A new ExtensionVersion record is created with status draft
  6. Files are stored via lo-storage (S3/R2/local) at {extension_id}/versions/{version}/{file_path}
  7. Each file gets a row in extension_version_files with content-type, size, and content hash

Supported file types​

CategoryExtensions
Code.js, .css, .html, .map
Images.png, .jpg, .jpeg, .gif, .svg, .webp, .avif, .ico
Video/Audio.mp4, .webm, .ogg, .mp3, .wav
Fonts.woff, .woff2, .ttf, .otf, .eot
Data.json, .lottie

Size limits​

LimitValue
Per file10 MB
Total upload50 MB
Max files per version200
Deploying Sports Scoreboard v1.2.0...

Uploading 8 files (1.2 MB total)...
layer.js 312 KB application/javascript
editor.js 525 KB application/javascript
styles.css 24 KB text/css
assets/logo.png 89 KB image/png
...
Upload successful. Status: draft
Submit for review via the dashboard or `lumio status`.

Backward compatibility​

Older CLI versions that send a single bundle field continue to work. The API treats the single bundle as bundle.js and processes it through the same pipeline.

CI/CD deployment​

In CI environments, authenticate with either the LUMIO_TOKEN environment variable or the --token flag:

# Via environment variable
LUMIO_TOKEN=${{ secrets.LUMIO_TOKEN }} lumio deploy -v 1.2.0 -d "Automated release"

# Via --token flag
lumio deploy -v 1.2.0 -d "Automated release" --token ${{ secrets.LUMIO_TOKEN }}

The CLI detects CI=true and skips interactive prompts. When --token is provided, it takes precedence over the stored credential.

Breaking changes​

Mark a version as breaking to prevent auto-updates for users who have not manually reviewed the breaking change notes:

lumio deploy -v 2.0.0 --breaking -d "Storage format changed — manual migration required"

Breaking versions show a notice in the extension store and require users to manually accept the update.

Exit codes​

Exit codeMeaning
0Deployment succeeded
1Authentication error (run lumio login)
2Validation error (missing build, invalid version, etc.)
3Upload error (network failure, rate limit)
4Extension not found (invalid Extension-ID)