High performance IDE for Jupyter Notebooks

Zasper is built from the ground up for massive concurrency: a minimal memory footprint, exceptional speed, and thousands of connections at once.

It speaks Jupyter's wire protocol, so it runs the notebooks you already have.

brew install zasper-io/tap/zasper

Other ways to install

04-data-analysis.ipynb
A Zasper notebook analysing the Palmer Penguins dataset, with a scatter plot of bill length against bill depth for three species
5× less CPU than Jupyter Server
40× less RAM than Jupyter Server
10 MB to download: the whole app, one binary

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.

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.

Your notebooks, unchanged

Zasper reads and writes .ipynb directly, so a notebook moves between Zasper and JupyterLab without being converted. Your files stay where they are (no import step, no workspace to create), and the same kernels run them, registered once.

The whole of it, including what each output type needs, is on Notebook Support.

Written about, and talked about

Zasper reached the front page of Hacker News the week it was released, and has been written up and presented since.

Hacker News

425 points

“Zasper: A Modern and Efficient Alternative to JupyterLab, Built in Go”, and a hundred comments arguing about notebooks, which is how you know people read it.

2 January 2025 Read the thread
I Programmer

The JupyterLab alternative

“Zasper started out as a front-end interface to JupyterLab like many others, but ended up as a ground up implementation of the Jupyter project.”

Nikos Vaggalis · 23 January 2025 Read the article
Techzine

A Go rewrite of Jupyter

An early write-up of the first release on Techzine's DevOps desk: what a Go implementation of the wire protocol is, and why its footprint is smaller.

Erik van Klinken · 2 January 2025 Read the article
FOSDEM 2026 High Performance Jupyter Notebooks with Zasper 1 February · Brussels
The Fifth Elephant 2025 Building high performance PyData tools by adding Go to the mix Bangalore
IndiaFOSS 2025 Zasper: High Performance IDE for Jupyter Notebooks FOSS United

And it is a real IDE

Every screen below is from a running session.

Your coding agent, beside your notebooks

Claude Code, Gemini CLI, Codex or any agent that speaks ACP, in a panel next to the notebook it is working on. It reads, edits and runs your cells through Zasper's own tools, and every file a turn changed is listed under it, to review in a diff and undo a block, a cell or the whole turn. It runs on your own subscription; Zasper holds no key.

Coding agents · MCP server

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.

SQL beside your Python

A SQL cell queries your database, or the DataFrames the kernel already holds, and leaves the answer as a DataFrame for the cells after it. PostgreSQL, MySQL, SQLite, DuckDB, Snowflake, BigQuery and more, browsed table by table in the Data panel, with each password kept in your system keychain.

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.

Your environments, already found

Every Jupyter kernel you have registered, and any Python with ipykernel on your PATH, in your active conda or virtual environment, or in the project's .venv, one click from a blank notebook.

Launcher
Zasper's file explorer beside the launcher, showing the Python environments it found (including conda, uv and xeus kernels), each one click from a new notebook, and a group of C kernels below them.

A real shell, in the same window

Your own shell in a panel below the notebook it belongs to, beside the problems, references and variables of the file you are 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.

Version control, built in

Branch, stage, commit and read a side-by-side diff in the window you are already working in. JupyterLab ships no source control; git there is a separate extension you install and keep up to date yourself.

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.

And the rest of it

Smaller features, in the same download.

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 ten, two of them Xeus kernels. Installing kernels walks through adding your own.

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.

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

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.

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.

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.

Does my code leave my machine?

No. Zasper runs a server on your own machine and your files stay on it. 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.

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

Proud to be supported by

Zerodha FOSS United

One binary, and your notebooks open in it

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