# Werkzeuge ## Demo-Instanz (`tools/demo/build.py`) Baut aus dem Projekt eine lauffähige Kopie **ohne Datenbank**: `Database` und `Auth` werden durch Stubs mit festen Beispieldaten ersetzt (`tools/demo/overlay/`). Das Original bleibt unverändert. ```bash python3 tools/demo/build.py /tmp/uvt-demo php -S 127.0.0.1:8123 -t /tmp/uvt-demo ``` Nützlich für: * **Screenshots** für die Dokumentation – immer mit denselben Daten * **Smoke-Test** – jede Seite einmal rendern, ohne MySQL aufzusetzen Demo-spezifische Zustände werden über Query-Parameter erreicht: | Parameter | Wirkung | |---|---| | `?demo=result` / `?demo=bulk` | Voucher-Ergebnis bzw. Bulk-Liste auf `index.php` | | `?demo=new` | frisch erzeugter Schlüssel auf `admin/api_keys.php` | | `?anon=1` | nicht angemeldet (für die Login-Seite) | | `?theme=dark` | erzwingt den Dark Mode | | `?brand=custom` / `?brand=nopanel` | Beispiel-Branding der Login-Seite | ## Screenshots (`tools/screenshots.py`) Rendert die Bilder aus `docs/screenshots/` neu. Voraussetzung ist ein headless Chromium; der Pfad kommt aus `$CHROME_BIN` oder wird in den üblichen Verzeichnissen gesucht. ```bash python3 tools/demo/build.py /tmp/uvt-demo php -S 127.0.0.1:8123 -t /tmp/uvt-demo & CHROME_BIN=/usr/bin/chromium python3 tools/screenshots.py ``` ## Actions-Runner (`tools/runner/`) Compose-Datei und Anleitung, um einen Forgejo-Actions-Runner einzurichten. Ohne Runner bleiben `ci.yml` und `release.yml` in der Warteschlange stehen. Details: [`tools/runner/README.md`](runner/README.md). Die Skripte sind Hilfsmittel für die Entwicklung – im Betrieb werden sie nicht benötigt und sind per `.htaccess` nicht über HTTP erreichbar.