Chloe

Docs

Settings and secrets

What goes in chloe.config.ts, what goes in .env, and a map of every setting.


Two places, and which one a value goes in is the only question:

What Where
A choice about how chloe behaves, an address, a path, a name settings in chloe.config.ts, in source control
A password, key or token .env beside it, mode 600, never committed
import { defineConfig } from "@chloejs/core";

import shop from "./agents/shop/agent.ts";

export default defineConfig({
  agents: [shop],
  settings: {
    model: { defaultModel: "anthropic/claude-sonnet-5", key: process.env.CHLOE_MODEL_KEY },
    connections: { resend: { api_key: process.env.CHLOE_CONNECTIONS_RESEND_API_KEY } },
    agents: { shop: { telegram: process.env.CHLOE_AGENTS_SHOP_TELEGRAM } },
  },
});
CHLOE_MODEL_KEY=...
CHLOE_CONNECTIONS_RESEND_API_KEY=re_...
CHLOE_AGENTS_SHOP_TELEGRAM=123456:ABC...

chloe reads nothing from the environment by itself. A secret reaches it only where the config names it, as process.env. and its name, so reading the config shows every key there is. A setting the config leaves out is its default, and so is one handed a variable nothing set. Any other value can be kept out of the file the same way.

The secrets are model.key, model.keys, connections.resend.api_key, connections.brave.api_key, connections.google.client, and everything under agents. Their names in .env are CHLOE_ and the path in capitals, and a message saying a key is missing gives both the name and the config line.

Every setting

Section What it controls More
model Which model an agent asks, how a call reaches it, the keys. Models
email.provider What carries mail a job sends with deliverEmail(): "resend" (the default), "gmail", or "none" to log it and send nothing. Connections
connections.google The Google account and the app it signs in with. Connections
connections.resend The Resend key, and chloe's alert mail. Connections
connections.brave The Brave Search key web.search uses. Without one it searches DuckDuckGo. Connections
agents.<id> Each agent's channel tokens, under the id in its agent.ts. Channels
serve Where the port listens: 127.0.0.1:3067. Change takes a restart. serve.url is the address the dashboard is opened at from elsewhere, so an agent can link to a file in its memory. serve.ownerKey is the key a copy in a machine takes as its owner, from the copy that made it, and serve.stopAfter the idle minutes before a copy stops itself. The site, Machines
machine Whether this chloe runs in a machine of its own, the shell user, the workspace, the hosts the shell may reach, the base image, and the keys every machine this copy makes is given. Machines
owner Who a run the clock started belongs to, as channel:who. Asking a person
node Which node npx chloe install runs. Empty is whichever is on the path.

Every setting with its default is in the settings reference, and your editor shows each one's explanation as you type it.

The dashboard's Configuration page (/configuration) changes them as forms, in the order the config says them: the model settings and keys, which service sends mail, the connections (Resend and its alerts, Google, Brave Search), the address the dashboard is reached at (serve.url), and the owner. Where the server listens, serve.host and serve.port, is changed in the file only, because a wrong one loses the page. A form changes the one value in chloe.config.ts and leaves the rest of the file, comments included, as it was. A key goes into .env, under the name the config already reads it from, or the suggested one, and the config names it as process.env.<name>. A value the file says as code (a variable, a spread, a call) is shown and not changed: the file is where to change it.

Below the forms, the Keys box takes any CHLOE_SOMETHING=value line and replaces that name's line in .env. It lists the names .env sets and never shows a value. Only CHLOE_ names are written, less CHLOE_STATE, CHLOE_MEMORY and CHLOE_DB, and an agent sends its owner there, at /configuration?key=<name>, rather than ask for a key in a chat. Each name the config does not hand over as process.env.<name> says so. Last is chloe.config.ts itself, as text.

Every save, from a form or the text, is loaded as the next reload would load it, and type checked when the project has TypeScript, and when either fails the old file stays (and .env with it) and the page shows why.

An edit to the config or .env is live without a restart, except serve.host and serve.port. Renaming an agent means renaming its entry under agents; until then chloe says which entry names no agent.

Where things are kept

Not a setting, because it is read before the config: CHLOE_STATE (the state folder, data/ beside the config), CHLOE_MEMORY (the agents' memories, data/memory) and CHLOE_DB (the run history), from the environment or .env. A change takes a restart. See The site.