Skip to content

Configuration

All Morning Ritual settings live under the triage block in ~/.optimalos/config.json. Defaults and env overrides are defined in optimalOS/src/config.ts:81-98,199-209.

Config keys

KeyTypeDefaultEnv overrideDescription
triage.ollama_urlstringhttp://localhost:11434TRIAGE_OLLAMA_URLBase URL of the Ollama endpoint (OpenAI-compatible /v1/chat/completions).
triage.ollama_tokenstring | nullnullTRIAGE_OLLAMA_TOKENBearer token if Ollama is fronted by an auth proxy.
triage.modelstringdeepseek-r1:14bTRIAGE_MODELOllama model tag. Any 1M-context model that supports JSON-object response format will work.
triage.max_nownumber3Hard cap for NOW lane.
triage.max_nextnumber7Hard cap for NEXT lane.
triage.max_laternumber30Hard cap for LATER lane.
triage.context_token_budgetnumber900000Soft prompt-token budget per batch. The workflow refuses to ship a chunk whose estimated tokens exceed 950_000 (the hard limit, slightly above this soft budget).
triage.rerun_requires_briefbooleanfalseWhen true, /api/triage/rerun should return 400 unless an unconsumed brief exists. Not currently enforced in the route — see callout below.
triage.batch_sizenumber25Tasks per Ollama call. ≤ 25 keeps small models accurate. Set to 0 to disable batching and send everything in one call.

Example

json
{
  "triage": {
    "ollama_url": "http://pop-os:11434",
    "ollama_token": null,
    "model": "deepseek-r1:14b",
    "max_now": 3,
    "max_next": 7,
    "max_later": 30,
    "context_token_budget": 900000,
    "rerun_requires_brief": false,
    "batch_size": 25
  }
}

Env overrides

Three keys can be overridden via environment variable, useful for shell-based deploys and dev work where you don't want to edit config.json:

bash
export TRIAGE_OLLAMA_URL=http://pop-os:11434
export TRIAGE_OLLAMA_TOKEN=sk-...
export TRIAGE_MODEL=deepseek-r1:14b

The remaining keys are config-file only.

Caveats

`triage.rerun_requires_brief` is not enforced

As of 2026-04-27 the config key exists and is parsed correctly, but the rerun route at optimalOS/src/routes/triage.ts:16-60 does not check it. Setting it to true has no effect on the API. Either treat the flag as informational until the route is patched, or gate reruns on the client side.

First-run behavior

On the very first triage run after upgrading (migration v5 creates the new tables and columns), every non-completed task is sent to the model fresh. The legacy priority field is not included in the prompt — the model scores from scratch. Expect many former P1s to demote below the NOW cap of 3. Lock the genuine NOW items via POST /api/triage/lock/:task_id and rerun; scores stabilize after 2-3 cycles. See Overrides & Locking.

Built by Carlos Lenis in Miami