remnix logo

Configuration

config.yaml, sidecar ignore files, paths, and every setting remnix reads.

Portable settings live in config.yaml. Machine identity and credentials stay next to the database, not in that file, so the YAML can be copied or committed.

~//remnix/config.yamlyaml
version: 2
disable_auto_migrate: false
sync:
  enabled: false
  interval: 5m
  gc_interval: 1h
  rclone_engine: embedded
  endpoints: []
  callbacks: []
daemon:
  compact_interval: 5m
  config_watch_interval: 30s
suggest:
  enabled: true
  menu: false
  menu_max: 8
  completions: false
  accept:
    - Right
pty_proxy:
  enabled: false
  height: 100

Editors that speak YAML language servers can load config.schema.json:

yaml
# yaml-language-server: $schema=https://remnix.app/config.schema.json

remnix writes that comment when it saves. Unknown YAML keys are rejected (additionalProperties: false). A pre-v2 file with sync.transport or the old nested sync.rclone object is refused; run remnix setup.

Interactive changes: remnix config, remnix config sync, and remnix remote .... The configuration wizard saves only on success.

Files

Defaults follow XDG. Override the directories with environment variables; filenames inside them are fixed.

PathPurpose
$XDG_CONFIG_HOME/remnix/config.yamlPortable settings (no secrets). Default ~/.config/remnix/config.yaml
$XDG_CONFIG_HOME/remnix/ignore-commands.txtExact commands that must not be recorded
$XDG_CONFIG_HOME/remnix/ignore-commands.regexRegex patterns for commands that must not be recorded
$XDG_DATA_HOME/remnix/local.yamlThis machine’s device_id and device_name
$XDG_DATA_HOME/remnix/rclone.confrclone credentials (mode 0600)
$XDG_DATA_HOME/remnix/history.dbLocal history and key metadata
$XDG_DATA_HOME/remnix/suggest-cache.dbPersistent CLI --help cache for overlay suggestion names and descriptions
$XDG_DATA_HOME/remnix/daemon-status.jsonLast daemon sync result
$XDG_DATA_HOME/remnix/setup-state.jsonCrash-safe setup marker
$XDG_RUNTIME_DIR/remnix/control.sockDaemon RPC (suggest, history, overlays)
$XDG_RUNTIME_DIR/remnix/terminal.sockDaemon terminal attach socket
VariableOverrides
REMNIX_CONFIG_DIRDirectory that holds config.yaml and the ignore files
REMNIX_DATA_DIRDirectory that holds local.yaml, rclone.conf, history.db, and suggest-cache.db
REMNIX_RUNTIME_DIRDirectory that holds the control and terminal sockets

A leftover rclone.conf under the config directory is moved into the data directory on startup. Do not copy local.yaml to another machine; that device needs its own id. See rclone for where encrypted objects live on remotes.

Reload

The daemon reloads config.yaml on SIGHUP, remnix daemon reload, or when the file’s mtime changes (polled every daemon.config_watch_interval). Sync interval picks up immediately.

Ignore files are not part of that YAML watch. Recording re-reads them when their mtime or presence changes, so new ignore rules apply to the next command without a daemon restart.

Shell-generated glyphs and hooks come from remnix init. After changing ui colors/icons, suggest, or pty_proxy, re-source init (or start a new shell). Installing a new binary is not enough.

version and migrations

KeyDefaultMeaning
version2Config format. remnix writes 2. Older files are bumped on load
disable_auto_migratefalseSkip automatic SQLite migrations when opening the database

sync

Encrypted history synchronization. Details of bundles, checkpoints, and equalize are in the sync protocol. Provider-specific rclone notes are in rclone.

KeyDefaultMeaning
sync.enabledon if any endpoint is enabledMaster switch. false keeps local history and does not delete remotes
sync.interval5mHow often the daemon syncs. Go duration (30s, 5m, 1h). Values under 1s fall back to 5m
sync.gc_interval1hHow often the daemon runs remote garbage collection
sync.rclone_engineembeddedembedded uses the bundled rclone library. external uses an rclone binary on PATH
sync.endpoints[]Mirrors of the same encrypted repository. Sync fans out to every enabled endpoint
sync.callbacks[]Commands run after a successful sync. Do not put secrets here

remnix sync uses every enabled endpoint; remnix sync --endpoint=<id> targets one. remnix remote add appends; it does not replace existing endpoints or mint a new Sync Master Key.

Endpoints

Each endpoint needs a unique id and a type. name is the display label (falls back to id). enabled opts it out of sync without deleting it.

Paths in path (and other user-supplied location strings) keep $HOME, ${VAR}, and ~/ as written. remnix expands them when the path is used, not when the file is saved.

typeFieldsNotes
rclonerclone_remote, provider, pathDefault for new setups. rclone_remote is the section name in rclone.conf, not a token. provider is a wizard id: s3, gcs, dropbox, azure-files, icloud-drive, onedrive, google-drive, webdav, smb, custom
directorypathLocal or already-mounted folder. That folder is the repository
rsyncremoteuser@host:path session transport
scphost, user, port, pathSSH session transport. port is 1-65535
yaml
sync:
  enabled: true
  rclone_engine: embedded
  endpoints:
    - id: google-drive
      type: rclone
      name: Google Drive
      rclone_remote: remnix-google-drive
      provider: google-drive
      path: remnix
      enabled: true
    - id: local-mirror
      type: directory
      path: ~/src/remnix-backup
      enabled: false

On S3/GCS the first path component is the bucket. Callbacks that run an external rclone sync against a directory endpoint still work; they are not the native rclone transport.

daemon

Background cadences for the long-lived remnix daemon.

KeyDefaultMeaning
daemon.compact_interval5mHow often the daemon prunes the RAM history cache and returns unused memory
daemon.config_watch_interval30sHow often to stat config.yaml for reload. Values under 1s fall back to 30s

remnix daemon compact runs the same cache prune on demand.

suggest

Inline history completion (ghost text) and the suggestion menu. Ranking is unchanged by these keys: match quality, recency, frequency, cwd, device, and session.

KeyDefaultMeaning
suggest.enabledtrueGhost-text suggestions. false keeps Ctrl+R without ghost text
suggest.menufalseLSP-style picker (zsh POSTDISPLAY, or overlay TUI with pty_proxy)
suggest.menu_max8Suggestion rows shown at once (typed row stays pinned). Capped at 32
suggest.completionsfalseMerge shell completions into the picker
suggest.accept[Right]Keys that accept the ghost suffix when the cursor is at the end of the line (Right, Tab, …)
suggest.iconssee ui.iconsLegacy aliases: typed, history, completion. Prefer ui.icons

Ghost text still previews the best history match. History is not listed in the dropdown; completions sit under the typed row. Capture stops at 512 matches so a huge path completion cannot freeze the prompt.

ShellGhost textCtrl+RSuggest overlay (Ctrl+Space)
zshPOSTDISPLAYyescompsys overlay when pty_proxy is on; else POSTDISPLAY menu. No completer uses parsed --help
bashble.sh, if loadedyes--help then history overlay when suggest.menu is on
fishnot supportedyescomplete -C overlay when suggest.menu is on; no completer uses parsed --help
nunot supportedyes--ide-complete overlay when suggest.menu is on; empty results use parsed --help

When a CLI has no dedicated completer, overlay names (subcommands and flags) and descriptions come from parsed --help via suggest-cache.db. A new session does not re-run --help when the page is already cached. remnix suggest cache warmup aws gcloud starts a background walk into that file (a second warmup while one is running is queued onto the same worker). remnix suggest cache warmup --status attaches to live per-page progress. remnix suggest cache purge aws gcloud drops stale tools after a CLI upgrade.

pty_proxy

Unix only (Linux, macOS, WSL). Windows widgets use the alt-screen.

KeyDefaultMeaning
pty_proxy.enabledfalseremnix init execs remnix-attach so overlay TUIs can snapshot the live prompt
pty_proxy.height100 (fullscreen)Ctrl+R overlay height. 40, 40%, or 0.4 are 40%. Omit, 0, or 100 is fullscreen

Put eval "$(remnix init ...)" near the top of the rc file so only the proxy re-execs. Set REMNIX_PTY_PROXY_LEGACY=1 to use the old per-terminal remnix pty-proxy process. Without a daemon session, widgets fall back to a local remnix search --interactive TUI.

Smaller heights still keep at least five history rows plus header, rule, help, and input.

ui

Colors and icons for the TUI. Empty values and the string default use the built-in Catppuccin-like theme. Hex must be #RGB or #RRGGBB. Ready-made palettes are on themes.

ui.colors

KeyDefaultUse
accent#F5C2E7Highlights
title#CBA6F7Titles
muted#585B70Secondary text
rule#313244Rules / borders
select#313244Selected row background
badge#89B4FABadges
duration#A6E3A1Durations
failed#F38BA8Failed commands
time#7F849CTimestamps
text#CDD6F4Body text

ui.colors.syntax

Command highlighting in search and inspect.

KeyDefault
command#89B4FA
keyword#CBA6F7
flag#FAB387
string#A6E3A1
comment#6C7086
operator#F38BA8
variable#89DCEB
path#94E2D5
number#F9E2AF
argument#CDD6F4

ui.icons

KeyDefaultUse
cursor❯Cursor glyph
suggestion_typed›Typed row in the picker (suggest.icons.typed still works)
suggestion_history*History / overlay
suggestion_completion+Shell completions
separator·Separators
move_up_down↑↓Move hint

Ignoring commands

Optional sidecar files next to config.yaml skip recording. They do not delete or hide rows already in history.db, and they do not filter search, suggestions, inspect, or inbound sync. A command skipped at start still gets a UUID so the shell end hook is a no-op.

Both files are optional. Empty lines are skipped. Surrounding whitespace is trimmed. There are no # comments: a line is a pattern or it is empty. Matching either file is enough (OR).

ignore-commands.txt

One exact full command per line. ls skips ls, not ls -la.

~//remnix/ignore-commands.txttext
ls
ll
exit

ignore-commands.regex

One Go RE2 pattern per line. The command is skipped if MatchString succeeds on the raw command (not anchored unless the pattern says so). Invalid lines are skipped with a warning so the rest of the file still applies.

~//remnix/ignore-commands.regextext
^sudo
^rm -rf

Built-in secret skips

Regardless of those files, remnix never records a command whose text contains (case-insensitive):

  • REMNIX_RECOVERY_KEY=
  • RCLONE_CONFIG_PASS=
  • AWS_SECRET_ACCESS_KEY=
  • AZURE_STORAGE_KEY=

Prefer typing the recovery key interactively. Putting it on the command line is still visible in the original shell histfile.

Import (remnix import histfile / atuin) uses the same skip rules for new inserts. Existing rows are left alone.

Commands

CommandPurpose
remnix config / config syncInteractive configuration wizard
remnix remote list / add / edit / remove / test / reconnect / browseEndpoints
remnix daemon reloadReload config.yaml now
remnix doctorRead-only diagnostics (config version, leftover rclone.conf, …)

Further reading: configuration wizard, rclone, architecture, themes.