Reference

Data model & storage

The exact shape of settings, history records, and dictionary entries — and where each lives on disk. Everything is local JSON.

Config

electron-store JSON

History

One file per record

Location

app userData directory

Entities

VoiceFlow persists three things: your settings (a single config object), your transcription history (one JSON file per record), and your dictionary (one JSON file per term).

LegendPKPrimary key / idFKForeign key referenceJSONSerialized JSON stringIDXUsed for search / filteringMODEDiscriminates dictation vs ask recordsNULLNullable / only present for part of the lifecycle
AppSettings9 fields

Single config object in the electron-store.

  • hotkeystringIDX
  • holdToTranscribeHotkeystring
  • languagestring
  • enablePolishboolean
  • polishProvider"groq"
  • audioInputDeviceId?string
  • groqApiKeystring
  • defaultModedictation|askMODE
  • askPasteBehaviorenum
TranscriptionRecord15 fields

One JSON file per transcription, named <id>.json.

  • idstringPK
  • modedictation|askMODE
  • original_textstring
  • optimized_text?string
  • command_text?string
  • source_text?string
  • final_textstring
  • app_context?jsonJSON
  • detected_language?string
  • app_name?stringIDX
  • window_title?stringIDX
  • diagnostics?jsonJSON
  • duration_seconds?number
  • word_countnumber
  • created_atstring
DictionaryWord3 fields

One JSON file per custom vocabulary term.

  • idstringPK
  • wordstringIDX
  • created_atstring
Relationships
  • TranscriptionRecordN : 1AppSettings.defaultModemode chosen at record time
  • DictionaryWordN : NTranscriptionRecordbiases the Whisper prompt

app_context is a serialized CursorContext captured at recording time. optimized_text, command_text, and source_text are populated depending on mode.

Which text fields are set, by mode

FieldDictationAsk
original_textalwaysThe raw Whisper transcript in both modes.
optimized_textif polishedDictation: the polished rewrite (or null on fallback). Ask: the transformed text.
command_textnull / instructionAsk only: the spoken instruction (the raw transcript).
source_textnull / selectionAsk only: the selected text that was transformed.
final_textalwaysWhat was actually pasted — the source of truth.

Storage locations

Everything lives under Electron's app.getPath('userData') directory:

userData layout
<userData>/
├── config.json          # electron-store: settings + API key
├── history/
│   ├── <id>.json        # one TranscriptionRecord per file
│   └── …
└── dictionary/
    ├── <id>.json        # one DictionaryWord per file
    └── …

Custom history directory

The history folder can be relocated (for example into a synced directory). VoiceFlow will create the target if needed and read / write future records there.

Your API key is stored in plaintext

The Groq API key lives in the local config store as plain text, readable by anything running as your user. Treat the config directory accordingly.