Deployment check

Eggbox Investor Showcase · stub app · 7 Oct 2026

If this page has styling and colour, static files are serving correctly (Problem 3 solved). An unstyled wall of black text means the symlink is missing.

The four known failure modes

PASS
1 · Passenger is running the right Python
Running 3.12.2 from /usr/bin/python3.12. Flask 3.1.2. If this page rendered at all, the interpreter is correct.
PASS
2 · Logs are being written
This request was logged to logs/app.log. Startup goes to logs/passenger_stderr.log. Duplicate-handler guard is in place, so Passenger reloads won't multiply log lines.
PASS
3 · Static files resolve
Serving from /home/broody/qr_app/static — an absolute path pinned to app.py, not the working directory.
TESTING
4 · Nested routes reach Flask
Checking /check/routing/deep. In the program manager, Apache passed / through untouched but mangled every path with segments, so every page except the dashboard returned 500. This is the probe for that.

Can this app store data?

PASS
Disk writes to data/
Appended a line to a .jsonl file, read it back and verified it parsed — the exact pattern responses.jsonl will use. Path: /home/broody/qr_app/data

Environment

Public host
www.event.broodylondon.com
Scheme
https
Server
Apache/2.4.68 (cPanel) OpenSSL/3.5.5 mod_bwlimited/1.4 Phusion_Passenger/6.1.8
Under Passenger
yes
App directory
/home/broody/qr_app
Working directory
/home/broody/qr_app
Server time (UTC)
2026-09-22T13:05:04+00:00
Server time (local)
2026-09-22T14:05:04  BST
Uptime
2282s since last restart
Server clock matters more than it looks. Responses are timestamped, and the two-step form relies on ordering events correctly across the break. If local time above is wrong, timestamps go in UTC only.

Live probes

TESTING
POST round-trip
Submitting to /api/echo — the interest form is a POST.
TESTING
Write via POST
Calling /api/write-test the way a real submission would.

Once every check above passes, this URL is locked — every QR code printed on a badge points here permanently. Confirm the subdomain is the one we want before the first badge is printed.