Quick Start
Install Zoi, sync the registry, install packages, and set up a project environment.
This guide gets you from a fresh machine to a working Zoi setup. It covers the normal user path first, then the project and package-author paths.
1. Install Zoi
Choose the installer for your platform.
Linux / macOS
curl -fsSL https://zillowe.pages.dev/scripts/zoi/install.sh | bashWindows
powershell -c "irm zillowe.pages.dev/scripts/zoi/install.ps1|iex"2. Set Up Your Shell
Zoi links package binaries into ~/.zoi/pkgs/bin. If commands installed by Zoi are not found, configure your shell:
zoi shell zshUse your shell name: bash, zsh, fish, elvish, or powershell.
3. Sync the Package Registry
Zoi uses Git-backed package registries. Sync once before installing packages:
zoi syncThis downloads package definitions from Zoidberg, builds the local package index, and imports registry metadata.
4. Find and Install a Package
Search:
zoi search helloShow package details:
zoi show @zillowe/helloInstall:
zoi install @zillowe/helloRun the installed command:
hello5. Use Zoi Without Installing a Package
For one-off commands, use zoi exec:
zoi exec @zillowe/helloThis is useful for trying a tool before adding it to your installed package set.
6. Update Safely
Preview updates first:
zoi update --all --dry-runApply updates:
zoi update --allIf an update causes problems, roll back:
zoi rollback <package>For a failed or interrupted transaction:
zoi rollback --last-transaction7. Create a Project Environment
Create zoi.yaml in your project root:
name: my-project
config:
local: true
pkgs:
- eza
- fzf
commands:
- cmd: build
run: make build
- cmd: test
run: make test
shell:
env:
default:
DEBUG: "true"Install project-local packages:
zoi install --localEnter the development shell:
zoi devRun project commands:
zoi run build
zoi run testCommit both zoi.yaml and zoi.lock so other machines can reproduce the same environment.
For strict reproducibility in CI:
zoi install --local --frozen-lockfile --yes8. Install From a Specific Source
Zoi source strings let you choose where a package comes from.
| Source | Example |
|---|---|
| Default active repos | zoi install hello |
| Specific repo | zoi install @zillowe/hello |
| Specific registry | zoi install #zoidberg@zillowe/hello |
| Specific version | zoi install @zillowe/[email protected] |
| Sub-package | zoi install @core/linux:headers |
| Local package file | zoi install ./my-tool.pkg.lua |
| Git repository | zoi install --repo Zillowe/Hello |
For more source formats, see Repositories & Registries.
9. Understand What Zoi Installs
Zoi has two kinds of dependencies:
- Zoi packages: Packages installed into Zoi's own versioned store.
- External dependencies: Dependencies installed through native or language package managers such as
apt,brew,scoop,cargo,npm,pip, orgo.
Use native:<name> in package definitions when the host operating system should choose the correct native package manager.
For the full dependency format, see Dependencies & Supported Package Managers.
10. Create Your First Package
A minimal .pkg.lua package looks like this:
metadata({
name = "my-cli",
repo = "community",
version = "1.0.0",
description = "My command line tool",
maintainer = { name = "Your Name", email = "[email protected]" },
license = "MIT",
bins = { "my-cli" },
types = { "pre-compiled" }
})
function prepare()
UTILS.EXTRACT("https://example.com/my-cli-1.0.0-linux-amd64.tar.gz", "src")
end
function package()
zcp("src/my-cli", "${pkgstore}/bin/my-cli")
end
function test()
local _, _, code = cmd(STAGING_DIR .. "/data/pkgstore/bin/my-cli --version")
return code == 0
endValidate it:
zoi package doctor ./my-cli.pkg.luaTest it:
zoi package test ./my-cli.pkg.luaBuild it:
zoi package build ./my-cli.pkg.lua --testFor the complete packaging guide, see Creating Packages.
11. Troubleshooting
Run:
zoi doctorCommon fixes:
| Problem | Fix |
|---|---|
| Installed commands are not found | Run zoi shell <shell> or add ~/.zoi/pkgs/bin to PATH. |
| Package cannot be found | Run zoi sync, then check active repos with zoi repo list. |
| You need a mirror | Use zoi sync set github, zoi sync set codeberg, or a custom registry URL. |
| You need offline installs | Pre-populate archives with zoi cache add or use --pkg-dir with --offline. |
| You need to know why something is installed | Run zoi why <package>. |
| You need to know which package owns a file | Run zoi owner <path>. |
Next Steps
- Read Features & Usage for the full command reference.
- Read Project Configuration for
zoi.yaml. - Read Creating Packages to write packages.
- Read Comparisons to understand when Zoi is the right tool.
2026 © All Rights Reserved.
- All the content is available under CC BY-SA 4.0, expect where otherwise stated.
- Source code is available on GitLab, licensed under Apache 2.0.
Last updated on
