Configuration
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"]
| Action | Default | What it does |
|---|---|---|
down / up | j,down / k,up | move the cursor |
top / bottom | g / G | jump to top / bottom |
span | v | start a span selection |
comment | c | add a comment |
cut | x | cut the selected span |
edit | e | edit in $EDITOR |
next_annotation / prev_annotation | n / p | move between annotations |
delete_annotation | backspace | delete an annotation |
submit | return,enter | submit the review |
share | S | share the plan |
quit | q | quit |
walk | w | start the walk wizard |
review_cycle | b | cycle 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)
| Key | Type | Default | Meaning |
|---|---|---|---|
auto_close | "off" or number ≥ 0 | "off" | after a verdict: "off" prompts, 0 closes at once, N counts down N seconds |
editor | string | $EDITOR | editor for long annotation bodies |
review_width | number, clamped 24-50 | 34 | width of the expanded review panel |
review_state | expanded | compact | hidden | expanded | review panel mode |
theme | a preset name (see [theme]) | cueloop | the 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"
| Key | Type | Meaning |
|---|---|---|
prompt | string, required | the comment body inserted when you pick the action |
metadata | string, optional | extra 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 |
|---|---|
| 1 | Zoom out, research in depth |
| 2 | Restate simplified |
| 3 | Out of scope |
| 4 | Let's chat about this |
| 5 | Prototype this |
| 6 | Ensure 0 regressions |
| 7 | Consider 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"
| Key | Default | Meaning |
|---|---|---|
vault | first vault found | vault path |
folder | cueloop | destination folder in the vault |
filenameFormat | {YYYY}-{MM}-{DD} - {title} | note filename template |
separator | space | filename word separator: space, dash, or underscore |
exportOn | manual | when to export: approve, any resolve, or manual |
filenameFormat and exportOn are camelCase, unlike the
snake_case [ui] keys - they are read verbatim.Environment variables
| Variable | Default | Used for |
|---|---|---|
CUELOOP_CONFIG | - | path to your user config file |
CUELOOP_HOME | ~/.cueloop | daemon state: socket, sessions, pid, lock |
CUELOOP_GH | gh | the 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.