ghcr.io/freestyle-voice/freestyle-server.
Quick start
http://localhost:4649. Verify with:
Docker Compose
Environment variables
The Docker image setsFREESTYLE_DB_PATH, HOST, PORT, and FREESTYLE_ENV for you. FREESTYLE_DB_PATH is required — the server refuses to start without it (the image defaults it to /data/freestyle.db).
Persistent data
The SQLite database stores all your settings, dictionary, vocabulary, formats, and transcription history. Mount a volume at/data to persist it:
Health check
The container has a built-in health check that pingsGET /api/health every 30 seconds. Docker reports the container as healthy when the endpoint responds.
Security
The only access control the server enforces is a trusted-origin check: state-changing requests (anything other thanGET/HEAD/OPTIONS) and WebSocket upgrades are rejected with 403 unless they come from a trusted origin (localhost, 127.0.0.1, or the app’s own app:// origin) or omit the Origin header. This blocks cross-origin browser attacks, but it is not a substitute for authentication — a plain curl with no Origin header is treated as trusted.
If you need to reach the server from other machines, put it behind a reverse proxy (nginx, Caddy, Traefik) or a tunnel that adds authentication and TLS, and keep the container bound to a private interface.
Connecting the desktop app
You can point the Electron app at a remote Freestyle server instead of using its embedded one. This is useful for sharing settings, dictionary, and vocabulary across machines.Remote server support is an advanced configuration. The desktop app is designed to work out of the box with its embedded server.