# Demo environment (for README screenshots) Fictional data only (RFC 5737 documentation addresses). A throwaway MariaDB on loopback, the Flask app, and a tiny mock of the PULSE internal API so the **Run Diagnostics** button works. ```bash D=$(mktemp -d); rsync -a --exclude .git . $D/gandalf && cd $D mariadb-install-db --no-defaults --datadir=$D/db --auth-root-authentication-method=normal --skip-test-db mariadbd --no-defaults --datadir=$D/db --socket=$D/sock --port=3398 --bind-address=127.0.0.1 --user=root & mariadb --no-defaults -S $D/sock -e "CREATE USER 'gandalf'@'127.0.0.1' IDENTIFIED BY 'demo-only'" < /dev/null mariadb --no-defaults -S $D/sock < gandalf/schema.sql mariadb --no-defaults -S $D/sock -e "GRANT ALL ON gandalf.* TO 'gandalf'@'127.0.0.1'" # gandalf/config.json: database -> 127.0.0.1:3398 gandalf/demo-only; pulse.url -> http://127.0.0.1:8650 (api_key/worker_id any value) python3 gandalf/scripts/demo/seed.py # events, suppressions, snapshot and link stats python3 gandalf/scripts/demo/mock_pulse.py & # canned diagnostics output (cd gandalf && gunicorn -b 127.0.0.1:8500 app:app) & python3 gandalf/scripts/demo/capture.py # screenshots + GIF -> docs/img/ ``` The app trusts Authelia `Remote-User` / `Remote-Groups` headers, so `capture.py` sends them directly. Requires `playwright` and `pillow`.