Skip to content

Custom Words: import from other dictation apps (PR-4a/b/c, epic #1619) #1686

Description

@saurabhav88

Part of #1619 (Smart Import, PR-4a/4b/4c in the adopted v5 plan).

Tier: MEDIUM | Test: required (PostProcessing) | Modules: PostProcessing, AppKit

What

Read the user's vocabulary out of another dictation app they already use, and fold it through the same review-and-commit pipeline as every other source.

Schemas were grep-verified directly on this machine (bible §5.8) and re-confirmed tonight against live data.

Scope: three apps, not four

App Storage Live data here v1
Wispr Flow SQLite, Dictionary table 9 rows, 6 importable
FluidVoice JSON, terms[] 1 term, 2 aliases
Superwhisper JSON, vocabulary[] + replacements[] 2 words, 1 replacement
TypeWhisper CoreData SQLite 0 rows ❌ deferred

TypeWhisper is deferred deliberately. Its schema is confirmed but the table is empty on the only machine available, so an adapter would be written against a shape nobody has ever seen populated — and its WAL sidecar files add a real correctness question that cannot be tested without real content. Writing it blind and calling it done would be exactly the kind of unverified work this epic has been avoiding.

Read constraints each adapter must honour

  • Wispr Flow: filter isDeleted = 0 (soft-delete — an unfiltered read resurrects words the user deliberately removed) and isSnippet = 0 (text expansions are a different feature). Open read-only/immutable: it is another app's live database.
  • Superwhisper: probe BOTH ~/Documents/superwhisper/ (legacy, present here) and ~/superwhisper/ (current default). Both keys may be absent entirely on a fresh install, not present-but-empty.
  • FluidVoice: read only the terms array; the sibling top-level keys are that app's own ASR tuning parameters, not vocabulary.

Synonyms are not imported

Consistent with the founder's v1 rule: competitor adapters supply the main word only, with every authority field .unspecified. A Wispr Flow entry like btw → by the way imports as the word "by the way"; the mapping itself is not brought across. Existing words are skipped and never modified.

This is an honest partial migration, and the screen says so rather than implying a full one.

Nothing is read until asked

No directory is touched at launch or on opening the sheet. Detection and reading happen only after the user picks an app, so an installed competitor is never quietly inspected in the background.

DoD

Each adapter tested against a fixture of that app's real shape · absent app reports "not found" rather than an error · present-but-empty reports nothing to import · another app's live database is never opened for writing · adds no second entry point · full suite + Debug/Release green.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2-mediumMedium priorityfeatureNew feature or capability

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions