A lightweight, dark-themed Windows 11 desktop app for beta testers. Manage test lists, log OBS timestamps, and overlay everything on top of any app — no alt-tabbing required.
![]() Always-on-top overlay — track tests over any app, draggable & adjustable opacity. |
![]() Settings — connect to OBS, configure Supabase sync, customise the hotkey. |
No command line or manual library installation is required.
- Download and extract the complete project folder.
- Double-click
setup_and_run.bat. - Leave the setup window open while the app is running.
On the first launch, the script:
- Installs Python 3.13 for the current Windows user if Python 3.11+ is not already available.
- Creates an isolated
venvinside the project folder. - Installs all pinned app libraries.
- Starts Beta Testing Manager.
Future launches skip installation unless requirements.txt changes. The legacy run.bat launcher uses the same automatic setup flow.
| Requirement | Notes |
|---|---|
| Windows | Windows 10 or 11 |
| Internet connection | Required during first-time setup |
| OBS Studio | Optional; version 28+ for timestamp capture |
| Supabase account | Optional; enables cloud sync |
If Windows Package Manager is unavailable, the launcher securely downloads the official signed installer from python.org and verifies its checksum before running it. The per-user install normally needs no administrator access.
- Create a free project at supabase.com.
- Open SQL Editor → New Query, paste the contents of
supabase_schema.sql, and run it. - Go to Project Settings → API and copy your Project URL and anon public key.
- Enter these in the app during first-run onboarding or in Settings → Account.
config.jsonstores credentials locally in plaintext. Do not commit this file to version control.
- In OBS: Tools → WebSocket Server Settings.
- Check Enable WebSocket server.
- Set a port (default:
4455) and a password. - Click OK.
- Enter the same host/port/password in Settings → OBS inside the app.
python -m venv venv
venv\Scripts\activate
python -m pip install -r requirements-dev.txt
python main.py- You will be prompted to enter a username — this tags all your sessions and CSVs.
- Optionally configure Supabase credentials.
- The main window opens. Configure OBS in Settings → OBS.
- Click New in the left sidebar and give the session a name.
- Click + Add Item in the toolbar and name each system under test.
- For each item you can:
- Tick the checkbox to mark it as Pass.
- Choose a status (Pending / In Progress / Pass / Fail).
- Press ▶ Start to capture the OBS timecode (or wall-clock if OBS is idle).
- Press ■ Stop to capture the end timecode.
- Type notes inline (bug descriptions, observations).
- The app polls OBS every second. When streaming or recording, Start / Stop buttons capture the OBS timer (e.g.
00:12:34.500). - If OBS is not connected, timestamps fall back to the local wall-clock (
ISO-8601). - The OBS status indicator in the toolbar shows:
Connected (idle)/LIVE/REC/Disconnected.
Toggle the floating overlay with the hotkey (default: Ctrl+Shift+O).
- The overlay floats above all normal windows and windowed-fullscreen (borderless) apps.
- Drag it anywhere on screen.
- Adjust opacity with the
αslider in the overlay title bar. - Changes sync with the main window in real time.
Limitation: The overlay cannot appear above exclusive-fullscreen DirectX swap chains (true fullscreen games). Switch those apps to windowed or borderless-windowed mode.
Click 💾 Save & Export at any time.
- Data is saved to Supabase (if configured).
- A CSV is exported. You'll be prompted to choose a save location.
CSV columns: System Name, Status, Start Timestamp, Stop Timestamp, Duration, Notes, Tester, Date.
Filename format: username_sessionname_YYYYMMDD.csv
In Settings → Overlay, edit the hotkey field using pynput format:
| Key combination | pynput format |
|---|---|
| Ctrl+Shift+O | <ctrl>+<shift>+o |
| Ctrl+F1 | <ctrl>+<f1> |
| Alt+F2 | <alt>+<f2> |
Restart the hotkey by saving settings.
| Setting | Description |
|---|---|
| Username | Your tester identity tag |
| Supabase URL | Project API URL from Supabase dashboard |
| Anon Key | Supabase anon/public API key |
| OBS Host | IP or hostname of OBS machine (default: localhost) |
| OBS Port | WebSocket port (default: 4455) |
| OBS Password | Password set in OBS WebSocket settings |
| Overlay Hotkey | Global hotkey to toggle the overlay (pynput format) |
| Overlay Opacity | Transparency of the overlay window (20%–100%) |
main.py
└── MainWindow
├── SessionController ←→ SupabaseService (supabase-py)
├── OBSController ←→ OBSWorker (QThread) ←→ OBS via obsws_python
├── TestListWidget → TestItemRow (×N)
└── OverlayWindow → OverlayItemRow (×N)
Key design choices:
- PyQt6 — native Windows feel, low RAM (~55–80 MB idle), mature Qt ecosystem.
- MVC separation — views never touch models directly; all state lives in controllers.
- QThread + signals — OBS polling is entirely off the main thread; cross-thread communication is always via
pyqtSignal. - pynput GlobalHotKeys — OS-level hook so the hotkey fires even when the app is minimised.
- Supabase anon key — no auth server needed for a desktop app; RLS policies allow full access via the anon key.
- Offline-first — every Supabase call is wrapped in try/except; the app works without internet (local-only mode).
| Problem | Fix |
|---|---|
| Automatic Python setup is blocked | Ask your administrator to allow the signed installer from python.org |
| A library is missing | Double-click setup_and_run.bat; it checks and refreshes the private environment |
| OBS shows "Error" | Check host/port/password in Settings → OBS; verify WebSocket is enabled in OBS |
| Hotkey not firing | Check that the pynput format is correct; some antivirus blocks keyboard hooks |
| Supabase not syncing | Check your URL and anon key in Settings → Account; verify the SQL schema was applied |
| Overlay behind windows | Ensure you're not in exclusive-fullscreen mode |



