Configuration

Summary

cueloop reads an optional TOML config. Every key has a default, so you set only what you want to change - keybindings, the review surface, the theme, and the Obsidian export.

Configuration is optional. cueloop ships with sensible defaults and reads a TOML file only to override them.

Where the file lives

cueloop looks for a user config in this order, and stops at the first it finds:

$CUELOOP_CONFIG
${XDG_CONFIG_HOME:-~/.config}/cueloop/config.toml

If the current repository has a .cueloop/config.toml, it is layered on top of the user config. Later layers win: built-in defaults, then user config, then repo config. A file that fails to parse is ignored, and the defaults stand.

[keys]

Every action is rebindable. A value is a single key combo or an array of them.

[keys]
down = ["j", "down"]
comment = ["c"]
submit = ["return", "enter"]
ActionDefaultWhat it does
down / upj,down / k,upmove the cursor
top / bottomg / Gjump to top / bottom
spanvstart a span selection
commentcadd a comment
cutxcut the selected span
editeedit in $EDITOR
next_annotation / prev_annotationn / pmove between annotations
delete_annotationbackspacedelete an annotation
submitreturn,entersubmit the review
shareSshare the plan
quitqquit
walkwstart the walk wizard
review_cyclebcycle the review panel mode
review_wider / review_narrower] / [resize the review panel

[ui]

[ui]
auto_close = "off"        # "off", 0 (instant), or N seconds
editor = "nvim"           # overrides $EDITOR for the edit action
review_width = 34          # review panel width in columns (24-50)
review_state = "expanded" # "expanded", "compact", or "hidden"
theme = "cueloop"         # a built-in theme preset (see below)
KeyTypeDefaultMeaning
auto_close"off" or number ≥ 0"off"after a verdict: "off" prompts, 0 closes at once, N counts down N seconds
editorstring$EDITOReditor for long annotation bodies
review_widthnumber, clamped 24-5034width of the expanded review panel
review_stateexpanded | compact | hiddenexpandedreview panel mode
themea preset name (see [theme])cueloopthe built-in color theme; also settable in Settings › Appearance

review_width and review_state also persist as you adjust them in the UI, so your last layout carries over between runs.

[[actions]]

On a plan, v marks a span and shows the marker toolbar (comment · cut · actions). Pressing a opens the quick-actions list: a set of preset comments you pick with j/k and , each inserting its prompt as a comment on the span. Every entry is a [[actions]] table with a required prompt and an optional metadata block that is appended after a blank line.

[[actions]]
prompt = "Needs a test"

[[actions]]
prompt = "Extract the duplication"
metadata = "pull the shared branch into one helper"
KeyTypeMeaning
promptstring, requiredthe comment body inserted when you pick the action
metadatastring, optionalextra lines appended after the prompt

Defining any [[actions]] replaces the defaults; a table without a prompt is ignored. With none configured, the built-in prompts stand:

#Default prompt
1Zoom out, research in depth
2Restate simplified
3Out of scope
4Let's chat about this
5Prototype this
6Ensure 0 regressions
7Consider existing repo patterns

[theme]

Pick a built-in theme with [ui] theme, then override individual tokens here. The presets are cueloop (the branded default, transparent so your terminal background shows through), rose-pine-moon, catppuccin-mocha, tokyo-night, gruvbox-dark, and nord (each paints its own opaque background). A [theme] override layers on top of the chosen preset, so a hand-tuned token survives a theme switch.

Override any theme token with a colour string. Unset tokens keep their default.

[theme]
accent = "#cba6f7"
green = "#a6e3a1"

By default the canvas and flat chrome are transparent: cueloop paints no background there, so your terminal's own background - including any transparency or blur it renders - shows through. The default text colours assume a dark-ish terminal. For an opaque look, set the surfaces yourself:

[theme]
background = "#1f1f29"
panel = "#1a1a23"

Tokens: background, panel, elevated, border, text, textMuted, textDim, accent, accentInk, green, red, blue, cursorBackground, markCommentBackground, insertedForeground, deletedForeground, backdrop. Unknown tokens are ignored.

[integrations.obsidian]

Export resolved reviews into an Obsidian vault.

[integrations.obsidian]
vault = "~/notes"
folder = "cueloop"
filenameFormat = "{YYYY}-{MM}-{DD} - {title}"
separator = "space"
exportOn = "manual"
KeyDefaultMeaning
vaultfirst vault foundvault path
foldercueloopdestination folder in the vault
filenameFormat{YYYY}-{MM}-{DD} - {title}note filename template
separatorspacefilename word separator: space, dash, or underscore
exportOnmanualwhen to export: approve, any resolve, or manual

camelCase here
The Obsidian keys filenameFormat and exportOn are camelCase, unlike the snake_case [ui] keys - they are read verbatim.

Environment variables

VariableDefaultUsed for
CUELOOP_CONFIG-path to your user config file
CUELOOP_HOME~/.cueloopdaemon state: socket, sessions, pid, lock
CUELOOP_GHghthe GitHub CLI used to fetch and post PR reviews
EDITOR-editor for the edit action (overridden by [ui] editor)

The gateway that serves shared plans reads its own CUELOOP_GATEWAY_* and key variables, but those are server-side and do not affect the local CLI.