music on console terminal — player · CD ripper · radio client
A keyboard-driven terminal music player, CD ripper, and internet-radio client for Windows and Linux, inspired by MOC. Two-pane layout, no mouse, no stutter. All heavy I/O stays off the main thread, every shared state is explicitly protected, and no volatile CD or hardware path ever leaks into persistent config.
Windows (MSYS2 UCRT64) · Linux (Debian Trixie) · MIT-style build from source
Classic mode is a faithful MOC homage. Ctrl+T is the remix. That toggle is the whole thesis.
Minimal, monochrome, exactly the console player you remember. Governed by theme.conf. Nothing moves that doesn't have to.
A comet progress bar, a sub-cell block visualizer, breathing animations, and 18 named truecolor palettes cycled with F8. The 256-color visuals shine on a Linux terminal.
Next track pre-decodes into a second buffer while the current one plays. Seamless transitions, configurable crossfade, and the queue overrides crossfade correctly.
Rip to FLAC, MP3, AAC, or WAV with per-track AccurateRip v1/v2 verification, drive offset correction, and CUETools DB cross-check.
ICY, HLS, and iHeart with live now-playing metadata. Station search via radio-browser.info. Shipped as a loadable plugin.
Multi-band EQ with presets, adjusted live from the right pane. Press e.
Sub-cell block spectrum rendered straight into the terminal grid. Press v.
Synced .lrc lyrics scroll with playback. Built-in tag editor writes through TagLib.
Embedded art or fetched from Cover Art Archive, iTunes, and Deezer. Rendered in-terminal.
Last.fm and ListenBrainz scrobbling, plus Discord Rich Presence over named-pipe IPC.
Reads ReplayGain tags and normalizes volume. Toggle with f.
Pitch-corrected playback from 50% to 200%. Stereo balance with < / >.
Background BPM analysis on track load, surfaced in the track info pane.
15 / 30 / 45 / 60 / 90 minute auto-stop, cycled with Z, shown in the title bar.
Playlists: .m3u .m3u8 .pls .xspf
Every ripped track is checksummed and matched against the AccurateRip database. The 150-sector preamble offset is honoured as a physical property of the disc, and the disc ID is normalized relative to the first track's LBA — so pressings with non-standard pregaps verify correctly instead of silently missing.
Track Status Conf CRC (v2) ───── ──────────── ──── ───────── 01 AccurateRip 200 8b4a1c7e 02 AccurateRip 200 d3f09a12 03 AccurateRip 200 6e21bb4f ... 12/12 verified
Every platform-specific capability sits behind a seam with a Windows and a Linux implementation — HTTP, IPC, notifications, CD access, plugin loading. The core is portable; the platform difference is resolved by CMake at build time, never by branching in the code.
The streaming source is a real loadable plugin (remoct_stream.so / remoct_stream.dll) driven through a frozen C ABI, with HTTP injected across a host-services table. A radio fix ships as a rebuilt plugin with no host rebuild. A deterministic test asserts the loaded plugin produces byte-identical audio to the compiled-in reference — so "swap the plugin" never means "hope it still matches."
Grab a build from GitHub Releases, or build from source. Single-header dependencies (miniaudio, nlohmann/json) and the vendored MD5 are checked in — no separate download step.
git clone https://github.com/RadMageIRL/re-moct cd re-moct cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build ctest --test-dir build --output-on-failure
Output lands in build/bin/remoct (or remoct.exe), with the streaming plugin beside it in build/bin/plugins/. Full per-platform instructions — including the Debian non-free enablement for FDK-AAC — are in BUILD.md.
Everything else is in the documentation.