Voice-to-text dictation app with local (Nvidia Parakeet/Whisper) and cloud models (BYOK). Privacy-first and available cross-platform.
This report summarizes scanner evidence for OpenWhispr/openwhispr, a JavaScript project with 10,457 GitHub stars. SynthScan examined 796,566 lines of code across 3300 source files, recording 1159 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 1.7 (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? 935 finding(s).
Are imports declared and package/API names verified? 196 finding(s).
Are wrappers, guards, and repeated structures necessary? 847 finding(s).
Which changes need focused human review? 1159 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 1159 distinct pattern matches across 18 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 | main.js | 86 | function configureChannelUserDataPath() { | CODE |
| LOW | main.js | 163 | function shouldRegisterProtocolWithAppArg() { | CODE |
| LOW | main.js | 181 | function restoreHtmlHandlerIfChanged(original) { | CODE |
| LOW | main.js | 225 | function registerOpenWhisprProtocol() { | CODE |
| LOW | main.js | 422 | function cleanupOrphanedLinuxRestoreToken() { | CODE |
| LOW | main.js | 746 | function initializeDeferredManagers() { | CODE |
| LOW | main.js | 810 | function handleEnterpriseAudioLink(url) { | CODE |
| LOW | main.js | 980 | async function exchangeSignedTokenForRawBearer(signedToken) { | CODE |
| LOW | main.js | 1004 | async function migrateCookieToBearerToken() { | CODE |
| LOW | main.js | 1032 | async function applySessionTokenAndRefresh(token) { | CODE |
| LOW | main.js | 1179 | async function dropUnsupportedStartupHold() { | CODE |
| LOW | openwhispr-mobile/app.config.js | 32 | function deriveGoogleCalendarRedirectScheme(clientId) { | CODE |
| LOW | openwhispr-mobile/app.config.js | 39 | function createGoogleCalendarRedirectConfig(environment, clientId) { | CODE |
| LOW | openwhispr-mobile/app.config.js | 104 | function createGoogleCalendarConfig(environment) { | CODE |
| LOW | openwhispr-mobile/config/openwhispr-environments.js | 21 | function resolveOpenWhisprEnvironment() { | CODE |
| LOW | …r-mobile/plugins/storekit/withStoreKitConfiguration.js | 47 | function validateStoreKitProductIds(storeKitConfiguration, canonicalProducts) { | CODE |
| LOW | …r-mobile/plugins/storekit/withStoreKitConfiguration.js | 60 | function createStoreKitReferenceBlock(indentation, reference) { | CODE |
| LOW | …r-mobile/plugins/storekit/withStoreKitConfiguration.js | 68 | function ensureStoreKitConfigurationReference(schemeContents, reference) { | CODE |
| LOW | …r-mobile/plugins/storekit/withStoreKitConfiguration.js | 86 | function withStoreKitConfiguration(config) { | CODE |
| LOW | …s/storekit/__tests__/withStoreKitConfiguration.test.ts | 21 | function createStoreKitConfiguration(productIds: string[]): object { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 36 | function resolveActivityEnvironment(cfg) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 61 | function writeExtensionSupportFiles(platformProjectRoot, environment) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 86 | function getBuildConfigurationIdsForTarget(xcodeProject, targetUuid) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 100 | function applyBuildSettingsToTarget(xcodeProject, targetUuid, buildSettings) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 169 | function findFileReferenceUuidByBasename(xcodeProject, basename) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 184 | function findBuildFileUuidForFileRef(xcodeProject, fileRefUuid) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 214 | function ensureSourcesBuildPhaseExists(xcodeProject, targetUuid) { | CODE |
| LOW | …le/plugins/activity-extension/withActivityExtension.js | 241 | function ensureSourceMembershipForTarget(xcodeProject, targetUuid, sourceBuildFileUuid, fileName) { | CODE |
| LOW | …/plugins/speaker-diarization/withSpeakerDiarization.js | 50 | ' def generate_available_uuid_list(count = 100)\n' + | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 33 | function resolveKeyboardEnvironment(cfg) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 69 | function writeExtensionSupportFiles(platformProjectRoot, environment) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 97 | function getBuildConfigurationIdsForTarget(xcodeProject, targetUuid) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 113 | function applyBuildSettingsToTarget(xcodeProject, targetUuid, buildSettings) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 194 | function findGroupFileReferenceUuid(xcodeProject, groupKey, basename) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 206 | function findBuildFileUuidForFileRef(xcodeProject, fileRefUuid) { | CODE |
| LOW | …le/plugins/keyboard-extension/withKeyboardExtension.js | 240 | function ensurePhaseMembershipForTarget(xcodeProject, targetUuid, buildFileUuid, fileName, phase) { | CODE |
| LOW | …ugins/pod-deployment-target/withPodDeploymentTarget.js | 22 | function addPodDeploymentTargetFloor(contents) { | CODE |
| LOW | …enwhispr-mobile/modules/app-group-storage/src/index.ts | 210 | export function addRecordingStoppedListener( | CODE |
| LOW⚡ | …enwhispr-mobile/modules/app-group-storage/src/index.ts | 225 | export function addRecordingErrorListener( | CODE |
| LOW⚡ | …enwhispr-mobile/modules/app-group-storage/src/index.ts | 232 | export function addBackgroundRecordingStartedListener( | CODE |
| LOW⚡ | …enwhispr-mobile/modules/app-group-storage/src/index.ts | 239 | export function addKeyboardStatusChangedListener( | CODE |
| LOW | …enwhispr-mobile/modules/app-group-storage/src/index.ts | 264 | export function addHardwareKeyboardChangedListener( | CODE |
| LOW | openwhispr-mobile/src/types/index.ts | 58 | export function inferenceToProcessingMode(mode: InferenceMode): ProcessingMode { | CODE |
| LOW | openwhispr-mobile/src/config/noteSharing.ts | 4 | export function getNoteShareViewerBaseUrl(): string { | CODE |
| LOW | openwhispr-mobile/src/config/prompts/retiredPrompts.ts | 118 | export async function sweepRetiredPromptOverrides( | CODE |
| LOW | openwhispr-mobile/src/config/prompts/registry.ts | 34 | export function normalizeCustomPromptForSave(draft: string, defaultText: string): string { | CODE |
| LOW | openwhispr-mobile/src/utils/expoAudio.ts | 32 | export function getDefaultRecorderOptions(): RecordingOptions { | CODE |
| LOW | openwhispr-mobile/src/screens/AccountScreen.tsx | 44 | function getSubscriptionManagementProvider(usage: UsageInfo): SubscriptionManagementProvider { | CODE |
| LOW | openwhispr-mobile/src/screens/AccountScreen.tsx | 52 | function showWebSubscriptionSupport(): void { | CODE |
| LOW | openwhispr-mobile/src/screens/AccountScreen.tsx | 106 | async function openGrantedBillingManagement(usage: UsageInfo): Promise<void> { | CODE |
| LOW | openwhispr-mobile/src/screens/AIModelsScreen.tsx | 36 | function localReasoningStatusLabel(readiness: LocalReasoningReadiness | null): string { | CODE |
| LOW | …mobile/src/screens/GoogleCalendarIntegrationScreen.tsx | 374 | export default function GoogleCalendarIntegrationScreen() { | CODE |
| LOW | …spr-mobile/src/screens/TranscriptionLanguageScreen.tsx | 44 | export default function TranscriptionLanguageScreen() { | CODE |
| LOW | …-mobile/src/screens/HardwareKeyboardShortcutScreen.tsx | 41 | export function HardwareKeyboardShortcutScreen() { | CODE |
| LOW | …le/src/screens/onboarding/steps/KeyboardSwitchStep.tsx | 141 | function AnimatedKeyboardSwitchPreview() { | CODE |
| LOW | …c/components/superwall/OpenWhisprSuperwallProvider.tsx | 22 | export function OpenWhisprSuperwallProvider({ children }: Props) { | CODE |
| LOW | …ile/src/components/superwall/SuperwallGateProvider.tsx | 138 | function runAccessGrantedWithoutPurchaseCallback( | CODE |
| LOW | …ile/src/components/superwall/SuperwallGateProvider.tsx | 152 | function reportAccessGrantedWithoutPurchase(gate: PendingGate): void { | CODE |
| LOW | …ile/src/components/superwall/SuperwallGateProvider.tsx | 213 | function recordPurchaseWithTimeout(productId: string): Promise<void> { | CODE |
| LOW | …ile/src/components/superwall/SuperwallGateProvider.tsx | 270 | export function DisabledSuperwallGateProvider({ children }: Props) { | CODE |
| 759 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …src/screens/__tests__/AccountScreen.anonymous.test.tsx | 17 | email: 'user@example.com', | CODE |
| LOW | …ns/__tests__/NoteEditorScreen.calendarContext.test.tsx | 73 | user: { id: 'user-1', email: 'user@example.com', emailVerified: true }, | CODE |
| LOW | …ns/__tests__/NoteEditorScreen.calendarContext.test.tsx | 547 | mockAuthState.user = { id: 'user-1', email: 'user@example.com', emailVerified: true }; | CODE |
| LOW | …ns/__tests__/NoteEditorScreen.calendarContext.test.tsx | 1634 | email: 'user@example.com', | CODE |
| LOW | …ens/__tests__/NoteEditorScreen.conflictBanner.test.tsx | 71 | user: { id: 'user-1', email: 'user@example.com', emailVerified: true }, | CODE |
| LOW | …/src/screens/__tests__/AccountScreen.referral.test.tsx | 8 | email: 'user@example.com', | CODE |
| LOW | …e/src/screens/__tests__/AccountScreen.billing.test.tsx | 17 | email: 'user@example.com', | CODE |
| LOW | …nts/superwall/__tests__/SuperwallGateProvider.test.tsx | 225 | email: 'user@example.com', | CODE |
| LOW | …pr-mobile/src/lib/__tests__/authClient.cookies.test.ts | 6 | data: { user: { id: 'user-1', email: 'user@example.com', emailVerified: true } }, | CODE |
| LOW | …pr-mobile/src/lib/__tests__/authClient.cookies.test.ts | 39 | (auth: AuthClientModule) => auth.signInWithEmail('user@example.com', 'password'), | CODE |
| LOW | …pr-mobile/src/lib/__tests__/authClient.cookies.test.ts | 41 | ['sign-up', (auth: AuthClientModule) => auth.signUpWithEmail('user@example.com', 'password')], | CODE |
| LOW | …bile/src/store/__tests__/useNotesStore.meeting.test.ts | 165 | const signedInUser = { id: 'user-1', email: 'user@example.com', emailVerified: true }; | CODE |
| LOW | …bile/src/store/__tests__/useNotesStore.meeting.test.ts | 687 | mockAuthState.user = { id: 'user-1', email: 'user@example.com', emailVerified: true }; | CODE |
| LOW | …bile/src/store/__tests__/useNotesStore.meeting.test.ts | 936 | mockAuthState.user = { id: 'user-1', email: 'user@example.com', emailVerified: true }; | CODE |
| LOW | test/utils/snippets.test.js | 401 | snippets: [{ trigger: "acme", replacement: "Acme Corp" }], | CODE |
| LOW | test/components/authenticationStep.test.js | 300 | const offline = await submitEmail(unavailableDiscovery, "user@example.com"); | CODE |
| LOW | test/components/authenticationStep.test.js | 309 | const company = await submitEmail(ssoAccount, "user@example.com"); | CODE |
| LOW | test/components/dictionaryView.test.js | 308 | node.getAttribute("placeholder") === "dictionary.shared.add.placeholder" | CODE |
| LOW | test/components/createSkillScreen.test.js | 324 | { ok: false, problems: [{ code: "placeholder" }] }, | CODE |
| LOW⚡ | test/lib/emailAuthDiscovery.test.js | 66 | await discoverEmailAuth("user@example.com", "https://auth.example.test"), | CODE |
| LOW⚡ | test/lib/emailAuthDiscovery.test.js | 75 | assert.equal(await discoverEmailAuth("user@example.com", "https://auth.example.test"), null); | CODE |
| LOW⚡ | test/lib/emailAuthDiscovery.test.js | 80 | await assert.rejects(discoverEmailAuth("user@example.com", "https://auth.example.test"), { | CODE |
| LOW⚡ | test/lib/emailAuthDiscovery.test.js | 87 | await assert.rejects(discoverEmailAuth("user@example.com", "https://auth.example.test"), { | CODE |
| LOW⚡ | test/lib/emailAuthDiscovery.test.js | 93 | await assert.rejects(discoverEmailAuth("user@example.com", "https://auth.example.test"), { | CODE |
| LOW | test/helpers/connectors/emailCompose.test.js | 7 | to: ["gabe+lunch@example.com", "dana@example.org"], | CODE |
| LOW | test/helpers/connectors/createConnectors.test.js | 131 | getGoogleCalendarAccounts: () => [{ email: "user@example.com" }], | CODE |
| LOW | test/helpers/connectors/createConnectors.test.js | 137 | email: "user@example.com", | CODE |
| LOW | test/helpers/connectors/createConnectors.test.js | 170 | return [{ email: "user@example.com" }]; | CODE |
| LOW | test/helpers/connectors/createConnectors.test.js | 178 | email: "user@example.com", | CODE |
| LOW | test/helpers/connectors/createConnectors.test.js | 191 | email: "user@example.com", | CODE |
| LOW | test/helpers/skills/skillFormat.test.js | 163 | assert.deepEqual(codes(validateSkillFiles(inBody, { source: "app" }).problems), ["placeholder"]); | CODE |
| LOW | test/helpers/skills/skillsIpc.test.js | 197 | const problems = [{ code: "placeholder" }]; | CODE |
| LOW | test/helpers/skills/skillsIpc.test.js | 330 | const problems = [{ code: "placeholder" }]; | CODE |
| LOW | test/helpers/skills/skillUpdate.test.js | 363 | { code: "placeholder" }, | CODE |
| LOW | test/helpers/skills/skillLibraryModel.test.js | 135 | problems: [{ code: "placeholder" }], | CODE |
| LOW | test/helpers/skills/skillLibraryModel.test.js | 138 | problems: [{ code: "placeholder" }], | CODE |
| LOW | test/helpers/skills/skillLibrary.test.js | 881 | problems: [{ code: "placeholder" }], | CODE |
| LOW | test/services/skillProposalTools.test.js | 105 | const electron = fakeElectron({ problems: [{ code: "placeholder" }, { code: "tooLarge" }] }); | CODE |
| LOW | src/types/skills.ts | 25 | | "placeholder" | CODE |
| LOW | src/locales/ja/translation.json | 265 | "placeholder": "ここをクリックしてからショートカットを押してください。OpenWhispr はどんなテキスト欄にも入力します。" | CODE |
| LOW | src/locales/ja/translation.json | 1495 | "placeholder": "カスタムシステムプロンプトを入力..." | CODE |
| LOW | src/locales/ja/translation.json | 1809 | "placeholder": "お名前", | CODE |
| LOW | src/locales/ja/translation.json | 1857 | "placeholder": "例: ジャービス、ノヴァ、アトラス...", | CODE |
| LOW | src/locales/ja/translation.json | 1956 | "placeholder": "単語またはフレーズを追加...", | CODE |
| LOW | src/locales/ja/translation.json | 3451 | "placeholder": "何でも質問", | CODE |
| LOW | src/locales/ja/translation.json | 3533 | "placeholder": "カンマ区切りで単語を追加", | CODE |
| LOW | src/locales/ja/translation.json | 3697 | "placeholder": "friend@example.com", | CODE |
| LOW | src/locales/ja/translation.json | 3939 | "placeholder": "API キーを入力", | CODE |
| LOW | src/locales/ja/translation.json | 4856 | "placeholder": "先に [TODO: …] のプレースホルダーを置き換えてください", | CODE |
| LOW | src/locales/ja/translation.json | 5059 | "placeholder": "ノートと文字起こしを検索…", | CODE |
| LOW | src/locales/ja/translation.json | 5182 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | src/locales/it/translation.json | 265 | "placeholder": "Clicca qui, poi premi la tua scorciatoia. OpenWhispr scrive in qualsiasi campo di testo." | CODE |
| LOW | src/locales/it/translation.json | 1495 | "placeholder": "Inserisci il tuo prompt di sistema personalizzato..." | CODE |
| LOW | src/locales/it/translation.json | 1809 | "placeholder": "Il tuo nome", | CODE |
| LOW | src/locales/it/translation.json | 1857 | "placeholder": "es. Jarvis, Nova, Atlas...", | CODE |
| LOW | src/locales/it/translation.json | 1956 | "placeholder": "Aggiungi una parola o frase...", | CODE |
| LOW | src/locales/it/translation.json | 2834 | "placeholder": "friend@example.com", | CODE |
| LOW | src/locales/it/translation.json | 3523 | "placeholder": "Chiedi qualsiasi cosa", | CODE |
| LOW | src/locales/it/translation.json | 3606 | "placeholder": "Aggiungi parole separate da virgole", | CODE |
| LOW | src/locales/it/translation.json | 3957 | "placeholder": "Incolla la tua chiave API", | CODE |
| 112 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ns/keyboard-extension/ios/KeyboardViewController.swift | 1221 | private var agentReviewSessionId = "" | COMMENT |
| LOW | …ns/keyboard-extension/ios/KeyboardViewController.swift | 3501 | COMMENT | |
| LOW | …speaker-diarization/ios/SpeakerDiarizationModule.swift | 1 | import ExpoModulesCore | COMMENT |
| LOW | …obile/modules/parakeet-asr/ios/ParakeetASRModule.swift | 21 | // AsrModels.load(from:version:encoderPrecision:) — loads what JS installed (the ANE-compile | COMMENT |
| LOW | openwhispr-mobile/src/config/constants.ts | 21 | }; | COMMENT |
| LOW | openwhispr-mobile/src/config/prompts/retiredPrompts.ts | 1 | import * as Crypto from 'expo-crypto'; | COMMENT |
| LOW | …ile/src/screens/__tests__/personalFolderScope.test.tsx | 1 | // Fix round 2, Finding 3: every personal folder surface — the FoldersScreen | COMMENT |
| LOW | openwhispr-mobile/src/lib/policyMessages.ts | 1 | // Single source of truth for the org-policy / client-version rejection | COMMENT |
| LOW | openwhispr-mobile/src/lib/chat/chatContext.ts | 21 | // Most two-character words are filler ("he", "go"), so one is kept only when it is clearly a name or | COMMENT |
| LOW | openwhispr-mobile/src/lib/chat/chatTerms.ts | 1 | // How a chat search term is matched. The note search (SQL) and the transcript passages sent with a | COMMENT |
| LOW | openwhispr-mobile/src/lib/notes/localMeetingNotes.ts | 21 | import type { StructuredMeetingNotes } from '@/types'; | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushNotes.ts | 81 | | { type: 'retry' } // count as failure, retry on the next sync (default) | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushNotes.ts | 241 | // A pending delete is exempt from the filter: DELETE carries no body, so | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushNotes.ts | 281 | continue; | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushNotes.ts | 461 | // draw one — batch-create also checks the SOURCE space of any existing | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushFolders.ts | 141 | // A pending delete is exempt from the filter: DELETE carries no body, so | COMMENT |
| LOW | openwhispr-mobile/src/sync/pushFolders.ts | 381 | // and team_not_found also arrive as 404s, and those mean "the scope is not | COMMENT |
| LOW | openwhispr-mobile/src/sync/pullDictionary.ts | 201 | // Using delta on the first sync would mid-stream two orderings — the server's | COMMENT |
| LOW | openwhispr-mobile/src/data/local/notesRepository.ts | 701 | .run(); | COMMENT |
| LOW | openwhispr-mobile/src/data/local/notesRepository.ts | 1301 | .set({ remoteId, pendingSync: 0, updatedAt: serverUpdatedAt }) | COMMENT |
| LOW | …ile/src/services/transcription/TranscriptionService.ts | 181 | return info.exists ? (info as any).size : undefined; | COMMENT |
| LOW | openwhispr-mobile/src/store/useAuthStore.ts | 141 | // build. Silently creating a server-side record for someone who declined one | COMMENT |
| LOW | native/meeting-aec-helper/compat/rtc_base/win32.h | 1 | // Shim: webrtc-apm omits rtc_base/win32.h but time_utils.cc includes it under | COMMENT |
| LOW | test/utils/githubMentions.test.js | 41 | // "@@x" and a domain immediately before "@" ("medium.com/@x") still don't | COMMENT |
| LOW | test/helpers/audioManagerCancelLifecycle.test.js | 221 | }); | COMMENT |
| LOW | test/helpers/useChatStreamingCancellation.test.js | 21 | // | COMMENT |
| LOW | test/helpers/connectors/githubFixtures.js | 1 | // GitHub replies for the GitHub connector tests. The shapes follow GitHub's | COMMENT |
| LOW | test/helpers/connectors/linearFixtures.js | 1 | // Linear replies for the Linear connector tests. The shapes follow what a | COMMENT |
| LOW | test/helpers/harness/fakeCloud.js | 1 | // In-memory stand-in for the cloud API behind window.electronAPI.cloudApiRequest. | COMMENT |
| LOW | resources/linux-system-audio-helper.c | 1 | #define _GNU_SOURCE | COMMENT |
| LOW | resources/linux-system-audio-helper.c | 21 | #define TARGET_SAMPLE_RATE 24000 | COMMENT |
| LOW | resources/windows-text-monitor.c | 21 | * Compile: | COMMENT |
| LOW | resources/linux-key-listener.c | 1 | /** | COMMENT |
| LOW | resources/windows-system-audio-helper.c | 21 | * audio so the output timeline stays continuous. | COMMENT |
| LOW | resources/windows-mic-listener.c | 401 | } else { | COMMENT |
| LOW | resources/linux-fast-paste.c | 1 | #define _GNU_SOURCE | COMMENT |
| LOW | resources/mediaremote-adapter/src/adapter/get.m | 1 | // Copyright (c) 2025 Jonas van den Berg | COMMENT |
| LOW | resources/mediaremote-adapter/src/adapter/stream.m | 1 | // Copyright (c) 2025 Jonas van den Berg | COMMENT |
| LOW | resources/mediaremote-adapter/src/utility/helpers.m | 1 | // Copyright (c) 2025 Jonas van den Berg | COMMENT |
| LOW | …superpowers/plans/2026-09-10-agent-paste-plain-text.md | 381 | // | COMMENT |
| LOW | scripts/afterPack.js | 1 | // electron-builder afterPack hook | COMMENT |
| LOW | scripts/download-sherpa-onnx.js | 21 | const GITHUB_RELEASE_URL = `https://github.com/k2-fsa/sherpa-onnx/releases/download/v${SHERPA_ONNX_VERSION}`; | COMMENT |
| LOW | src/config/retiredPrompts.js | 1 | // Registry of default prompt texts the app has shipped over time, as SHA-256 | COMMENT |
| LOW | src/stores/settingsStore.ts | 601 | if (v !== null) localStorage.setItem(dst, v); | COMMENT |
| LOW | src/stores/settingsStore.ts | 661 | if (v !== null) localStorage.setItem(dst, v); | COMMENT |
| LOW | src/stores/settingsStore.ts | 881 | // migrateProviderSettings() had created `transcriptionMode` / `reasoningMode`, | COMMENT |
| LOW | src/stores/settingsStore.ts | 2861 | // other three LLM scopes — used when onboarding routes every reasoning scope to | COMMENT |
| LOW | src/stores/actionProcessingStore.ts | 41 | // meeting on the default 9B while the merge still had room to spare. | COMMENT |
| LOW | src/stores/noteStore.ts | 101 | COMMENT | |
| LOW | src/utils/gpuBannerPolicy.ts | 21 | // each branch must require an engine that actually runs locally — otherwise the | COMMENT |
| LOW | src/utils/audioContainer.ts | 1 | // Chromium's MediaRecorder only offers WebM/Opus (and MP4/AAC) on the desktop | COMMENT |
| LOW | src/utils/dictionaryPromptCap.js | 1 | import { usesTranscriptionKeywords } from "./dictionaryKeywords.js"; | COMMENT |
| LOW | src/utils/dictionaryPromptCap.js | 21 | // rare proper nouns fragment. Used to warn in the UI, not to trim: the true | COMMENT |
| LOW | src/utils/sharedDictionaryHints.ts | 41 | // A colon that ends a token ("SYSTEM:", "Note:") opens a clause; inside one | COMMENT |
| LOW | src/utils/whisperGpuPack.ts | 1 | import type { CudaWhisperStatus, VulkanWhisperStatus } from "../types/electron"; | COMMENT |
| LOW | src/components/ui/overlayBlur.ts | 1 | import { getCachedPlatform } from "../../utils/platform"; | COMMENT |
| LOW | src/components/ui/pageWidth.ts | 1 | // Content column shared by the control panel pages. Apply it inside a scroll | COMMENT |
| LOW | src/components/ui/gradientCircle.ts | 1 | // Brand blue as glass, matched to the app icon: the --gradient-brand-glass ramp under the | COMMENT |
| LOW | src/components/icons/primitives.tsx | 181 | // under Lucide's ISC License: | COMMENT |
| LOW | src/helpers/database.js | 201 | COMMENT | |
| 42 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/helpers/macosPasteTyping.test.js | 21 | print("{\\"browser\\":\\"\\(bundleId)\\",\\"typed\\":\\(isTypedBrowser(bundleId))}") | CODE |
| HIGH | test/helpers/macosPasteTyping.test.js | 27 | print("{\\"chunks\\":\\(encoded)}") | CODE |
| HIGH | test/helpers/macosPasteLayout.test.js | 93 | print("layout scenarios passed") | CODE |
| HIGH⚡ | test/helpers/macosPasteRead.test.js | 27 | print("PASTE_POSTED") | CODE |
| HIGH⚡ | test/helpers/macosPasteRead.test.js | 29 | print(promise.waitForRead(postedAt: postedAt, budgetMs: Int(arguments[3])!)) | CODE |
| HIGH⚡ | test/helpers/macosPasteRead.test.js | 31 | print(pasteboard.string(forType: .string) ?? "<none>", terminator: "") | CODE |
| HIGH⚡ | test/helpers/macosPasteRead.test.js | 34 | print(tag ?? "<none>", (pasteboard.types ?? []).map(\\.rawValue).joined(separator: ",")) | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 194 | return None | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 197 | return None | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 200 | return None | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 203 | return None | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 206 | return None | CODE |
| HIGH⚡ | scripts/lib/meeting-aec-build.js | 209 | return None | CODE |
| HIGH | scripts/lib/meeting-aec-build.js | 255 | return None | CODE |
| HIGH | scripts/lib/meeting-aec-build.js | 296 | print(json.dumps({"regular": sorted(collected), "avx2": sorted(avx2)})) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 85 | // ─── Mirror keys ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 237 | // ─── Request consumption ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 355 | // ─── readKeyboardAgentJob ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 396 | // ─── readKeyboardAgentDraft ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 437 | // ─── clearKeyboardAgentJob ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 451 | // ─── writeKeyboardAgentResult ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 549 | // ─── consumeKeyboardAgentAction ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 609 | // ─── isKeyboardAgentCancelled ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …spr-mobile/src/lib/__tests__/keyboardAgentSync.test.ts | 628 | // ─── Example instructions ───────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | test/locales/orukeetModelCard.test.js | 14 | assert.ok(translation.models.descriptions.parakeet.orukeet.trim()); | CODE |
| CRITICAL | test/helpers/assistantPanel.test.js | 634 | const onKeyDown = globalThis.document.addEventListener.mock.calls.findLast( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | resources/linux-text-monitor.py | 61 | except Exception: | CODE |
| LOW⚡ | resources/linux-text-monitor.py | 77 | except Exception: | CODE |
| LOW⚡ | resources/linux-text-monitor.py | 85 | except Exception: | CODE |
| LOW | resources/linux-text-monitor.py | 120 | except Exception: | CODE |
| LOW | resources/linux-text-monitor.py | 147 | except Exception: | CODE |
| LOW | resources/linux-text-monitor.py | 167 | except Exception: | CODE |
| LOW | resources/linux-text-monitor.py | 180 | except Exception: | CODE |
| LOW⚡ | resources/linux-text-monitor.py | 203 | except Exception: | CODE |
| LOW⚡ | resources/linux-text-monitor.py | 214 | except Exception: | CODE |
| LOW⚡ | resources/linux-text-monitor.py | 223 | except Exception: | CODE |
| LOW | resources/linux-text-monitor.py | 242 | except Exception: | CODE |
| MEDIUM | resources/linux-text-monitor.py | 101 | def _parse_pid(value): | CODE |
| MEDIUM | resources/linux-text-monitor.py | 231 | def on_text_changed(event): | CODE |
| LOW | examples/custom-asr-shim/shim_template.py | 160 | except Exception as exc: # surface, never swallow | CODE |
| LOW | examples/custom-asr-shim/stepaudio_shim.py | 234 | except Exception as exc: # surface, never swallow | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | resources/linux-text-monitor.py | 61 | except Exception: | CODE |
| HIGH | resources/linux-text-monitor.py | 267 | except KeyboardInterrupt: | CODE |
| HIGH | resources/linux-text-monitor.py | 120 | except Exception: | CODE |
| HIGH | resources/linux-text-monitor.py | 242 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/components/integrationsView.test.js | 460 | assert.match(shownText(container), /Authorization: Bearer YOUR_API_KEY/); | CODE |
| HIGH | docs/integrations-compatibility.md | 43 | For OAuth, add the server URL in a supporting client, sign in to OpenWhispr and approve access. For a client accepting r | CODE |
| HIGH | src/components/integrations/McpPane.tsx | 101 | Authorization: Bearer YOUR_API_KEY | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | src/locales/en/translation.json | 5409 | "formal": "Hi Sarah,\n\nThank you for your time today. I will send the updated proposal by Thursday. Please let | CODE |
| MEDIUM⚡ | src/locales/en/translation.json | 5410 | "casual": "Hi Sarah,\n\nThanks for today. I'll send the updated proposal over by Thursday, let me know if you ne | CODE |
| MEDIUM⚡ | src/locales/en/translation.json | 5411 | "excited": "Hi Sarah,\n\nThanks so much for your time today! I'll send the updated proposal by Thursday. Let me | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/components/backdropBlurCost.test.js | 8 | // (#2298). The harness renders i18n keys verbatim; the assertions only read classes. | COMMENT |
| MEDIUM | test/helpers/cloudChunkPolicy.test.js | 255 | // 73-minute file read as a seamless transcript. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …kground-uploader/tests/run-provider-transport-tests.py | 26 | CODE | |
| LOW | …kground-uploader/tests/run-provider-transport-tests.py | 43 | CODE | |
| LOW | resources/linux-text-monitor.py | 109 | CODE | |
| LOW | examples/custom-asr-shim/stepaudio_shim.py | 91 | CODE | |
| LOW | examples/custom-asr-shim/test_shim.py | 224 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …sources/mediaremote-adapter/bin/mediaremote-adapter.pl | 3 | # This file is licensed under the BSD 3-Clause License. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/custom-asr-shim/shim_template.py | 21 | CODE | |
| LOW | examples/custom-asr-shim/stepaudio_shim.py | 17 | CODE | |
| LOW | examples/custom-asr-shim/test_shim.py | 14 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | examples/custom-asr-shim/test_shim.py | 11 | cd examples/custom-asr-shim && python3 -m unittest | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | resources/linux-text-monitor.py | 208 | # Check if the element supports the Text interface | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CLAUDE.md | 298 | Offline semantic search that finds notes by meaning, not just keywords. Used by the AI agent's `search_notes` tool. Its | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/components/JoinYourTeamModal.tsx | 73 | async function handleRequest(entry: JoinableWorkspace) { | CODE |