Everyday workflows for the desktop app. Keyboard shortcuts are listed in the README, along with how to change them. Help → Controls (F1) shows the keys currently in force, so it is the list to trust once you have remapped anything; it also names the file to edit and reports anything wrong with it.
Open files via File → Open… (Ctrl+O), drag-and-drop, or spektra <file> on the command line. Each file gets a tab (Ctrl+Tab switches, Ctrl+W or middle-click closes); opening a file that is already open focuses its existing tab instead of adding a duplicate. The header shows codec · sample rate · bit depth · channels · duration · bitrate; hovering it shows the file's full path, and right-clicking it offers Copy path. The spectrogram paints progressively while the file is analyzed. The plot is labelled on every edge: a "Frequency (kHz)" axis with ticks on the left, a "Time" axis with ticks on the bottom, and a colour key on the right marked in dBFS (decibels relative to full scale, 0 being the loudest possible sample).
When the overview finishes, the bandwidth banner appears under the header:
- Green (Lossless): energy reaches the top of the band; no cutoff found.
- Amber (Suspicious): energy rolls off gradually; could be lossy or a natural master. Also amber: a sharp cutoff at or above 20 kHz, even in a lossless file, because MP3-320-class encodes and honestly band-limited masters look identical up there (worth a look, not an accusation). A wall in the last few percent below Nyquist counts as the file's own anti-alias filter and stays green.
- Red (Lossy): a sharp cutoff at a codec-typical frequency, with a likely codec/bitrate guess.
- Violet (Upsampled): the container claims hi-res (e.g. 96 kHz) but the real bandwidth stops at a lower standard rate's limit (e.g. 22.05 kHz, a 44.1 kHz source). The codec guess is suppressed; the banner names the likely true source rate.
- Red (Mixed): the file's provenance changes partway through, as in a compilation, DJ mix, or continuous set. Most of it reads clean, but a stretch covering at least two consecutive 30-second windows carries a wall that does not belong there, which judging the file as a whole would miss (the genuine tracks supply the frequencies the transcoded one lacks). The banner names the suspect stretch's start and end, and the cutoff line is drawn at the worst wall inside it.
When a cutoff is detected, its frequency is also drawn as a thin line (with a matching tick on the frequency ruler) across the spectrogram in the verdict's color, so the wall is visible against the image; the line tracks zoom, pan, and the log/linear axis. The line can sit below where the picture seems to end: the detector counts a frequency as live only if it ever comes within 55 dB of the file's loudest point, while the display paints everything down to the dB floor (-120 by default), so faint speckle above the line (encoder noise, artifacts around decode errors) is visible but deliberately does not count as bandwidth.
Zoom with the wheel (time) and Shift+wheel (frequency), drag to pan, double-click to reset. Zoomed spans re-render sharply via an ffmpeg segment decode. Multichannel files get a channel selector (Mix / Ch 1 / Ch 2 / …); for stereo files the other views are precomputed in the background right after load, so switching is instant (Ctrl+Up / Ctrl+Down step through them). The integrity result sticks to the file across switches; loudness is remembered per channel. Ctrl+0 resets the view, F5 reloads the file, and the cursor crosshair with its time / frequency / dB readout can be hidden via View → Crosshair (Ctrl+H).
View → Next File / Previous File (Ctrl+Right / Ctrl+Left) moves to the neighbouring file without leaving the spectrum view, so reviewing a whole folder costs one tab instead of one per track. The next file replaces the current one in the same tab, keeping its place in the tab strip, so Ctrl+1..9 still means what it meant. For a file opened from a folder tab the sequence is exactly what that tab's grid is listing, in the order the tree shows it: the drilldown scope and the severity filter both apply, so filtering to Problems only turns Ctrl+Right into "next problem". For a file opened any other way it is that file's own folder, in name order. The walk stops at either end rather than wrapping and says so in the status bar, and if the next file already has its own tab, that tab is selected instead of a second one being opened. A file you have already looked at comes back at once: finished analyses stay in memory across tabs (Keep in memory in Preferences, 512 MB by default), so stepping back with Ctrl+Left, opening a file a second time, or comparing two files you just viewed skips the decode, and the integrity result comes back with it; F5 always reads the file again, and a file that changed on disk is never served from memory.
- Check Integrity (Ctrl+I): decode errors, interior silent gaps, and truncation: the classic partial-download failures. The check runs by itself in the background on every file you open (on by default, a Preferences toggle), so a damaged file cannot hide behind a healthy-looking spectrogram; the banner appears as soon as the check finishes. Findings are also marked on a thin lane along the time axis: cyan for each silent gap (informational), red for a truncated file's missing tail (damage). The lane zooms and pans with the spectrogram (decode errors carry no position, so they show in the banner only). Ctrl+I toggles the results: press it to hide the banner and lane, again to bring them back without re-analyzing. Silent gaps are reported but never raise the verdict (silence is legal audio); one or two stray decode errors count as Suspect (worth a listen); Corrupt means provable damage (decode failure, three or more errors, or a file shorter than its own header promises).
- Measure Loudness (Ctrl+L): integrated LUFS, loudness range, true peak (EBU R128 via ffmpeg), crest factor, and a clipping hint. Like Ctrl+I, pressing it again hides the banner and again brings it back without re-measuring.
Both act on the current file, so they grey out wherever there is none (a folder tab, a comparison tab); in a folder tab the menu's folder commands take over, each named after the folder it would act on: the drilldown scope when you have drilled in, the whole tab otherwise. Analyze '(folder)' queues every file in that scope, honoring the cache and leaving your checkboxes untouched, exactly like the tree's "Analyze this folder". The two launchers below it adapt in place: Find Duplicates in '(folder)' opens Duplicate Detective on that folder and starts scanning, and Manifest of '(folder)' opens the Folder Manifest on it; each window keeps its own folder box, so an unscoped run is still a click away. In any other tab the folder command greys out and the launchers read Duplicate Detective… / Folder Manifest… and open their windows exactly as before.
Two report commands sit in the File menu, each a submenu that lists the formats directly so you pick before the save dialog rather than through its extension field:
- File → Export → HTML / CSV / JSON saves the current file's audit (metadata, bandwidth/upsampling verdict, integrity) as one row; if the integrity check hasn't been run yet, it runs first. HTML is the default (Ctrl+Shift+S). The Export submenu is disabled until a file is open, since it acts on the current tab.
- File → Audit Folder → HTML / CSV / JSON picks any folder, analyzes every audio file in it in parallel (progress dialog with Cancel), then saves one row per file; cancelling writes nothing. It is always available because it chooses its own folder rather than acting on an open tab.
The schema matches the CLI's audit --csv/--json exactly, so GUI and scripted sweeps are interchangeable. The HTML flavor is a dark, sortable page for reading rather than scripting.
Drop a folder onto the window (or File > Open Folder..., Ctrl+Shift+O, or pass a folder on the command line: spektra Music) to browse and audit a library in place. The folder opens instantly as a browse tree in a left pane: folders and files each carry a checkbox and a severity marker dot, and each folder shows a rollup label ("12 files" before anything is analyzed, "5/12 · 2 problems" once verdicts exist). Nothing is analyzed on drop; any verdicts cached from earlier audits paint straight onto the tree markers and the grid, so you see what is already known right away. Tick individual files or whole folders to build a worklist (a folder's checkbox cascades to everything beneath it, and shows an indeterminate state when only part of its subtree is checked), then press Analyze (or F5) to analyze exactly the checked set; Shift+F5 (or Shift+click Analyze) re-analyzes even files that are already cached.
The grid on the right streams verdicts as the checked files are analyzed: bandwidth verdict, cutoff, codec, bitrate, length, and an integrity verdict. Two marker dots share the tree's palette but mean different things: the dot in the File column is the row's whole verdict, exactly the dot the tree shows for that file (the worst of bandwidth and integrity, violet for upsampled), while the dot in the Integrity column colors integrity alone, so a transcode that decodes cleanly shows a red File dot next to a green Integrity dot. Transcodes and corrupt values show red, upsampled shows violet; an honest lossy file (an MP3 with the cutoff its bitrate predicts) is not a problem and stays neutral, including a high-bitrate one whose own wall sits at or above 20 kHz. The same high wall in a lossless file earns a yellow dot instead: possibly a high-bitrate transcode, possibly a band-limited master, worth a listen either way. Red bandwidth means the wall does not belong there: lossy content in a lossless format, or an mp3/aac far below its bitrate's expected cutoff. The severity filter (All files / Suspect + worse / Problems only) hides rows below the chosen tier; each tier includes everything worse, so a corrupt file always passes a bar a suspect file passes. The File column shows each row's path relative to the dropped folder (hover for the full path), so you can tell apart same-named tracks from different albums; sorting it groups rows by folder. Export (a dropdown of HTML/CSV/JSON) writes exactly the rows currently shown, honoring the severity filter and any drilldown scope, with the same relative paths; it is disabled until the current view has at least one analyzed row. Double-click a row (or press Enter) to open that file as a normal tab; double-click a file in the tree to jump to its row in the grid (when it has one and the current filter and scope show it). From there, Ctrl+Right and Ctrl+Left walk the rest of the grid without coming back here, replacing the file in that one tab rather than opening a tab per track, and honoring the severity filter and drilldown scope in force at the moment you press them. Every opened file checks its own integrity automatically, so opening a damaged row marks its regions on the time-axis lane as soon as the check lands. Select a folder in the tree and press Drilldown (in the row of actions above the tree, next to the check-all/none buttons; greyed out until a folder is selected) to scope the grid to that subtree (a "Scope: path" breadcrumb shows the focus); Up widens the scope one folder at a time, and Show all clears it. Grid columns can be resized by dragging their header edges, and the layout (column widths plus the tree pane width) is saved when the app closes and restored on the next start. Right-click works everywhere: a grid row offers Open spectrogram, Re-analyze (ignore cache), Copy path, and Reveal in Explorer; a file in the tree offers the same, and a folder offers Drilldown here, Analyze this folder (honors the cache and leaves your checkboxes untouched), Show in manifest (opens the Folder Manifest window on that folder), Copy path, and Reveal. The grid supports multi-selection (Ctrl/Shift+click), and Copy path and Re-analyze act on the whole selection when the clicked row is part of it; Open spectrogram always acts on the clicked row alone.
Results are cached in %APPDATA%\Spektra\audit-cache.db (shared with the CLI, keyed by file size and modified time), so a file analyzed here is already cached for the next audit and for the spektra audit command. The progress bar is byte-weighted, with a live percentage, file count, and remaining-time estimate beside it once enough files have finished to make the estimate meaningful. The order files are scheduled in is a preference (Folder analysis order in Ctrl+E): folder order (top to bottom, as the tree shows them), smallest files first for quick early results, or largest files first. Analysis is parallel, but files are handed to the workers strictly in the scheduled order, so the chosen order is what you see: rows may finish a few positions apart, never from random corners of the tree. While a run is in flight, the tab's folder icon in the tab strip becomes a spinner, so a run left in the background stays visible; one analysis runs at a time across folder tabs, and starting another just names the tab that is busy in the status bar. Cancelling keeps the rows already analyzed, and finished files stay cached, so a later run reuses them; Refresh (above the tree, or Ctrl+F5) re-reads the folder from disk without analyzing anything: new files appear unchecked, deleted ones vanish, cached verdicts repaint, and the checkboxes you had ticked stay ticked.
This window is where Spektra's results most often turn into deletions somewhere else, so the caveat belongs here: the matches are evidence, not proof. Matching is acoustic, so two different masters of one song may not pair and a tie stars more than one copy rather than guessing a winner. Read why a group ranked its copies before acting on it, and keep a backup before deleting anything on the strength of any tool's verdict, this one included. Spektra itself never renames, moves or deletes a file.
Analyze → Duplicate Detective… opens a separate window that finds duplicate songs across any set of folders by acoustic fingerprint: a renamed, retagged, or relocated copy still matches, and a file whose name lies about its content does not. Add the folders to compare with the picker, by pasting a path into the box below the list, or by dragging folders in from Explorer (Clear all empties the list and the last results together, putting the window back to its starting state; whether the list returns on the next launch is the On launch preference's call), press Scan (analysis and fingerprints share the audit cache, so re-scans are fast), and read the results as groups: the headline names the song, counts the copies, and shows the sameness confidence; the foldout lists every copy with its verdict facts, the star marks the copy worth keeping (ties star more than one), "found by audio" flags a member whose filename shares nothing with the group, and the quality line says how sure the ranking is and why. The window is view-only: it never renames, moves, or deletes files. Matching limits are the CLI's (see docs/cli.md): edits and remixes do not pair, files under 20 s are listed as not analyzed, and copies from very different masters may not pair.
While a scan runs the folder list freezes (the run snapshotted it at start): the buttons, the path box, and drops all wait with a footer note, and closing the window cancels the scan rather than orphaning it (finished analysis stays cached, so nothing is lost). Once results exist, a filter box appears above them: every word must match a group's label or one copy's path, applied live, with the footer counting the groups shown.
The row under the pointer highlights, and stays highlighted while its context menu is open. Double-click a copy to open it as a normal tab in the main window; right-click a copy for Open spectrogram, Compare with winner (both copies side by side in the main window, the winner as A; greyed on the winner itself), Copy path, and Reveal in Explorer; right-click a group's box for Copy loser paths (every copy except the winner, one path per line, ready for another tool) or Copy all paths. The Export dropdown lists the formats directly (HTML a self-contained dark page, CSV/JSON for scripts) and dims until a scan has produced something to write.
Beside the filter box sits Only differences, which turns the same results into a folder diff and takes the place of the group list while it is ticked: showing one scan twice under two different questions was the confusing part. Point the window at two folders holding nearly the same music, tick it, and every group the scan is confident is the same recording disappears. What is left is a split view, one column per scan root in the order you added them, each headed by the shortest name that tells it apart from the other roots, so comparing two copies of one library shows FLAC\Album and MP3\Album rather than the word Album twice, and two folders that differ only by drive show their whole paths (hover for the full path either way) and a line like 3 file(s) only here · 41.2 MB, with the tracks only that side has listed underneath with their verdict facts. A folder with nothing unique still gets a column, reading nothing only here, because that is an answer and not an absence. Below the columns sits the one call a diff cannot make for you: matches too weak to take on trust, headed 2 possibly the same · check these yourself and shown rather than hidden, in a short scrolling list so that however many there are they cannot crowd out the columns above them. The filter box narrows the columns as well, by path. The diff ignores format and quality entirely, because a FLAC and the MP3 made from it are the same track; deciding which copy to keep is what the ordinary view is for, one untick away. An empty diff is a real answer rather than a failed scan, so the footer always says how many were hidden, how many sit in one folder only, how many matched weakly, and how many files could not be compared at all. Diff rows behave like copies: the row under the pointer highlights, double-click opens the file as a normal tab in the main window, and right-click offers Open spectrogram, Copy path, and Reveal in Explorer, with no Compare with winner, because a file only one folder holds has no counterpart to compare against.
Analyze → Folder Manifest… opens a small read-only window that lists everything inside one folder as a tree, not just the audio: pick a folder with Browse, type or paste one into the address bar at the top (Enter loads it, Esc reverts an edit, and emptying the bar clears the listing), or drag one in from Explorer. Every file shows its type chip and size in aligned Kind/Size columns (drag a column's left edge in the header to resize it; the widths persist), and every folder headline carries a composition rollup like 12 flac · 3 jpg · 1 nfo plus the recursive size on disk, counted over everything beneath it. Audio files the audit cache already knows (from a folder tab, spektra audit, or a Duplicate Detective scan) show their honest codec colored by verdict, so a FLAC that is really a transcode reads yellow here too; files never analyzed just show their extension. Nothing is ever decoded, so even huge folders list fast, and a listing that is still too big (a NAS share, a whole drive) can be cancelled: Browse becomes Cancel while the walk runs, and closing the window cancels it too. Rescan (or F5) lists the current folder again, picking up files added or removed on disk. The window can never touch the files: no move, no delete, view and export only. Right-click a file for Open spectrogram (greyed on non-audio files), Copy path, and Reveal in Explorer; right-click a folder for Audit this folder (hands it to the main window as an audit tab, ready to analyze), Copy path, and Reveal, with the audit tree's folder menu offering Show in manifest for the hop back. A filter box narrows the tree to chosen extensions (space separated: flac jpg; dots and *. prefixes are tolerated): folders without matches disappear, rollups recount what is shown, and a file also matches when its chip kind does, so filtering flac still surfaces a FLAC whose chip honestly says mp3, and filtering mp3 finds it too. The Export dropdown lists the formats directly (HTML a self-contained dark page, CSV/JSON rows for scripts), dims until a listing is on screen, and writes exactly what is shown, filter included; the suggested file name is built from the folder's path plus the active filter, so exports of different folders and filters don't collide. The same listing is scriptable as spektra manifest in the CLI. The window placement always persists; whether the last folder returns on the next launch is the On launch preference's call.
Open both files, then File → Compare… (or spektra --compare A B). The comparison tab stacks A over B on a shared time axis with synced zoom/pan.
- Align: coarse/fine sliders or the ms box nudge B in time; Auto finds the offset by cross-correlation. Drift (clock-rate mismatch) is detected and flagged.
- Modes: Both / A / B / Diff (hotkeys:
Tflips A/B,Dshows the difference,Aauto-aligns,Escreturns to Both). The Diff view renders A−B on a diverging blue-white-red scale; a transcode shows up as a solid red band above its cutoff. - Cursor line: a vertical line runs through both panes with a time tick on the shared ruler, so a feature in A can be matched to the same instant in B. Toggle it via View → Crosshair (Ctrl+H).
- Null test: time-domain A−B residual over the visible span, reported in dB (deeper = more identical).
File → Save Image… (Ctrl+S) writes a PNG of the visible spectrogram; Copy Image (Ctrl+Shift+C) puts it on the clipboard.
FFT size (512-8192) and window function (Hann/Hamming/Blackman/Blackman-Harris) are analysis settings that re-analyze open tabs; the folder analysis order (folder order / smallest first / largest first) schedules the folder tab's Analyze and applies from the next run; the integrity toggle decides whether every opened file checks itself (on by default; applies to files opened afterwards); Keep in memory sets how much analyzed audio stays in memory across tabs (512 MB by default, about ten stereo tracks at FFT 2048; Off = always re-analyze), applied live, so a file you step back to, open again, or compare shows at once instead of decoding again, while a file that changed on disk is never served from memory and F5 always reads the file again; palette (Turbo by default; Magma, Inferno, Plasma, Viridis, Cividis, Grayscale, single-hue MonoGreen/MonoAmber ramps where saturation tracks intensity, plus any custom palette JSON dropped in %APPDATA%\Spektra\palettes or a palettes folder next to the app - see the CLI guide for the format; the list refreshes when Preferences opens), tightness (a level curve: higher keeps quiet detail darker so peaks read tighter, lower blooms), dB floor, and linear/log frequency axis are display settings applied instantly. On launch (the Session section) picks Start new or Keep last: Start new (the default) opens the app and its tool windows empty, while Keep last brings back the previous session's tabs, Duplicate Detective folders, and manifest folder; a launch with any argument stays targeted either way, and layouts, column widths, and window placements persist regardless. The once-a-day update check toggle also lives here; updates are notify-only (Help → Check for Updates).
The installer can add Spektra to the Explorer right-click menu. It is off by default: tick "Add Spektra to the Explorer right-click menu" on the installer's Options page. It never changes which program opens your audio files. To change your mind later, open Installed apps (or Programs and Features), choose Modify on Spektra, and tick or untick the same box; the wizard remembers what you chose last time, including across updates.
What it adds:
- Analyze with Spektra on audio files. Select several and they open as tabs in one window, not a window each.
- A cascading Spektra submenu on folders, on the folder itself and on empty space inside an open folder: Open in Spektra (browse the folder with cached verdicts already showing; nothing is analyzed until you ask), Find duplicates (opens Duplicate Detective on that folder and starts scanning), List folder contents (opens Folder Manifest on that folder).
- Spektra in the Open With list for audio files.
On Windows 11 the file verb and the folder submenu sit under "Show more options" rather than on the top-level right-click menu; Open With is unaffected.
The same things work from a command line or a shortcut:
spektra "song.flac" "other.flac" # one tab each
spektra "D:\Music\Albums" # browse and audit a folder
spektra --dupes "D:\Music\Albums" # Duplicate Detective on a folder
spektra --diff "D:\Music\A" "D:\Music\B" # two folders as a folder diff
spektra --manifest "D:\Music\Albums" # Folder Manifest on a folder
spektra --compare a.flac b.flac --auto --mode diff
Spektra runs as one instance. Launching it while it is already open sends the new command line to the running window rather than starting a second one: files arrive as extra tabs, a folder as another browse, and a bare launch just brings the window to the front. This is also what makes a multiple selection land in one window, because Windows invokes a right-click verb once per selected file.