jcode and pi are both open source coding agents that live in your terminal, read your files, edit code, and run commands on your behalf. That’s close to where the similarity ends.
They start from opposite design decisions about what belongs in the core tool versus what you should bolt on yourself, and that one choice explains most of the differences below.
This page walks through both, including jcode’s own published performance numbers against pi.
What is jcode?
jcode is written in Rust and installs as a single binary. It ships with a memory system, multi agent coordination, MCP support, browser automation, and a range of other features turned on from the first run, and it is tuned specifically for running many sessions at once without eating through RAM.
What is pi?
pi is written in TypeScript and installs as an npm package. Its core deliberately does very little: four tools (read, write, edit, bash) and a small system prompt. Everything else, from MCP to subagents to a permission system, is left for you to add through extensions, skills, or third party packages.
jcode vs pi quick comparison
| jcode | pi | |
|---|---|---|
| Language | Rust | TypeScript |
| License | MIT | MIT |
| Install | Install script, Homebrew, or build from source | npm install -g (or another Node package manager) |
| Runtime dependency | None, ships as a standalone binary | Requires Node.js |
| Design approach | Full feature set on by default, tuned for many parallel sessions | Minimal four tool core, everything else added through extensions |
| Multi agent work | Built in swarm support; agents in the same repo coordinate automatically | Not built in; run separate instances yourself, for example through tmux |
| MCP support | Built in, including reading Claude Code’s own MCP config files | Not built in; add it through an extension |
| Browser automation | Built in, through Firefox Agent Bridge | Available through a community package, not the core |
| Memory | Built in semantic memory graph with automatic recall | Not built in; sessions are saved as JSONL files you can branch and replay, but nothing is recalled automatically |
| Background tasks | Built in; long running commands become trackable background tasks | Not part of the core by design |
| Plan mode | Built in /plan command | Not built in; write plans to a file or add an extension |
| Built in to dos | Built in /todos command | Not built in; the project points you toward a plain TODO.md file instead |
| Session resume from other tools | Reads sessions from Codex, Claude Code, OpenCode, and pi itself | Not designed for this |
| Self modification | Has a dedicated self dev mode for editing its own source | Not a built in feature |
jcode
- +Memory, swarm, MCP, and browser control all built in
- +Standalone binary, nothing else to install
- +Tuned for running many sessions at once
- +Reads sessions from Codex, Claude Code, OpenCode, and pi
Best for: a full feature set working right away, across many sessions at once.
pi
- –Four tool core; everything else is an extension
- –Needs Node.js installed first
- –Extra agents via tmux or a community package
- –Sessions saved as branchable JSONL files
Best for: building your own agent stack piece by piece.
Two different starting points
pi’s own documentation is unusually direct about what it leaves out: no MCP, no subagents, no permission prompts, no plan mode, no built in to do list, no background bash. The reasoning is consistent throughout: those are all things a team might want built differently depending on their setup, so pi would rather give you the building blocks (extensions, skills, prompt templates, themes, and a package system) than pick one version of each and bake it in.
If you want subagents, you spawn more pi instances yourself, commonly through tmux, or you install a community package that does it for you.
jcode takes the opposite bet. Multi agent coordination, MCP, memory, browser control, background tasks, a plan mode, and a to do list are all there from the first launch, with no extension needed to turn them on.
The trade off is the one you’d expect: less of a blank slate to shape to your exact liking, but a lot less setup before you’re doing real work.
Neither approach is simply better. It depends on whether you’d rather start from a small core and add exactly what you need, or start with most things already switched on.
Memory and multi agent work
jcode’s memory system embeds each turn as a vector and automatically pulls related memories into later conversations, with an ambient process that periodically consolidates and cleans up what’s stored. pi has no equivalent built in.
Memory · 1 active session
Memory · 10 active sessions
Startup · time to first frame
Startup · time to first input
“jcode (lean)” is jcode with local memory embedding turned off. Figures are jcode’s own published measurements from one machine, jcode v0.9.1888-dev vs pi 0.62.0.
What it does instead is store every session as a JSONL file with a tree structure, so you can branch a conversation at any earlier point and resume from there, or share full sessions with others. That’s a strong session model, but it’s replay and branching rather than automatic recall across sessions.
For running more than one agent on the same project, jcode’s swarm support lets several agents work in the same repo with the server keeping them informed when one edits a file another has read.
pi has no equivalent in its core; you’d run separate instances through tmux, write your own coordination layer, or reach for a community package such as oh-my-pi, which adds subagent support on top of pi.
Providers and models
Both tools connect to a wide set of model providers rather than locking you into one. jcode ships built in login flows for providers including Claude, OpenAI, Gemini, GitHub Copilot, Azure OpenAI, and several OpenAI compatible services, plus a provider add command for pointing it at almost any other endpoint, local models included.
pi covers similar ground through its own unified API: subscription login for Claude Pro/Max, ChatGPT Plus/Pro, GitHub Copilot, and Gemini, API keys for providers like Anthropic, OpenAI, Google, Azure, Amazon Bedrock, xAI, DeepSeek, Mistral, and Groq, and a models.json file for adding Ollama, LM Studio, vLLM, or any other API compatible endpoint. Custom OAuth flows or nonstandard APIs go through an extension, the same way any other added capability does in pi.
In practice, neither tool limits you to one lab’s models, and switching between a paid subscription and a local model is possible in both.
Installing and getting started
jcode installs with a single script and needs nothing else on your machine first:
# macOS & Linux
curl -fsSL https://jcode.sh/install | bash
# Windows 11 (PowerShell 5.1+)
irm https://jcode.sh/install.ps1 | iex
pi installs as a global npm package, so Node.js needs to already be on your machine:
npm install -g @mariozechner/pi-coding-agent
If you’re new to the terminal and don’t already have Node.js set up, that’s an extra step jcode doesn’t require.
Performance: jcode’s own benchmark numbers
These figures come from jcode’s own measurements, run on one Linux machine, comparing jcode v0.9.1888-dev against pi 0.62.0 among other tools. Treat them as the project’s own published numbers rather than an independent audit, and check current figures before treating any of this as fixed, since both tools update often.
Memory use at one active session
| Tool | Memory (PSS) | Compared to jcode with memory off |
|---|---|---|
| jcode (local embedding off) | 27.8 MB | baseline |
| jcode | 167.1 MB | 6.0× more |
| pi | 144.4 MB | 5.2× more |
At a single session, pi actually uses somewhat less memory than jcode running with its memory system turned on. jcode’s leanest mode, with local embeddings switched off, is the lightest of the three.
Memory use at ten active sessions
| Tool | Memory (PSS) | Compared to jcode with memory off |
|---|---|---|
| jcode (local embedding off) | 117.0 MB | baseline |
| jcode | 260.8 MB | 2.2× more |
| pi | 833.0 MB | 7.1× more |
Extra memory per additional session
| Tool | Extra memory per session | Compared to jcode with memory off |
|---|---|---|
| jcode (local embedding off) | ~9.9 MB | baseline |
| jcode | ~10.4 MB | 1.1× more |
| pi | ~76.5 MB | 7.7× more |
This is where the gap widens. A single pi session is fairly light, but each additional session costs roughly seven times what an additional jcode session costs, so the difference grows quickly once you’re running several sessions side by side, which is the situation jcode is specifically tuned for.
Startup speed
| Measurement | jcode | pi | Difference |
|---|---|---|---|
| Time to first frame | 14.0 ms | 590.7 ms | 42.2× slower |
| Time to first input | 48.7 ms | 596.4 ms | 12.2× slower |
Both figures are averaged across ten interactive launches on the same machine. Some of this gap likely comes down to runtime: jcode starts as an already compiled Rust binary, while pi starts a Node process and its TypeScript layers on top, which typically takes longer to get to a usable screen.
Which one fits your workflow
If you want a tool that already does most of what you need, across many sessions, without assembling it yourself first, jcode is the more direct route. If you’d rather start from a small core and build your own setup piece by piece in TypeScript, or you want to embed the underlying agent runtime inside something you’re building yourself, pi’s package split (coding agent, agent core, and a unified model API as separate pieces) is built for exactly that.
Conclusion
jcode and pi solve the same basic problem with different amounts of scaffolding included by default. jcode gives you memory, multi agent coordination, MCP, browser control, and background tasks from the first run, and its own numbers show it staying lighter and starting faster as you add more sessions. pi gives you a small, well understood core and asks you to add capability through extensions, which suits anyone who wants to shape the tool exactly around their own workflow instead of adopting someone else’s defaults.