cursor/rules, .kiro/steering, plus roughly forty other marker files — and drifts toward the strongest "scent." An open editor window radiating an active project pulls it hardest; a closed folder icon or a buried directory emits a faint whiff.
I cloned the repo, ran npm install && npm start
, and within seconds the little insect was orbiting my VS Code window where a CLAUDE.md
sat open. Switched to a Finder pane showing a project root with .cursor/rules
— it banked left and hovered there. The heuristic is surprisingly readable: each detected marker adds weight, open windows multiply it, nested paths divide it. No ML model, just a deterministic scoring loop that runs every ~500 ms.
// package.json snippet — the marker list lives here
{
"agentMarkers": [
"AGENTS.md",
"CLAUDE.md",
".cursor/rules",
".kiro/steering",
".github/copilot-instructions.md",
"prompt.md",
"system-prompt.md",
".windsurf/rules",
".continue/config.json"
// … 30 more
]
}
The fork lives at github.com/<forker>/desktop-fly-vibecode
(search the name, it's the only one with "vibecode" in the description). Install is the usual Electron dance — npm run build
spits a signed macOS .dmg and a Windows .exe. Linux users get an AppImage. No auto-updater yet, so pin the release you like.
Caveats: it polls the accessibility tree, so macOS will nag for Screen Recording permission on first launch. On Wayland the window-title sniffing is hit-or-miss; X11 works fine. CPU sits around 0.3 % idle on an M2, spikes to 1.2 % when you have a dozen projects open — negligible.
Why bother? Purely ambient awareness. I keep it running on a second monitor; when the fly settles on a window I know that project still has its agent context wired up. If it wanders off to the dock, something’s stale — maybe the .cursor/rules
got deleted or the symlink broke. Stupid? Yes. Useful? Weirdly, for the five minutes a day I glance over and confirm the scent trail is still hot.
Worth the five-minute build if you already live inside Cursor, Claude Code, or Windsurf and want a passive dashboard that doesn't demand a browser tab.
Next How I vibe-coded a macOS driver to rescue my Drobo 5D from →