NullPlayer User Guide

SkillDev tools

User-facing features, menus, keyboard shortcuts, and functionality overview. Use when documenting features, understanding user workflows, or explaining capabilities to users.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the NullPlayer User Guide skill

What this skill tells your AI

The instructions your AI receives, as published by ad-repo/nullplayer in skills/user-guide/SKILL.md and read by ahel’s review.

A faithful recreation of Winamp 2.x for macOS with Plex/Jellyfin/Subsonic integration, ProjectM visualizations, and casting support.

System Requirements

  • macOS 14.0 (Sonoma) or later
  • Internet connection (for streaming and skin downloads)

Core Features

Windows

WindowDescriptionToggle
Main WindowPrimary player with transport controlsAlways visible
Playlist EditorTrack list and playlist managementPL button or context menu
EqualizerClassic 10-band EQ or modern 21-band EQ with presetsEQ button or context menu
Spectrum AnalyzerLarge spectrum visualizationContext menu or Window menu
Audio AnalyzerFriture-style multi-pane analyzer (Scope, Levels, Spectrogram, Octave, Pitch, Delay)Context menu or Window menu
PeppyMeterSkinnable analog VU meter — needle/bar meters that track left/right levels; right-click to pick a meter or enable RandomContext menu or Window menu
FlowLive network throughput meter — download/upload views with interface selectionContext menu or Window menu
Library BrowserBrowse Plex/Jellyfin/Subsonic/Emby and local mediaLogo button or context menu
VisualizationsVisualization engine host for ProjectM, Geiss, Tripex, and Met Museum Art (consistently labeled "Visualizations" in menus and window chrome)VZ button, Windows menu, or context menu

In Original and Original-Metal UI, Windows > Play History opens the Data tab inside the Library Browser instead of a separate window. The Data tab is also available in the Classic library browser. The Data tab shows:

  • Play Time summary (day/week/month/year/all-time)
  • Top Artists (music only)
  • Top Movies and Top TV Shows (separate sections; TV groups by show name)
  • Genre breakdown (music and video; excludes radio)
  • Sources breakdown (music and video; excludes radio — a note directs to the Internet Radio section below)
  • Output Devices breakdown (which speaker/cast device was active; cast sessions record Chromecast/Sonos/DLNA device name)
  • Content Types donut chart (Music / Movies / TV Shows / Radio / Video)
  • Internet Radio section — total listen time + Top Stations ranked by play count and listen duration
  • Plays Over Time time series

All charts are interactive filters — clicking a segment narrows all other charts to that slice. The Now Playing… context menu item shows rich track info (album artist, year, track number, genre, play count, rating, file path, etc.) fetched live from the server for Plex/Subsonic/Jellyfin/Emby tracks.

Top Menu Bar

Global controls are also available from the macOS top menu bar:

  • Windows
  • UI
  • Playback
  • Visuals
  • Libraries
  • Output

Output > Sonos supports persistent-open room checkbox selection (same behavior as the context menu Sonos submenu).

Output > Streaming > Rip URL… opens the Stream Ripper (paste a URL → FLAC/MP3/MP4); see Output Devices & Casting below.

Window Docking

Windows automatically snap together when dragged near each other:

  • Edge-to-edge snapping
  • Screen edge snapping
  • Group minimize (attached windows minimize together)
  • Lock Connected Windows / Unlock Connected Windows toggle (context menu) controls whether connected windows always move as a group
  • Snap to Default (context menu) resets all windows

Drag behaviour:

  • Quick drag (release mouse within ~400 ms of clicking): the dragged window detaches from its group and moves alone; other connected windows stay put
  • Hold then drag (hold ≥ 400 ms before moving): all connected windows move together as a group
  • When connected windows are locked: hold timing is bypassed and drags always move the whole connected group
  • Connected peers show a brief highlight overlay at mouseDown to preview which windows will move together

Compact Mode

Compact Mode collapses NullPlayer to a single menu-bar app. Toggle it from the main window's right-click context menu (Compact Mode) or the Windows top menu — available in every UI family. When enabled:

  • The Dock icon is hidden (the app switches to an accessory/menu-bar app) and a NullPlayer status-bar item appears in the menu bar. Clicking it reveals the single compact window; its menu also has Exit Compact Mode.
  • Left-clicking the status-bar item toggles the compact window shown/hidden. Right-clicking opens the Compact Mode menu.
  • The compact window opens at the top-right of the screen, aligned directly below the menu bar with no extra gap.
  • The sole window is the Library Browser with a stripped-down player bar embedded across the top (transport, seek + time, a scrolling title marquee, and volume), built from the active UI's own components (classic skin sprites in classic, modern controls in modern).
  • All other windows (Main, EQ, Playlist, Spectrum, etc.) are hidden; their prior visibility is remembered and restored when you exit. Exceptions: the video player and debug console windows are allowed in Compact Mode — a playing video stays visible on entry, videos opened while compact (e.g. a downloaded YouTube video) appear normally, and an open debug console remains visible.
  • Exiting restores the Dock icon, the macOS menu bar, and the previously open windows.

Compact Window

Compact Window opens the same compact Library Browser mini-player as a normal free-floating window. Toggle it from the main window's right-click context menu (Compact Window) or the Windows top menu. It is mutually exclusive with menu-bar Compact Mode.

  • NullPlayer stays a regular app: Dock icon and menu bar remain visible.
  • Only the main window is hidden. Playlist, EQ, Spectrum, Library, Visualizations, video, and other windows stay where they are.
  • The compact window uses normal window level so it can sit behind other apps; enabling Always on Top raises it like the other app windows.
  • Drag it from the compact player bar or the browser area. Playback controls, seek, volume, close, and minimize keep their normal click behavior.
  • The window remembers its last frame and can restore across launches. Returning to NullPlayer from another desktop or fullscreen app focuses Compact Window instead of reopening the hidden main window.

Main Window Elements

ElementDescription
Time DisplaySingle-click toggles elapsed/remaining; double-click cycles timer number systems in Original and Original-Metal UI
Track MarqueeScrolling song title/artist, with album art thumbnail when available
BitrateTrack bitrate in kbps
Sample RateAudio sample rate in kHz
Stereo IndicatorShows mono/stereo status
Cast IndicatorShows when casting to external device
Spectrum AnalyzerReal-time frequency visualization

Playback Menu: Timer

Playback > Timer unifies main-window timer options:

  • Elapsed / Remaining choose the time basis
  • Number System is modern-only
  • Default (Decimal) restores the current default behavior
  • Additional modern timer number systems include Arabic-Indic, Extended Arabic-Indic, Devanagari, Bengali, Thai, Fullwidth, Octal, and Hexadecimal

Sliders

  • Position Bar: Seek through track
  • Volume Slider: Adjust playback volume (0-100%)
  • Balance Slider: Pan audio left/right

Transport Buttons

Previous, Play, Pause, Stop, Next

Toggle Buttons

  • EQ: Show/hide Equalizer
  • PL: Show/hide Playlist

Original and Original-Metal UI add: HT (Hide Title Bars), CP (Compact Mode), VZ (Visualizations), FL (Flow), PM (PeppyMeter), SP (Spectrum), AA (Audio Analysis), WV (Waveform), LB (Library)

Media Sources

Plex Integration

  • Browse music, movies, and TV shows
  • Album artwork and metadata
  • Radio features (Track/Artist/Album/Genre/Decade/Rating/Hits/Deep Cuts)
  • Automatic scrobbling (90% or end, min 30s)
  • Video playback with casting

Jellyfin Integration

  • Browse music and video libraries
  • Library selector in status bar: click "Lib:" to switch library. Mode-aware — shows music library picker in music tabs (Artists/Albums/Tracks/Plists) and video library picker in Movies/TV tabs. "All" option browses across all libraries.
  • Rating scale: 0-100% (0-10 internal)
  • Scrobbling (50% or 4 minutes for audio, 90% for video)

Navidrome/Subsonic

  • Browse artists, albums, playlists
  • Music folder selector in status bar: click "Lib:" to filter by music folder. "All" shows content from all folders.
  • Token authentication
  • Scrobbling (50% or 4 minutes)
  • Casting support via proxy

Emby Integration

  • Browse music and video libraries
  • Library selector in status bar: click "Lib:" to switch library. "All" browses across all libraries.
  • Rating scale: 0-100% (0-10 internal, multiply/divide by 10; 1 star = 20)
  • Scrobbling (50% or 4 minutes for audio, 90% for video)
  • Casting support via proxy (stream URLs have no file extension)

Internet Radio

  • Shoutcast/Icecast streaming
  • Live song metadata (ICY + SomaFM fallback when ICY is missing)
  • Auto-reconnect on disconnect
  • Large bundled global station catalog (including full SomaFM channel set)
  • Curated regional additions (African, Caribbean, South American, European, Indian, Thai) plus expanded jazz streams
  • Station management (add/edit/delete/import)
  • Internet-radio-only folder organization (smart folders + custom folders)
  • 5-star station ratings (persisted per station URL)
  • Casting to Sonos
  • Play history tracking — listen sessions are recorded with pause-aware duration; visible in the Data tab Internet Radio section (total listen time + top stations). Sessions shorter than 1 second are discarded. Long sessions checkpoint every 30 minutes.
  • Playback Options now groups all source histories under a single Radio History submenu

Local Files

Drag & drop or use File menu. Supports: MP3, M4A, AAC, WAV, AIFF, FLAC, OGG, ALAC

.cue Sheets

Open a .cue file (File → Open, drag-drop, or double-click), or open an audio file that has a sibling .cue next to it, and the single backing file is virtually split into its cue tracks — one row per track in the now-playing playlist, with correct titles/durations. Prev/Next move per cue track, seek stays within the current track, and playback crosses track boundaries gaplessly (shuffle and repeat-single still advance correctly, but a small gap is expected in those modes). Nothing is written to disk and nothing is added to the library.

Optionally, Library → Split .cue Albums on Import (off by default) makes the library scan physically split a backing file into per-track FLACs (via ffmpeg) when it finds a .cue; the split tracks are added to the library and the original is hidden. With it off, the .cue is ignored and the backing file imports as one track. If ffmpeg isn't installed, splitting is skipped with a one-time notice and the original imports normally. Takes effect on the next scan. See the cue-sheets skill for internals.

Local Library Browser

Switch the Library Browser source to "Local" to manage a persistent media library.

+ADD menu (three options):

  • Add Files... — file picker filtered to audio formats
  • Add Video Files... — file picker filtered to video formats (.mp4, .mkv, .mov, etc.); files are classified as movies or TV episodes automatically (SxxExx naming / iTunes metadata)
  • Add Folder... — folder picker; scans immediately for audio and video files, and saves the folder as a "remembered folder"

Watch folders (remembered folders):

  • Folders added via "Add Folder..." are persisted in the library database
  • They are not monitored automatically — there is no filesystem watcher
  • Press the ⟳ refresh button to run an incremental re-scan of all remembered folders (new/changed/removed files only)
  • Fast ingest behavior: newly discovered files appear quickly with filename/basic info, then metadata (duration/tags/sample rate) fills in asynchronously
  • Duplicate detection and per-file signatures prevent unnecessary metadata re-parse for unchanged files
  • Progress updates are throttled/coarse during large imports to keep UI responsive

Tabs: Artists, Albums, Playlists (Plists in the UI), Movies, TV (the TV-shows tab, labeled Shows internally), Radio, Search, Data

The Data tab is present in both the modern Library Browser and the classic library browser (PlexBrowserView). It shows play-history analytics for all sources (see the Data tab description at the top of this section).

Drag/Drop + Folder Import Behavior (Local/NAS)

Import discovery is now unified across classic + modern entry points (main window, playlist windows, library browsers):

  • Directory traversal runs in background (no synchronous recursive UI-thread scans)
  • Extension filtering is consistent across add-folder and drag/drop paths
  • Supported content checks are shared before accepting a drop
  • Works for large local sets and NAS paths (SMB/AFP) with less UI churn during import

Output Devices & Casting

Sonos

  • Multi-room casting
  • Group management while casting
  • Local file streaming via embedded server
  • Network stream proxying for Subsonic/Jellyfin

Chromecast

  • Audio and video casting
  • Video opens locally by default, including when a Chromecast was used previously; choosing a device from the cast menu is required to start a new video cast.
  • When video casting is active, the global Output/Cast menu remains available for stopping the session even if no local video window is open.
  • Position synchronization
  • Buffering state handling

DLNA

  • UPnP device discovery
  • Video casting to TVs

AirPlay

  • Native macOS AirPlay support
  • Auto-detected output devices

Stream Ripper (Output → Streaming → Rip URL…)

  • Paste a URL (auto-filled from the clipboard) and pick FLAC, MP3, or MP4 video at a chosen profile: 720p / 2.5 Mbps, 1080p / 4 Mbps (recommended), 1080p / 8 Mbps (high quality), 1440p / 16 Mbps, 4K / 35 Mbps, or Full / 50 Mbps
  • Downloads via a system-installed yt-dlp (+ffmpeg); shows an install hint if missing
  • Best-quality source selection; lossless FLAC; video is compatibility-transcoded to H.264/AAC MP4
  • Tags output with source metadata; audio embeds cover art. Final files are named Artist - Title; video uses a temporary Artist - Title [source] file during compatibility transcoding.
  • Writes a .cue sheet when the source has chapter timestamps
  • Progress band at the top of the main window; finish dialog offers Play Now / Reveal in Finder
  • See the stream-ripper skill for internals

Audio Features

Equalizer

  • Classic UI: 10-band graphic EQ (-12dB to +12dB per band)
  • Original/Original-Metal UI: 21-band graphic EQ (-12dB to +12dB per band)
  • Preamp control
  • Anti-clipping limiter
  • Original/Original-Metal UI: 7 compact preset toggle buttons in the button row (FLAT, ROCK, POP, ELEC, HIP, JAZZ, CLSC); clicking a preset auto-enables EQ if off; clicking the active preset deactivates it (reverts to flat); dragging any fader clears the active preset
  • Original/Original-Metal UI: integrated glowing PRE control in the graph strip replaces the old preamp slider; drag to adjust preamp, double-click to reset to 0 dB
  • Original/Original-Metal UI: double-click a fader to reset that band only to 0 dB
  • Original/Original-Metal UI: AUTO button applies genre-based preset for the current track and auto-enables EQ if off
  • Original/Original-Metal UI: all 21 frequency labels are visible in-window, using compact labels like 1K, 1.4K, 2K, 11.2K
  • Classic UI: PRESETS dropdown with all presets including "I'm Old" / "I'm Young"

Playback Options

  • Gapless Playback: Seamless track transitions (local files)
  • Sweet Fades: Crossfade between tracks (1-10s duration)
  • Volume Normalization: Consistent loudness (-14dB target)
  • Reference Tuning: Pitch-shift playback to a different reference frequency. Presets for Off, 432 Hz, 440 Hz, and a Custom… dialog (source/target Hz, ±2400 cents). Applies to local files and HTTP streams; unavailable while casting because remote renderers have no local audio graph to insert the pitch shifter into. Persists across launches; the CLI also accepts --tuning, --tuning-source, and --tuning-offset-cents as session-only overrides.
  • Playback Speed: Tempo-preserving speed control from 0.25× to 4.0×, with presets plus Custom…. Applies to local files and HTTP streams; unavailable while casting. Persists across launches.
  • Balance: Stereo pan submenu (slider plus Left / Center / Right presets), backed by engine.balance and mirrored by the classic Balance Slider sprite. Gives Original and Original-Metal UI and menu-only/Compact workflows access to balance without a face slider. Persists across launches.
  • Remember State on Quit: AppStateManager.restorePlaylistState restores playlist contents and ordering; it intentionally does not restore the selected track, seek position, or playing state

Sleep Timer

Accessible via Playback > Sleep Timer (or the right-click context menu).

Modes

ModeBehaviour
TimedPause/stop after 5, 10, 15, 30, 45, 60, or 90 minutes, or 2, 5, 8, or 12 hours. A 10-second linear volume fade-out fires before the action.
End of Current TrackPause/stop when the currently playing track ends naturally. Does not fire on manual skip or previous. Works correctly with Sweet Fades crossfade.
End of QueuePause/stop when the last track in the playlist finishes.

Behaviour notes

  • The submenu shows a live countdown (Sleep Timer: 1:23) while a timed timer is running.
  • Selecting the currently active preset again cancels it (toggle behaviour).
  • A Cancel Sleep Timer item appears at the top of the submenu while any timer is active.
  • If the volume is adjusted manually during a timed fade-out, the fade aborts and the volume is left at the new level.
  • If a timed timer is cancelled mid-fade, volume is restored to the level it was at when the timer started.
  • State is session-local — not persisted across launches.

Spectrum Modes

  • Accurate: True signal levels (40dB range)
  • Adaptive: Global adaptive normalization
  • Dynamic: Per-region normalization (bass/mid/treble)

Visualizations

Audio Analyzer Window

A multi-pane real-time analyzer (Friture-style), available in every UI family. Right-click the window to pick a pane:

  • Scope — oscilloscope waveform of the live signal.
  • Levels — per-channel Peak and RMS meters (green/yellow/red) in dBFS.
  • Spectrogram — scrolling waterfall of the spectrum over time.
  • Octave — 1/3-octave bar spectrum (20 Hz–20 kHz) with peak-hold markers.
  • Pitch — detected note, frequency, and how sharp/flat it is (best for vocals/single notes; unreliable on deep bass).
  • Delay — stereo left/right timing offset in ms and samples (resolves up to ±~5.8 ms).

Only the visible pane runs, so the window is light on CPU and idles when closed.

PeppyMeter (Analog VU Meter)

A skinnable analog VU meter window (a port of PeppyMeter), available in every UI family. Left/right levels drive rotating needle meters or bar meters composited from bundled image templates (25 meters at 480×320: bar, vintage, blue, compass, chillout, big-bang, …). Right-click to choose a meter or toggle Random (auto-switches on an interval). It consumes the shared stereo audio tap, so it idles when closed. See the peppymeter skill for internals.

Flow (Network Throughput Meter)

Flow is a single-height dockable network throughput meter, available in every UI family. It shows either download or upload throughput with a live history graph. Double-click the window to switch between download and upload views, or right-click and choose Show Upload View / Show Download View. The right-click menu also selects the network interface or advances to the next interface. See the flow skill for internals.

Main Window Visualization Modes

Off, Spectrum, Cava, Enhanced, Ultra, Fire, JWST, Lightning, Matrix, Snow, EKG, vis_classic. Double-click cycles visual modes; select one from Visuals > Main Window > Mode. When Cava is selected, the same submenu exposes its independent Color Preset, Bars, Smoothing, and Bass Tilt controls.

The Visuals menu also has top-level Spectrum Window controls and a Visualizations submenu for the ProjectM/Geiss/Tripex/Met visualization host.

Album Art Visualizer

30 effects transforming album artwork based on audio

ProjectM/MilkDrop

100+ bundled presets, OpenGL rendering, fullscreen support.

If a preset actually crashes the app while it's on screen — at any point, whether during load or long after — it is automatically disabled so it can't crash the app again on the next launch. Normal quits, force quits, and app kills never disable a preset; only a genuine crash does. To bring disabled presets back, use Visuals → Visualizations → Restore Disabled ProjectM Presets — the item shows how many are currently disabled, and is greyed out when there are none.

Geiss

Port of Ryan Geiss's classic Winamp visualization. ProjectM-peer engine — selected from the same right-click Visualization Engine submenu. Right-click for runtime controls: effect navigation, Geiss Sensitivity, Gamma, Beat Detection, Sync Color to Sound, Slide Shift, Mode Lock, Palette Lock, Auto-Switch interval, visMode (Wave/Spectrum), and Randomize Palette. All settings persist across launches.

Spectrum Analyzer Window

55 bars, 9 quality modes (Winamp/vis_classic/Enhanced/Ultra/Fire/JWST/Lightning/Matrix/Snow)

Skins

Loading Skins

  • Skins > Load Skin... to open .wsz file
  • Place in ~/Library/Application Support/NullPlayer/Skins/ for auto-discovery
  • Bundled skins: Silver (default), Classic, Dark, Light

Original UI Mode

  • Skins > Original/Classic > Switch to… to change UI mode
  • Switches live, with no restart — only the mode-dependent window layer is rebuilt; audio, casting, the video player, and playlist/seek/play state continue uninterrupted. Picking a specific modern or classic skin while in the other mode also switches live.
  • Original skins use skin.json format
  • Portable Original skin bundles use .nsz (ZIP) and can be imported via Skins > Original > Load Skin...
  • Bundled Original skins: NeonWave (default), Skulls

UI Size Mode

  • Original/Original-Metal UI: choose context menu -> UI Size -> 50%, 90%, 100%, 105%, 110%, 115%, 125%, 135%, 150%, or 200%
  • Classic UI: choose context menu -> UI Size or use the classic size control to enlarge
  • Scales all windows to the selected percentage
  • Persists across same-mode restarts; a saved session from a different UI mode starts at 100% with default window geometry
  • Original/Original-Metal UI: changes live instantly
  • Classic UI: changes live instantly (no restart)

Hide Title Bars (Original/Original-Metal UI)

  • Toggle via context menu or HT button on the main window
  • HT Off (default): EQ/Playlist/Spectrum hide titlebars when docked — this is always active, even with HT off
  • HT On: All 6 windows (main, EQ, playlist, spectrum, ProjectM, library browser) hide titlebars; the main window keeps the same outer size while its internal layout expands to fill the reclaimed space
  • Preserves the border line (titlebar area collapses to border width, not 0)

Keyboard Shortcuts

Playback

  • Space: Play/Pause
  • V: Stop
  • B: Next track
  • Z: Previous track
  • ←/→: Seek backward/forward 5s
  • ↑/↓: Volume up/down

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
120
Forks
9
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
user-guide
Source
github.com/ad-repo/nullplayer