Open source IDE for Jupyter · 2.1.0

Agentic notebooks, on your own machine.

Zasper is an IDE for Jupyter, built in Go. It runs the notebooks and kernels you already have in a fraction of the memory, with your coding agent beside them to read, edit and run cells.

brew install zasper-io/tap/zasper

Other ways to install

04-data-analysis.ipynb · Claude Code
A penguins notebook in Zasper with a scatter plot of bill length against bill depth, coloured by predicted species with the misclassified penguins circled, and Claude Code's panel beside it: the tool calls it made to read, edit and run the notebook, its two-sentence answer, and the notebook listed as the file the turn changed, with Undo this turn.
5× less CPU than Jupyter Server
40× less RAM than Jupyter Server
10 MB to download: the whole app, one binary

Written about, talked about, and supported by

425 points Hacker News I Programmer January 2025 Techzine January 2025 FOSDEM 2026 Talk, Brussels
The Fifth Elephant Talk, Bangalore, 2025
IndiaFOSS 2025 Talk
Zerodha Supporter
FOSS United Supporter

Agents

Your agent works in your notebook. You keep the final say.

Claude Code, Gemini CLI, Codex or any agent that speaks ACP, in a panel beside the notebook it is working on. Zasper gives it the live kernel, and every change it makes is yours to review and undo.

  1. 01 · Bring

    Your agent, your account

    Signed in with your own subscription. Zasper holds no key and sends none of the conversation anywhere.

  2. 02 · Work

    Cells in the live kernel

    It reads cells and outputs, edits cells, runs them, and inspects variables and dataframes. Plots come back to it as images.

  3. 03 · Ask

    Nothing behind your back

    It asks before it edits a file or runs a command, unless you allow it. Each run shows in its cell, under the agent's name.

  4. 04 · Review

    Undo a block, a cell or a turn

    Every file a turn changed is listed with a diff. Put back one change, one file, or the whole turn.

04-data-analysis.ipynb (turn 1)
Zasper showing a turn by Claude Code: a notebook diff, Before the turn against Now, with one of 24 cells added, a classifier on three standardised measurements, and an undo beside it. The agent panel lists the tool calls, its answer of 97.0% accuracy up from 88.0%, and the changed notebook with Undo this turn.
In the panel: a turn's changes, diffed cell by cell, each with its own undo.
Terminal 1
Zasper's terminal panel running claude -p connected to Zasper's MCP server. Above it, the notebook's last cell has re-run with the agent's mark beside it and prints 97.0% accuracy, and Claude's one-line answer is in the terminal.
From a terminal: Claude Code runs the same notebook through zasper mcp.

Already run an agent in a terminal?

Zasper is an MCP server too. Register it once, and Claude Code, Codex, Cursor or Gemini CLI drives the notebooks you have open, each run landing in its cell as you watch.

claude mcp add zasper -- zasper mcp

Coding agents covers the panel, its permissions and undo; MCP server covers agents you run outside Zasper.

Open by design

Your notebooks stay yours. So does everything around them.

A hosted notebook keeps your work in its cloud, in its format, and on its bill. Zasper is a binary you run, on files you already have.

Weighing it against a hosted platform? Zasper and Hex, side by side.

Benchmarks

The gap widens as the load does

Both servers were run against the same workload, 10 requests per second per kernel on an Apple M4, from 2 concurrent kernels up to 100. Zasper uses less of both at every load, and the RAM gap grows with concurrency, from about 4× at 2 kernels to 38× at 100. At 64 kernels Jupyter Server begins losing kernel connections, and by 100 it has lost all of them, while Zasper answers every request at both loads.

100 concurrent kernels

Peak RAM
Zasper 49 MB
Jupyter Server 1.9 GB

38× less RAM

Average CPU
Zasper 12.5%
Jupyter Server 14.3%

1.1× less CPU

Replies per request
Zasper 5.0 of 5
Jupyter Server 1.5 of 5

Jupyter Server is dropping replies

Average CPU use against concurrent kernels, 2 to 100. Jupyter Server rises from 2.7% to a peak of 15.5% at 64 kernels; Zasper rises from 0.8% to 12%. The widest gap is 4.5 times less, at 4 kernels. Crosses mark Jupyter Server losing kernel connections from 64 kernels, and all of them at 100.
Peak RAM use against concurrent kernels, 2 to 100. Jupyter Server rises from 90 MB to 133 MB at 32 kernels, then climbs to 1.9 GB at 100; Zasper stays under 50 MB throughout. The widest gap is 38 times less, at 100 kernels. Crosses mark Jupyter Server losing kernel connections from 64 kernels, and all of them at 100.

CPU is averaged across each run; RAM is the highest figure observed. The figures above round the widest gaps: 4.5× less CPU at 4 kernels and 38× less RAM at 100. At 2 kernels the difference is about 3× for CPU and 4× for RAM. The CPU gap does not grow with load, while the RAM gap does. The crosses are measured the same way as the lines, as replies received against requests sent, which is flat at five replies per request until a server stops answering. Jupyter's 14% CPU at 100 kernels is 14% while returning nothing. Every point is recomputed from the raw runs in zasper-benchmark, where the harness and the methodology are public.

Features

And it is a real IDE

Every screen below is from a running session.

SQL cells

SQL beside your Python

Query PostgreSQL, DuckDB, Snowflake and more, or your DataFrames, and get a DataFrame back for the next cell.

SQL cells · Tutorial: query data with SQL

nyc_taxi.ipynb
A notebook of New York taxi trips in Zasper. The Data panel lists a SQLite connection named taxi with its three tables, and the DataFrames the kernel holds. Beside it, a SQL cell on taxi joins trips to zones and writes df_boroughs, and its output shows 8 rows: trips and average fare by borough, Manhattan first with 2,615,336 trips.
Environments

Your environments, already found

Your registered kernels, conda environments and project .venv, one click from a new notebook.

Launcher
Zasper's file explorer beside the launcher, showing Python kernels (ipykernel, Xeus and the project's own environment), each one click from a new notebook, and below them kernels for C, C++, R, Bash, Deno, Go, Julia, Ruby and Scala.
Terminal

A real shell, in the same window

Your own shell, in a panel below the notebook you are working in.

Terminals
A penguins notebook open in Zasper with the terminal panel beneath it, where a Python session imports the tutorial's helpers and prints the count and mean body mass of each species.
Source control

Version control, built in

Branch, stage, commit and diff without leaving the window. No extension to install.

Source control
Zasper's source control panel on branch main, listing three changed and four untracked files above the last commit, with a notebook diff of 04-data-analysis.ipynb beside it: one of 23 cells edited, its removed and added lines marked, and the unchanged cells folded.

Zasper reads and writes .ipynb at each file's own nbformat version and runs the kernels you already have, so the notebooks in the screenshots above are ordinary Jupyter notebooks.

Also included

And the rest of it

Smaller features, in the same download.

Kernels

Every kernel you already run

Zasper launches kernels through Jupyter's own kernelspec mechanism, so a kernel that runs under Jupyter runs here without being registered again.

Python ipykernel & Xeus
R IRkernel
Julia IJulia
C++ xeus-cpp
Scala Almond
Ruby IRuby
JavaScript Deno, with TypeScript
Go GoNB
Bash bash_kernel
Any kernel kernelspec

Python covers two implementations, ipykernel and Xeus (xeus-python). Every registered kernel is listed, and so is any Python environment Zasper finds with ipykernel in it. The launcher above shows three Python kernels, one of them Xeus. Installing kernels walks through adding your own.

Deployment

Your laptop, or your server

The same binary either way. Run it on the machine in front of you, or put it on a box and open it from anywhere. A footprint this small is what makes a shared server cheap.

Signed in from the first run

Every server starts with an access token. Sign in with the link it prints, or paste the token; set it yourself to keep it across restarts.

Behind your own HTTPS

A reverse proxy in front, WebSockets passed through, and the certificate you already have.

Docker, or a service

A Dockerfile and a Compose file to build and run it in a container, and a systemd unit for when it should come back up with the machine.

Deploying on Cloud walks through all three, and both ways to sign in.

Get started

Start here

Ten minutes from nothing to a notebook you have run and saved.

Step one

Install it

Homebrew, snap, conda, or the binary for your platform. No runtime for Zasper itself; notebooks need a Jupyter kernel, and pip install ipykernel is enough to start.

Installation
Step two

Your first notebook

Make one, put it on a kernel, run a cell, write down what it was for, and save it, step by step, with a picture of each.

Your first notebook
Step three

Bring your environment

Register the conda or uv environment you already work in as a Jupyter kernel, and it appears in the kernel list.

Working with Conda

License

Open source, with a commercial license too

Zasper is dual-licensed. Use it under the GNU Affero General Public License, or under a commercial license when the AGPL's terms do not fit what you are building.

Open source

AGPL-3.0-only

Running Zasper, on your own machine or on a server, needs nothing more. If you distribute Zasper, or let people use a modified version over a network, the AGPL requires you to make the corresponding source, including your changes, available under the same license.

Read the license
Commercial

Commercial license

For organizations that want to build Zasper into a proprietary product, keep their modifications private, or need terms the AGPL does not offer.

prasun@zasper.io

Contributions are accepted under the Contributor License Agreement, which is what lets Zasper be offered under both licenses.

FAQ

Questions people actually ask

Is Zasper a drop-in replacement for JupyterLab?

For your notebooks and your kernels, yes: the same files, the same kernelspecs, the same wire protocol. For JupyterLab itself, no. This is a separate implementation with its own interface, not a re-creation of Lab's UI or its extension API.

How is Zasper different from a hosted notebook like Hex?

A hosted platform runs your code in its own cloud and keeps projects in its own format. Zasper runs on your machine or your server, your notebooks stay .ipynb files in your folder, and your agent runs on your own subscription. Hex does more for a team publishing dashboards to people who do not code; Zasper is for the people writing the notebooks. Zasper and Hex, side by side has the details.

Do my JupyterLab extensions work?

No. Zasper has its own extension model rather than Lab's, so a lab extension will not load. If an extension is the reason you are staying, that is a fair reason to stay.

Does it work on Windows?

Yes, and there is a Windows build. The one part that needs WSL is the built-in terminal, which is built on a Unix pseudo-terminal; running the server under WSL gives you that too and is the setup we recommend.

Is it really free?

Yes, under the AGPL-3.0: install it, run it, put it on your own server, change it. The commercial license is for building Zasper into a proprietary product, which the AGPL does not allow.

What happens to my conda and uv environments?

One registered as a Jupyter kernel appears in the launcher as it does in Jupyter, without being registered again. Without a kernelspec, Zasper still lists one with ipykernel in it if it is active when Zasper starts, is your base conda install, or is the project's .venv in a trusted folder.

Which coding agents work, and what do they cost?

Claude Code, Gemini CLI and Codex, and any other agent that speaks ACP; Claude Code is the one tested most. Each runs on your own account and subscription, so Zasper adds no cost and holds no key. Agents you run outside Zasper can use it through its MCP server.

Does my code leave my machine?

No. Zasper runs a server on your own machine and your files stay on it. A coding agent you start talks to its own provider, as it does in a terminal. It sends anonymous usage data, with no file names, paths, contents or IP address, and ZASPER_TELEMETRY=0 switches it off; PRIVACY.md is the complete list. It also asks zasper.io once a day whether there is a newer version, and loads widget libraries it does not bundle from jsDelivr unless Load widget libraries from the internet is off in Settings.

Community

The project, and how to join it

Zasper is developed in the open, by people who use it. What to know before you depend on it.

Latest release 2.1.0, with coding agents, a variables panel and SQL cells 16 October 2026
Stability The HTTP and WebSocket API, the configuration file and the command-line flags follow semantic versioning. They break only in a major release, and each break is explained since 1.0.0
Written in Go on the server, TypeScript and React in the browser, all in one repository AGPL-3.0
Contribute

Good first issues

The open issues on GitHub, and a developer guide that gets you building from source in two commands.

Open issues
Ask

Discussions

Questions, ideas and "is this supposed to happen", in the open, where the answer is findable afterwards.

GitHub Discussions
Talk

Slack

The project's own workspace, for quick questions and day-to-day talk.

Join the Slack

One binary, and your notebooks open in it

No account to make, and your files stay on your machine.