Deployable stub for StudioCommand:
- Rust Axum engine serving a static UI
- systemd +
/opt/studiocommandsymlink-based layout
cd engine
cargo run
# open http://127.0.0.1:3000/GET /health->OKGET /api/v1/system/info-> version, arch, cpu, load, temp (best-effort)GET /api/v1/status-> consolidated UI state (queue/log + now-playing + producers + system)POST /api/v1/queue/reorder-> reorder upcoming queue items by UUID (playing item is pinned)GET /admin/api/v1/updates/status-> stub status
Drag-and-drop must be stable across refreshes and multi-client views. Indices are not stable because items can be inserted/removed at any time. The engine therefore assigns each queue item a UUID and the API accepts an ordered list of those UUIDs.
Safety rule: the currently playing item is pinned at index 0 and cannot be reordered.
See packaging/ for install.sh, studiocommand.service, and an nginx template.
curl -fsSL https://raw.githubusercontent.com/ChZeman/StudioCommand/main/packaging/install-online.sh | \
sudo bash -s -- --domain studiocommand.yourstation.org --email you@yourstation.org- If
--versionis omitted, the installer will propose the latest GitHub Release and ask you to confirm. - If
--domainis omitted, the installer will prompt for it. - If
--emailis omitted, the installer uses a self-signed certificate (browser warning) for quick testing. - StudioCommand is served via nginx HTTPS on port 9443.
- Pushing a tag like
v0.1.0triggers GitHub Actions to build x86_64 + aarch64, generate a mergedsha256sums.txt, and publish a GitHub Release automatically with all three files attached. packaging/install-online.shwill verifysha256sums.txtwhen it is present in the Release.
Releases include the browser UI (index.html + assets). GitHub Actions builds the web UI during CI and packages the build output
(web/dist for Vite or web/build for CRA) into the release tarballs.
Releases include the browser UI (index.html + assets) from the web/ directory. At the moment the UI is packaged as static files
(no Node build step required yet).
StudioCommand uses a split model:
- Nginx serves the browser UI directly from disk (
/opt/studiocommand/current/web). - The engine listens privately on
127.0.0.1:3000and serves the API (/api/*) and WebSockets (/ws/*).
This keeps UI deployment simple and avoids coupling the Rust binary to frontend assets.
The queue UI shows Cart + a short ID suffix in the metadata row. This is intentionally verbose so you can validate reorder behavior even when track titles repeat (common in demo data).
StudioCommand persists the current queue ordering to a local SQLite database so restarts keep the same playlist order.
- Default DB path:
/opt/studiocommand/shared/studiocommand.db - Override with:
STUDIOCOMMAND_DB_PATH=/path/to/studiocommand.db
Why SQLite?
- Transactional safety (no partial writes)
- Simple operations (single file)
- Good future fit for ingest/history
Implementation notes:
- Uses
WALjournaling mode +synchronous=NORMALfor a good safety/performance balance. - Queue writes are performed in a single transaction that rewrites the ordered list.