TypeWhisper for Windows - Local speech-to-text with translation
207
stars
854
commits
C#
primary language
Sep 10, 2026
updated
Speech-to-text and AI text processing for Windows. Dictate anywhere, transcribe files, and transform text with reusable workflows. Use local models when privacy matters, or add cloud providers through plugins when speed and scale matter more.
TypeWhisper for Windows includes system-wide dictation, file transcription, workflows, history, dictionary, snippets, local and cloud transcription engines, and bundled integrations. Advanced surfaces like the HTTP API, CLI, plugin SDK, marketplace, and action plugins remain available for power users and automation.
See Platform parity and exclusions for the Windows support matrix, Windows-native replacements, and Apple-only non-goals.
The complete 1.0.8 screenshot set is available in docs/screenshots/windows. App captures use a consistent 1240 x 800 frame. Plugin dialogs keep their content-specific height so every setting remains visible. PNG files are kept for GitHub rendering, and WebP variants are included for web/docs reuse.
| Dashboard | Statistics |
|---|---|
![]() | ![]() |
| Dictation | File Transcription |
|---|---|
![]() | ![]() |
| Workflows | Integrations |
|---|---|
![]() | ![]() |
The complete set of 32 Windows plugin settings dialogs is available in docs/screenshots/windows/plugins. API-key plugins use non-sensitive screenshot fixtures so their configured controls are visible without storing or contacting real provider accounts.
| OpenAI / ChatGPT | xAI / Grok |
|---|---|
![]() | ![]() |
| ElevenLabs | OpenRouter |
|---|---|
![]() | ![]() |
\s, \n, \r, \t, and \\ escapes.ß to ss.{date}, {time}, {datetime}, {clipboard}, {day}, and {year}. Date/time placeholders support custom formats, such as {date:dd.MM.yyyy}.typewhisper command.Download the latest installer from GitHub Releases.
Windows releases are code-signed using SignPath.io. Free code signing is provided by SignPath.io, certificate by SignPath Foundation. See the privacy policy for data handling details.
Stable releases use the default Velopack channel. Release candidates and daily builds are published as prereleases on their own update channels. Installed builds can switch channels in Settings.
TypeWhisper for Windows release artifacts are built from this repository by GitHub Actions and submitted for signing through SignPath.io. Signing approvals are limited to project maintainers. The signed publisher may appear as SignPath Foundation because the certificate is provided through the SignPath Foundation open-source program.
| Use Case | Recommended Models |
|---|---|
| Fast general dictation | Parakeet TDT 0.6B, whisper.cpp Base Q5_0 |
| Multilingual dictation with translation | Canary 180M Flash, whisper.cpp Large V3 Turbo |
| Lowest disk usage | whisper.cpp Tiny Q5_0 |
| Higher local accuracy | whisper.cpp Small or Large V3 Turbo |
| Experimental local speech | IBM Granite 4.0 1B Speech |
Local models are provided by bundled plugins and can be installed from the built-in marketplace.
For backend compatibility and troubleshooting on AMD GPUs, see AMD acceleration on Windows.
The current Windows evaluation of NVIDIA's streaming Parakeet EOU model is documented in Parakeet Realtime EOU on Windows.
Clone the repository:
git clone https://github.com/TypeWhisper/typewhisper-win.git
cd typewhisper-win
Build with .NET 10:
dotnet build TypeWhisper.slnx
Run the app:
dotnet run --project src/TypeWhisper.Windows
Run the automated checks before shipping changes:
dotnet test TypeWhisper.slnx
The app appears in the system tray, and the welcome wizard guides you through extension installation, model download, and setup.
The HTTP API is an advanced local automation surface. It binds to localhost and 127.0.0.1, is configurable in Settings, and uses port 8978 by default. When the server starts it writes discovery files to %LOCALAPPDATA%\TypeWhisper: legacy api-port and api-discovery.json with { "version": 1, "port": 8978, "token": "..." }.
Authentication is off by default for local compatibility. If Settings > Advanced > API Server > Require API Token is enabled, /v1/status remains public and all other routes require either Authorization: Bearer <token> or X-TypeWhisper-API-Token: <token>. Settings backup export and import always require a token because backups can contain sensitive transcription text and personal configuration. OPTIONS requests return 204 No Content.
| Endpoint | Method | Description |
|---|---|---|
/v1/status | GET | App status, active engine, active model, API version, and capability flags |
/v1/models | GET | List all available local and cloud models |
/v1/transcribe | POST | Transcribe multipart or raw audio |
/v1/transcribe/local-file | POST | Transcribe a file path already on this Windows machine |
/v1/history | GET | Search history with pagination |
/v1/history | DELETE | Delete a history entry by ID |
/v1/rules | GET | List workflow-backed rules |
/v1/profiles | GET | List workflow-backed profiles |
/v1/rules/toggle | PUT | Toggle a rule by id |
/v1/profiles/toggle | PUT | Toggle a profile by id |
/v1/dictation/start | POST | Start recording |
/v1/dictation/stop | POST | Stop recording |
/v1/dictation/status | GET | Check current dictation state |
/v1/dictation/transcription | GET | Poll dictation result by session ID |
/v1/dictionary/terms | GET | List enabled dictionary terms |
/v1/dictionary/terms | PUT | Replace or append dictionary terms |
/v1/dictionary/terms | DELETE | Delete one dictionary term |
/v1/dictionary/corrections | GET | List enabled dictionary corrections |
/v1/dictionary/corrections | PUT | Upsert a correction |
/v1/dictionary/corrections | DELETE | Delete a correction |
/v1/settings/export | GET | Export a portable JSON backup |
/v1/settings/import | POST | Validate and safely merge a portable JSON backup |
/v1/transcribe accepts multipart/form-data with a file part or a raw audio request body. Multipart fields are:
language: exact source language, such as en or delanguage_hint: repeatable language hints; do not combine with languagetask: transcribe or translatetarget_language: translate the final text to this languageresponse_format: json or verbose_jsonprompt: request-specific transcription prompt/contextengine and model: per-request overrides using IDs from /v1/modelsRaw audio requests can pass the same options with headers: X-Language, X-Language-Hints, X-Task, X-Target-Language, X-Response-Format, X-Prompt, X-Engine, and X-Model. Add ?await_download=1 to wait for a local model download or restore when supported.
/v1/transcribe/local-file accepts JSON. This is what the CLI uses for normal file paths, so large local files are not uploaded through the API process:
{
"path": "C:\\Audio\\recording.wav",
"language_hints": ["de", "en"],
"task": "transcribe",
"engine": "mock",
"model": "tiny"
}
Dictionary terms use PUT /v1/dictionary/terms with { "terms": ["TypeWhisper"], "replace": false } and DELETE /v1/dictionary/terms with { "term": "TypeWhisper" }. Corrections use literal phrase matching and optional case sensitivity, for example { "original": "neuer Absatz", "replacement": "\\n\\n", "caseSensitive": false }. Replacement values decode \s, \n, \r, \t, and \\ once when applied. Corrections created through the HTTP API remain literal; regular expression matching can be enabled in the Dictionary UI.
GET /v1/settings/export returns the versioned backup document directly as JSON. Send that document unchanged as application/json to POST /v1/settings/import. Import requests are limited to 64 MiB and return per-category imported, skipped, and conflict counts plus warnings and restart_required. Backup responses use Cache-Control: no-store. Backups exclude credentials, API tokens, license state, audio, hardware selections, and machine-local paths.
curl -X POST http://localhost:8978/v1/transcribe \
-F "file=@recording.wav" \
-F "language_hint=de" \
-F "language_hint=en" \
-F "response_format=verbose_json"
curl -X POST http://localhost:8978/v1/dictation/start
curl -X POST http://localhost:8978/v1/dictation/stop
curl "http://localhost:8978/v1/dictation/transcription?id=<session-id>"
The browser microphone integration research, security boundary, proof of concept, and test plan are documented in docs/BROWSER_MICROPHONE_INTEGRATION_WINDOWS.md.
The optional typewhisper CLI talks to the local HTTP API and is intended for scripts, terminals, Raycast commands, and batch workflows. It reads %LOCALAPPDATA%\TypeWhisper\api-discovery.json before the legacy api-port file. Tokens can also be supplied with TYPEWHISPER_API_TOKEN or --api-token.
typewhisper status
typewhisper models
typewhisper transcribe recording.wav --language de --json
typewhisper transcribe recording.wav --language-hint de --language-hint en
typewhisper transcribe recording.wav --engine groq --model whisper-large-v3-turbo
typewhisper transcribe - < audio.wav
typewhisper export typewhisper-backup.json
typewhisper import typewhisper-backup.json
typewhisper import typewhisper-backup.json --json
Backup exports are written through a sibling temporary file and atomically moved into place. Restore uses safe merge semantics; existing conflicting entries are reported instead of silently overwritten.
| Option | Description |
|---|---|
--port <N> | Server port (default: auto-discover, fallback 8978) |
--api-token <token> | API token override |
--json | Output as JSON |
--language <code> | Source language, such as en or de |
--language-hint <code> | Repeatable language hint for restricted auto-detection |
--task <task> | transcribe (default) or translate |
--translate-to <code> | Target language for translation |
--engine <id> | Override the transcription engine |
--model <id> | Override the transcription model |
--await-download | Wait for local model restore/download |
The CLI requires the API server to be running in Settings.
Workflows let you configure transcription, transformation, and automation behavior per application, website, or hotkey. For example:
Create workflows in Settings > Workflows. Choose a template, assign an app, website, or hotkey trigger, then configure language/task/model overrides, prompt processing, output behavior, action routing, and priority. Website patterns support wildcard matching, so *.github.com matches gist.github.com.
When you start dictating, TypeWhisper matches the active window and browser URL against enabled workflows with the following priority:
github.com in any supported browserOUTLOOK.EXE or Code.exeThe active workflow is shown in the recording overlay.
TypeWhisper supports plugins for adding custom transcription engines, LLM providers, post-processors, memory providers, TTS providers, event observers, and action plugins. Plugins are .NET class libraries with a manifest.json, installed to %LocalAppData%\TypeWhisper\Plugins\.
Bundled plugin families include:
| Type | Plugins |
|---|---|
| Local transcription | SherpaOnnx, whisper.cpp, Granite Speech |
| Cloud transcription | OpenAI, Groq, xAI/Grok, AssemblyAI, Deepgram, ElevenLabs, Reson8, Gladia, Google Cloud STT, Soniox, Speechmatics, Cloudflare ASR, Voxtral, OpenAI Compatible |
| Server-backed transcription | Qwen3 STT |
| LLM providers | OpenAI, Groq, xAI/Grok, Gemini, Claude, Cerebras, Cohere, Fireworks, OpenRouter, OpenAI Compatible, Gemma Local |
| TTS providers | OpenAI, xAI/Grok, Supertonic TTS |
| Actions | Linear, Obsidian, Script, LiveTranscript, Webhook |
| Memory | File Memory, OpenAI Vector Memory |
| Interface | Purpose |
|---|---|
ITranscriptionEnginePlugin | Local, cloud, or custom speech-to-text engines |
ILlmProviderPlugin | LLM chat completions for workflow processing |
IPostProcessorPlugin | Post-processing pipeline for cleanup and formatting |
IActionPlugin | Custom actions triggered by workflow output |
ITypeWhisperPlugin | Event observer, lifecycle hook, or utility plugin |
The SDK includes helpers for OpenAI-compatible APIs:
OpenAiTranscriptionHelper: multipart/form-data upload for Whisper-compatible endpointsOpenAiChatHelper: chat completion requestsOpenAiApiHelper: shared HTTP error handlingtypewhisper-win/
|-- src/
| |-- TypeWhisper.Core/ # Core logic, models, interfaces, persistence
| |-- TypeWhisper.PluginSDK/ # Plugin contracts, helpers, manifest models
| |-- TypeWhisper.Cli/ # typewhisper command-line client
| `-- TypeWhisper.Windows/ # WPF UI, services, view models, app composition
|-- plugins/ # Bundled plugin source
|-- tests/
| |-- TypeWhisper.Core.Tests/ # Core xUnit tests
| `-- TypeWhisper.PluginSystem.Tests/
`-- docs/ # Design notes and implementation plans
Patterns: MVVM with CommunityToolkit.Mvvm. App.xaml.cs is the composition root. SQLite is used for persistence with a custom migration pattern. Plugins load through AssemblyLoadContext isolation and manifest-based discovery. Workflows drive app/website/hotkey matching and prompt orchestration.
Key dependencies: NAudio (audio), NHotkey.Wpf (hotkeys), WPF-UI (Fluent Design), Microsoft.ML.OnnxRuntime (local translation), Velopack (updates), H.NotifyIcon.Wpf (system tray), and org.k2fsa.sherpa.onnx (local ASR).
GPLv3. See LICENSE for details. Commercial licensing is available under LICENSE-COMMERCIAL.md. See TRADEMARK.md for the trademark policy.
C#
98.4%
TypeWhisper for Windows - Local speech-to-text with translation
207
stars
854
commits
C#
primary language
Sep 10, 2026
updated
Speech-to-text and AI text processing for Windows. Dictate anywhere, transcribe files, and transform text with reusable workflows. Use local models when privacy matters, or add cloud providers through plugins when speed and scale matter more.
TypeWhisper for Windows includes system-wide dictation, file transcription, workflows, history, dictionary, snippets, local and cloud transcription engines, and bundled integrations. Advanced surfaces like the HTTP API, CLI, plugin SDK, marketplace, and action plugins remain available for power users and automation.
See Platform parity and exclusions for the Windows support matrix, Windows-native replacements, and Apple-only non-goals.
The complete 1.0.8 screenshot set is available in docs/screenshots/windows. App captures use a consistent 1240 x 800 frame. Plugin dialogs keep their content-specific height so every setting remains visible. PNG files are kept for GitHub rendering, and WebP variants are included for web/docs reuse.
| Dashboard | Statistics |
|---|---|
![]() | ![]() |
| Dictation | File Transcription |
|---|---|
![]() | ![]() |
| Workflows | Integrations |
|---|---|
![]() | ![]() |
The complete set of 32 Windows plugin settings dialogs is available in docs/screenshots/windows/plugins. API-key plugins use non-sensitive screenshot fixtures so their configured controls are visible without storing or contacting real provider accounts.
| OpenAI / ChatGPT | xAI / Grok |
|---|---|
![]() | ![]() |
| ElevenLabs | OpenRouter |
|---|---|
![]() | ![]() |
\s, \n, \r, \t, and \\ escapes.ß to ss.{date}, {time}, {datetime}, {clipboard}, {day}, and {year}. Date/time placeholders support custom formats, such as {date:dd.MM.yyyy}.typewhisper command.Download the latest installer from GitHub Releases.
Windows releases are code-signed using SignPath.io. Free code signing is provided by SignPath.io, certificate by SignPath Foundation. See the privacy policy for data handling details.
Stable releases use the default Velopack channel. Release candidates and daily builds are published as prereleases on their own update channels. Installed builds can switch channels in Settings.
TypeWhisper for Windows release artifacts are built from this repository by GitHub Actions and submitted for signing through SignPath.io. Signing approvals are limited to project maintainers. The signed publisher may appear as SignPath Foundation because the certificate is provided through the SignPath Foundation open-source program.
| Use Case | Recommended Models |
|---|---|
| Fast general dictation | Parakeet TDT 0.6B, whisper.cpp Base Q5_0 |
| Multilingual dictation with translation | Canary 180M Flash, whisper.cpp Large V3 Turbo |
| Lowest disk usage | whisper.cpp Tiny Q5_0 |
| Higher local accuracy | whisper.cpp Small or Large V3 Turbo |
| Experimental local speech | IBM Granite 4.0 1B Speech |
Local models are provided by bundled plugins and can be installed from the built-in marketplace.
For backend compatibility and troubleshooting on AMD GPUs, see AMD acceleration on Windows.
The current Windows evaluation of NVIDIA's streaming Parakeet EOU model is documented in Parakeet Realtime EOU on Windows.
Clone the repository:
git clone https://github.com/TypeWhisper/typewhisper-win.git
cd typewhisper-win
Build with .NET 10:
dotnet build TypeWhisper.slnx
Run the app:
dotnet run --project src/TypeWhisper.Windows
Run the automated checks before shipping changes:
dotnet test TypeWhisper.slnx
The app appears in the system tray, and the welcome wizard guides you through extension installation, model download, and setup.
The HTTP API is an advanced local automation surface. It binds to localhost and 127.0.0.1, is configurable in Settings, and uses port 8978 by default. When the server starts it writes discovery files to %LOCALAPPDATA%\TypeWhisper: legacy api-port and api-discovery.json with { "version": 1, "port": 8978, "token": "..." }.
Authentication is off by default for local compatibility. If Settings > Advanced > API Server > Require API Token is enabled, /v1/status remains public and all other routes require either Authorization: Bearer <token> or X-TypeWhisper-API-Token: <token>. Settings backup export and import always require a token because backups can contain sensitive transcription text and personal configuration. OPTIONS requests return 204 No Content.
| Endpoint | Method | Description |
|---|---|---|
/v1/status | GET | App status, active engine, active model, API version, and capability flags |
/v1/models | GET | List all available local and cloud models |
/v1/transcribe | POST | Transcribe multipart or raw audio |
/v1/transcribe/local-file | POST | Transcribe a file path already on this Windows machine |
/v1/history | GET | Search history with pagination |
/v1/history | DELETE | Delete a history entry by ID |
/v1/rules | GET | List workflow-backed rules |
/v1/profiles | GET | List workflow-backed profiles |
/v1/rules/toggle | PUT | Toggle a rule by id |
/v1/profiles/toggle | PUT | Toggle a profile by id |
/v1/dictation/start | POST | Start recording |
/v1/dictation/stop | POST | Stop recording |
/v1/dictation/status | GET | Check current dictation state |
/v1/dictation/transcription | GET | Poll dictation result by session ID |
/v1/dictionary/terms | GET | List enabled dictionary terms |
/v1/dictionary/terms | PUT | Replace or append dictionary terms |
/v1/dictionary/terms | DELETE | Delete one dictionary term |
/v1/dictionary/corrections | GET | List enabled dictionary corrections |
/v1/dictionary/corrections | PUT | Upsert a correction |
/v1/dictionary/corrections | DELETE | Delete a correction |
/v1/settings/export | GET | Export a portable JSON backup |
/v1/settings/import | POST | Validate and safely merge a portable JSON backup |
/v1/transcribe accepts multipart/form-data with a file part or a raw audio request body. Multipart fields are:
language: exact source language, such as en or delanguage_hint: repeatable language hints; do not combine with languagetask: transcribe or translatetarget_language: translate the final text to this languageresponse_format: json or verbose_jsonprompt: request-specific transcription prompt/contextengine and model: per-request overrides using IDs from /v1/modelsRaw audio requests can pass the same options with headers: X-Language, X-Language-Hints, X-Task, X-Target-Language, X-Response-Format, X-Prompt, X-Engine, and X-Model. Add ?await_download=1 to wait for a local model download or restore when supported.
/v1/transcribe/local-file accepts JSON. This is what the CLI uses for normal file paths, so large local files are not uploaded through the API process:
{
"path": "C:\\Audio\\recording.wav",
"language_hints": ["de", "en"],
"task": "transcribe",
"engine": "mock",
"model": "tiny"
}
Dictionary terms use PUT /v1/dictionary/terms with { "terms": ["TypeWhisper"], "replace": false } and DELETE /v1/dictionary/terms with { "term": "TypeWhisper" }. Corrections use literal phrase matching and optional case sensitivity, for example { "original": "neuer Absatz", "replacement": "\\n\\n", "caseSensitive": false }. Replacement values decode \s, \n, \r, \t, and \\ once when applied. Corrections created through the HTTP API remain literal; regular expression matching can be enabled in the Dictionary UI.
GET /v1/settings/export returns the versioned backup document directly as JSON. Send that document unchanged as application/json to POST /v1/settings/import. Import requests are limited to 64 MiB and return per-category imported, skipped, and conflict counts plus warnings and restart_required. Backup responses use Cache-Control: no-store. Backups exclude credentials, API tokens, license state, audio, hardware selections, and machine-local paths.
curl -X POST http://localhost:8978/v1/transcribe \
-F "file=@recording.wav" \
-F "language_hint=de" \
-F "language_hint=en" \
-F "response_format=verbose_json"
curl -X POST http://localhost:8978/v1/dictation/start
curl -X POST http://localhost:8978/v1/dictation/stop
curl "http://localhost:8978/v1/dictation/transcription?id=<session-id>"
The browser microphone integration research, security boundary, proof of concept, and test plan are documented in docs/BROWSER_MICROPHONE_INTEGRATION_WINDOWS.md.
The optional typewhisper CLI talks to the local HTTP API and is intended for scripts, terminals, Raycast commands, and batch workflows. It reads %LOCALAPPDATA%\TypeWhisper\api-discovery.json before the legacy api-port file. Tokens can also be supplied with TYPEWHISPER_API_TOKEN or --api-token.
typewhisper status
typewhisper models
typewhisper transcribe recording.wav --language de --json
typewhisper transcribe recording.wav --language-hint de --language-hint en
typewhisper transcribe recording.wav --engine groq --model whisper-large-v3-turbo
typewhisper transcribe - < audio.wav
typewhisper export typewhisper-backup.json
typewhisper import typewhisper-backup.json
typewhisper import typewhisper-backup.json --json
Backup exports are written through a sibling temporary file and atomically moved into place. Restore uses safe merge semantics; existing conflicting entries are reported instead of silently overwritten.
| Option | Description |
|---|---|
--port <N> | Server port (default: auto-discover, fallback 8978) |
--api-token <token> | API token override |
--json | Output as JSON |
--language <code> | Source language, such as en or de |
--language-hint <code> | Repeatable language hint for restricted auto-detection |
--task <task> | transcribe (default) or translate |
--translate-to <code> | Target language for translation |
--engine <id> | Override the transcription engine |
--model <id> | Override the transcription model |
--await-download | Wait for local model restore/download |
The CLI requires the API server to be running in Settings.
Workflows let you configure transcription, transformation, and automation behavior per application, website, or hotkey. For example:
Create workflows in Settings > Workflows. Choose a template, assign an app, website, or hotkey trigger, then configure language/task/model overrides, prompt processing, output behavior, action routing, and priority. Website patterns support wildcard matching, so *.github.com matches gist.github.com.
When you start dictating, TypeWhisper matches the active window and browser URL against enabled workflows with the following priority:
github.com in any supported browserOUTLOOK.EXE or Code.exeThe active workflow is shown in the recording overlay.
TypeWhisper supports plugins for adding custom transcription engines, LLM providers, post-processors, memory providers, TTS providers, event observers, and action plugins. Plugins are .NET class libraries with a manifest.json, installed to %LocalAppData%\TypeWhisper\Plugins\.
Bundled plugin families include:
| Type | Plugins |
|---|---|
| Local transcription | SherpaOnnx, whisper.cpp, Granite Speech |
| Cloud transcription | OpenAI, Groq, xAI/Grok, AssemblyAI, Deepgram, ElevenLabs, Reson8, Gladia, Google Cloud STT, Soniox, Speechmatics, Cloudflare ASR, Voxtral, OpenAI Compatible |
| Server-backed transcription | Qwen3 STT |
| LLM providers | OpenAI, Groq, xAI/Grok, Gemini, Claude, Cerebras, Cohere, Fireworks, OpenRouter, OpenAI Compatible, Gemma Local |
| TTS providers | OpenAI, xAI/Grok, Supertonic TTS |
| Actions | Linear, Obsidian, Script, LiveTranscript, Webhook |
| Memory | File Memory, OpenAI Vector Memory |
| Interface | Purpose |
|---|---|
ITranscriptionEnginePlugin | Local, cloud, or custom speech-to-text engines |
ILlmProviderPlugin | LLM chat completions for workflow processing |
IPostProcessorPlugin | Post-processing pipeline for cleanup and formatting |
IActionPlugin | Custom actions triggered by workflow output |
ITypeWhisperPlugin | Event observer, lifecycle hook, or utility plugin |
The SDK includes helpers for OpenAI-compatible APIs:
OpenAiTranscriptionHelper: multipart/form-data upload for Whisper-compatible endpointsOpenAiChatHelper: chat completion requestsOpenAiApiHelper: shared HTTP error handlingtypewhisper-win/
|-- src/
| |-- TypeWhisper.Core/ # Core logic, models, interfaces, persistence
| |-- TypeWhisper.PluginSDK/ # Plugin contracts, helpers, manifest models
| |-- TypeWhisper.Cli/ # typewhisper command-line client
| `-- TypeWhisper.Windows/ # WPF UI, services, view models, app composition
|-- plugins/ # Bundled plugin source
|-- tests/
| |-- TypeWhisper.Core.Tests/ # Core xUnit tests
| `-- TypeWhisper.PluginSystem.Tests/
`-- docs/ # Design notes and implementation plans
Patterns: MVVM with CommunityToolkit.Mvvm. App.xaml.cs is the composition root. SQLite is used for persistence with a custom migration pattern. Plugins load through AssemblyLoadContext isolation and manifest-based discovery. Workflows drive app/website/hotkey matching and prompt orchestration.
Key dependencies: NAudio (audio), NHotkey.Wpf (hotkeys), WPF-UI (Fluent Design), Microsoft.ML.OnnxRuntime (local translation), Velopack (updates), H.NotifyIcon.Wpf (system tray), and org.k2fsa.sherpa.onnx (local ASR).
GPLv3. See LICENSE for details. Commercial licensing is available under LICENSE-COMMERCIAL.md. See TRADEMARK.md for the trademark policy.
C#
98.4%