Releases: LeoHChen/HarmonIQ
v1.1.1 — VLC-compatible playlist export
The "take your playlists with you" release. HarmonIQ now writes standard VLC-compatible playlists onto the drive, so the same library plays on the desktop without re-exporting anything.
Highlights
- VLC-compatible playlist export. Every playlist is mirrored to the drive as a standard Extended M3U file at
<Drive>/HarmonIQ/Playlists/<name>.m3u8, with relative paths that resolve wherever the drive is mounted (Mac/PC). Plug the drive into a computer and open them straight in VLC. (#134, #135) - Whole-drive "All Tracks" playlist. An
All Tracks (<DriveName>).m3u8containing the entire drive library is exported alongside the per-playlist files, so the whole collection opens in one click. (#135) - Automatic + self-healing. Sidecars are (re)generated on every playlist edit, drive load, and reindex — so playlists made before this release, or on another device, appear without any manual step, and entries follow files that move between scans. (#135)
Build: 1.1.1 (7)
🤖 Generated with Claude Code
v1.1 — Charcoal Phosphor, language browse, artist headshots, lock-screen lockstep
What's new in v1.1
Charcoal Phosphor. A deeper, more authentically Winamp-2.x palette across the whole player — graphite chassis, deeper CRT-green LCD, sharper corners, amber + red chromatic accents in the spectrum visualizer.
Browse by language. New Library → Language hub buckets your collection into Chinese / English / Others, with a "Reclassify all tracks" Settings action for already-indexed drives.
Artist headshots. The Artists tab is now a visual grid. Off-by-default opt-in fetcher pulls real artist photos via MusicBrainz → Wikidata → TheAudioDB → Wikipedia. Tile is always a real headshot or a placeholder — never an album cover stand-in.
Album art on tap. Off-by-default opt-in fetcher fills missing album covers via MusicBrainz + Cover Art Archive. Albums view also picks up artwork files dropped manually into <Drive>/HarmonIQ/Artwork/.
One Refresh sheet per drive. Settings → drive maintenance is consolidated into a single "Refresh…" sheet with three semantic levels (Quick refresh / Reindex tracks / Fetch from internet) plus an Advanced disclosure for full rebuild. The previous 5–6 separate buttons are gone.
Lock screen lockstep. The iOS Now Playing widget and the HarmonIQ Live Activity now stay synchronized — play state, elapsed time, artwork all update atomically.
EQ + visualizer polish. Equalizer preset picker is easier to tap and faster to commit. Visualizer style picker commits on first tap. Radial Pulse renders unambiguously radial at any audio energy level.
Compilation albums fold up. Multi-artist albums (e.g. "1995 Grammy Nominees") collapse into one "Various Artists" entry instead of fragmenting per performing artist. New offline tools/library-doctor.swift for --report / --dedupe / --rebuild.
AI hides cleanly on older devices. AI Smart Play UI only appears when Apple Intelligence is reachable or you've configured an Anthropic key. iPhone 14 / iOS 18 users see no dead-end teasers.
Build 6 — 2026-05-09
A small App Store submission build over the same v1.1 release. No tag bump, no marketing-version change.
- About-screen easter egg. Tap the Version row five times in Settings → About to find a small homage to a certain late-90s media player. (#123)
- Export-compliance auto-answer. Adds
ITSAppUsesNonExemptEncryption = falseto the Info.plist so App Store Connect can auto-answer the export-compliance question on every future upload — the app only uses standard OS-provided HTTPS for the opt-in album-art / artist-photo fetchers. - Plus a public TestFlight join link in the README and landing site, and a non-tech setup guide at getting-started.html for readers who want help picking drives, cables, ripping CDs, and tagging.
Build 6 is the build going into the App Store v1.1 review submission. Build 5 (uploaded 2026-05-04) remains on TestFlight for the existing beta group.
Full changelog: README.md · Landing site: https://www.leochen.net/HarmonIQ/
TestFlight: join the public beta.
v1.0 — your collection deserves a real player
Music for your own collections, ported to your iPhone.
The 1.0 release. HarmonIQ is now a feature-complete iPhone music player for the people who never threw out their MP3 folders — the CD ripper with three external drives full of FLACs, the Napster-era curator with a meticulous "Best Of 2003" directory, the audio-archivist who treats a hard drive like a library and not a cache.
Built around three load-bearing claims:
- You own your files. No streaming service, no cloud locker, no account. The MP3s and ripped CDs on your drive are yours; HarmonIQ plays them in place.
- You own your playlist algorithm. Smart Play's rule-based modes are pure functions you can fork. The AI modes prefer Apple Intelligence's on-device foundation model — your library never leaves the phone.
- You own your taste. No engagement metrics, no recommendation graph, no listening history shipped off for ad targeting.
Works on the plane. Works in the subway. Works in the woods.
What's new since 0.4
Audio
- Functional 10-band EQ. AVAudioEngine + AVAudioUnitEQ replaces AVAudioPlayer; sliders move the actual signal. Built-in presets (Flat, Rock, Pop, Jazz, Classical, Bass Boost, Vocal Boost) plus persisted custom curves. (#28)
- Live Activity for background playback. Lock-screen banner + Dynamic Island compact / expanded / minimal layouts; throttled to respect ActivityKit budgets. (#18)
- Diagnostic logging.
os.Loggerinstrumentation in the playback path (subsystemnet.leochen.harmoniq, categoryplayback) — track-finish success flags, decode errors, audio-session interruptions, route changes, scope releases. Filter in Console.app to triage mid-track aborts. (#38)
Smart Play
- Three AI modes. Vibe Match (free-text vibe → curated queue), Storyteller (8–12 track narrative arc with a blurb), Sonic Contrast (alternates by style). (#25)
- On-device AI by default. Prefers Apple Intelligence's foundation model on iOS 26 + iPhone 15 Pro+ — no API key, no network. Falls back to Anthropic when a key is configured.
- Save AI queues as playlists. Tap the bookmark in the player → name → it lands as a regular drive-resident playlist with the prompt and mode stashed for later. (#58)
- Two more rule-based modes. Genre Tunnel (stay inside the playing track's genre) and Era Walk (chronological tour) join the existing Mood Arc / Deep Cut / One Per Artist additions. 14 rule-based + 3 AI modes total.
Visualizers
- Eight fancy oscilloscope variants. Neon Glow, Harmonic Layers, Mirror Wave, Filled Wave, Radial Wave, Waterfall, Lissajous, Beat Flash. SwiftUI total: 16 styles. (#27)
- Skinned-player tap-cycle — single tap on the 76×16 visualizer rect cycles all 16 styles in the Winamp player too. (#36)
- Radial Pulse fix — meter tap-format mismatch was suppressing levels; replaced with
format: nilso the engine wires the live format correctly. (#41)
Library
- Favorites. Heart toggle on both player skins; saves to a system "Favorites" playlist on the drive — favorites travel between devices via the on-drive
playlists.json. (#33) - Incremental reindex. Skip work when the drive is unchanged (cheap fingerprint check); when it changed, only re-extract metadata for files whose mtime changed. New files added, missing files removed. (#55)
- Drive auto-load + Reload button. App foreground re-reads any drive that was offline at launch. Manual Reload button per drive in Settings re-reads the cached index without a full filesystem walk. Reindex now passes a force flag so explicit taps never silently no-op.
App polish
- Settings → About shows real Version, Build, Commit (short SHA), Release tag, Built-at — populated by a postBuildScript. "Copy build info" puts a multi-line block on the clipboard for bug reports. (#52)
- Settings → Feedback — one-tap links to file feature requests, file bugs (label-prefilled), browse open issues, star the repo. (#59)
- Landing site at https://www.leochen.net/HarmonIQ/ — sun-bleached gradient hero, all 9 bundled skins as native previews, 16-style visualizer grid, "Make it yours" contribution invitations. Plain HTML/CSS, no analytics. (#57)
- Chrome bar consistency. Skinned-player top bar redesigned — five buttons (skin, save-AI, favorite, sleep, close), all 36×36 hierarchical-white SF Symbols. Search and Playlists tabs gain proper inline titles. Save-AI uses
bookmark.fillfor clear semantics. - Branded launch screen. Sun-Bleached Grooves splash matching the app icon (sunset gradient + black vinyl disc).
Requirements
- iOS 16+
- AI Smart Play with on-device backend: iOS 26 + iPhone 15 Pro or newer + Apple Intelligence enabled
- Live Activity / Dynamic Island: iOS 16.1+ for activities; iPhone 14 Pro+ for the Dynamic Island layout
Where to put your music
Anywhere Files can see it: USB-C SSD, on-device storage, iCloud Drive, SMB share. Settings → Add Music Drive… picks any folder and indexes its contents. The index lives in a HarmonIQ/ folder on the drive itself, so the same drive works on any iPhone without re-scanning.
🤖 Generated with Claude Code
v0.4 — visualizer overhaul, sleep timer, SmartPlay modes, launch screen
Highlights since v0.3
- Sleep timer — auto-stop after 15/30/45/60 min or at the end of the current track, with a live LCD countdown in the player transport. (#16)
- Visualizer overhaul — 8 selectable styles on the SwiftUI player: spectrum, oscilloscope, plasma, mirror, radial pulse, particles, fire, starfield. Active style persists across launches. Long-press or double-tap the visualizer to cycle. The skinned (Winamp) player honors the same choice within its 76×16 + palette constraints. (#26)
- SmartPlay — three new rule-based modes: Mood Arc (high-energy → wind-down), Deep Cut (skip openers and "Greatest Hits" comps), One Per Artist (max library breadth). 12 modes total. (#25)
- Branded launch screen — Sun-Bleached Grooves splash matching the app icon: sunset gradient + black vinyl disc, no tonearm. (#30)
- Performance — throttled
currentTimepublish to ~2 Hz, gated the visualizer + display link on view visibility, paused the display link when the app backgrounds. Substantially fewer SwiftUI invalidations during normal playback. (#17) - Reliability — fixed several Sendable / actor-isolation issues around background/foreground notification observers (no compile-time isolation warnings, no spurious main-actor hops).
- Repeat-one indicator: subtle "1" badge on the repeat button when single-track loop is active. (#15)
Build: 3
Min iOS: 16
🤖 Generated with Claude Code
v0.3 — drill-down fixes, scrollable skin picker, recent searches
Highlights
- Albums and Artists drill-downs work again — taps now push into detail views instead of looping back to the list.
- Album detail polish — centered Winamp-themed header card with aligned PLAY / SHUFFLE buttons.
- PLAYER row in BROWSE — return to the now-playing sheet from the library; icon pulses with a live audio-level glow and a 3-bar mini-VU.
- Skin picker overhaul — single tap cycles to the next skin, long-press opens a scrollable sheet (the old contextual menu couldn't scroll past 9 skins). Same affordance on the SwiftUI player so picking "None" still gives a usable picker.
- Four more bundled skins: Bento Classified, Crystal Display, Glass Factory, Luna Steel.
- Recent searches — persisted LRU (capped at 10), surfaced when the search field is empty.
- README added.
Changes
- #13 UI polish: working drill-downs, scrollable skin picker, recent searches
Full changelog: v0.2...v0.3
v0.2 — skin polish + UX fixes
First proper release-on-iPhone build. Tag: v0.2 (annotated, on cc11db9).
What's new since v0.1
Skin polish
- EQ + Playlist panels now skin alongside the main player. Switching skins recolors the entire now-playing sheet at once — text, background, and current-track highlight all read the active skin's
PLEDIT.TXTpalette (#12). - Skin picker added to the SwiftUI (None) player so you can switch back to a skinned player without leaving the now-playing screen (#12).
UX fixes
- Mini player removed — it was blocking the bottom row of the tab bar and list rows after the now-playing sheet was dismissed. Auto-present-on-tap (from v0.1) handles reopening the player (#12).
- Bogus read-only flag fixed — every picked folder used to come back read-only because security scope wasn't open during bookmark capture, so the on-drive
HarmonIQ/library.jsonwrite failed and the index fell back to the sandbox even on writable locations (#11). - Folder delete in Library → Folders view (it was Settings-only) (#11).
Install
Build & run from Xcode against any iOS 16+ device or simulator. No release artifacts attached.