Eduardo Silveira
All projects

Parallax

A terminal client and an Electron client over one agent runtime, built to find out how much of an IDE an agent actually needs.

Status
Superseded by vertexcode. Both clients still public.
Stack
TypeScript · React + Ink · Next.js 16 · Electron · Server-Sent Events
Size
~210k of CLI, ~550k of desktop client
Links
GitHub (CLI) · GitHub (desktop)

Two front ends over one agent runtime. The CLI renders a reactive terminal interface with React and Ink — a status bar that holds session state, a reasoning trace that streams as it arrives, line-numbered diffs. The desktop client is an Electron shell around a Next.js app that connects to the same daemon over Server-Sent Events and renders the parts a terminal is bad at: collapsible reasoning blocks, a side-by-side patch viewer, session history.

The question I was actually asking: how much of an IDE does an agent need before the interface starts getting in the way?

What the two clients answered

The terminal wins for everything that is a stream. Reasoning, tool calls, status — text arriving in order is what a terminal is for, and a reactive TUI fixes the one thing plain output gets wrong, which is that you cannot tell a working process from a stuck one.

The desktop client wins for exactly one thing, and it is diffs. A large multi-file patch in a terminal is unreviewable no matter how well you colour it. Everything else I built into the desktop app — session management, icon routing per tool type, a settings surface — was comfortable rather than necessary.

That answer is the reason I stopped extending it. The next agent I wrote had no desktop client and hooked the editor's own diff viewer instead.

Things worth keeping

Interrupts that actually interrupt. Ctrl-C signals an AbortController that hard-stops generation and aborts running tools, rather than killing the process. You correct course without losing the session.

Compaction as a command. /compact summarises the conversation, clears the old message blocks and replaces the window with the summary. Every long-running agent needs this and most of them discover it late.

A router rather than an abstraction layer. The CLI streams to several providers directly instead of through a generic middle layer. Generic abstractions over tool-calling schemas are where the schemas quietly break, because every provider disagrees about the shape in a slightly different way.

Parallel subagents. A coordinator model decomposes an objective and spawns lighter subagents that execute concurrently against a non-blocking tool engine. It works, and it is also the feature most likely to spend a lot of tokens doing something a single careful pass would have done better — which is a scheduling problem, not a model problem.