Friday · Use

Configuration

Everything the Go engine reads, where it reads it from, and what each value does.

This documentation is in English.

On this page
  1. Where settings live
  2. Choosing the engine
  3. Providers and keys
  4. Models
  5. Behaviour
  6. Command rules
  7. Your own sub-agent roles
  8. Project instructions
  9. The interface
  10. Diagnostics
  11. Every variable, in one table

Where settings live

Settings are flat KEY: "value" pairs in settings.json, in Friday's config directory:

SystemDirectory
Linux$XDG_CONFIG_HOME/archymedes, else ~/.config/archymedes
macOS~/Library/Application Support/Archymedes
Windows%APPDATA%\Archymedes
AnywhereARCHYMEDES_CONFIG_DIR, when set

Three ways to change them, all writing the same file:

  • In a session: Settings (alt+s or /settings), Providers (alt+p), /key, /model.
  • From the shell: friday settings.
  • By hand: edit settings.json.

An environment variable with the same name always wins over the file, so a key exported in your shell is used even when the file holds another. The engine reads settings when a session opens; a change applies to the next session.

Choosing the engine

ValueWhereEffect
--engine go / --engine tscommand linethis run only
ARCHYMEDES_ENGINE=go / tsenvironmentevery run in this shell
Settings → Behaviour → Engine (ARCHYMEDES_ENGINE in settings.json)settingsevery run
nothing set—the Go engine, with the TypeScript engine taking a session that needs it (the rule)

auto is accepted as "nothing set". Anything else is refused with a message.

Providers and keys

A provider is ready when its key (and, for some, its address) is set. Without an explicit choice, Friday uses the provider you used last (ARCHYMEDES_PROVIDER, remembered for you), else the first ready one in this order:

Provider--providerNeedsDefault modelHow the Go engine reaches it
AnthropicanthropicANTHROPIC_API_KEYclaude-sonnet-5Messages API, native, with prompt caching
OpenAIopenaiOPENAI_API_KEYgpt-5.6-terraOpenAI API
Archymedes Cloudarchymedes-cloudARCHYMEDES_CLOUD_TOKEN, ARCHYMEDES_CLOUD_BASE_URLautoTypeScript engine only
OpenRouteropenrouterOPENROUTER_API_KEYopenrouter/autoChat Completions at https://openrouter.ai/api/v1
Google GeminigoogleGOOGLE_API_KEYgemini-2.5-proChat Completions (Google's OpenAI-compatible endpoint)
xAI GrokxaiXAI_API_KEYgrok-4Chat Completions
DeepSeekdeepseekDEEPSEEK_API_KEYdeepseek-chatChat Completions
MistralmistralMISTRAL_API_KEYmistral-large-latestChat Completions
GroqgroqGROQ_API_KEYllama-3.3-70b-versatileChat Completions
Ollama (local)ollama—llama3.1Chat Completions at http://localhost:11434/v1
OpenAI-compatibleopenai-compatibleOPENAI_COMPATIBLE_API_KEY, OPENAI_COMPATIBLE_BASE_URLgpt-4o-miniChat Completions at your address
Free modelsfree / --freeOPENROUTER_API_KEYopenrouter/freeOpenRouter, free models only
Claude Codeclaudeyour own claude sign-in—TypeScript engine only
Codexcodexyour own codex sign-in—TypeScript engine only

Each provider's settings share a prefix: the id in capitals with - as _ (openai-compatible → OPENAI_COMPATIBLE, free → FREE, so free mode's model is FREE_MODEL).

VariableDoes
<PREFIX>_API_KEYthe key, as in the table's "Needs" column (Ollama needs none; free mode's is OPENROUTER_API_KEY)
<PREFIX>_MODELthe model to use instead of the default
<PREFIX>_SMALL_MODELthe model for cheap work; see Models
<PREFIX>_BASE_URLanother address: a regional endpoint, a proxy, a self-hosted gateway
OPENROUTER_BASE_URLfree mode's address, when not OpenRouter's own

Free mode never pays. With --free or ARCHYMEDES_PROVIDER=free, only openrouter/free or a model ending in :free is accepted, for the main model, the small model and any role's model. A session that remembered free mode never falls through to a paid provider when the key is gone.

Models

VariableDefaultDoes
<PREFIX>_MODELthe provider's defaultthe main model
<PREFIX>_SMALL_MODEL—the small model, for this provider
ARCHYMEDES_SMALL_MODEL—the small model, for any provider without its own
ARCHYMEDES_CONTEXT_LIMIT128000the main model's context window in tokens (at least 8000); compaction starts at 80% of it

Without a small model, the main model does everything. What runs on which:

WorkModel
the conversation; plan, review and general helpersmain
explore and verify helperssmall
compaction (automatic and /compact)small
session titlessmall
a role file's model:main, small, or a model id of the same provider

Behaviour

SettingDefaultDoes
ARCHYMEDES_TEST_FIRST (Settings → Build test first)onfor code changes: tests first and seen failing, then the code, then the project's static check. off: only the ordinary proof rule
ARCHYMEDES_TITLESonoff keeps a session's title as the first line of its first request, with no title request to the small model
ARCHYMEDES_SUGGEST (Settings → Suggestions)onnext steps after a turn, notes on each edit and hints while you type (User guide). off: none of them
ARCHYMEDES_SUGGEST_MODELoffon: the small model proposes up to two next steps of its own after each turn, for one small call
ARCHYMEDES_JEVonwith TYPESAFE_API_KEY set, Jev weighs the suggestions and notes edits; off never calls it. TYPESAFE_MODEL names the Jev model (jev-latest by default)
ARCHYMEDES_DEFER_TOOLSautowhich tools are found on demand with tool_search instead of being sent with every request. auto: git_log, git_show, todo_read, close_agent. off: send every tool. A comma list: exactly those names
ARCHYMEDES_PROVIDER—the provider to use when none is chosen; set for you when you pick one

Modes are chosen per session (--plan, --build, --auto, --defender, or shift+tab), not by a setting; a resumed session keeps its own.

Command rules

Rules you write once instead of answering the same approval every day. A rule names a command by its first words and says allow (run without asking), ask (always ask, even in auto mode or under a standing approval) or forbid (never run; the model is told your reason).

Two files are read, both optional: .archymedes/rules.json in the project, and rules.json in the config directory.

json
{
  "rules": [
    { "prefix": ["npm", ["test", "run"]], "decision": "allow" },
    { "prefix": ["git", "push"], "decision": "ask", "reason": "pushes are reviewed",
      "match": ["git push origin main"], "not_match": ["git pull"] },
    { "prefix": ["rm", ["-rf", "-fr"]], "decision": "forbid", "reason": "use trash-put instead" }
  ]
}
  • prefix: the command's first words. An element that is a list matches any one of its words.
  • decision: allow, ask or forbid.
  • reason: shown to the model with a refusal, and to you with a question.
  • match / not_match: examples checked when the rules load. A rule whose examples fail is left out, and a line at the start of the session names it and why.
  • A compound command (a && b, a | b, a; b) is judged part by part: forbidden if any part is, asked if any part asks, allowed only if every part is allowed.
  • In defender mode, allow rules still ask: every change there is looked at.

Your own sub-agent roles

A Markdown file per role, in .archymedes/agents/ in the project or agents/ in the config directory. A file with a built-in role's name replaces it. Full reference: Sub-agents → Writing a role.

markdown
---
name: migrations
description: writes and checks database migrations
tools: read_file, grep_files, write_file, edit_file, run_command
readonly: false
model: small
background: false
max-iterations: 20
max-tool-calls: 60
---
You write database migrations for this project. Every migration has a down step…

Project instructions

The first of these files found at the project root is given to the model with every request, as instructions from the people who work there: AGENTS.override.md, ARCHYMEDES.md, AGENTS.md, CLAUDE.md, .archymedesrules. Up to 20,000 characters are used. Sub-agents do not receive it; their brief says what they need.

The interface

Read by the friday binary itself, for what the screen looks like. Each is also a row of Settings (Appearance) unless marked as environment only.

VariableDefaultDoes
ARCHYMEDES_THEMEarchymedes-bluethe colours; --theme or /theme for one run or to change it
ARCHYMEDES_LANGUAGEyour localethe interface's language
ARCHYMEDES_PHOTOS (environment only)onoff leaves the pictures out; local keeps them to the built-in copies (the Gallery fetches nothing)
ARCHYMEDES_WALLPAPER (environment only)onoff keeps the pictures but not behind the whole screen
ARCHYMEDES_REDUCE_MOTION (environment only)offany value turns off animated scrolling and keeps the wallpaper still

Diagnostics

VariableDoes
ARCHYMEDES_ACP_TRACE=<file>appends every protocol message between the interface and the engine
ARCHYMEDES_DEBUG_LOG=<file>the interface's structured log; its first engine line says which engine runs and why
ARCHYMEDES_AGENT=<command>the TypeScript agent's command (the npm launcher sets it; a JSON array or a space-separated string)

Every variable, in one table

VariableRead bySection
ARCHYMEDES_ENGINEthe friday binaryChoosing the engine
ARCHYMEDES_CONFIG_DIRboth engines and the interfaceWhere settings live
ARCHYMEDES_PROVIDERboth enginesProviders and keys
<PREFIX>_API_KEY, <PREFIX>_MODEL, <PREFIX>_BASE_URLboth enginesProviders and keys
<PREFIX>_SMALL_MODEL, ARCHYMEDES_SMALL_MODELGo engineModels
ARCHYMEDES_CONTEXT_LIMITGo engineModels
ARCHYMEDES_TEST_FIRSTboth enginesBehaviour
ARCHYMEDES_TITLESGo engineBehaviour
ARCHYMEDES_SUGGESTGo engineBehaviour
ARCHYMEDES_SUGGEST_MODELboth enginesBehaviour
ARCHYMEDES_JEV, TYPESAFE_API_KEY, TYPESAFE_MODELboth enginesBehaviour
ARCHYMEDES_DEFER_TOOLSGo engineBehaviour
OPENROUTER_BASE_URLGo engine (free mode)Providers and keys
ARCHYMEDES_FREE_GATEWAY_URLTypeScript engine; the binary reads it to choose the engineProviders and keys
ARCHYMEDES_ACP_TRACE, ARCHYMEDES_DEBUG_LOG, ARCHYMEDES_AGENTthe friday binaryDiagnostics
ARCHYMEDES_THEME, ARCHYMEDES_LANGUAGE, ARCHYMEDES_PHOTOS, ARCHYMEDES_WALLPAPER, ARCHYMEDES_REDUCE_MOTIONthe friday binaryThe interface

Key bindings are changed in the Keys app (F7) and saved to keys.json in the config directory.

Kept in the repository as docs/engine/CONFIGURATION.md, checked by its conformance tests · synced at af2a9b2