Dictare now runs on Windows.
Not “builds on Windows.” Not “launches and immediately crashes on Windows.” Runs. Tray icon in the corner, global hotkey registered, hold to record, let go, transcription comes back, text pastes at the cursor. The full pipeline. On a Windows machine.
That happened this week, and it took significantly longer than I expected — almost entirely because of one plugin that was very confidently doing nothing.
—
The Setup
The plan going into this week was straightforward in theory: take the Flutter app that’s been working on macOS for months and verify it compiles and runs on a Windows PC. Flutter is supposed to be cross-platform. The Dart code is shared. The native bits — tray icon, hotkey, overlay, audio recording — are abstracted behind platform channels. How hard could it be?
The answer is: harder than the framework pitch suggests, less hard than writing everything twice.
Monday evening I got the first successful Windows build. `flutter build windows –debug`, 74 seconds, exit 0. The executable landed in the build folder. I launched it.
The tray icon appeared. The hotkey registered. The overlay window showed. The recording coordinator initialised without errors. At this point I was feeling unreasonably good about my life choices.
Then I pressed the hotkey and tried to record something.
—
The Lying Plugin
The `record` Flutter plugin has a Windows implementation called `record_windows`. It supports the same Dart API as the macOS version. You call `.start()`, it returns a Future that resolves to success, and recording begins.
Except it doesn’t.
The logs said everything was working. `_doStart: about to call plugin start()` — check. `_doStart: plugin start() returned` — check. WAV file path created in the temp directory — check. Then I opened the recording file and found it was empty. Zero bytes.
I went to Windows Settings → Privacy → Microphone → Recent activity. Zero requests. Nothing had touched the microphone. The plugin had told me it was recording while quietly never opening the audio device.
I confirmed this by digging into the plugin’s source. The Windows implementation calls into Windows Media Foundation. The problem was somewhere in that stack — the API was reporting success regardless of what Media Foundation actually did underneath. The CHANGELOG showed a known pattern of silent-failure issues across recent versions, with the most recent release notes hedging on which Flutter versions the fix actually applies to. I’m on a Flutter version that isn’t on that list.
The fix required going one level down: instead of using the plugin’s WAV-writer wrapper, I switched to a raw PCM encoder and wrote the WAV header in Dart. Different code path, bypasses the layer that was silently failing. Audio started capturing immediately.
Early Tuesday morning, before the workday started, the pipeline went end-to-end on Windows for the first time. Hold hotkey, speak, let go, watch the transcription come back from Supabase, text paste at cursor. The thing works.
—
The Bugs That Weren’t The Audio Bug
While the audio issue was blocking, I was also finding the smaller things.
Windows IME has `Win+Shift+Space` reserved. That was Dictare’s Mac hotkey. The Windows port needed `Ctrl+Alt+Space` instead. The hotkey manager plugin silently accepts any hotkey registration without telling you if it failed — I had to read the plugin’s C++ source to find the discarded return value.
The tray icon initialiser expects a real `.ico` file on disk at runtime. The Mac path of passing an empty string doesn’t work. I bundled the default Flutter scaffold icon as a temporary fix — the proper Dictare icon is coming in Phase 9.
The `wispr/filepicker` native channel is macOS-only. Windows has no handler for it. The fix is a `MissingPluginException` catch that returns null — appropriate, because after Phase 5a the credentials move server-side anyway.
Each of these took twenty minutes to an hour to diagnose. None of them were documented anywhere useful. I found them the old-fashioned way.
—
The App Is Now Called Dictare on Windows
One other thing that shipped this week: the user-visible rebrand.
The codebase internally is still called “wispr” — package names, SharedPreferences keys, MethodChannel identifiers. That’s a deliberate Phase 9 decision. Changing those now would wipe test users’ configs and require lockstep changes across Mac and Windows native code. Not worth the risk this close to launch prep.
But the things users actually see — window title, tray tooltip, MSIX publisher field — those were still showing “wispr.” Easy to fix, purely text changes, no migration headaches. So I fixed them.
The MSIX publisher now reads “BadgerBuilds Ltd.” The window title says “Dictare.” The tray tooltip says “Dictare — Voice to Text” or “Dictare — Voice to Translate” depending on mode. Small thing, but it matters. If I’m going to use this every day for real testing, it should look like a real product.
—
Where Things Stand
Dictare is now feature-complete on Windows with one exception: the waveform visualiser. On macOS, when you hold the hotkey to record, you get a floating 16-bar animation that reacts to your voice amplitude in real time. It’s a Core Animation panel — sixteen white rounded rectangles that breathe with your voice. Satisfying to use.
Windows didn’t have that. The overlay would show but with no animation — a silent dark rectangle while you spoke, then the “Transcribing…” status after. Functional, but wrong.
That shipped by the end of the week too. The Windows implementation uses GDI (Windows’ native graphics layer), 16 vertical bars, a 60Hz repaint timer that lerps each bar toward its target height for smoothing. Less elegant than the Mac version at the code level, but visually equivalent.
That was the last gap.
—
What’s Next
Phase 5b — the Windows port — is done. Both platforms are now in parity.
That leaves:
The target is still Q3 2026. That’s feeling achievable now in a way it didn’t when I was staring at a zero-byte WAV file at 10pm on Monday.
—
This Week in Numbers
—
Dictare works on Windows. That’s the week.
— Badger
—
Badger is building an AI-powered side income in public. No gurus, no fluff — just honest accounts of what’s working, what isn’t, and what it’s actually costing.