SQS Signal is a self-hosted dictation app that turns speech into text using OpenAI Whisper. Speak your drafts, notes, prompts, and memos faster than you'd type them — all on your own infrastructure with GitHub OAuth. Optional daily quotas apply when GitHub auth is enabled.
Speaking is often faster than typing — 2-3x faster for rough drafts, meeting notes, code comments, journal entries, or brain-dumping ideas. SQS Signal gives you a simple, private way to do that on your own hardware.
- Dictation-first — Optimized for short voice clips via microphone. Upload mode for longer audio.
- CPU-Optimized Whisper — Runs
small.enmodel efficiently on CPU. No GPU needed. - Self-Hosted & Private — Your audio never leaves your server. Full data control.
- Docker, One Command —
docker compose up -dand you're running. - GitHub OAuth (optional) — Let any GitHub user sign in securely. Disabled by default.
- Built for Production — Caddy HTTPS, SQLite persistence, access logging, daily mic quotas.
SQS Signal is built on and compatible with several open-source speech-to-text projects:
- OpenAI Whisper — The core transcription engine. Runs on CPU (FP16 disabled), supports multiple model sizes. MIT licensed.
- whisper.cpp — A C/C++ port of Whisper with CPU-only inference, VAD support, and broad platform compatibility. MIT licensed. The transcription pipeline is compatible with whisper.cpp-based backends.
- faster-whisper — A reimplementation of Whisper using CTranslate2 that benchmarks faster and more memory-efficient than openai/whisper. MIT licensed. The service API can be adapted to use faster-whisper as a drop-in backend.
Additional open-source components:
- Microphone Dictation — Speak, stop, get instant text via WebSocket
- File Upload — Upload audio/video files for higher-quality results
- GitHub OAuth Sign-In — Secure sign-in with any GitHub account
- Daily Mic Quota — 15 minutes of microphone dictation per user per day (configurable)
- Daily Upload Quota — 100 MB per user per day (configurable)
- Access Logging — All sign-ins and activity logged to SQLite + rotating files
- No GPU Required — Optimized for single CPU VPS (tested on 2 vCPU / 4GB RAM)
- Docker Compose Stack — Caddy + FastAPI Web + Whisper Service in 3 containers
Internet → Caddy (:443/:80) → Web (:8892 → :8000) → Whisper (:8891 → :8000)
| Container | Role |
|---|---|
| Caddy | Reverse proxy, automatic HTTPS, TLS termination, gzip |
| Web | FastAPI app — auth, UI, dictation orchestration, SQLite DB |
| Whisper Service | OpenAI Whisper CPU inference with small.en model |
- Audio is captured via microphone (WebSocket streaming) or uploaded as a file
- The web service forwards audio to the Whisper transcription service
- Whisper processes the audio on CPU and returns transcribed text
- Results are displayed live in the browser or returned as JSON via API
- Optimized for short dictation clips (5-20 seconds ideal)
- Uses the
small.enWhisper model by default - Live dictation via WebSocket with configurable language support (11 languages + auto-detect)
- File upload for pre-recorded audio and video files (configurable:
MAX_FILE_SIZE_MB,DAILY_UPLOAD_LIMIT_MB) - CPU-only inference (no GPU backend)
- Self-hosted deployment on a single VPS or local machine
- Docker & Docker Compose
- (Optional for sign-in) A GitHub OAuth App
git clone https://github.com/rasrobo/sqs.chat.git
cd sqs.chat
cp .env.example .envBy default, the app runs without GitHub sign-in — just start and use:
docker compose up -dVisit https://your-domain.com and start transcribing immediately, no login required.
If you want authentication, set these in .env:
GITHUB_AUTH_ENABLED=true
GITHUB_CLIENT_ID=your_client_id
GITHUB_CLIENT_SECRET=your_client_secret
GITHUB_CALLBACK_URL=https://your-domain.com/auth/github/callback
Then restart the stack:
- Go to GitHub Developer Settings → OAuth Apps → New OAuth App
- Homepage URL:
https://your-domain.com - Callback URL:
https://your-domain.com/auth/github/callback - Copy Client ID and Client Secret into
.env
| Variable | Required | Default | Description |
|---|---|---|---|
GITHUB_AUTH_ENABLED |
No | false |
Set true to enable GitHub OAuth sign-in |
GITHUB_CLIENT_ID |
If auth enabled | — | GitHub OAuth App client ID |
GITHUB_CLIENT_SECRET |
If auth enabled | — | GitHub OAuth App client secret |
GITHUB_CALLBACK_URL |
If auth enabled | https://sqs.chat/auth/github/callback |
OAuth callback URL |
WHISPER_SERVICE_URL |
No | http://whisper-service:8000 |
Internal whisper service URL |
MAX_FILE_SIZE_MB |
No | 50 |
Max uploaded file size in MB. Increase for large files (e.g. 500). Larger files need more CPU time — adjust read_timeout in Caddyfile accordingly. |
DAILY_UPLOAD_LIMIT_MB |
No | 100 |
Max total upload size per user per day (only when GITHUB_AUTH_ENABLED=true) |
MAX_RECORDING_MINUTES |
No | 15 |
Max mic recording time per user per day (only when GITHUB_AUTH_ENABLED=true) |
COOKIE_SECURE |
No | False |
Set True for HTTPS production |
Quotas only apply when GITHUB_AUTH_ENABLED=true. Without auth, all users are anonymous and quotas are not enforced.
- Mic: 15 minutes per user per day (resets at midnight UTC). Configurable via
MAX_RECORDING_MINUTES. - Upload: 100 MB per user per day. Configurable via
DAILY_UPLOAD_LIMIT_MB. - Quotas enforced server-side with SQLite — users see remaining time/quota in the UI.
- When mic quota is exhausted, users are prompted to use upload mode instead.
All events logged to SQLite (access_log table) and rotating files (access.log, transcribe.log, error.log).
Sustainable Use License — source is visible and self-hostable, but you may not offer it as a competing commercial hosted transcription service without permission. Inspired by the fair-code model (n8n, GitLab EE).
If you find this project useful, consider supporting development on Ko-fi.
Built by Ras Robo / Side Quest Studios