Build from source on Windows x64 with Python 3.13

Website, downloads and setup guide: https://pointer.digitalnatives.ie/
Coordinator origin: https://api.pointer.digitalnatives.ie
OAuth callback: https://api.pointer.digitalnatives.ie/oauth/callback
The website hostname is separate from the coordinator's SP_PUBLIC_URL.

Use a fresh virtual environment and install requirements.txt. Then:

python -m PyInstaller --noconfirm --onefile --windowed --name SharedPointers --collect-all pystray --collect-all websockets companion.py
python -m PyInstaller --noconfirm --onefile --windowed --name Coordinator coordinator.py
python -m PyInstaller --noconfirm --onefile --windowed --name ServerSetup --add-binary "C:/absolute/path/cloudflared.exe;." coordinator_setup.py

Put Coordinator.exe beside ServerSetup.exe. Put service.json beside the companion
EXE with {"url":"https://api.pointer.digitalnatives.ie"}. No Discord secret belongs in
service.json or the companion executable.

Cloudflared for the test tunnel comes from the official cloudflare/cloudflared
GitHub release. The build used 2026.10.6 cloudflared-windows-amd64.exe, SHA256:
d521b3bf68982165f0d06d76732f22d9a105ef057ff3ae4c0986f3a23190950f

pystray is LGPL licensed and its Python sources and licenses are supplied in the
archive. Modify or replace the source in your build environment and rebuild the
companion with the command above to use your modified version. No signing key
or proprietary service is required to build or run your changed companion.

For a stable hosted coordinator, install aiohttp and copy coordinator.py and
discord_state.py to a Python host. Supply SP_PUBLIC_URL, SP_DISCORD_CLIENT_ID,
SP_DISCORD_CLIENT_SECRET, SP_DISCORD_BOT_TOKEN and SP_DATA_DIR privately through
the host's secret settings. It binds 127.0.0.1:8766 (SP_PORT can override). Route
HTTPS and WebSocket requests to that port through your reverse proxy. Use one
process and persistent data storage. Don't commit or distribute credentials.
The public origin must match the registered /oauth/callback redirect exactly.
The current Oracle deployment uses a dedicated shared-pointers system account,
systemd startup, loopback port 8766, and an Apache HTTPS/WebSocket reverse proxy.
See ../deployment/README.md in the project for deployment validation and rollback.
The new-origin OAuth callback is registered in Discord and real user sign-in has
passed. The old Windows coordinator/tunnel are stopped and its temporary OAuth
callback is removed. Retained Windows configuration remains private, with saved
credentials encrypted. Real two-PC Go Live overlay/pointing acceptance remains.

Run tests: python -m unittest discover -s . -p "test_*.py" -v
Tests require local socket access. Live Discord acceptance is separate.
