# Conference Poll — Hi-Acts 3rd Network Meeting **Developed by TXproducts | June 2026** --- ## What this is A self-paced live polling web app for the Hi-Acts 3rd Network Meeting at DESY Hamburg (10 June 2026). Attendees scan a QR code, answer 10 questions on their phone, and can view live results afterwards. Results update automatically every 2.5 seconds. --- ## File structure ``` conference_poll/ ├── app.py Main server file (questions, routes, logic) ├── requirements.txt Python dependencies ├── static/ │ ├── attend_qr.png QR code image shown on the join slide (replace before go-live) │ └── logo.svg TXproducts logo └── templates/ ├── poll.html Attendee poll page (phone/tablet friendly) ├── join.html QR code beamer slide (desktop, shown on projector) ├── display.html Live results page (bubble chart + per-question analysis) ├── question_view.html Single question bubble chart (linked from display page) └── admin.html Internal raw results view (not public-facing) ``` --- ## Pages | URL | Purpose | Who sees it | |-----|---------|-------------| | `/` | Attendee poll | Everyone who scans the QR | | `/join` | QR code slide | Shown on projector/beamer | | `/display` | Live results with bubble chart | Anyone with the link | | `/q/1` — `/q/10` | Per-question bubble chart | Linked from display page | | `/admin` | Raw response counts | Internal only | --- ## How to run locally (for testing) **Requirements:** Python 3.10 or higher ```bash cd conference_poll pip3 install -r requirements.txt python3 app.py ``` Then open `http://localhost:5001` in a browser. --- ## Deployment instructions ### Recommended setup (Bluehost VPS or equivalent) 1. Upload the entire `conference_poll/` folder to the server 2. Install dependencies: ```bash pip3 install -r requirements.txt pip3 install gunicorn ``` 3. Run with Gunicorn (production-grade server): ```bash gunicorn -w 2 -b 0.0.0.0:80 app:app ``` Or on port 443 with SSL if HTTPS is configured. 4. The app will be accessible at the server's public IP or domain. ### Before go-live checklist - [ ] Generate a new QR code pointing to the live URL (e.g. `https://poll.txproducts.de`) - [ ] Replace `static/attend_qr.png` with the new QR code image - [ ] Update the URL pill in `templates/join.html` (search for `poll.txproducts.de`) - [ ] Restrict access to `/admin` so it is not publicly accessible (basic auth or IP whitelist) - [ ] Consider adding a database for persistent storage (see note below) --- ## Important: data persistence Currently all responses are stored in memory. If the server restarts during the event, all data is lost. For production, the `answers` dictionary in `app.py` should be replaced with a simple SQLite or PostgreSQL database. The relevant section is clearly marked in `app.py` with the comment "IN-MEMORY DATA STORE". --- ## Security notes - The `/admin` page has no authentication. Restrict it at the server level before deployment. - The Flask `secret_key` in `app.py` should be changed to a long random string for production. - The demo routes (`/demo/stream`, `/demo/status`, `/submit_demo`) are safe to leave in but can be removed if preferred. --- ## Changing questions (content owner: TXproducts) Questions are defined in `app.py` in the `QUESTIONS` list. The web dev team does not need to touch these. The TXproducts team manages question content directly. After any question change, the `QUESTIONS` array in `templates/display.html` (inside the `