A free, open source, and extensible speech-to-text application that works completely offline.
This report summarizes scanner evidence for cjpais/Handy, a Rust project with 35,719 GitHub stars. SynthScan examined 96,198 lines of code across 378 source files, recording 279 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 3.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 88 finding(s).
Are imports declared and package/API names verified? 182 finding(s).
Are wrappers, guards, and repeated structures necessary? 11 finding(s).
Which changes need focused human review? 279 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 279 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/i18n/locales/pl/translation.json | 172 | "placeholder": "Nowa notatka", | CODE |
| LOW | src/i18n/locales/pl/translation.json | 442 | "placeholder": "Wybierz mikrofon...", | CODE |
| LOW | src/i18n/locales/pl/translation.json | 458 | "placeholder": "Wybierz urządzenie wyjściowe...", | CODE |
| LOW | src/i18n/locales/pl/translation.json | 582 | "placeholder": "Dodaj słowo", | CODE |
| LOW | src/i18n/locales/pl/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/pl/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/pl/translation.json | 794 | "placeholder": "Wybierz okres retencji..." | CODE |
| LOW | src/i18n/locales/vi/translation.json | 172 | "placeholder": "Ghi chú mới", | CODE |
| LOW | src/i18n/locales/vi/translation.json | 442 | "placeholder": "Chọn micrô...", | CODE |
| LOW | src/i18n/locales/vi/translation.json | 458 | "placeholder": "Chọn thiết bị đầu ra...", | CODE |
| LOW | src/i18n/locales/vi/translation.json | 582 | "placeholder": "Thêm một từ", | CODE |
| LOW | src/i18n/locales/vi/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/vi/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/vi/translation.json | 794 | "placeholder": "Chọn thời gian lưu giữ..." | CODE |
| LOW | src/i18n/locales/sv/translation.json | 172 | "placeholder": "Ny anteckning", | CODE |
| LOW | src/i18n/locales/sv/translation.json | 442 | "placeholder": "Välj mikrofon...", | CODE |
| LOW | src/i18n/locales/sv/translation.json | 458 | "placeholder": "Välj utmatningsenhet...", | CODE |
| LOW | src/i18n/locales/sv/translation.json | 582 | "placeholder": "Lägg till ett ord", | CODE |
| LOW | src/i18n/locales/sv/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/sv/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/sv/translation.json | 794 | "placeholder": "Välj lagringsperiod..." | CODE |
| LOW | src/i18n/locales/he/translation.json | 172 | "placeholder": "פתק חדש", | CODE |
| LOW | src/i18n/locales/he/translation.json | 442 | "placeholder": "בחר מיקרופון...", | CODE |
| LOW | src/i18n/locales/he/translation.json | 458 | "placeholder": "בחר התקן פלט...", | CODE |
| LOW | src/i18n/locales/he/translation.json | 582 | "placeholder": "הוסף מילה", | CODE |
| LOW | src/i18n/locales/he/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/he/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/he/translation.json | 794 | "placeholder": "בחר משך שמירה..." | CODE |
| LOW | src/i18n/locales/da/translation.json | 172 | "placeholder": "Ny note", | CODE |
| LOW | src/i18n/locales/da/translation.json | 442 | "placeholder": "Vælg mikrofon...", | CODE |
| LOW | src/i18n/locales/da/translation.json | 458 | "placeholder": "Vælg outputenhed...", | CODE |
| LOW | src/i18n/locales/da/translation.json | 582 | "placeholder": "Tilføj et ord", | CODE |
| LOW | src/i18n/locales/da/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/da/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/da/translation.json | 794 | "placeholder": "Vælg opbevaringsperiode..." | CODE |
| LOW | src/i18n/locales/ja/translation.json | 172 | "placeholder": "新規メモ", | CODE |
| LOW | src/i18n/locales/ja/translation.json | 442 | "placeholder": "マイクを選択…", | CODE |
| LOW | src/i18n/locales/ja/translation.json | 458 | "placeholder": "出力デバイスを選択…", | CODE |
| LOW | src/i18n/locales/ja/translation.json | 582 | "placeholder": "単語を追加", | CODE |
| LOW | src/i18n/locales/ja/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/ja/translation.json | 654 | "placeholder": "sk-…" | CODE |
| LOW | src/i18n/locales/ja/translation.json | 794 | "placeholder": "保持期間を選択…" | CODE |
| LOW | src/i18n/locales/it/translation.json | 172 | "placeholder": "Nuova nota", | CODE |
| LOW | src/i18n/locales/it/translation.json | 442 | "placeholder": "Scegli microfono...", | CODE |
| LOW | src/i18n/locales/it/translation.json | 458 | "placeholder": "Scegli dispositivo di output...", | CODE |
| LOW | src/i18n/locales/it/translation.json | 582 | "placeholder": "Aggiungi una parola", | CODE |
| LOW | src/i18n/locales/it/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/it/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/it/translation.json | 794 | "placeholder": "Seleziona periodo di conservazione..." | CODE |
| LOW | src/i18n/locales/ca/translation.json | 172 | "placeholder": "Nota nova", | CODE |
| LOW | src/i18n/locales/ca/translation.json | 442 | "placeholder": "Seleccionaun micròfon...", | CODE |
| LOW | src/i18n/locales/ca/translation.json | 458 | "placeholder": "Selecciona un dispositiu de sortida...", | CODE |
| LOW | src/i18n/locales/ca/translation.json | 582 | "placeholder": "Afegiu una paraula", | CODE |
| LOW | src/i18n/locales/ca/translation.json | 648 | "placeholder": "https://api.openai.com/v1", | CODE |
| LOW | src/i18n/locales/ca/translation.json | 654 | "placeholder": "sk-..." | CODE |
| LOW | src/i18n/locales/ca/translation.json | 794 | "placeholder": "Selecciona el període de conservació..." | CODE |
| LOW | src/i18n/locales/cs/translation.json | 172 | "placeholder": "Nová poznámka", | CODE |
| LOW | src/i18n/locales/cs/translation.json | 442 | "placeholder": "Vyberte mikrofon...", | CODE |
| LOW | src/i18n/locales/cs/translation.json | 458 | "placeholder": "Vyberte výstupní zařízení...", | CODE |
| LOW | src/i18n/locales/cs/translation.json | 582 | "placeholder": "Přidat slovo", | CODE |
| 122 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-nix-deps.ts | 1 | // scripts/check-nix-deps.ts — Keep .nix/bun.nix in sync with bun.lock | COMMENT |
| LOW | scripts/ci/stage-transcribe-libs.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/build.yml | 281 | echo "RC=llvm-rc" >> $env:GITHUB_ENV | COMMENT |
| LOW | .github/workflows/build.yml | 361 | # ggml-vulkan (built by transcribe-cpp-sys when the Vulkan backend is on) | COMMENT |
| LOW | src-tauri/Cargo.toml | 121 | "Win32_Graphics_Gdi", | COMMENT |
| LOW | src-tauri/Cargo.toml | 181 | # The rev is a cjpais/tao branch, not upstream: dev past 0.35.3 also carries | COMMENT |
| LOW | src-tauri/build.rs | 1 | fn main() { | COMMENT |
| LOW | src-tauri/build.rs | 141 | /// "transcribe"`) emits its install dirs and the wrapper (`links = | COMMENT |
| LOW | src-tauri/build.rs | 201 | libs.insert(name.to_string(), src); | COMMENT |
| LOW | src-tauri/build.rs | 401 | }); | COMMENT |
| LOW | src-tauri/build.rs | 541 | println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/swift"); | COMMENT |
| LOW | src-tauri/src/autostart.rs | 1 | //! Launch-at-login (autostart) handling. | COMMENT |
| LOW | src-tauri/src/transcription_coordinator.rs | 61 | /// Holds at least this long stop recording; shorter ones lock it on. | COMMENT |
| LOW | src-tauri/src/transcription_coordinator.rs | 101 | COMMENT | |
| LOW | src-tauri/src/transcription_coordinator.rs | 901 | BusyAction::Remember, | COMMENT |
| LOW | src-tauri/src/transcription_coordinator.rs | 921 | // The unit tests above assert the classifiers in isolation. The harness | COMMENT |
| LOW | src-tauri/src/lib.rs | 121 | COMMENT | |
| LOW | src-tauri/src/lib.rs | 221 | // Note: Shortcuts are NOT initialized here. | COMMENT |
| LOW | src-tauri/src/memory.rs | 1 | //! glibc allocator tuning (Linux only). | COMMENT |
| LOW | src-tauri/src/memory.rs | 21 | COMMENT | |
| LOW | src-tauri/src/memory.rs | 41 | /// Return freed-but-cached malloc arena memory to the OS. | COMMENT |
| LOW | src-tauri/src/tray.rs | 1 | //! System tray icon and menu. | COMMENT |
| LOW | src-tauri/src/tray.rs | 81 | /// Latest computed snapshot, waiting to be (or just) applied. | COMMENT |
| LOW | src-tauri/src/overlay.rs | 681 | /// `hide()` below only unmaps the window if no show happened after it was | COMMENT |
| LOW | src-tauri/src/overlay.rs | 721 | static LAYER_SHELL_ACTIVE: AtomicBool = AtomicBool::new(false); | COMMENT |
| LOW | src-tauri/src/clipboard.rs | 441 | .arg("type") | COMMENT |
| LOW | src-tauri/src/input.rs | 161 | /// Get the current mouse cursor position using the managed Enigo instance. | COMMENT |
| LOW | src-tauri/src/secure_input.rs | 1 | //! macOS Secure Event Input detection, monitoring, and fallback. | COMMENT |
| LOW | src-tauri/src/settings.rs | 121 | pub api_format: PostProcessApiFormat, | COMMENT |
| LOW | src-tauri/src/settings.rs | 181 | /// Hold to record and release to stop, or tap to keep recording until the | COMMENT |
| LOW | src-tauri/src/settings.rs | 381 | fn deref_mut(&mut self) -> &mut Self::Target { | COMMENT |
| LOW | src-tauri/src/settings.rs | 401 | /// default bindings for any missing keys before the settings are used. | COMMENT |
| LOW | src-tauri/src/settings.rs | 421 | pub autostart_enabled: bool, | COMMENT |
| LOW | src-tauri/src/settings.rs | 441 | /// None means "average all channels" (original behavior). | COMMENT |
| LOW | src-tauri/src/settings.rs | 501 | pub theme: Theme, | COMMENT |
| LOW | src-tauri/src/settings.rs | 521 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/settings.rs | 541 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/settings.rs | 1461 | assert!(!settings.audio_feedback); | COMMENT |
| LOW | src-tauri/src/signal_handle.rs | 21 | } else { | COMMENT |
| LOW | src-tauri/src/cli.rs | 21 | pub toggle_post_process: bool, | COMMENT |
| LOW | src-tauri/src/cli.rs | 41 | COMMENT | |
| LOW | src-tauri/src/tray_i18n.rs | 1 | //! Tray menu internationalization | COMMENT |
| LOW | src-tauri/src/paste_tx/macos.rs | 1 | //! macOS reliable paste. | COMMENT |
| LOW | src-tauri/src/paste_tx/mod.rs | 1 | //! Receipt-sequenced clipboard paste ("reliable paste", debug-gated). | COMMENT |
| LOW | src-tauri/src/paste_tx/mod.rs | 21 | //! read before that is an eager third party (clipboard manager, antivirus) | COMMENT |
| LOW | src-tauri/src/paste_tx/mod.rs | 61 | /// When the chord could not be injected at all, no legitimate receipt can | COMMENT |
| LOW | src-tauri/src/paste_tx/windows.rs | 1 | //! Windows reliable paste. | COMMENT |
| LOW | src-tauri/src/shortcut/handy_keys.rs | 1 | //! Handy-keys based keyboard shortcut implementation | COMMENT |
| LOW | src-tauri/src/audio_toolkit/lang_id.rs | 1 | //! Confidence-gated text-based language identification. | COMMENT |
| LOW | src-tauri/src/audio_toolkit/text.rs | 61 | COMMENT | |
| LOW | src-tauri/src/audio_toolkit/text.rs | 141 | /// - Soundex phonetic matching for pronunciation similarity | COMMENT |
| LOW | src-tauri/src/audio_toolkit/text.rs | 401 | let capitalized = filler.as_str().starts_with(char::is_uppercase); | COMMENT |
| LOW | src-tauri/src/engine_supervisor/supervisor.rs | 1 | //! Parent side: [`EngineSupervisor`], the single owner of the transcribe.cpp | COMMENT |
| LOW | src-tauri/src/engine_supervisor/supervisor.rs | 41 | /// Floor for stream calls that do no decoding (begin, reset). | COMMENT |
| LOW | src-tauri/src/engine_supervisor/supervisor.rs | 221 | /// The loaded model (logically: it stays loaded while its worker is | COMMENT |
| LOW | src-tauri/src/engine_supervisor/mod.rs | 1 | //! Process isolation for transcribe.cpp. | COMMENT |
| LOW | src-tauri/src/catalog/mod.rs | 1 | //! The bundled, offline model catalog. | COMMENT |
| LOW | src-tauri/src/catalog/mod.rs | 61 | transcribe_cpp: String, | COMMENT |
| LOW | src-tauri/src/managers/model_capabilities.rs | 1 | //! Model capability probing — the seam between Handy's model UI and "what can | COMMENT |
| LOW | src-tauri/src/managers/model_capabilities.rs | 81 | /// Not a GGUF we can use (bad magic, unsupported version, malformed). | COMMENT |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | src-tauri/src/shortcut/handy_keys.rs | 11 | //! ┌─────────────────┐ commands ┌──────────────────────┐ | COMMENT |
| MEDIUM⚡ | src-tauri/src/shortcut/handy_keys.rs | 12 | //! │ Main Thread │ ───────────────▶ │ Manager Thread │ | COMMENT |
| MEDIUM⚡ | src-tauri/src/shortcut/handy_keys.rs | 16 | //! └─────────────────┘ │ - dispatches actions │ | COMMENT |
| MEDIUM⚡ | src-tauri/src/shortcut/handy_keys.rs | 17 | //! └──────────────────────┘ | COMMENT |
| MEDIUM | src-tauri/src/catalog/mod.rs | 171 | // ───────────────────────── scores ───────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/catalog/mod.rs | 210 | // ───────────────────────── descriptions ───────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/managers/model/download/tests.rs | 12 | // ── SHA256 verification tests ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/managers/model/download/tests.rs | 81 | // ── Resumable HTTP downloader tests ─────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CONTRIBUTING_TRANSLATIONS.md | 30 | ### Step 1: Create the Language Folder | COMMENT |
| LOW | CONTRIBUTING_TRANSLATIONS.md | 47 | ### Step 2: Copy the English File | COMMENT |
| LOW | CONTRIBUTING_TRANSLATIONS.md | 53 | ### Step 3: Translate the Values | COMMENT |
| LOW | CONTRIBUTING_TRANSLATIONS.md | 73 | ### Step 4: Register Your Language | COMMENT |
| LOW | CONTRIBUTING_TRANSLATIONS.md | 90 | ### Step 5: Test Your Translation | COMMENT |
| LOW | CONTRIBUTING_TRANSLATIONS.md | 97 | ### Step 6: Submit a Pull Request | COMMENT |
| LOW | README.md | 289 | #### Step 1: Find Your App Data Directory | COMMENT |
| LOW | README.md | 303 | #### Step 2: Create Models Directory | COMMENT |
| LOW | README.md | 315 | #### Step 3: Download Model Files | COMMENT |
| LOW | README.md | 330 | #### Step 4: Install Models | COMMENT |
| LOW | README.md | 353 | #### Step 5: Verify Installation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src-tauri/src/secure_input.rs | 114 | /// none are affected), the experience is seamless and nothing is shown. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/components/update-checker/portableInstaller.ts | 23 | export function resolvePortableInstallerUrl( | CODE |
| LOW | src/lib/utils/modelTranslation.ts | 22 | export function getTranslatedModelDescription( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-nix-deps.ts | 83 | "[check-nix-deps] Don't forget to commit: .nix/bun.nix .nix/bun-lock-hash", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/mirror_models.py | 145 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/mirror_models.py | 193 | CODE |