Skip to content

Configuration

Bryan Speelman edited this page Sep 8, 2026 · 2 revisions

The file

ripdoctor config

prints every resolved setting as JSON, and ripdoctor doctor prints the path of the file they come from. It is TOML, and it does not exist until you create it: ~/.config/ripdoctor/config.toml, or under $XDG_CONFIG_HOME if that is set.

A partial file is fine. Anything you leave out keeps its default, and an unrecognised key is reported by doctor rather than refusing to load.

A minimal one:

library = "/srv/music"
vinyl = "/srv/vinyl"
capture_device = "hw:1,0"

The two directories

vinyl is the pool: the working directory for records in progress and the archive of raw sides. It needs room — an LP side is roughly 300 MB as 24-bit FLAC. See Files on disk for what goes in it.

library is where finished, tagged albums are filed. This is the directory your music player or server watches.

If you use beets, library must match beets' own directory setting. They are two names for one place and nothing else keeps them in step; ripdoctor doctor reports it when they disagree.

Capture

ripdoctor devices

lists the capture devices this machine has and what each accepts. Take the device name from there:

capture_device = "hw:1,0"
capture_rate = 48000
capture_format = "S24_3LE"
capture_channels = 2

The device is never guessed. If it is empty, recording asks you to set it.

Set the rate and depth to what your interface actually sends. A capture metered at the wrong rate measures the wrong frequency band, and the gap detection then works on the wrong numbers. ripdoctor probe will tell you whether what arrived looks like music.

The rate and depth can also be changed per-capture from the Rip panel, which is the quicker way to try a different setting.

Serving

bind = "127.0.0.1"
port = 8080

127.0.0.1 means that machine only. See The web interface for reaching it from elsewhere.

Cutting

lead = 1.3      # seconds of run-in kept before a track starts
tail = 1.5      # seconds kept after it ends

These pad every cut. They are what stops a boundary landing on the first instant of sound.

embed_art = true    # write the cover into each track as well as the folder
file_mode = 0o664   # permissions on the files that reach the library
dir_mode = 0o775

The two modes matter when something other than you reads the library — a music server running as its own user, for instance.

Importer

importer = "beets"

beets is the default and what the package installs. tagger is the built-in fallback: metaflac plus a directory, no database, no cover art fetching, no ReplayGain. It exists so a record can be finished when beets is broken.

You do not need to switch to tagger to import a record MusicBrainz has never heard of — see Importing.

Measurement cache

cache_name = ".cache"

The directory under vinyl/work/ that holds level measurements. Name an existing one here to adopt a pool that already has them, rather than re-measuring.

Thresholds

The detection constants live under a [thresholds] table. They ship with measured defaults and most people never touch them.

[thresholds]
gap_below = 16.0            # dB under the music level to count as a gap
gap_above = 12.0            # dB back up to count as music again
gap_minimum = 1.2           # seconds; shorter quiet stretches are not gaps
refine_above = 8.0          # dB used when tightening a boundary
span_below = 20.0           # dB under music for the run-in/run-out edges
span_run = 1.5              # seconds a span must hold
autostop_below = 20.0       # dB under music to look like the run-out
autostop_dwell = 120.0      # seconds of that before stopping
autostop_max_seconds = 2100 # hard cap on a capture, 35 minutes
arm_floor = -60.0           # below this the arm is up, not playing
align_min_r = 0.65          # correlation needed to carry a cut across a re-rip
align_max_drift = 0.02      # how much speed drift alignment tolerates

ripdoctor measure records a few short samples from your own chain and prints what it measures beside these defaults, so you can see whether your chain separates music from silence the way they assume.

Any threshold you move is reported by ripdoctor doctor. It is the first thing to check when detection behaves oddly.

Clone this wiki locally