Repository navigation
Templates and Skills
A template is a folder you keep once and write onto other machines: agent instructions, editor rules, skills, scripts, project scaffolding. Publishing it makes one copy the source of truth; applying it is the setup step.
You do not need a template to start: eznit template init writes a built-in
starter offline, for an AI terminal or for a shell (--kind bash writes
shell/bashrc.sh, and so on for zsh, fish and PowerShell). Publishing and
applying through the API need a running eznit instance; an offline bundle
needs neither (see Take it with you).
Any file, in any folder shape. These are the ones people actually keep:
| What | Example paths |
|---|---|
| Agent instructions |
AGENTS.md, CLAUDE.md
|
| opencode agents and skills |
.opencode/agents/build.md, .opencode/skills/deploy/SKILL.md
|
| Editor rules |
.cursor/rules/project.mdc, .windsurf/rules/project.md, .github/copilot-instructions.md
|
| Shell configuration |
shell/zshrc.sh, shell/profile.ps1
|
| Project files |
Makefile, .editorconfig, .gitignore, docker-compose.yml
|
| Binary helpers | an image, a compiled script, a font โ anything non-text |
A worked folder:
my-setup/
โโโ AGENTS.md
โโโ .opencode/
โ โโโ agents/build.md
โ โโโ skills/deploy/SKILL.md
โโโ .cursor/rules/project.mdc
โโโ shell/zshrc.sh
Files are written relative to the target folder; .. and absolute paths are
refused. A file marked executable is written with mode 0755 when applied.
eznit template publish ./my-setup # prompts name, kind, description, public?
eznit template publish ./my-setup --public --commands <id>=shell/zshrc.sh
eznit template list # public catalogue + your own
eznit template list --mine --kind opencode
eznit template show <id> # the files and the variables
eznit template apply <id> --target ../other-project [--force]publish reads every file in the folder, skipping symlinks and files over the
limits. --force on apply overwrites files that already exist; without it, an
existing file stops the apply before anything is written.
Only a public template can be applied without a session. Your own private
templates need eznit login.
Write a placeholder in any text file and it becomes a variable:
# {{PROJECT_NAME}}
{{PROJECT_DESCRIPTION}}On publish, each distinct placeholder is asked once for a default value.
An empty default makes the variable required: apply will ask for it.
On apply, the values are asked on the machine that writes the files and
substituted into text files. A binary file is copied byte for byte. A
placeholder the template does not declare is left alone and reported, so you can
see it.
Variable names are upper case (PROJECT_NAME), up to 50 per template.
A command is a script kept once in your library and referenced by templates, so updating it updates every template that pulls it in.
eznit command add scripts/fmt.sh --name fmt # keep it once
eznit command list
eznit template publish . --commands <command-id>=bin/fmt
eznit command remove fmt # refused while a template uses itA command name is unique per user, not globally. command remove answers
409 while a template still references it โ a published template does not
quietly lose a script.
The library round-trips through a crower pack (CLI Reference), for moving the same commands to a workflow manager that already uses crower.
A template can leave the server as one file, and come back out on a machine that has never seen eznit:
eznit template export <id> -o setup.eznit # needs a session for a private template
eznit template apply --from-file setup.eznit --target ../another-projectThe bundle is JSON (format: 1) holding the files โ text and binary โ and the
variables with their prompts and defaults. A command the template pulls in is
written at its target path, so the bundle is a snapshot to apply, not a publish
request. The same path rules and limits are checked when it is read; a bundle
cannot be a way around them. apply --from-file asks the variables locally, so
no answer leaves the machine.
export refuses to overwrite an existing file without --force.
Checked by the CLI before the upload and by the server on the request:
| Thing | Limit |
|---|---|
| Files per template | 200 |
| Text file | 256 KiB |
| Text across the template | 4 MiB |
| Binary file | 10 MiB |
| Binary across the template | 32 MiB |
| Variables | 50 |
| Commands per template | 50 |
- Variable values. They are asked where the files are written, never stored on the server.
-
Your git token. It stays in
~/.eznit/config.jsonon your machine.
- Crower packs โ move a command library between eznit and crower (#185).
- Device-to-device transfer over cthrone. See Direction.
An offline bundle is how sharing works today without a shared instance:
template export and apply --from-file, above.