No more notification sounds after upgrading to OpenCode V2: the opencode-notifier delivery trap

I use Paseo as a shell, connecting to a local opencode serve, and don't run the TUI in a terminal. After migrating OpenCode from v1 to v2 on October 1, opencode-notifier stopped making any sound: the plugin logs showed it loaded successfully, and system volume was normal. Digging through the 0.6.0 source made it clear—the V2 server hardcodes delivery to "command", forcibly turning off all sound and popup notifications and leaving only a custom command outlet, while the sounds were moved to the TUI component that I don't load at all.

Tools

Paseo's plugin directory

My daily driver stack is Paseo + OpenCode + OpenViking. Paseo recently shipped an official plugin directory too, so now there's both the community one at paseo.cafe and the official one at paseo.sh/plugins. I'd ported the solarized theme earlier to go easier on my eyes, and it's listed in both directories.

Tools

TRAE committed code for me — why is it signed as Claude?

After I fixed a small bug, TRAE went ahead and added Co-Authored-By: Claude Sonnet 4.6 to the commit message on its own. That's ridiculous as hell — even when I commit with Claude Code, it doesn't add a Claude signature. Add the credit system, token rate limiting, and project file uploads on top of that — ever since TRAE went commercial, it's getting less and less reassuring.

Tools

Feishu's official MCP causes a memory leak: tracking down orphan processes from lark-mcp

Mac memory mysteriously eaten up, and it turns out dozens of orphan node processes were left behind by Feishu's official lark-mcp. The root cause is that its stdio lifecycle only handles data inflow, not pipe closure, so the process doesn't kill itself after the host exits. Upstream issues and PRs were filed but have just sat there unmerged, and the repo hasn't been updated for over a year.

Tools

It's Time to Make AI Put Files in the Trash Before Deleting Them

While working with WorkBuddy, I noticed that deleted temp files end up in the Trash, whereas my opencode reaches for rm at the drop of a hat. Digging into that detail led me to discover that macOS 15 already ships with a built-in trash command that can replace rm.

Tools

Configuring thinking-effort switching after hooking the GOAT plan up to opencode

The previous post on the goat setup missed one piece: models like deepseek-v4-flash couldn't pick a thinking depth in /models. Digging in, it turned out the GOAT plan does support it — the problem was that the hand-written models in the custom provider were missing a reasoning capability declaration, so opencode's variant generation logic stopped them at the door. In the end I added reasoning:true to every model under goat and goat-zdr, and testing showed no side effects.

Tools

Paseo Solarized Light theme plugin: low contrast and easy on the eyes, install from GitHub with one command

I built a Solarized Light eye-friendly theme plugin for Paseo using the official addTheme plugin API. No need to touch any Paseo files, and nothing is lost on upgrade. Since Paseo 0.7.0 you can install plugins straight from GitHub, one command and you're done.

Tools

Wiring the CommandCode goat plan into opencode: two-step setup + a zdr custom request header

I bought CommandCode's goat plan and wanted to use it as my main plan in opencode. The whole integration takes just two steps: first /connect to save the API key, then declare the provider in opencode.json. The goat plan requires an x-cmd-zdr: 1 header on every request, and testing confirmed you can add that in the config too.

Tools

OpenCode Go plan usage estimates: see every model on one page

OpenCode Go's monthly allowance is spread across several tables, and the official "5-hour quota" chart doesn't list all the models. So I built a chart page that automatically scrapes the official price table and, using the same methodology as the official one, works out the number of requests available per month for each model and plots it. Hover for details.

Tools

Integrating OpenViking to unify OpenCode and Hermes memory

I hand OpenCode all kinds of tasks piecemeal throughout the day, and at night I want to say one sentence and have it wrap up with a review and summary. But before, OpenCode's memory and Hermes's memory were each stored separately, with no way to unify them. I installed OpenViking with uv, hit two pitfalls (httpx[socks], the mcp 2.0 breaking upgrade), and finally linked up OpenCode's and Hermes's memory to get fully automatic archiving and review.

Tools
123