Configuration
On this page
Zest works with no configuration. Everything here is optional.
Where Zest looks for a value
For every key and setting, first match wins, checked on every request (so a key you add while the editor is open works on the next click):
- The server's environment (
export OPENAI_API_KEY=…before Claude Code starts). .env.local, then.env, in the page's folder, then each folder above it up to your git root or home folder.- Zest's config file:
~/.config/zest/config.json(Windows:%APPDATA%\zest\config.json; override withZEST_CONFIG). Keys pasted in the editor or set withzest keys setgo here, with permissions set so only you can read it.
{ "keys": { "OPENAI_API_KEY": "sk-…", "GEMINI_API_KEY": "AIza…" } }
Keys
| Name | For |
|---|---|
OPENAI_API_KEY | Generate with OpenAI |
GEMINI_API_KEY, GOOGLE_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY | Generate with Google (first one found) |
PEXELS_API_KEY | Pexels search |
Settings
| Name | Default | Does |
|---|---|---|
ZEST_PORT | 4477 | First port to try for a server of Zest's own (when the Zest service is not running); Zest moves up if it is taken |
ZEST_ASSETS_DIR | assets | Where placed images go, relative to the page (must stay inside its folder) |
ZEST_OPENAI_IMAGE_MODEL | tries gpt-image-2, gpt-image-1.5, gpt-image-1 | Pin one OpenAI image model |
ZEST_GOOGLE_IMAGE_MODEL | tries gemini-2.5-flash-image, gemini-3-pro-image-preview | Pin one Google image model |
OPENAI_BASE_URL | https://api.openai.com/v1 | An OpenAI-compatible endpoint (a proxy, Azure OpenAI) |
ZEST_LIBRARY_URL | the Zest CDN | Point the Library tab at your own manifest, for a team's approved images |
CHROME_PATH | found automatically | The browser zest shoot drives |
ZEST_NO_BROWSER | unset | Never open a browser (CI, remote machines) |
NO_COLOR | unset | Plain zest doctor output |
ZEST_UPDATE_CHECK | on | 0 stops the daily check for a newer release (the policy file can turn it off for a whole machine) |
ZEST_HOME | ~/.zest | Where the ledger lives (ledger.jsonl, see Notes and Submit), with the mailboxes and the pages waiting for quiet (When someone is already working here) |
ZEST_WAIT_EVERY_MS | 60000 | How often a Submit that waits for quiet asks again whether the other agent is still working |
ZEST_LEDGER | on | 0 stops writing the ledger |
A team library
ZEST_LIBRARY_URL can point at any folder served over HTTPS that holds a manifest.json in the library format. Put your brand's approved photography there, set the variable in a shared .env, and everyone's Library tab shows it.
Run, the button and your team's setup
| Setting | What it does |
|---|---|
ZEST_RUNNER=off | Turns the Run button off on this machine, whatever the config says. The editor copies the prompt instead. |
ZEST_CLAUDE_PATH | Where the claude program is, if Zest cannot find it on your PATH. A .js or .mjs file runs under Node. |
ZEST_SERVICE_PORT | The Zest service's port (4470). Change it, and change the address your dev server forwards /__zest to (Editing in place). |
ZEST_POLICY | Read the organisation's policy from this path (see Security). |
ZEST_CONFIG | Use another config file (keys, Run's yes, approvals, the button's repos) instead of ~/.config/zest/config.json. |
zest.json files in your repository hold what your team decides once: context files, built pages, checks, lint words, locked images, packs and extensions. See Your team's setup.