Skip to content

Repository files navigation

Echo89 — your songs, your moments, your archive

A local-first, cinematic music player that turns songs into a personal archive

Remember. Mix. Keep it local. — your music, your moments, your archive.

Live Demo Last Commit Stars License: MIT Built with Next.js Local-first

Highlights · Live Demo · Player · Moments · Smart Mixes · Setup · Support


🎵 Why Echo89?

A music player that remembers. One click saves a Moment; one sentence builds a Mix. Local-first by design — your audio never leaves the browser.

Echo89 modernizes the compact desktop player: a cinematic custom UI, readable controls, a real queue, local playlists, one-click Moments, Smart Mixes, and mood-to-mood Journey Mixes — all powered by a deterministic, local engine.

The three pillars:

  • 🎵 Remember — one click captures the song, mood, and moment without breaking playback.
  • 🎚️ Mix — Smart Mixes from a sentence; Journey Mixes from mood to mood. AI is optional.
  • 🔒 Local-first — audio, artwork, and memories stay in your browser. No accounts, no analytics.

⚡ Highlights

🎚️ Cinematic player 🧠 One-click Moments 🎛️ Smart Mixes
HTMLAudioElement + Web Audio viz/equalizer, persistent queue, 3 themes. Save song, mood, timestamp, artwork — no form, no pause. Sentence → validated intent → deterministic local track selection.
🗺️ Journey Mixes 📚 Local playlists ⌨️ Command bar
Mood→mood routes with Short/Medium/Long. Create, reorder, dedupe, queue, "Re-import required" safety. Ctrl/Cmd+K for real product actions, never deletes blindly.
🔎 Artwork matching 🧬 Memory DNA 🔒 Private by default
Embedded → MusicBrainz → iTunes/Cover Art, SSRF-hardened proxy. Deterministic local mood/scene/emotion profiles. No cloud audio, no analytics, no third-party trackers.

🚀 Live Demo

Try it now: echo89.vercel.app

Echo89 cinematic music player

Echo89's cinematic player in action.



Product overview

Echo89 is designed around two simple actions:

  • Saving a moment takes one click.
  • Creating a mix takes one sentence.

The music player stays central. Memory intelligence quietly improves rediscovery and mixing without making the user complete a diary form.

What Echo89 modernizes

Classic local players were fast and personal, but their tiny controls, separate tool windows, and file-only organization aged poorly. Echo89 keeps playback controls, a queue, equalizer, visualization, local files, themes, and compact-player personality while presenting them as one responsive 2026 interface.

Player

  • Native HTMLAudioElement playback with Web Audio visualization and equalizer
  • Seek, previous/next, play/pause, shuffle, repeat, volume, and mute
  • Persistent player instance across Player, Library, Mixes, and Moments
  • Local multi-file import and IndexedDB persistence
  • Embedded metadata and cover extraction
  • Automatic MusicBrainz matching for coverless files
  • Cover images cached as IndexedDB Blobs after a successful match
  • Queue controls and local playback source labels
  • Three switchable Echo89 themes

One-click Remember this

Press Remember this while a song plays. Echo89 immediately saves:

  • current song and artist
  • album and available artwork
  • playback timestamp
  • current date and approximate time
  • an honest default title
  • deterministic local Memory DNA

Playback never pauses and no form blocks the player. A small confirmation lets the user optionally add a short note or open Add details.

The advanced editor preserves optional title, note, moods, date, time, place, private people labels, photo, and playback-position controls under progressive disclosure.

Moments

Moments combines three views:

  • Recent — direct cards with replay, song, date, note, edit, and delete actions
  • Timeline — searchable and filterable chronological history
  • Map — a stable visual relationship map with pan, zoom, keyboard access, and list fallback

Map lines represent real shared songs, moods, or scene tags. A single Moment is centered at a controlled size with its title and track visible. Technical emotional numbers stay inside optional analysis details.

New users begin with an empty Moments area. Echo89 does not seed demo memories or demo timelines.

Manual playlists

Playlists are stored locally in IndexedDB. Users can:

  • create, rename, duplicate, and delete playlists
  • add the current track
  • add one or multiple Library tracks
  • save the current queue
  • remove and reorder tracks
  • play normally or shuffled
  • add a playlist to the queue
  • start playback at a selected track

Playlist entries remain when a local file is unavailable and display Re-import required instead of silently disappearing.

Smart Mixes

Smart Mixes use real music already in the local Library. Presets include:

  • Continue this vibe
  • Make it calmer
  • Raise the energy
  • Deep focus
  • Late-night drive
  • Rediscover something
  • Memory lane
  • Build from this moment

A one-sentence request such as “Focused coding music that slowly gets more energetic for 25 minutes” is parsed into a validated intent. Track selection remains deterministic and local, using sonic profiles, saved Moments, recent playback, listening history, artist-repeat penalties, availability, and a stable seed.

AI is optional. Smart Mix generation works without an AI provider.

Journey Mixes

Journey Mixes preserve Echo89’s deterministic route engine while simplifying the controls:

  1. Start from a Moment or mood.
  2. Move toward another Moment or mood.
  3. Choose Short, Medium, or Long.
  4. Create Journey.

Cards lead with the journey, song count, and play action. Technical stage explanations sit inside Why these songs?. A Journey can be saved as a playlist.

Journey Mode shows the current stage, artwork, associated Moment when available, path progress, and a clear exit. Escape exits the overlay.

Listening history

Echo89 stores lightweight local listening events:

  • track start
  • meaningful listening threshold
  • completion
  • skip
  • playback source
  • playlist or Journey source

It does not log every progress update and sends no history to analytics. History supports rediscovery and repeat penalties and can be cleared independently.

Command bar

Press Ctrl/Cmd + K to preview and execute local actions such as:

  • Create a playlist called Hackathon
  • Save my queue as Late Night
  • Continue this vibe
  • Replay my latest moment
  • Build a journey from nervous to confident
  • Show recent moments

The command bar performs product actions rather than open-ended chat and never deletes data without confirmation.

Local-first architecture

Next.js App Router
├── Browser
│   ├── HTMLAudioElement + Web Audio API
│   ├── music-metadata local file parsing
│   ├── Dexie / IndexedDB
│   │   ├── tracks + queue + settings
│   │   ├── moments + sonic profiles + routes
│   │   └── playlists + listening events
│   ├── deterministic Memory DNA
│   ├── deterministic Smart Mix engine
│   └── deterministic Journey engine
└── Server routes
    ├── /api/music/metadata          sanitized MusicBrainz lookup + multi-source artwork
    ├── /api/music/artwork/proxy     SSRF-hardened same-origin image proxy (iTunes, MusicBrainz)
    ├── /api/memories/enrich         optional Kilo enrichment
    └── /api/memories/models         live free-model discovery

The IndexedDB database intentionally retains its original physical name so existing local libraries survive the Echo89 rebrand. Schema version 3 adds playlists and listening events without resetting tracks, queue, settings, Moments, profiles, or routes.

Optional AI interpretation

Echo89 sends sanitized text from one Moment to the configured Kilo route. The response must match strict Memory DNA JSON and all numeric values are clamped.

Normal Moment cards do not advertise implementation statuses. Advanced details report whether Kilo enrichment completed or local Memory DNA is active.

Deterministic local fallback

Every Moment is committed to IndexedDB before network work. Local Memory DNA derives bounded mood, scene, emotional, and visual profiles from available input. If Kilo is offline, unavailable, or malformed, saving and all local product behavior continue.

Smart Mix selection and Journey generation never require AI.

IndexedDB data model

Schema version 3 contains:

  • tracks
  • settings
  • queue
  • memories
  • sonicProfiles
  • routes
  • playlists
  • listeningEvents

Unavailable local files do not cause playlist or Moment deletion.

Backup and migration

Version 2 JSON backups include:

  • Moments without private photo Blobs
  • Journey routes
  • playlists and Smart Mix definitions
  • safe theme and player settings

Audio, photos, file paths, and listening history are excluded. Version 1 Echo89 memory backups remain importable.

Privacy

  • Audio, embedded artwork, downloaded cover Blobs, photos, playlists, and listening history stay in the browser.
  • Audio bytes, photos, file paths, the full Library, listening history, and all Moments are never sent to AI.
  • Artwork matching sends only sanitized song text to MusicBrainz.
  • Kilo receives only sanitized text for the single Moment being enriched.
  • There are no accounts, cloud audio uploads, third-party analytics, Firebase, or Supabase.

Artwork and API keys

Artwork requires no API key. Echo89 uses this order:

  1. Read an embedded file cover.
  2. Match sanitized metadata through MusicBrainz for title/artist/year correction.
  3. Resolve cover art from free, no-key sources in priority order:
    • iTunes Search API (broad coverage, upscaled to 600×600) — primary.
    • MusicBrainz + Cover Art Archive — exact-release fallback.
  4. Fetch the chosen cover through the same-origin, SSRF-hardened /api/music/artwork/proxy so external services only see the server IP.
  5. Save the resulting image Blob in IndexedDB.

The default Kilo configuration uses an anonymously accessible free model, so an API key is optional. For authenticated Kilo usage:

Copy-Item .env.example .env.local
# Add KILO_API_KEY and optionally KILO_MEMORY_MODEL.

Never use a NEXT_PUBLIC_ variable for a provider key. On Vercel, add server-only variables under Project Settings → Environment Variables and redeploy.

Setup

Requirements: Node.js 20+ and npm.

npm install
npm run dev

Open http://localhost:3000.

Development commands

npm run lint
npm run typecheck
npm test
npm run build
npm run start

Tests

Vitest covers:

  • deterministic Memory DNA and validation
  • one-click Moment creation and optional notes
  • honest default Moment titles
  • route scoring, attached-memory weighting, and recent penalties
  • playlist creation, normalization, missing entries, and ordering
  • Smart Mix prompt parsing, presets, deterministic generation, and rediscovery
  • command parsing
  • timeline filtering
  • backup validation and legacy compatibility

Production build and Vercel

npm run build
npm run start

The repository is a standard Next.js App Router project and can be imported into Vercel without a custom build command.

Demo flow

  1. Import a legal local track.
  2. Confirm metadata and artwork appear.
  3. Play it and press Remember this.
  4. Close the confirmation without entering a note.
  5. Open Moments → Recent, then replay the saved timestamp.
  6. Create a playlist and add Library tracks.
  7. Open Smart Mixes and choose Continue this vibe.
  8. Save the preview as a playlist.
  9. Create a short Journey Mix between two moods.
  10. Export a backup.

Legal demo music

The files in public/audio/ are short synthesized WAV signals created for verification. Do not commit commercial recordings or personal imports. Echo89 is an independent hackathon project and is not affiliated with or endorsed by Winamp or its owners.

Known limitations

  • Persistent audio depends on browser quota and storage policy.
  • MusicBrainz matching quality depends on embedded metadata or filename quality and network availability.
  • Browser autoplay may require a user gesture.
  • Background playback can still be affected by operating-system or browser power policies.
  • Smart Mix and Journey variety improves with a larger local Library and more listening history.
  • Backups intentionally do not contain local audio or private photos.

Future roadmap

  • Optional user-controlled encrypted sync
  • More local audio-feature extraction
  • Richer playlist cover editing
  • Additional deterministic Smart Mix directions
  • Installable PWA media-session controls

📈 Star History

Star History Chart

If Echo89 makes your music feel more personal, a ⭐ helps others find it.


💬 Support

Built by @akyourowngames. Local-first, always learning. 🎶


🔗 More from the same author

  • friday — local-first AI assistant (graph memory, semantic routing, FastAPI/Next.js).
  • A.N.K.I.T.A — Python personal AI assistant with voice, memory, Telegram.
  • AniKai — anime discovery web app (Next.js + Vercel).

License

MIT. See LICENSE.