Your project's setup, in one place you host.
Templates, scripts and files you can pull onto any machine — self-hosted, no subscription, no third party.
- One place for the files a project needs. Agent instructions, editor rules, skills, scripts, any text or binary file, in any folder shape you like.
- Publish once, apply anywhere. A folder becomes a template: the next
machine, or the next project, gets
eznit template apply <id>instead of a retyped setup. - With or without AI. Built-in starters for opencode, Codex, Copilot, Cursor and Windsurf; the same folder holds plain shell and editor configuration.
- Yours. Bytes live on your disk, indexed in your own PostgreSQL. No subscription and no third-party account.
- One command to try.
make setup && make upneeds only Docker.
Pre-1.0 and unhardened. Read Security status before exposing this anywhere but
localhost.
make setup && make up # Docker: API :4000, UI :5173, PostgreSQL, migrations| What | Where |
|---|---|
| Web UI | http://localhost:5173 |
| API | http://localhost:4000 |
| API reference (Swagger UI) | http://localhost:5173/docs |
Uploaded bytes live on the api-data volume, so they survive
docker compose down (down -v removes them too).
The CLI is a separate binary: make build_cli (Go only) writes
build/cli/linux/eznit, or download one from
Releases.
./build/cli/linux/eznit template init --kind opencode --target ./demo # no server needed
./build/cli/linux/eznit signup # first account is the admin
./build/cli/linux/eznit template publish ./demo --public
./build/cli/linux/eznit template list # note the id
./build/cli/linux/eznit template apply <id> --target ../another-project
./build/cli/linux/eznit template export <id> -o setup.eznit # one file…
./build/cli/linux/eznit template apply --from-file setup.eznit # …on a machine with no serverThe core commands prompt for what they need. template init is the offline
path: it writes a starter into a folder with no server and no account. Full
flags: CLI Reference.
| Dark | Light |
|---|---|
![]() |
![]() |
Sign up or log in on the page, or paste the token from eznit login into
localStorage as eznit.token. The full set of screenshots is under
docs/screenshots.
| Keep | Commands | Travels as |
|---|---|---|
| Files | upload, list, download, delete, share |
bytes on your disk, indexed in PostgreSQL |
| Templates | template publish, list, show, apply, export, init |
a folder: text, binary, variables, commands |
| Commands | command add, list, show, remove, import, export |
a script kept once and pulled into templates by id; a crower pack imports/exports them |
| Repositories | repo auth, list, clone (GitHub, GitLab, Bitbucket) |
a clone; the token stays on your machine |
A template may hold anything: AGENTS.md, .opencode/agents/, a SKILL.md,
.cursor/rules/, a PowerShell profile, a Makefile. Values like
{{PROJECT_NAME}} are asked on the machine that writes the files and are never
sent to the server.
eznit template init --kind writes a starter for the terminal you use:
| Kind | Starter writes |
|---|---|
opencode |
AGENTS.md + .opencode/agents/{build,plan,reviewer}.md |
codex |
AGENTS.md |
copilot |
AGENTS.md + .github/copilot-instructions.md |
cursor |
AGENTS.md + .cursor/rules/project.mdc |
windsurf |
AGENTS.md + .windsurf/rules/project.md |
generic |
AGENTS.md |
bash |
shell/bashrc.sh |
zsh |
shell/zshrc.sh |
fish |
shell/config.fish |
powershell |
shell/profile.ps1 |
The shell starters are commented snippets: source the file from your shell's
rc/profile and uncomment the examples you want. Applying a template never edits
a file in your home directory unless you point --target there.
| Platform | CLI | Server bundle |
|---|---|---|
| 🐧 Linux amd64 | eznit-cli_<tag>_linux_amd64.tar.gz |
eznit-server_<tag>_linux_amd64.tar.gz |
| 🐧 Linux arm64 | eznit-cli_<tag>_linux_arm64.tar.gz |
eznit-server_<tag>_linux_arm64.tar.gz |
| 🪟 Windows amd64 | eznit-cli_<tag>_windows_amd64.zip |
eznit-server_<tag>_windows_amd64.zip |
| 🪟 Windows arm64 | eznit-cli_<tag>_windows_arm64.zip |
eznit-server_<tag>_windows_arm64.zip |
| 🍎 macOS amd64 | eznit-cli_<tag>_darwin_amd64.tar.gz |
eznit-server_<tag>_darwin_amd64.tar.gz |
| 🍎 macOS arm64 | eznit-cli_<tag>_darwin_arm64.tar.gz |
eznit-server_<tag>_darwin_arm64.tar.gz |
The CLI archive carries eznit and ez; the server bundle carries
eznit-server, eznit-gui, the migrations, the Compose services and
RUNNING.md. Verify a download against checksums.txt from the release page.
This is a self-hosted tool, and it is not hardened. What is true today:
- Files are stored unencrypted on the server's disk. Do not put this on a
public interface as it stands —
localhostor a VPN you control. - The first account is the admin. It is the only one that may list, update or delete other accounts; no route grants the flag.
- Auth is rate-limited per IP and per address (
429+Retry-After). Signup and login do not reveal whether an address has an account; passwords are bcrypt; session tokens are random and expire. - Tokens stay on the CLI machine. The session token and the git-host token
live in
~/.eznit/config.json(mode0600); the eznit API never sees the host token.
The full list of what is deferred is on the roadmap board.
| I want to… | Read |
|---|---|
| try it in five minutes | Getting Started |
| publish and apply a template | Templates and skills |
| look up a command or flag | CLI Reference |
| configure every variable and secret | Configuration |
| know what runs on which OS or shell | Platforms and shells |
| see what is planned | Direction |
| develop or build a release | Development · Releases |
| fix an error | Troubleshooting |
In the repository: ARCHITECTURE.md is the map of the request
path and where a change belongs; CONTRIBUTING.md is how to
send one. The wiki's source is docs/wiki/ — edit it through a pull request, or
the next sync overwrites it.
This project says what it verified.
- No test sends a request through the whole stack. The router is tested with no database, and the repositories are tested against a real PostgreSQL; no test starts the API and makes an HTTP call that reaches a query.
- The Windows server bundle is built, never started. CI smoke-tests the Windows CLI; the server and the Compose stack are not run on Windows.
- The ARM64 binaries are built, never executed on ARM hardware, and the macOS archives are cross-compiled on Linux and never started on a Mac.
- The browser UI has no automated test; the screenshots are captured by hand.
Running the untested parts and saying what happened is the most useful contribution right now — see CONTRIBUTING.md.
Issues and pull requests are welcome: open an issue first, branch from dev,
run make check (and make web_check for UI changes), and say in the pull
request what ran and what did not. The full rules are in
CONTRIBUTING.md.
This project is developed with an AI agent. The review bar is the same: judge by tests and evidence, not by who wrote it.
MIT — see LICENSE.

