A Pretentious Backdrop for videos, based on Butterchurn.
Pretendrop is a silent, fullscreen music-reactive visual system for a second display, a projector, or the wall behind a set. It decodes a random track from your own library to drive the visuals, then routes the audio through a gain of zero. The screen gets the motion; the room stays quiet.
It ships with the Butterchurn preset collection, fast preset transitions, favorites, and three deliberately different shuffle engines.
Pretendrop requires Node.js 22.12 or newer.
cd ~/src/pretendrop
npm ci
npm run electron:binary
npm run build
npm run startDependencies are pinned to exact versions and .npmrc disables install scripts,
so npm ci does not download Electron by itself. npm run electron:binary runs
Electron's own installer on purpose: it fetches the pinned release and checks it
against the checksums shipped in the package.
For live UI development, run these in separate terminals:
npm run dev
npm run dev:desktopThe regular app opens fullscreen in kiosk mode. Move the pointer to reveal its
controls. Press F to leave or return to kiosk mode, and Ctrl+Q to quit.
| Key | Action |
|---|---|
Space |
Pause or resume the reactive track |
N |
Pick another random track |
← / → |
Change preset |
H |
Love or unlove the current preset |
Z |
Undo the favorite you just removed |
B |
Blackout the screen |
O |
Open the curation panel |
F |
Toggle fullscreen kiosk mode |
Ctrl+Q |
Quit |
Space, the arrows and Enter belong to whatever control has keyboard focus, so
tabbing through the transport and pressing space activates the button you are
on rather than pausing playback.
The heart updates immediately and the status line confirms that it was saved. Favorite names wrap to as many lines as they need; they are never abbreviated.
The audio source control supports local library tracks and microphones on Linux and macOS. Microphone audio goes directly to Butterchurn through Web Audio: it is not recorded, written to disk, sent over the network, or connected to the speakers. The selected source and microphone are saved with the other preferences. When a live source is selected, the settings panel shows the raw RMS level received by Electron in dB plus a peak marker, so silence and routing problems are visible before the signal reaches the visual intensity control.
On Linux, Pretendrop can also react to the system output. This installation is
tuned for PulseAudio on PipeWire: it finds the monitor belonging to the current
default sink and uses pactl to move only Pretendrop's recording stream to that
monitor. It does not change the global default input or reroute another app. The
system-audio option is disabled with a diagnostic message when pactl, the
default sink, or its monitor is unavailable.
On macOS, the packaged app declares why it needs microphone access. The system permission prompt appears the first time a microphone is selected. System-audio capture is intentionally not offered on macOS.
On Linux, the first scan starts at ~/Music. Choose any library from the
console whenever you want. Pretendrop reads embedded title, artist, and album
tags only for the selected track; it does not send library data anywhere.
No personal media path is embedded in the source or build. The music index is held in memory for the running session and audio output remains muted.
On Linux, preferences are written in the standard XDG location:
$XDG_CONFIG_HOME/pretendrop/preferences.json
# or ~/.config/pretendrop/preferences.json when XDG_CONFIG_HOME is unset
The file is plain JSON and is created automatically on first run. Existing
Butter preferences are migrated once if they are found, without deleting the
old file. Set PRETENDROP_PREFERENCES_FILE to use an explicit JSON path.
When ~/dot exists, npm run install:linux keeps the plain JSON in your
private dotfiles source and exposes it at the standard XDG path:
~/.config/pretendrop/preferences.json
-> ~/dot/stow/common/.config/pretendrop/preferences.json
Pretendrop resolves that link before its atomic save, so it never replaces the link itself. This keeps personal preference data in the private dotfiles repo, not in the Pretendrop source repository. The macOS build uses the platform app-data directory instead of an XDG path.
Choose all presets or favorites, then choose an engine:
- Entropy uses cryptographic randomness and avoids recent repeats.
- Deck deals a complete random permutation before repeating a preset.
- Explorer favors presets seen least during the current session.
The seconds field controls automatic preset changes. Set it to 0 for manual
changes only.
The control panel also gives the visual system a small, practical set of live parameters:
- Intensity changes the audio level fed to Butterchurn without changing the muted speaker output.
- Transition sets the preset crossfade duration.
- Vignette sets the edge darkness from
0to100percent.
Those three are sliders and apply while you drag, so you set them by watching the screen rather than by typing a number and tabbing away.
- Quality selects
eco,normal, orfullrenderer budgets. - Lock preset stops automatic preset changes while tracks keep rotating.
- Track interval selects a silent random track every N minutes;
0keeps the natural end-of-track behavior. - Interface can auto-hide, stay visible, or remain hidden.
- New chaos resets session shuffle history; blackout hides the canvas
and the interface without closing Pretendrop, and stops rendering while it is
on. Press
Bfor blackout from the keyboard. - Restore defaults puts every scene parameter back where it started.
Interface text is drawn with its own dark halo, so it stays readable over a
bright preset even with the vignette at 0.
npm run install:linux
rofi -show drunThe installer builds the UI, writes an XDG desktop entry named Pretendrop, and replaces the previous Butter launcher if it exists. It does not require a system-wide install.
To make distributable Linux artifacts:
npm run dist:linuxThis creates an AppImage and a tarball in release/.
Run this on a Mac:
npm run install:macIt generates a DMG and ZIP in release/. Mount the DMG and drag
Pretendrop.app to Applications. The GitHub Actions workflow builds Linux x64,
macOS x64, and macOS arm64 artifacts; public distribution still needs your own
Apple signing and notarization credentials.
Pretendrop is released under the MIT License. Butterchurn and its preset collection are also MIT-licensed; direct runtime dependency notices are kept in THIRD_PARTY_NOTICES.md and copied into packaged apps.