Skip to content

Configuration & files

Inari keeps its state in ~/.config/inari, created with 0700 (owner-only — routing rules and app history are nobody else's business, see src-tauri/src/persistence/mod.rs). Most files are JSON; two are plain-text markers and one is a secret.

PathWhat
~/.config/inari/channels.jsonChannels (Game/Chat/Music/…), max 10
~/.config/inari/buses.jsonMixes for OBS
~/.config/inari/assignments.jsonApp → channel routing
~/.config/inari/aliases.jsonRenamed apps, channels and mixes
~/.config/inari/outputs.jsonOutput device per channel, plus which channels have auto-failover turned off
~/.config/inari/seen_apps.jsonHistory of every app ever seen playing audio, including "ignored" marks
~/.config/inari/eq.json, eq_presets/Per-channel EQ + saved presets
~/.config/inari/mic.jsonMic chain config
~/.config/inari/profiles/Saved layouts
~/.config/inari/prefs.jsonApp preferences — theme, device naming, balance slider, notification display, your hotkey bindings and the remote's enabled flag, address and port
~/.config/inari/remote-tokenThe remote's bearer token. Its own file, 0600
~/.config/inari/active_profilePlain text: the name of the live-bound profile
~/.config/inari/notify_mirrorMarker file; its presence means OLED notification mirroring is on

Writes are atomic (temp file + fsync + rename), so a crash mid-save leaves either the old file or the complete new one. Each file carries a schema version, and keys a build doesn't recognise are preserved across a load/save round trip — so running an older Inari once does not silently drop settings a newer one wrote.

As of v1.0.13 that really is every file: channels.json and the profiles had been missing both the version field and the catch-all, which meant an older build could strip a newer one's additions from exactly the files holding the channel set.

Atomicity is not ordering, though. A profile autosave snapshots the whole profile under the mixer lock and writes it outside — an fsync under that lock would stall every other command — so with a second thread writing at the same time (the remote's runtime, a global hotkey, the CLI), the slower writer used to win the rename and put an older snapshot on top of a newer one. Snapshots now carry a sequence number, and a write older than what is already on disk is dropped rather than applied.

The remote token

remote-token is 32 bytes from the OS random source, hex-encoded, written with mode 0600 and kept out of prefs.json — that file is ordinary configuration people paste into bug reports. Deleting the file mints a new token on the next start; Settings → Remote → Regenerate token does the same on demand, and invalidates every device that had paired with the old one.

Log file

~/.local/share/com.fbnlrz.inari/logs/inari.log

One file, capped at 512 KiB. When it fills, the previous contents are discarded rather than archived, so grab the log reasonably soon after a problem. Settings → About has a button that opens the folder. Collecting a log for a bug report is covered in Troubleshooting.

WirePlumber fragments

Two more files live outside the config directory, under ~/.config/wireplumber/wireplumber.conf.d/:

PathWhat
90-sink-routing.confThe stream.rules fragment that pins apps to their channel
51-arctis-nova-pro-headroom.confOptional anti-crackle headroom for the Nova Pro (presence of the file is the setting)

The routing fragment still carries the old sink prefix from before the rename — worth knowing when you go looking for it. WirePlumber reads conf fragments at startup only, so changes take effect at the next login or WirePlumber restart.

Autostart

Enable autostart in Settings; Inari writes a systemd user unit (~/.config/systemd/user/inari.service) anchored to your graphical session. With Start minimized on, the unit's ExecStart gains --minimized, so the unit is rewritten whenever you toggle it.

Reset Inari wipes ~/.config/inari, removes the routing fragment and deletes this unit. The one thing it leaves behind is 51-arctis-nova-pro-headroom.conf — delete that by hand if you want it gone.

Command line

inari takes --minimized to boot straight to the tray, and a handful of verbs (status, mute, volume, profile) that talk to the already-running instance. A second launch never opens a second window — it raises the one that is running. See Command line.

Migrating from upstream Sink

If you used the upstream Sink, run ./migrate-to-inari.sh once to move ~/.config/sink~/.config/inari and clean up the old autostart unit. Your channels, mixes, profiles and routing are preserved; PipeWire node names are kept stable on purpose.

Released under the GPL-3.0 License. A fork of NC1107/sink.