Vibe Coding Presenter turns a cheap wireless presenter remote into a voice-first vibe coding controller for Windows: talk to your AI coding agent and send prompts from across the room, without touching the keyboard.
The core idea is simple: before coding agents and AI writing tools, the most important productivity shortcut was often Ctrl+C then Ctrl+V. In a voice-first AI workflow, the new high-frequency loop is becoming:
start voice input -> speak -> stop voice input -> Enter
Or, in shortcut form:
Ctrl+Shift+D + Enter
This project maps a presenter remote's Up/Down buttons into that loop, so you can talk to ChatGPT, Codex, Claude, or PRISM with much less mouse and keyboard use.
Vibe Coding Presenter is a lightweight Windows tray app written in C#/.NET Framework. It listens for double-presses from a presenter remote that sends ArrowUp and ArrowDown keyboard events.
- Double Up starts or stops voice input. If you are in some other app (mail, a PDF, a browser page), it first jumps back to the AI agent you used last, so you never have to move the mouse back to the input box.
- Double Down sends the message. In ChatGPT, Codex, Claude, and PRISM, the app first tries to click the real
Sendbutton through Windows UI Automation, then falls back toEnter. - Single Up/Down presses are swallowed so the remote does not accidentally scroll pages or recall command history.
- The tray menu includes Pause, Restart hook, Open log file, and Exit.
When a ChatGPT browser tab is active:
- Double Up sends
Ctrl+Shift+D. - Double Down clicks the
Sendbutton, or falls back toEnter.
This matches ChatGPT web dictation, where Ctrl+Shift+D behaves like a start/stop voice shortcut.
Codex desktop uses Ctrl+Shift+D as a hold-to-dictate shortcut, not a normal toggle. Vibe Coding Presenter adapts to that:
- First Double Up presses and holds
Ctrl+Shift+D. - Second Double Up releases
Ctrl+Shift+D. - Double Down clicks the
Sendbutton, or falls back toEnter.
This makes Codex feel like a toggle-based voice workflow even though its native shortcut is hold-based.
Recent Codex desktop builds may identify their foreground process as ChatGPT instead of Codex. The default config treats both codex and chatgpt desktop processes as hold-to-dictate apps, while browser tabs are still handled as web pages.
PRISM's built-in voice mode may not always work reliably. For PRISM, Vibe Coding Presenter uses Windows voice typing:
- Double Up finds and focuses the
Ask anythinginput box, then sendsWin+H. - Double Down clicks the
Sendbutton or falls back toEnter, waits for the assistant to finish, then clicksCompileto refresh the PDF pane.
The input focus uses Windows UI Automation instead of screen coordinates, so it is more robust across window sizes and display layouts.
The auto-compile delay is configurable. The default is 25 seconds:
"PrismAutoCompileAfterEnter": true,
"PrismCompileDelayMs": 25000Claude's built-in dictation is not very reliable on Windows, so Vibe Coding Presenter uses Windows voice typing instead when the Claude desktop app is active:
- First Double Up sends
Win+Hto open Windows voice typing. Speak, and the text goes into the Claude input box. - Second Double Up sends
Win+Hagain to stop voice typing, leaving the text in the box so you can review it. - Double Down while voice typing is open stops it, waits briefly (
ClaudeVoiceStopBeforeSendMs, default 800 ms) so the last phrase lands, then clicksSendor falls back toEnter. - Double Down when voice typing is not open just clicks
Sendor falls back toEnter.
Before opening voice typing, the app briefly moves focus off Claude's input box and back. Windows voice typing follows the last focus event it saw, which can go stale after the mouse moves to another monitor, making the voice typing bar open on the wrong screen and type nowhere. The refresh fixes that, and the caret stays where it was.
To go back to Claude's own dictation shortcut (Ctrl+D), set:
"ClaudeUseWindowsVoiceTyping": falseWindows voice typing may hear you but insert nothing when a third-party IME such as Sogou Pinyin is active in the Claude window. Switch that window to an English keyboard (Win+Space) or Microsoft Pinyin before dictating.
This tool only runs on Windows. On a Mac, keep using Claude's built-in dictation directly.
By default, this Claude rule is desktop-app-only and will not trigger inside common browsers, even if a browser tab title contains the word "Claude".
When the foreground app is not Claude, Codex, PRISM, or a ChatGPT web tab, Double Up:
- Finds the AI agent you used last (Claude or Codex; Claude if you have not used either since startup). If that one is not open, it uses the other.
- Brings its window to the front (restoring it if minimized).
- Starts dictation there exactly as if you had pressed Double Up inside it: Windows voice typing in Claude, hold-to-dictate in Codex.
Then Double Down sends as usual. Set "JumpToAgentFromOtherApps": false to restore the old behavior (send Ctrl+Shift+D to whatever app is in front).
Clone or download this repository, then run PowerShell from the project folder:
powershell -ExecutionPolicy Bypass -File .\Start-PresenterHotkey.ps1The script uses the C# compiler already included with Windows/.NET Framework. It does not require installing the .NET SDK.
To enable start-at-login:
powershell -ExecutionPolicy Bypass -File .\Start-PresenterHotkey.ps1 -AtLoginTo stop:
powershell -ExecutionPolicy Bypass -File .\Stop-PresenterHotkey.ps1To uninstall the startup shortcut:
powershell -ExecutionPolicy Bypass -File .\Uninstall-PresenterHotkey.ps1On first run, the app creates:
build\presenter-hotkey.json
It is copied from:
config.sample.json
Edit the generated local config for your own machine. Do not commit your local build\presenter-hotkey.json if it contains machine-specific settings.
Sample behavior:
{
"UpVk": "0x26",
"DownVk": "0x28",
"UpAction": "Ctrl+Shift+D",
"CodexUpAction": "Ctrl+Shift+D",
"CodexHoldProcessNames": ["codex", "chatgpt"],
"CodexHoldTitleContains": ["codex"],
"ClaudeUpAction": "Ctrl+D",
"ClaudeUseWindowsVoiceTyping": true,
"ClaudeVoiceTypingAction": "Win+H",
"ClaudeVoiceStopBeforeSendMs": 800,
"ClaudeInputNameContains": ["prompt", "prosemirror"],
"ClaudeFocusDelayMs": 150,
"ClaudeProcessNames": ["claude"],
"JumpToAgentFromOtherApps": true,
"ChatGptWebTitleContains": ["chatgpt"],
"DownAction": "Enter",
"PrismWindowTitleContains": ["prism"],
"ClaudeWindowTitleContains": ["claude"],
"ClaudeDesktopOnly": true,
"PrismInputNameContains": ["ask anything", "message", "prompt", "ask"],
"PrismCompileButtonNameContains": ["compile"],
"SmartSendForegroundContains": ["chatgpt", "codex", "claude", "prism"],
"SmartSendButtonNameContains": ["send", "submit"],
"SmartSendButtonNameExcludes": ["feedback", "share", "copy", "stop", "voice", "dictation"],
"PrismUpAction": "Win+H",
"PrismDownAction": "Enter",
"PrismFocusDelayMs": 150,
"PrismAutoCompileAfterEnter": true,
"PrismCompileDelayMs": 25000,
"DoublePressMs": 900,
"ActionCooldownMs": 800
}If PRISM has a different browser title on your machine, add another keyword to PrismWindowTitleContains.
- Windows only.
- Designed for presenter remotes that emit
ArrowUpandArrowDown. - While running, normal
ArrowUpandArrowDownkeyboard events are intercepted globally. Use Pause or Exit from the tray menu when you need normal arrow-key navigation. - If the remote suddenly starts scrolling again, right-click the tray icon and choose Restart hook.
- PRISM support depends on Windows UI Automation being able to see the input box.
- Windows voice typing (used for Claude and PRISM) may not insert text while a third-party IME such as Sogou Pinyin is active. Use an English keyboard or Microsoft Pinyin.
This project is one small piece of a fun trend: turning everyday devices into vibe coding inputs.
Bilibili creator 林亦LYi tested eight unusual vibe coding input devices in the video 1元 vs 50万元 Vibe Coding:写代码可以多离谱?, and open-sourced the projects in LYiHub/pub-ai-inputs: a Xiaomi TV remote, an Apple Watch, a PS5 DualSense controller, and even an AITO M9 (问界 M9) car used as a voice input for a coding agent.
Vibe Coding Presenter brings the same idea to the most ordinary office gadget there is: the presentation clicker already sitting in your bag. No extra hardware, no driver, just two buttons mapped to "talk" and "send".
The point is not the remote itself. The point is the interface shift.
Copy/paste was the signature gesture of desktop productivity. Voice-controlled AI is creating a new signature gesture: open dictation, say the intent, send it. Small tools like this make that loop physical, fast, and shoulder-friendly.
Vibe Coding Presenter 是一个 Windows 托盘小工具,可以把普通翻页激光笔/演示遥控器变成 vibe coding 语音控制器:不用碰键盘,站着、坐远一点也能直接对 AI 编程助手说话、发送指令。
核心想法很简单:在 Codex、ChatGPT 这类工具出现以前,最重要的生产力快捷键常常是 Ctrl+C 和 Ctrl+V。但在语音优先的 AI 工作流里,新的高频动作正在变成:
启动语音输入 -> 说话 -> 停止语音输入 -> Enter 发送
也就是:
Ctrl+Shift+D + Enter
这个项目把演示遥控器的上/下键映射成这个循环,让你可以用更少的鼠标和键盘操作来控制 ChatGPT、Codex、Claude 和 PRISM。
Vibe Coding Presenter 是一个轻量的 Windows 托盘程序,用 C#/.NET Framework 编写。它监听遥控器发出的 ArrowUp 和 ArrowDown 键盘事件,并识别“双击”。
- 向上双击:启动或停止语音输入。如果你正在用别的程序(邮件、PDF、网页等),它会先自动跳回你最近用的 AI 助手,不用再把鼠标移回输入框。
- 向下双击:发送消息。在 ChatGPT、Codex、Claude 和 PRISM 里,程序会先通过 Windows UI Automation 点击真正的
Send按钮;如果找不到按钮,再回退到Enter。 - 单次上/下键会被吞掉,避免网页滚动或 Codex 回放历史输入。
- 托盘菜单提供 Pause、Restart hook、Open log file 和 Exit。
当前台是 ChatGPT 网页时:
- 向上双击发送
Ctrl+Shift+D。 - 向下双击点击
Send按钮;如果找不到按钮,再回退到Enter。
ChatGPT 网页里,Ctrl+Shift+D 可以作为听写/语音输入的开始与停止快捷键。
Codex 桌面应用里的 Ctrl+Shift+D 不是普通 toggle,而是 hold-to-dictate,也就是需要按住才持续听写。Vibe Coding Presenter 对它做了适配:
- 第一次向上双击:按住
Ctrl+Shift+D。 - 第二次向上双击:松开
Ctrl+Shift+D。 - 向下双击:点击
Send按钮;如果找不到按钮,再回退到Enter。
这样 Codex 用起来就像有了一个“按一下开始、再按一下结束”的语音开关。
最近的 Codex 桌面版可能会把前台进程显示成 ChatGPT,而不是 Codex。默认配置会把 codex 和 chatgpt 这两个桌面进程都当作 hold-to-dictate 应用处理;浏览器标签页仍然按网页版逻辑处理。
PRISM 自带的 voice mode 有时不稳定,所以这里改用 Windows 自带语音输入:
- 向上双击:先找到并聚焦
Ask anything输入框,然后发送Win+H。 - 向下双击:点击
Send按钮或回退到Enter,等待 AI Assistant 完成修改后,自动点击Compile刷新右侧 PDF。
输入框定位使用 Windows UI Automation,而不是屏幕坐标,因此对窗口大小和多屏布局更稳。
自动 Compile 的等待时间可以配置。默认等待 25 秒:
"PrismAutoCompileAfterEnter": true,
"PrismCompileDelayMs": 25000Claude 自带的语音输入在 Windows 上效果不太好,所以当前台是 Claude 桌面应用时,改用 Windows 自带的语音输入:
- 第一次向上双击:发送
Win+H,打开 Windows 语音输入。说话时文字会直接输入到 Claude 的输入框里。 - 第二次向上双击:再发送一次
Win+H,结束语音输入,文字留在输入框里,可以先检查再发送。 - 语音输入还开着时向下双击:先结束语音输入,稍等一下(
ClaudeVoiceStopBeforeSendMs,默认 800 毫秒)让最后一句落到输入框里,然后点击Send按钮;找不到按钮时回退到Enter。 - 语音输入没开时向下双击:直接点击
Send按钮或回退到Enter。
打开语音输入前,程序会让 Claude 输入框的焦点很快地离开再回来。Windows 语音输入认的是它最后收到的焦点通知;鼠标移到别的屏幕后,这个记录可能过时,导致语音条跑到别的屏幕、文字打不进去。刷新一下焦点就能解决,光标位置不会变。
如果想换回 Claude 自带的语音快捷键(Ctrl+D),把配置改成:
"ClaudeUseWindowsVoiceTyping": false如果 Claude 窗口里用的是搜狗拼音这类第三方输入法,Windows 语音输入可能能听到声音但打不出字。说话前先按 Win+空格 把这个窗口切到英文键盘或微软拼音即可。
这个工具只在 Windows 上运行。在 Mac 上直接使用 Claude 自带的语音输入即可。
默认情况下,这条 Claude 规则只针对桌面应用生效;如果普通浏览器网页标题里有 Claude,它不会触发,避免误把 Edge/Chrome 里的 Ctrl+D 变成收藏网页。
当前台不是 Claude、Codex、PRISM 或 ChatGPT 网页时,向上双击会:
- 找到你最近用的 AI 助手(Claude 或 Codex;程序启动后两个都没用过时默认 Claude)。如果它没打开,就用另一个。
- 把它的窗口切到最前面(最小化了会自动还原)。
- 像你在它里面向上双击一样开始语音输入:Claude 用 Windows 语音输入,Codex 用按住听写。
之后向下双击照常发送。如果想恢复旧行为(直接向当前程序发送 Ctrl+Shift+D),设置 "JumpToAgentFromOtherApps": false。
下载或 clone 这个仓库后,在项目目录里运行:
powershell -ExecutionPolicy Bypass -File .\Start-PresenterHotkey.ps1脚本使用 Windows/.NET Framework 自带的 C# 编译器,不需要安装 .NET SDK。
如果希望开机自动启动:
powershell -ExecutionPolicy Bypass -File .\Start-PresenterHotkey.ps1 -AtLogin停止程序:
powershell -ExecutionPolicy Bypass -File .\Stop-PresenterHotkey.ps1删除开机启动快捷方式:
powershell -ExecutionPolicy Bypass -File .\Uninstall-PresenterHotkey.ps1第一次运行后会生成:
build\presenter-hotkey.json
它会从下面这个示例配置复制生成:
config.sample.json
如果你需要按自己的电脑环境调整,请改本地生成的 build\presenter-hotkey.json。不要把自己的本地配置提交到 GitHub。
示例配置:
{
"UpVk": "0x26",
"DownVk": "0x28",
"UpAction": "Ctrl+Shift+D",
"CodexUpAction": "Ctrl+Shift+D",
"CodexHoldProcessNames": ["codex", "chatgpt"],
"CodexHoldTitleContains": ["codex"],
"ClaudeUpAction": "Ctrl+D",
"ClaudeUseWindowsVoiceTyping": true,
"ClaudeVoiceTypingAction": "Win+H",
"ClaudeVoiceStopBeforeSendMs": 800,
"ClaudeInputNameContains": ["prompt", "prosemirror"],
"ClaudeFocusDelayMs": 150,
"ClaudeProcessNames": ["claude"],
"JumpToAgentFromOtherApps": true,
"ChatGptWebTitleContains": ["chatgpt"],
"DownAction": "Enter",
"PrismWindowTitleContains": ["prism"],
"ClaudeWindowTitleContains": ["claude"],
"ClaudeDesktopOnly": true,
"PrismInputNameContains": ["ask anything", "message", "prompt", "ask"],
"PrismCompileButtonNameContains": ["compile"],
"SmartSendForegroundContains": ["chatgpt", "codex", "claude", "prism"],
"SmartSendButtonNameContains": ["send", "submit"],
"SmartSendButtonNameExcludes": ["feedback", "share", "copy", "stop", "voice", "dictation"],
"PrismUpAction": "Win+H",
"PrismDownAction": "Enter",
"PrismFocusDelayMs": 150,
"PrismAutoCompileAfterEnter": true,
"PrismCompileDelayMs": 25000,
"DoublePressMs": 900,
"ActionCooldownMs": 800
}如果你的 PRISM 网页标题里没有 prism,可以把对应关键词加入 PrismWindowTitleContains。
- 目前仅支持 Windows。
- 适合会发送
ArrowUp和ArrowDown的演示遥控器。 - 程序运行时会全局拦截普通
ArrowUp和ArrowDown。如果你需要正常使用方向键,可以从托盘菜单 Pause 或 Exit。 - 如果遥控器突然又开始滚动网页,右键托盘图标,点击 Restart hook。
- PRISM 支持依赖 Windows UI Automation 能否识别页面输入框。
- Windows 语音输入(Claude 和 PRISM 用的就是它)在搜狗拼音等第三方输入法下可能打不出字,请切到英文键盘或微软拼音。
这个项目是一个有趣潮流里的一小块:把身边各种设备变成 vibe coding 的输入工具。
B 站 UP 主 林亦LYi 在视频 1元 vs 50万元 Vibe Coding:写代码可以多离谱? 里测试了八种离谱的 vibe coding 输入设备,并把项目开源在 LYiHub/pub-ai-inputs:小米遥控器、Apple Watch、PS5 手柄,甚至把问界 M9 汽车变成了编程 agent 的语音输入。
Vibe Coding Presenter 把同样的思路用在最普通的办公小物上:你包里本来就有的那支翻页激光笔。不用额外硬件,不用装驱动,两个按键分别对应“说话”和“发送”。
重点不是激光笔本身,而是交互方式正在改变。
复制粘贴曾经是桌面生产力的标志性动作。语音控制 AI 正在创造新的标志性动作:打开语音,说出意图,发送。像 Vibe Coding Presenter 这样的小工具,就是把这个循环变成一个更自然、更快速、也更保护肩膀的物理动作。