Addresses Important #2 from the final code review. The asset partial was previously included unconditionally for any overlay detail page. Workshop overlays and read-only files-type overlays (when the viewer isn't the owner or admin) have no data-editor-language textarea, so the ~30 KB of Prism + CodeJar + JS + CSS shipped pointlessly. Gate the include on the two cases that actually mount an editor: script-type overlays (bash editor) and files-type overlays where the current user has edit rights (the files-editor modal). I-1 from the review (race window during "Loading…") was confirmed moot — editorDialog.showModal() only fires after the fetch resolves (files-overlay.js:409), so the dialog is invisible during the fetch-and-placeholder window and the user can't type into it. I-3 (Playwright coverage of the language dropdown override) is real follow-up work that needs a new files-type overlay seed in the live_server fixture. Deferred as a v2 ticket. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| alembic | ||
| l4d2web | ||
| tests | ||
| alembic.ini | ||
| pyproject.toml | ||
| README.md | ||
l4d2-web-app
Flask web app for managing L4D2 servers through user-private blueprints.
Key v1 behaviors
- Local username/password login; no public signup
- Admin-managed overlay catalog
- Private blueprints per user
- Server creation from blueprints (live-linked; no per-server blueprint overrides)
- Async job model with persisted command logs in
job_logs - Desired vs actual state model
- Live logs for jobs and servers via SSE endpoints
- Host operations go through
l4d2ctlvia a local host command runner, not directl4d2hostimports
Frontend constraints
- Server-rendered templates (Jinja)
- Vendored HTMX (
static/vendor/htmx.min.js) - Custom CSS only
- Tokenized, consistent link and accent colors
Development
From the workspace root (../):
uv sync # creates .venv, installs l4d2host + l4d2web editable, plus dev deps
uv run pytest l4d2web/tests -q
Configuration
The web app reads these settings from the environment:
DATABASE_URL: SQLAlchemy database URL, for examplesqlite:////var/lib/left4me/left4me.db.SECRET_KEY: Flask secret key used for sessions and CSRF-sensitive state.JOB_WORKER_THREADS: number of background job worker threads.
In the systemd deployment, environment is loaded from /etc/left4me/host.env and /etc/left4me/web.env.
Admin Bootstrap
Create the first admin account with the Flask CLI. Provide the password through LEFT4ME_ADMIN_PASSWORD:
LEFT4ME_ADMIN_PASSWORD='change-me' flask create-user <username> --admin