Each active request in the kiosk Live Queue now displays its
request number before the customer name (e.g. #42 jess) so
multiple requests from the same email can be distinguished.
Bumps version to 0.5.4.
- Added a third kiosk slide showing the active customer queue.
- Customer names are derived from the local-part of their email address.
- Statuses are mapped to friendly labels:
pending -> Received
prompt_ready / songs_uploaded -> Trollgorithm Recording in Studio
revisions_requested -> Waiting for Customer Response
awaiting_payment -> Payment Due
- Completed/delivered statuses are not shown.
- If the queue overflows, a note points customers to the status page.
- Added queue-only mode (kiosk_cycle_seconds = 1) and updated the
cycle logic to rotate QR -> pricing -> queue.
- Updated /admin/settings help text for the new mode.
Bumps version to 0.5.3.
Operators can now select Version A and/or Version B in the Upload Songs
section and click 'Delete Selected Songs'. The handler removes the
chosen MP3 files, clears their DB paths, resets customer_approved to
'none', and sets the request status back to 'prompt_ready' so new
songs can be uploaded.
Bumps version to 0.5.1.
The final delivery email now appends a Song Lyrics section in the same
format shown on the customer player page: section headers like
[Chorus] are stripped, blank lines are preserved as stanza breaks,
and the lyric lines are rendered as plain text.
Bumps version to 0.4.8.
- Added a required Pronouns dropdown to /request and /admin/request:
He/Him/His, She/Her/Hers, They/Them/Their.
- Moved Email to the top of the customer request form; Pronouns sit just below Name.
- Added column to the requests schema with automatic migration.
- Stored pronouns are included in confirmation emails and Hermes prompt copy.
- Fixed /admin/request so Preferred singer voice / gender is a dropdown
matching the customer form instead of a free-text input.
- Updated README to describe pronouns and the structured style selectors.
Bumps version to 0.4.7.
The customer request form previously had an open 'Style / genre / mood'
text field, which produced inconsistent genre descriptions and confused
Suno. Replace it with three dropdowns:
- Decade / era (required) — loaded from /mnt/Storage/Decades.txt
- Basic style (required) — loaded from /mnt/Storage/Music Genres.txt
- Additional style (optional) — same genre list
The combined value is stored in the existing style_genre column as a
comma-separated string (e.g. '1980's, Pop, Funk'), so no schema change
is required. The admin request page exposes the same dropdowns for
corrections, and the copy-to-Hermes prompt formats the style as a clean
sentence like '1980's-era Pop with Funk influences'.
The canonical lists live in /mnt/Storage; bundled copies under lists/
act as a fallback when that mount is unavailable in the container.
Bumps version to 0.4.6 and updates README.
The signed callback token for /api/prompt/<rid> expired after 1 hour.
That was too short for a workflow where the operator may copy the URL and
paste it to Hermes, then wait for a response. Extend to 7 days.
Also fixes the misleading 401 on expired tokens (token check runs before
API key check). The new /api/key-test endpoint lets callers verify the
API key independently.
Bump version 0.4.4 -> 0.4.5.
Provides a simple GET endpoint that validates the Authorization Bearer
token against HERMES_API_KEY and returns JSON:
{"ok": true, "reason": "valid"} or
{"ok": false, "reason": "key_mismatch" / "missing_bearer" / "not_configured"}
Rate limited to 4 per minute to prevent brute-force guessing.
Bump version 0.4.3 -> 0.4.4.
The previous schema migration added revision_count as TEXT. SQLite stores
the default as TEXT, but the app does integer arithmetic on it, causing:
TypeError: unsupported operand type(s) for -: 'int' and 'str'
- init_db() now adds revision_count as INTEGER.
- app.py casts revision_count to int in play() and revise() and when
incrementing in revise(), so existing TEXT values also work.
Bump version 0.4.2 -> 0.4.3.
Deployed databases can persist without the revision_history table,
causing /play/<token>/revise to crash with sqlite3.OperationalError.
- log_revision() now creates the table on the fly if it is missing.
- app.py runs init_db() at import time (safe CREATE TABLE IF NOT EXISTS)
so new deployments auto-create missing tables on startup.
Bump patch version 0.4.0 -> 0.4.1.
/api/prompt/<rid> previously rejected any request not in 'pending'
status. This blocked the revision workflow from using the callback.
Now the endpoint accepts 'pending' (sets status to 'prompt_ready') and
'revisions_requested' (keeps status as 'revisions_requested' so the
operator still sees it needs new song uploads).
- New VERSION file at project root, starting at 0.3.0.
- config.py reads VERSION and exposes it as Config.VERSION.
- Admin settings page now renders the live version from config.
- Semantic versioning convention: MAJOR for breaking/user-facing changes,
MINOR for new features, PATCH for bug fixes and small polish.
The customer player page (/play/<token>) and revision endpoint were
reading max_revisions directly from booth_settings.json, where it is
stored as a string. Arithmetic/comparison with revision_count (an int)
raised TypeError and caused a 500 error when opening the customer player.
Add get_max_revisions() helper that always returns a non-negative int,
and use it in play(), revise(), and admin_settings().
The regenerate button stores encrypted keys, but legacy/manual writes may
save plaintext. get_hermes_api_key now falls back to returning the raw
value if Fernet decryption fails.
Previously passed the entire runtime_settings dict as metadata, which could
clobber/overlap email form fields. Now only artist/album/year/comment are passed.
- Disable checkboxes, payment ref input, and submit button in admin UI when customer has not approved.
- Add server-side guard in mark_paid_deliver action.
- Replace /audio/<token>/<v>.mp3 with /api/stream/<token>/<v>.mp3.
- Stream bytes from private storage with Accept-Ranges and Content-Range support.
- Keep old /audio route returning 404.
- Update player page JS to use new stream endpoint.
- Refresh app.py module and route docstrings for runtime settings,
MP3 tagging, rate limiting, revision workflow, and admin actions.
- Clarify config.py and models.py comments.
- Update template comments/CSS for dashboard filters, request detail,
player page, and settings page.
- Rewrite README.md with current features, status flow, file layout,
deployment variables, and troubleshooting.
- Refresh REVIEW.md quick-reference.
- Add MAX_REVISIONS to docker-compose.yml environment list.
- Expand requirements.txt comment coverage.
No version history or changelog included.