Windows-native desktop companion for OpenCode. Click the companion, speak through your existing Handy setup, click again, and the transcript is sent to opencode run headlessly.
- Windows
- Handy installed and configured
- OpenCode installed and configured
- .NET 10 Desktop Runtime or SDK
dotnet runClick the icon once to start Handy transcription. Click it again to stop, capture Handy's pasted transcript, run OpenCode, and show the short response.
Right-click the companion to pin/unpin, clear messages, or exit.
Environment variables:
HANDY_PATH: command/path for Handy, defaults tohandyOPENCODE_PATH: command/path for OpenCode, defaults toopencodeOPENCODE_COMPANION_DIR: working directory passed to OpenCode, defaults to your Windows user homeOPENCODE_COMPANION_MODEL: optionalprovider/model, defaults toopencode/kimi-k2.5OPENCODE_COMPANION_VARIANT: optional model variant, defaults tononeOPENCODE_COMPANION_AGENT: optional OpenCode agent nameOPENCODE_COMPANION_TIMEOUT_SECONDS: OpenCode timeout, defaults to300HANDY_TIMEOUT_SECONDS: wait time for Handy to paste text, defaults to45
The companion sets OPENCODE_CLIENT=companion, OPENCODE_EXPERIMENTAL_CUSTOMIZE_SKILL=true, OPENCODE_EXPERIMENTAL_SCOUT=true, and OPENCODE_PERMISSION={"*":"allow"} for spawned OpenCode processes when those variables are not already set. It also passes --dangerously-skip-permissions. Newer OpenCode source registers customize-opencode by default, but installed opencode 1.14.48 gates it behind OPENCODE_EXPERIMENTAL_CUSTOMIZE_SKILL.
OpenCode process stdout/stderr is persisted to %LOCALAPPDATA%\OpenCodeCompanion\logs\opencode-YYYYMMDD.log.
Native WinForms/Win32 directly solves the important parts: always-on-top borderless windows, focus capture for Handy's paste, global screen/window positioning, and process control. Electron would mainly buy easier CSS animation/layout, web UI tooling, and cross-platform reuse, at the cost of shipping Chromium and higher idle memory.