Telling Technology · Learning in public
All episodes
EP.28 — VOICE ROUTER
Speak to the right window, not the loud one

I voice-command any Claude Code window on any screen

I said “on screen 2, tab 3: implement the plan” out loud — and the right AI session, on the right monitor, picked up the order and started working. No clicking between windows. No voice assistant guessing which project I meant.

A multi-monitor desk: the main PC plus a phone and a spare laptop turned into extra screens, each running a Claude Code session, with a spoken command routing to screen 2.
⌁ one voice · every screen · zero tokens to route
It starts with the demo: say the screen and tab, watch the prompt land where you meant it.
01 The bottleneck

Many projects, many windows — and voice couldn't aim

Every project runs its own VS Code window with its own Claude Code session. Switching between them by hand is the real bottleneck — and no voice assistant can target a specific window. So I built the screen fabric first: spacedesk turns any spare device into an extra monitor for free — an old laptop, a tablet, even my phone joins over its browser with no native client. I tried it live on my phone as a second screen and it just worked. The signage box I'd priced as the alternative cost 2 195 kr and couldn't even extend the desktop.

claude code — desktop
> I've got five projects open in five VS Code windows across three screens. Give me a way to send a spoken order to one specific window.
First the canvas: spacedesk adds any spare device as a wired/wireless monitor — free, browser-based, phone included. Then we can route by screen + tab. Building the window router next.
Desk with a main monitor plus a laptop and a phone acting as extra screens via spacedesk, each running a different VS Code window.
spacedesk · 0 kr
Spare laptop + phone become screens 2 and 3 — for free.
02 The router

Every window enumerated live — no config to go stale

A PowerShell script walks Win32 and enumerates every VS Code window at the moment I speak — which monitor it sits on, its position, its title. So “screen 2, tab 3” is resolved fresh each time, against the windows that are actually open right now. No config file to drift out of date, no hard-coded window handles that break the second I rearrange the desk. The route-list map you see is generated on the fly.

claude code — desktop
> Enumerate every VS Code window live via Win32 — which monitor, which position — so I can address them by screen and tab.
Done — route-list.ps1 walks EnumWindows, filters to Code.exe, maps each to its monitor + rect. Prints a live map: screen 1 → 2 tabs, screen 2 → 2 tabs, screen 3 → 1 tab. Resolved fresh on every command.
Terminal output of route-list.ps1 showing every VS Code window grouped by monitor, tab index, and window handle, enumerated live via Win32.
Win32 · live map
The map is built the instant you speak — never from a saved file.
03 The gotcha

The keybinding that hid my terminal instead of focusing it

Then a subtle bug nearly sank it. Ctrl+` is supposed to focus the terminal — but VS Code's default toggles: if the terminal is already focused, the same key hides it, and my carefully-routed prompt paints straight into the source code instead. The fix was one custom, non-toggle keybinding bound to a “focus terminal” command that never hides — so the target is deterministic every single time, whatever state the window was in.

claude code — desktop
> Sometimes the prompt lands in my code, not the terminal. Why?
Because Ctrl+` TOGGLES — it hides an already-focused terminal. Rebound it to workbench.action.terminal.focus (focus-only, never toggle) via a custom keybinding. Now it focuses, deterministically, every time.
Before/after: with the default keybinding the prompt spills into source code; with a custom focus-only keybinding it lands in the terminal every time.
before / after
One non-toggle keybinding turns “sometimes” into “every time”.
🛡️

The routing is regex, not an AI model — zero tokens, zero mishears

The voice server intercepts the screen N, tab M pattern with a plain regex before any AI model sees it. That means zero tokens spent to route, zero added latency, and — the part that matters — zero risk of a model mishearing and firing “delete the tests” at the wrong project. The AI does the work inside the target window; it never decides which window. Deterministic addressing, intelligent execution — kept on separate rails on purpose.

04 Four receipts

Fabric → map → intercept → landing

Four frames from the build: the spare-device screen fabric, the live window map, the regex that routes before any model wakes up, and a spoken command landing in the correct window. Tap any image to enlarge it and read the exact prompt that drew it.

LIVE DEMO · SPOKEN COMMAND, RIGHT WINDOW

“If you see this, you work”

The router's own first live test was the proof: it injected a message into the very Claude Code session that had just built it — “if you see this, you work.” It saw it. It worked. Now I speak the screen and the tab, the regex routes it in nothing flat, the non-toggle keybinding focuses the right terminal, and the correct session on the correct monitor starts executing — while every other window sits untouched.

The router injecting 'if you see this, you work' into the same session that built it, the message appearing in the correct terminal on screen 2.
1 voice · 5 windows · 3 screens · 0 tokens to route · 1 window hit, every time
06 Steal this

Steal the pattern: free screens + a live window router

Two moves you can copy today — turn spare devices into monitors with spacedesk, and route spoken commands to a specific window with a live Win32 enumeration plus a regex intercept that never spends a token. Everything in this series is free and open.

tool spacedesk screen fabric script route-list.ps1 (Win32 enum) fix non-toggle terminal.focus keybinding method regex intercept before the LLM
the keybinding fix { "key": "ctrl+`", "command": "workbench.action.terminal.focus" } // focus-only, never toggles

Want this pointed at your own multi-screen setup? Mail jacob@skogstrom.se — one call, no pitch.

Next episode

I can aim my voice at any window. Next: the windows start talking back.

Routing a command into the right session is one direction. The next build closes the loop — the sessions report their own state back to one place, so I hear which window needs me before I've even looked at it.

Darkened teaser of the AIOS engine that ties the voice router into the wider system.
drops next · follow so you don't miss it