Configuration
The environment variables and config files you reach for when building on Jetsyn: the runtime and agent tuning knobs, the CLI transport settings, and the file contracts inside a cell.
Jetsyn ships with working defaults, so most of these you never touch. When you do need to reach in, configuration comes in two forms: environment variables that tune the runtime and choose how the CLI reaches your cell, and a small set of files inside the cell that carry the contracts your employees read and write.
Two forms of configuration#
Everything a builder touches falls into three groups. Two are environment variables, one on each side of the wire; the third is a handful of files on the cell's /workspace volume that every surface agrees on.
- Runtime and agent tuning shape how an employee process launches inside the cell: which model and effort it runs at, when it is considered stalled, and what a Pro terminal opens into.
- CLI transport lives in your shell and decides how
jetsynreaches the cloud cell: the connect mode, the box, the key, the default cell, the token, and the endpoints. - Cell files are the config-file contracts on the cell volume: the shared company record, the Brain the strategist writes, the live roster, the intent output seam, and the agent-to-UI render file.
Runtime and agent tuning#
These control how an employee launches inside the cell. The headless runtime, the one that answers gateway events, and the interactive jetsyn agent REPL each carry their own launch knobs, so you can tune one without disturbing the other.
| Variable | Default | What it controls |
|---|---|---|
JETSYN_AGENT_RUNTIME | cli | Selects the agent runtime. cli is the proven default; sdk is reserved (see below). |
JETSYN_MODEL | claude-opus-4-8 | Model the headless CLI employee launches with. |
JETSYN_EFFORT | xhigh | Reasoning effort for the headless CLI employee. |
JETSYN_STALL_TIMEOUT_SECONDS | 600 | The only kill condition: the child is stopped only after stdout has been silent this long. There is no total-runtime cap. |
JETSYN_AGENT_MODEL | claude-opus-4-8 | Model for the interactive jetsyn agent REPL. |
JETSYN_AGENT_EFFORT | xhigh | Reasoning effort for the interactive REPL. |
JETSYN_AGENT_CWD | /workspace | Working directory the interactive REPL starts in. |
JETSYN_AGENT_PERMISSION | bypassPermissions | Permission mode for the interactive REPL. |
JETSYN_PRO_TERMINAL_COMMAND | /app/bin/jetsyn-claude | The command a new Pro or cell terminal launches. Swapping it is a UI-only change, the seam for a custom console. |
# Set in the cell environment; the defaults are already sane
export JETSYN_MODEL=claude-opus-4-8
export JETSYN_EFFORT=xhigh
export JETSYN_STALL_TIMEOUT_SECONDS=600Availability
Available now: the cli runtime, the proven default that every employee runs on. Coming soon: the sdk runtime; JETSYN_AGENT_RUNTIME=sdk is reserved and not yet enabled, so leave it at cli.
CLI transport#
These live in the shell where you run jetsyn. Mediation, whether you get a direct or a conversational session, is decided by the in-cell command, never by the transport, so these variables only affect how the CLI reaches your cell. When JETSYN_CONNECT is unset the CLI picks SSH if an SSH key is present, otherwise HTTPS.
| Variable | Effect |
|---|---|
JETSYN_CONNECT | Force the transport: ssh or https. Wins over the auto-selection when set. |
JETSYN_BOX | The host the SSH transport connects to. |
JETSYN_SSH_KEY | Path to the SSH identity the SSH transport uses. |
JETSYN_CELL | The default cell slug to use when a command omits it. |
JETSYN_TOKEN | The credential the HTTPS bridge authenticates with. Read from the environment, never from the command line. |
JETSYN_API | Base URL of the backend the CLI calls for sign-in and control-plane requests. |
JETSYN_UPDATE_URL | Where jetsyn update fetches a new copy of the script. The download is validated before it overwrites the installed script. |
JETSYN_RECOMMENDED_URL | Where the CLI reads the recommended version and loadout. |
export JETSYN_CONNECT=https
export JETSYN_CELL=acme
jetsyn agent # connects to the acme cell over HTTPSTip
The bridge reads JETSYN_TOKEN from the environment and never from argv, so your credential stays out of shell history and out of the process list. Keep it in your environment, not inline on the command.
Files in the cell#
All customer data is folders on the cell's /workspace volume. A few files there are not data but contracts: every surface agrees on their shape, so an employee that writes one and a surface that reads it stay in sync with no shared code.
| File | Contract |
|---|---|
workspace.json | The one shared company record that the web /agent app and the CLI both read, at the /workspace root. Whitelisted keys only, capped at 20KB. |
Brain/spine.json | Config-in-memory the strategist writes: mission, goals, roster, tasks. Every white-label employee reads its own slice, so two tenants get two behaviors with no code change. |
Brain/STRATEGY.md, Brain/PLAN.md | The human-readable strategy and plan the strategist authors alongside spine.json. |
Brain/roster.json | The live employee-to-session store: who exists, whether each is active, and each employee's durable session id. A re-run driver or scheduler reads this to know who to resume. |
runs/<task>/intents/*.json | The credential-isolated output seam. An employee writes JSON intent files here; a privileged parent drains them and calls your tools, so the employee never holds a token. |
.claude/agents/<id>/ui.json | The agent-to-UI contract: how an employee renders itself into any surface. |
workspace.json
The shared record is a small, whitelisted object. Only name, idea, slug, status, and plan are accepted; anything else is dropped. Write it cell-canonical and it shows up identically on the web workspace and the CLI.
{
"name": "Acme Robotics",
"idea": "AI employee for our support inbox",
"slug": "acme",
"status": "active",
"plan": "business"
}The agent-to-UI contract
Each employee renders itself by writing a ui.json under .claude/agents/<id>/. It is version 1 of a closed contract: a fixed set of block primitives, text, markdown, list, kv, link, preview, and action. Writes are atomic, so a surface never reads a half-written file, and unknown keys are rejected, which is what lets every surface render every employee without per-employee UI code.
Where to go next#
The CLI
Where the transport variables apply: install, sign in once, and reach your cloud cell from the terminal.
Read →Architecture
The cell, the spawn-per-event employee, and the runtime these knobs tune.
Read →Build an AI employee
How the Brain, the roster, and the ui.json contract come together to author an employee as plain files.
Read →Gateways
How connections are configured as data, and how to add a channel or an integration.
Read →