# Environment

> Every environment variable chamoji reads: the face, colour, the update check, the TypeSafe key, config paths and git.

Source: https://www.chamoji.dev/docs/reference/environment

chamoji reads a few environment variables: to turn the moving faces and the update check off, to pick colours, to find its key and cache, and to keep git from asking for a password mid-command. This page lists every one.

## The face

Commands that wait, such as `memory sync`, show a small face on stderr while they work, with the step’s name. They end with a line such as `( ■‿■ ) ✓ Synced memory with origin: 2 entries in 3s`. A bare `chamoji` plays a short intro. The faces use the logo’s foil colours on a dark terminal and plain text on a light one.

- **Nothing moves,** and the output is exactly what it was before faces, when stderr isn’t a terminal, in CI, with `TERM=dumb`, with `--json`, or with `CHAMOJI_NO_ANIMATION=1`.
- **It never touches stdout,** so pipes and `--json` are unaffected.
- **Colour** follows `FORCE_COLOR`. `FORCE_COLOR=0` removes the colour, but the faces still move.

## Faces and colour

| Name | Type | Description |
| --- | --- | --- |
| `CHAMOJI_NO_ANIMATION=1` | exactly 1 | Turn off the moving faces and the intro. Other values do nothing. |
| `CHAMOJI_THEME` | light \| dark | Skip asking the terminal for its background, which chamoji otherwise does once. Light means no foil colours. Other values are ignored. |
| `CHAMOJI_ASCII=1` | exactly 1 | Draw the faces and the logo in plain ASCII. This is the default on the old Windows console. |
| `COLORFGBG` | foreground;background | The fallback for the theme, when `CHAMOJI_THEME` isn’t set and the terminal doesn’t answer. A background of 7 or 15 is light; any other number is dark. Without either, chamoji assumes dark. |
| `FORCE_COLOR` | 0 to 3, true or false | `0` or `false` turns colour off, and the faces still move. `1`, `2` or `3` sets the colour level, whatever the terminal says. `true` turns colour on at the level the terminal supports. |
| `NO_COLOR` | not read yet | chamoji 0.14.0 doesn’t read it, so the colour stays. Use `FORCE_COLOR=0` instead. |
| `WT_SESSION` | set by Windows Terminal | On Windows, chamoji draws its usual faces when this is set, and ASCII when it isn’t, as on the old console. |

## CI and terminals

| Name | Type | Description |
| --- | --- | --- |
| `CI` | any value | Set by most CI services. With it, nothing animates, there is no update check, the commit composer hook doesn’t open, and the one-time hints after `init` and in a monorepo without a `release` section don’t show. It also sets the colour level when the output is a terminal or `FORCE_COLOR=true` is set: full colour on GitHub Actions, Gitea Actions and CircleCI; 16 colours on Travis, AppVeyor, GitLab CI, Buildkite, Drone and Codeship. Other CI gets no colour, or 16 colours with `FORCE_COLOR=true`. A number in `FORCE_COLOR` always wins. On Windows, the Windows console’s level applies instead. |
| `TERM=dumb` | exactly dumb | Nothing animates, and there is no colour unless `FORCE_COLOR` asks for it. |

## The update check

The check runs at most once a day and only when stderr is a terminal. [Install](https://www.chamoji.dev/docs/install.md#the-update-notice) says what it sends.

| Name | Type | Description |
| --- | --- | --- |
| `CHAMOJI_NO_UPDATE_CHECK=1` | exactly 1 | Don’t check npm for a newer chamoji. The same as `--no-update-check`. |
| `NO_UPDATE_NOTIFIER` | any value | The same, under the name other CLIs use. |
| `XDG_CONFIG_HOME` | absolute path | Where the cache goes: `$XDG_CONFIG_HOME/chamoji/update-check.json`. A relative path is ignored. Default: `~/.config`. |
| `APPDATA` | path · Windows | Where the cache goes on Windows, when `XDG_CONFIG_HOME` isn’t set. |

## AI

| Name | Type | Description |
| --- | --- | --- |
| `TYPESAFE_API_KEY` | string | The key for [Jev](https://typesafe.ai), which `--ai` and the composer’s suggestions use. If it isn’t in the environment, chamoji reads that one line from `.env.local`, then `.env`, and no other variable in those files. For `--ai` on `changelog`, `next-version` and `release`, it reads them in the current folder, tracked files included. Memory search and the MCP server, with `--ai`, read them in the current folder and skip a file git tracks. The composer reads them at the repo root and skips a file git tracks. Skipping tracked files means a repo you clone can’t send your work to someone else’s account. Without `--ai` or the composer’s opt-in, nothing is sent. |

## git and your PATH

| Name | Type | Description |
| --- | --- | --- |
| `GIT_SSH_COMMAND` | command | For git commands that reach the network, such as `memory sync`, chamoji sets `GIT_TERMINAL_PROMPT=0`, and uses `ssh -o BatchMode=yes` unless you set an ssh command, here or in `core.sshCommand`. A missing password then fails the command instead of waiting for a prompt the face would draw over. |
| `GIT_SSH` | path | The older way to name an ssh program. When it’s set, chamoji leaves ssh alone, as with `GIT_SSH_COMMAND`. |
| `PATH` | path list | `init --agents` checks whether `chamoji` is on it. When it isn’t, the server in `.mcp.json` starts with `npx --yes @chamoji/cli mcp` instead. `setup` offers the Claude Code step when `claude` is on it. |

## Not a variable

`CHAMOJI_NO_CARD=1` looks like one, but the Claude Code hook reads it from the text of the agent’s command: `CHAMOJI_NO_CARD=1 git commit -m "…"` lets a commit without a `Why:` line through. Use it when you’ve told the agent to skip cards.

## Related

- [Install](https://www.chamoji.dev/docs/install.md): The update notice, and how to turn it off.
- [Sorting with AI](https://www.chamoji.dev/docs/guides/sorting-with-ai.md): What --ai sends, and where the key comes from.
- [Exit codes](https://www.chamoji.dev/docs/reference/exit-codes.md): What 0, 1, 2 and 3 mean for every command.
