AIDE
A desktop environment that pulls a developer's whole daily loop into one window — and the tool I now use to do my own work.
- Role
- Collaborator — roughly a third of the codebase
- With
- Justin Christensen
- Source
- Private repository
- Status
- In active use
AIDE is a desktop app that collapses the scattered parts of a working day into one window: starting and tailing local dev servers, branching git worktrees per ticket, reading and moving tickets, running test suites, terminals, a Monaco editor with tree-sitter symbol navigation, and AI coding sessions driven through the Claude Agent SDK. It's keyboard-first throughout — a sidebar tree, section focus, tab cycling, a type-ahead palette, and an escape ladder that always gets you back out.
It isn't mine alone, and the honest framing matters. A former colleague started it and has written more of it than I have. Across the history my share is about 95 commits and a third of the added lines, but the more useful measure is which parts I own: the renderer state store, pane layout, the keybinding system, the repo-profile layer, workspace lifecycle, and a good deal of the IPC surface between the main and renderer processes. The two pieces of work below are the ones I'd want to be judged on.
Making it work for anyone
AIDE started life wired to a single organization's setup. The stack presets knew one team's build tooling, the test axes were that team's test axes, database targets and ports were baked in, and the config assumed one particular repository root. That's the right way to start — it made the tool useful on day one — but it also meant nobody else could run it.
I reshaped the configuration around a generic repo root and named database targets, then made the tool detect a profile per repository rather than applying one config-wide. Stacks, tests, and cleanup all became profile-driven. Toolchain presets became generic and self-describing, so a card in the UI is labeled by what it actually runs rather than by a hardcoded assumption. The last organization -specific defaults came out with the test axes.
The interesting part wasn't any single change — it was that removing hardcoded assumptions kept surfacing places where two concepts had been quietly fused. A repository's toolchain and its owner's config were the same thing until they weren't. A stack card started the config-wide owner's stack rather than its own repository's. A stated repo entry silently discarded the profile that had been detected for it. Each one was invisible while there was only one org, and each one was a real defect the moment there were two.
Archiving a workspace without losing one
Workspaces accumulate. A finished ticket leaves a worktree, a branch, and session state behind, and after a few weeks the sidebar is mostly things you're done with. So I added an archive: finished workspaces read as finished, and archived ones can be brought back.
Almost all of the work was in the failure cases, because the operation touches real branches and real checkouts and there is no undo for getting it wrong. The archive write is atomic, so an interrupted archive leaves either the old state or the new one and never a half-written record. Archiving moved off the main thread, because blocking the UI on filesystem work is how you get a user force-quitting mid-operation. A reactivate that was interrupted resumes rather than starting over. Reactivating round-trips the exact branch that was archived instead of inferring one. And the workspace never deletes a branch it doesn't own — which sounds obvious right up until you consider a worktree pointed at a branch somebody else created.
That's the part I'd defend in an interview. The feature is a list that hides things. The engineering is entirely about what happens when the power goes out halfway through.
Elsewhere in the codebase
Ticket integration behind a single abstraction, so Jira and Linear look the same
to everything upstream of them — including reading a Linear ticket in full
and changing its status without leaving the app. Terminals that stay alive across
tab switches rather than being rebuilt, and that inherit the user's login-shell
environment when they spawn a stack. Pane zoom, a minimized dock, and per-session
status. A memory-pressure panel with per-session attribution, sampling
/proc/meminfo on Linux. And enough cross-platform work to find
physical iPhones and hand them an IP address they can actually reach.
The repository is private, so there's nothing to link. I'm happy to walk through any of it.