Real-time dictation (AssemblyAI/Deepgram, own provider/key/model), auto-ingest
folders, record-in-background, per-invocation diarization, manage built-in
templates (enable/track), local whisper.cpp auto-start/idle-stop, and dev tooling
(local review + release-checklist skill).
Voxtral realtime was reverse-engineered but pulled (not WebView-reachable); its
adapter is kept on disk, unwired.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Switching the API-key encryption mode no longer moves keys. The on-disk
envelope now retains passphrase material (kdf/verifier/keys) even while
Obsidian secret storage is active, so the two stores coexist and `mode` is
just the active-store flag.
Key transfer is now an explicit, separate action presented as Copy (the
source is kept, so it is a copy, not a move):
- setEncryptionMode: switch active method only, no transfer
- copyKeys: duplicate inactive -> active, source untouched
- clearKeys(mode): wipe one method's saved keys
- unlockPassphraseStore: unlock the snapshot regardless of active mode
- countStoredKeys / EncryptionStatus.passphraseConfigured for the UI
Settings tab: the mode dropdown is now a pure switch; new Copy and Clear
buttons (behind a new generic ConfirmModal) handle key material with a
copied/cleared count Notice. changePassphrase is a direct within-passphrase
re-key. Docs updated (SECRETS.md, CLAUDE.md, wiki).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Errors: bump minAppVersion 1.4.0 to 1.4.4 (FileManager.processFrontMatter is since 1.4.4) and update versions.json; remove the disallowed eslint-disable in passphrase-modal and pass the random-string example via a variable to satisfy sentence-case.
Popout/compat warnings: setTimeout/clearTimeout to window.*; document to activeDocument, capturing the document ref for paired add/removeEventListener (recorder wake-lock, quick-record popover, settings, floater); globalThis to window for require/process in getNodeApi; replace the rewrite-hidden display-none important rule with el.toggle/hide/show; register activeDocument/activeWindow as eslint globals for no-undef.
Attestations: add .github/workflows/release.yml (build, actions/attest-build-provenance, softprops/action-gh-release on tag push).
Docs: CLAUDE.md minAppVersion rationale plus CI release/attestation and display() deferral notes; README Vault access disclosure and License corrected to 0BSD; DEVCONFLICTS refreshed.
Deferred recommendations: display() to getSettingDefinitions (1.13.0+ rewrite) and vault enumeration (necessary, disclosed).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This session's features:
- Quick Record mode selector: third button on the floater opens a
popover of templates, switchable mid-recording. Updates the
controller's template in place; does not touch lastUsedTemplateId
until completion.
- Per-invocation destination override on the main modal: a Destination
row under the template picker overrides insertMode and the new-file
fields for one run, plumbed via PipelineParams.destinationOverride
and shallow-merged onto a template copy before insertOutput. The
template file on disk is never mutated.
- Assistant prompt as a vault file: replaces the settings textarea
with ReWrite/AssistantPrompt.md, loaded via src/assistant-prompt.ts
and cached on plugin.assistantPrompt. AI/Agent labels standardized
to "Assistant"; aiName -> assistantName; adHocInstructionsPrompt
field removed.
- Known Nouns list: ReWrite/KnownNouns.md with YAML guidance
frontmatter and a Markdown body of nouns (optional misheard
alternates after a colon). buildKnownNounsSystemPromptSection
injects a "Known nouns" block into the LLM system prompt only when
the list is non-empty. Frontmatter is for humans and is not sent
to the LLM in v1.
Cross-cutting: PipelineParams gains host: PipelineHost (narrow
interface in src/types.ts) so the pipeline can read assistantPrompt
and knownNouns without importing ReWritePlugin and forming a cycle.
Pre-existing uncommitted work also rolled in:
- Passphrase encryption for secrets.json.nosync via AES-GCM +
PBKDF2 (src/secrets.ts), with PassphraseModal and a settings-tab
banner/dropdown for mode selection.
- WhisperHost adopt/external states + PID sidecar so an orphaned
whisper-server from a previous session is adopted, and external
ones are never killed by ReWrite (src/whisper-host.ts).
- Whisper status bar (src/ui/whisper-status-bar.ts) and
start/stop commands.
- Audio persistence before transcription (src/audio-persist.ts)
plus the reprocess-audio flow (src/ui/audio-source.ts,
src/ui/audio-file-picker.ts).
- Wake-name extraction (src/wake-name.ts).
- Templates as vault Markdown files in a folder
(src/templates-folder.ts).
- Linux build script for whisper-server
(scripts/build-whisper-linux.sh).
- README, CLAUDE.md, docs/FEATURES.md, eslint.config.mts updates
covering all of the above.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>