{"id":51109436,"url":"https://github.com/shatilkhan/knightingale","last_synced_at":"2026-06-24T16:02:40.224Z","repository":{"id":362874382,"uuid":"1241300975","full_name":"ShatilKhan/knightingale","owner":"ShatilKhan","description":"Wisprflow alternative for windows and linux with self hosted models and api support","archived":false,"fork":false,"pushed_at":"2026-06-06T10:38:17.000Z","size":5729,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T11:12:55.920Z","etag":null,"topics":["cli","dictation","linux","macos","rust","speech-to-text","stt","voice-input","whisper","windows"],"latest_commit_sha":null,"homepage":"https://shatilkhan.github.io/knightingale/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ShatilKhan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T07:53:13.000Z","updated_at":"2026-06-06T10:38:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ShatilKhan/knightingale","commit_stats":null,"previous_names":["shatilkhan/knightingale"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ShatilKhan/knightingale","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShatilKhan%2Fknightingale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShatilKhan%2Fknightingale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShatilKhan%2Fknightingale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShatilKhan%2Fknightingale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ShatilKhan","download_url":"https://codeload.github.com/ShatilKhan/knightingale/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShatilKhan%2Fknightingale/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34739426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","dictation","linux","macos","rust","speech-to-text","stt","voice-input","whisper","windows"],"created_at":"2026-06-24T16:02:39.609Z","updated_at":"2026-06-24T16:02:40.212Z","avatar_url":"https://github.com/ShatilKhan.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"design-system/brand/knitingale-icon/1-readme.png\" width=\"280\" alt=\"Knightingale\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eKnightingale\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Voice dictation that minds its own business.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/stargazers\"\u003e\u003cimg alt=\"stars\" src=\"https://img.shields.io/github/stars/ShatilKhan/knightingale?style=flat-square\u0026color=2D4A3E\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/network/members\"\u003e\u003cimg alt=\"forks\" src=\"https://img.shields.io/github/forks/ShatilKhan/knightingale?style=flat-square\u0026color=2D4A3E\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/watchers\"\u003e\u003cimg alt=\"watchers\" src=\"https://img.shields.io/github/watchers/ShatilKhan/knightingale?style=flat-square\u0026color=2D4A3E\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/releases/latest\"\u003e\u003cimg alt=\"release\" src=\"https://img.shields.io/github/v/release/ShatilKhan/knightingale?style=flat-square\u0026color=5C8052\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/releases\"\u003e\u003cimg alt=\"downloads\" src=\"https://img.shields.io/github/downloads/ShatilKhan/knightingale/total?style=flat-square\u0026color=5C8052\u0026cacheSeconds=3600\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ShatilKhan/knightingale/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"ci\" src=\"https://img.shields.io/github/actions/workflow/status/ShatilKhan/knightingale/ci.yml?style=flat-square\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"license\" src=\"https://img.shields.io/github/license/ShatilKhan/knightingale?style=flat-square\"\u003e\u003c/a\u003e\n  \u003cimg alt=\"repo size\" src=\"https://img.shields.io/github/repo-size/ShatilKhan/knightingale?style=flat-square\"\u003e\n  \u003cimg alt=\"hits\" src=\"https://hits.sh/github.com/ShatilKhan/knightingale.svg?style=flat-square\u0026color=2D4A3E\"\u003e\n\u003c/p\u003e\n\n---\n\nA minimal voice dictation daemon for Linux, Windows, and macOS. A single static binary listens for a global hotkey, records your microphone, transcribes either through a cloud STT API you choose or a Whisper model running locally, and types the result into whatever window has focus.\n\n## Install\n\n```sh\ncurl -fsSL https://shatilkhan.github.io/knightingale/install.sh | sh\n```\n\nThen:\n\n```sh\nknightingale setup    # pick Cloud (BYOK) or Local, set hotkey\nknightingale toggle   # start dictating\n```\n\nThe default hotkey is **Super+K** on Linux/Windows and **Cmd+Shift+K** on macOS. Hit it to start, hit it again to stop and type.\n\nAlternatives:\n\n```sh\ncargo install knightingale                     # if you have Rust installed\nbrew install ShatilKhan/tap/knightingale       # macOS (later)\nscoop install knightingale                     # Windows (later)\n```\n\n## Why\n\n- **xhisper** (~5 MB, bash + C) is Linux-only and needs shell glue.\n- **openwhispr** (~300 MB RAM, Electron) is feature-rich but heavy.\n- **WisprFlow / SuperWhisper** are closed-source SaaS.\n\nKnightingale picks the middle: ~15–30 MB binary, ~10–40 MB RAM idle, cross-platform, BYOK + local STT, no telemetry, MIT licensed.\n\n## Cloud providers (bring your own key)\n\nOne config field selects which credential block to read. Eight named providers share the same `/v1/audio/transcriptions` HTTP shape; a `custom` provider plus a `local` whisper.cpp backend cover everything else.\n\n| Provider | env prefix | default model |\n|---|---|---|\n| `groq` *(default)* | `GROQ_*` | `whisper-large-v3-turbo` |\n| `openai` | `OPENAI_*` | `whisper-1` |\n| `deepinfra` | `DEEPINFRA_*` | `openai/whisper-large-v3-turbo` |\n| `fireworks` | `FIREWORKS_*` | `whisper-v3-turbo` |\n| `lemonfox` | `LEMONFOX_*` | `whisper-1` |\n| `sambanova` | `SAMBANOVA_*` | `Whisper-Large-v3` |\n| `azure` | `AZURE_OPENAI_*` | per-deployment |\n| `custom` | `CUSTOM_BASE_URL`, `CUSTOM_API_KEY`, `CUSTOM_MODEL` | self-hosted Speaches / LocalAI / vLLM |\n| `local` | `KNIGHTINGALE_MODEL_PATH` | `distil-small.en` (Phase 2) |\n\nAPI keys live in `~/.config/knightingale/.env` (mode 0600). The TOML config beside it is safe to share.\n\n## Local models\n\nKnightingale doesn't auto-pull Whisper checkpoints — that's an Ollama-class\nfeature and not worth the complexity for a one-time setup. Instead:\n\n```sh\nknightingale model recommend           # spec-aware pick for your machine\nknightingale model where \u003calias\u003e       # prints the curl command\n```\n\nRun the curl line once, then point `KNIGHTINGALE_MODEL_PATH` at the file:\n\n```sh\necho 'KNIGHTINGALE_MODEL_PATH=~/.cache/knightingale/models/ggml-distil-small.en-q5_1.bin' \\\n  \u003e\u003e ~/.config/knightingale/.env\n```\n\n`model list` shows the catalog. Sizes range from `tiny.en` (~32 MB) to `large-v3` (~1.1 GB Q5). The default `distil-small.en` is real-time on CPU and fits 4 GB VRAM laptops; `large-v3-turbo` is the sweet spot for RTX-class GPUs.\n\n## Privacy\n\nKnightingale does not collect or transmit telemetry of any kind. No usage metrics, no error reports, no analytics, no phone-home. Your audio, transcripts, and configuration stay on your machine unless you explicitly point Knightingale at a cloud provider — in which case audio is sent **only** to the API endpoint configured in your `.env`, with your key, and nowhere else. No proxy, no cache, no logging by us.\n\n## Commands\n\n| | |\n|---|---|\n| `knightingale toggle` | Start / stop a recording |\n| `knightingale status` | Print daemon state |\n| `knightingale doctor` | Diagnose problems |\n| `knightingale setup` | Re-run the interactive install flow |\n| `knightingale logs [--since 1h] [--path]` | Tail the daemon log |\n| `knightingale config show` | Print config (secrets redacted) |\n| `knightingale config edit` | Open `config.toml` in `$EDITOR` |\n| `knightingale config edit-secrets` | Open `.env` in `$EDITOR` |\n| `knightingale config set \u003ckey\u003e \u003cvalue\u003e` | Set a config field |\n| `knightingale config set-key \u003cprovider\u003e` | Hidden prompt for an API key |\n| `knightingale config test` | Verify the active provider |\n| `knightingale config provider list` | Print providers + defaults |\n| `knightingale config mic list` / `set \u003cname\u003e` | Pick the input device |\n| `knightingale banner [--wide]` | Print the ASCII bird |\n\n## Architecture\n\nSee [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full design. In one paragraph: a Cargo workspace splits the code into `knightingale-core` (audio, STT, IPC, config, status), a thin `knightingale-daemon` that pulls those modules together inside a `std::thread` loop, and a `knightingale` CLI client that talks to the daemon over a local socket. No async runtime. No tokio. No Electron.\n\n## Documentation\n\nDocumentation site: [shatilkhan.github.io/knightingale](https://shatilkhan.github.io/knightingale/) *(published from `docs/` after Phase 1 polish)*.\n\n## Contributing\n\nIssues and PRs welcome. Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) before proposing a refactor.\n\n## License\n\n[MIT](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshatilkhan%2Fknightingale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshatilkhan%2Fknightingale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshatilkhan%2Fknightingale/lists"}