zel
One binary. Everything you do to a Zellij site, you do with it.
zel is the interface to Zellij. Creating a content folder, converting one from
another tool, checking it, running it, building it and putting it online are all
subcommands of the same binary.
It is a native executable with no Node dependency. The commands that describe the content model read a schema compiled into the binary. The commands that build a site run the engine in a container, so nothing on your machine needs npm, a Node version, or a lockfile.
Installing
Binaries are published on the repository's releases page — Linux, macOS and
Windows, x86-64 and arm64, each with a .sha256 beside it.
curl -fsSL https://raw.githubusercontent.com/mylife-inc/releases/main/zellij/install.sh | shOr download the archive for your platform, verify it against its .sha256, and
put zel on your PATH. See the Quickstart for the detail.
What it does
Write
Create a content folder, or a page, or one section — with the fields already filled in. Ask what any section type takes.
Convert
Read an existing MkDocs or Docusaurus tree and write the Zellij equivalent beside it.
Check and run
Validate the folder, and serve it locally while you write.
Ship
Produce a static site or a container image, and put either one online.
The whole surface
| Command | Status | |
|---|---|---|
zel new | A content folder, a section, a page, a guide, a project | Available |
zel explain | What a section type takes | Available |
zel list | Section types, themes, formats, targets | Available |
zel context | The whole content model as one file, for an AI agent | Available |
zel detect | What tool a folder was written for | Available |
zel convert | That folder, as Zellij content | Available |
zel migrate | detect, convert and check in one step | Available |
zel check | Validate a content folder | Available |
zel fmt | Canonical formatting for the YAML | Planned |
zel dev | Development server | Available |
zel serve | Serve what build produced | Planned |
zel build | A static site, or a container image | Available |
zel deploy | Build and put it online | Planned |
zel image | Build, run and push container images | Available |
zel ci | Write a pipeline that does all of it on push | Available |
zel publish | check, build and deploy in one step | Planned |
zel ship | Somebody else's docs to a published site, in one line | Planned |
zel doctor | What is installed, what is missing | Available |
How a command finds your content
Every command that reads or writes content takes an optional directory:
zel check # figure it out
zel check ./docs # this oneWith no argument, zel looks for, in order:
A zel.toml
Searching upward from the current directory. Its
contentkey wins over everything else. See Configuration.A ./content folder
The conventional name, and what
zel new docscreates.The current directory
If it holds a
site.yamlor apages.yaml, it is the content root.
If none of those match, the command says so and stops. It never guesses at a folder that merely contains Markdown — a wrong guess produces a conversion or a build that looks finished and is not.
Where Docker comes in
Commands that only read the content model — explain, list, context,
detect, convert, new — are pure Rust and need nothing installed.
Commands that produce a site — check, dev, build, deploy — run the
engine, and the engine is a Next.js application. Rather than require Node,
zel runs it in a container from a public image.
zel doctortells you whether a container runtime is present and which image it would use.
You never write a Dockerfile, and you never see one unless you ask for it with
zel image dockerfile.
