Skip to main content

Zett logo

Zett

A local-first, AI-assisted workspace for turning fleeting thoughts, conversations, links, and assets into reusable knowledge.

License: MIT Python 3.10-3.14 Local-first


Zett is a private workspace where you think out loud with an AI assistant and keep what matters. Catch a fleeting thought in one line before it slips away, bring in the sources around it, and work it into something durable — a card, an article, a slide deck, or a paper — organized, searchable, and stored on your own machine.

No account, no cloud workspace, no telemetry. Zett runs as a single local application that listens on 127.0.0.1 and keeps every database and file under one directory. It talks to the model provider you configure, and to a chat platform only when you connect one.

What you can do

  • Think in a conversation. Ask, refine, and iterate; the answer streams with its reasoning and the tools it used, so you can see how it got there.
  • Catch a fleeting thought. Jot down the idea, a rough note, or a question the moment it arrives, and develop it into something durable whenever you come back to it.
  • Keep the good parts. Cards, articles, images, slide decks, and LaTeX PDFs are built from the conversation and saved only when you say so.
  • Build a library. Everything published is searchable and tagged with a nested tag tree, and every item links back to the conversation it came from.
  • Bring your sources. Attach notes, links, images, and files to a conversation, or keep a global library of material you reuse everywhere.
  • Choose your models. Configure several providers and pick the model and the reasoning effort for each conversation.
  • Work hands-free. Set a prompt to run on a schedule and read the transcript of what it produced while you were away.
  • Talk to it from your phone. Connect a chat platform and keep a separate conversation per chat, images and voice notes included.

Install

Zett ships as one Python package — the application, the zett command, and the compiled interface — so this is the whole install:

uv tool install zettelekasten   # or: pipx install zettelekasten
zett start                      # serves 127.0.0.1:6280 in the background

The distribution is zettelekasten; the command it installs is zett. It is published to PyPI together with the agim and zett-weixin packages it depends on, so one install is enough. To work from a checkout instead:

git clone https://github.com/Chang-LeHung/zettelekasten
cd zettelekasten
make install             # builds the interface and installs the `zett` command
zett start               # serves 127.0.0.1:6280 in the background

Either way, open http://127.0.0.1:6280, add a model provider in Settings, and start a conversation. zett start returns once the server answers and leaves it running without the terminal, zett status reports it, and zett stop shuts it down; zett start --foreground stays attached instead.

First steps

  1. Connect a model. Settings → Provider → New provider. Give it a name, pick the provider, set the model, and paste an API key. Keys are encrypted with a local key file before they are stored.
  2. Start a conversation. Ask a question, drop in a note or a screenshot, and keep going. You can queue your next message while it is still answering, or steer the running answer with a correction.
  3. Save what is worth keeping. Ask for a card, an article, a deck, or a paper. The Assistant writes a draft; you review the diff and publish it.
  4. Optional. Connect a channel under Channels, or create a recurring prompt under Scheduled tasks.

Where your data lives

Everything is under ~/.zettelekasten/ — the databases, attachments, artifact projects, user skills, and rotating logs. Set ZETT_STORAGE_ROOT to move it. Deleting a conversation removes its messages, files, and artifacts with it.

Documentation

The project site is published at https://chang-lehung.github.io/zettelekasten/, with the full documentation under https://chang-lehung.github.io/zettelekasten/docs/:

Development

git clone https://github.com/Chang-LeHung/zettelekasten
cd zettelekasten

make install     # build the frontend and install the `zett` command
make dev         # run from source with reload on 127.0.0.1:6280
make check       # Ruff, backend/agim/channel tests, frontend tests, typecheck, build

The repository holds the FastAPI application and the Vue interface that Zett serves. backend/README.md documents how the backend is put together, and AGENTS.md records the rules a change has to follow.

The repository also carries two packages that are released on their own: agim, the stateless chat SDK, and zett-weixin, the WeChat channel plugin built on it. The agent runtime Zett runs on lives in its own repository, zett-agent.

zett3rd/ keeps integrations that live beside Zett without being part of its build — nothing there is imported by the backend or the interface, so a broken one can never fail Zett itself. It currently holds a Zettelekasten Chrome extension (Vue 3 + TypeScript, built with Vite) that embeds a separate conversation in each webpage, reads that page, and saves useful results into your library.

Plugins

Zett discovers installed packages through entry points, so an extension is a normal distribution rather than a patch:

  • zett.agent — tools, lifecycle hooks, slash commands, and @ references inside a conversation.
  • zett.channels — a chat platform, from QR login to inbound media.

Install one into the same environment as Zett and restart; the plugin guide walks through a complete example, including what the host guarantees and which boundaries stay closed.

License

This project is available under the MIT License.

Metadata

Release files for zettelekasten 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zettelekasten 0.0.1
File Size Uploaded
zettelekasten-0.0.1.tar.gz 5.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for zettelekasten 0.0.1
File Interpreter ABI Platform
zettelekasten-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 10.4 MB

Release files / zettelekasten-0.0.1.tar.gz

Download URL zettelekasten-0.0.1.tar.gz
Size 5.3 MB
Tags Source
SHA-256 checksum
How to use checksums
45f57018f9d07466373e5121a2b69977b54cc0e46d5eb8c2cb61eda1e39aac38
BLAKE2b-256 checksum
How to use checksums
4e6abc145ec3a96f3678ceae4e9d4e6f1b5a3904e263f0d6c1aa9ca4f19047dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / zettelekasten-0.0.1-py3-none-any.whl

Download URL zettelekasten-0.0.1-py3-none-any.whl
Size 5.1 MB
Tags Python 3
SHA-256 checksum
How to use checksums
cf576bf3aa17bec5399ecdc81ba4424fb206662054704712af6de184aeae005c
BLAKE2b-256 checksum
How to use checksums
f7a1e0f060fb27f7b2c9ef637edd98f3b7e14c7c3129e51dd75d5da7781c1e5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.0.2

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page