Explore Kevin Cusnir / Lirioth Teltanion's real public listening archive, or import a Spotify, Last.fm, Apple Music, ListenBrainz or YouTube history and optionally attach a private MusicBee library snapshot. Nova Music Lab processes selected exports in the browser and turns supported evidence into timelines, artists, genres, obsessions, cultural journeys and transparent interpretive readings. Those emotional and personality readings are creative reflection tools, not clinical assessments or diagnoses.
Current public version: 1.6.0 β deployed 2026-08-09. The Living Archive Finds Its Voice refreshes the complete archive through 2026-08-06, clearly separates Kevin / Lirioth's exhibition from the local build-your-own path, opens the full artist catalog through AβZ/listening navigation and makes genres, obsessions and interpretive boundaries easier to understand.
Verified release identity: pull request #38 merged the reviewed source; workflow 31319814024 verified, deployed and smoke-tested commit e0d49d2940343fe2ebd7cfb4eee4cbd4d8d39cae; annotated tag v1.6.0 and the GitHub Release resolve to that same product commit.
Verified public engineering evidence: React 19 Β· TypeScript Β· Vite Β· Dexie/IndexedDB Β· Web Workers Β· 803 passing Vitest tests with 1 intentional private-fixture skip Β· 18/18 Playwright journeys Β· EN/ES/HE RTL Β· protected GitHub Pages CI. These figures describe the accepted v1.6.0 release gate. IndexedDB schema revision 4 is a storage contract, not the product version.
v1.6.0 verification state (2026-08-09): the exact released source passed one uninterrupted Node 22.13.0 npm run verify:release run: 132 test files passed with 1 intentional private-fixture skip, 803 tests passed with 1 intentional skip, every strict data/privacy/build budget passed and all nine source-fingerprinted visuals passed audit and visual review. Playwright passed 18/18 desktop/mobile journeys with one worker, and the protected Pages workflow completed its live identity smoke test.
Explore the live flagship Β· Read the architecture Β· Follow the product roadmap
- Open the live flagship and enter the museum.
- Start in Explore, the visual default; switch to Guided whenever you want simpler language and essential context.
- Open Artists to browse the complete Atlas by listens, AβZ, letter or search.
- Switch to Deep Dive when you want methodology and provenance.
- In
1.2.0β deployed 2026-07-29 β Share & Feedback prepares a WhatsApp invitation and Audio Lab previews a permitted local audio file without uploading it. - In
1.4.0β deployed 2026-07-29 β a guest can add an optional local museum name, import compatible files and compare the resulting private museum directly with Kevin's public exhibition. - In
1.5.0β deployed 2026-08-01 β portrait fallbacks, genre evidence, snapshot dates and bounded local imports become easier to trust. - In
1.6.0β deployed 2026-08-09 β the archive grows through August 6, the first screen explains whose museum this is, Create opens the private visitor path, the full Atlas becomes navigable and genre/obsession stories become easier to read.
No account is required for the public exhibition or local archive import.
These nine captures were regenerated from the frozen 1.6.0 product source
on 2026-08-09, passed the release-media hash/dimension audit and received a
desktop/mobile EN/ES/HE visual review. The manifest binds them to the committed
product source; they are immutable visual evidence for the deployed release. The live
build-meta.json
remains the authoritative identity for the currently served artifact. The annotated
tag stays anchored to the reviewed product commit even when a later
documentation-only deployment receives its own commit SHA.
A welcoming mobile entrance β Spanish copy and the responsive room navigation remain readable at 390 px. |
Genres without clipping β the deep link, tabs and evidence chart fit the mobile viewport. |
A museum your friends can make their own β no account is required to name a local museum, import compatible files and begin a private comparison.
Three rooms, one story β Overview β Artists β Genres shows how the invitation becomes evidence; reduced-motion readers receive a static frame.
One system across contexts β mobile, Hebrew RTL and a light theme use the same information architecture.
Streaming platforms usually reduce years of listening to a short recap. Nova Music Lab begins with Kevin / Lirioth's published personal archive and treats it as a cultural artifact: something to investigate, revisit and interpret. The same browser experience lets another listener choose supported exports and build a private local museum without surrendering the raw history to a Nova analytics backend.
The project is built around five commitments:
- Evidence before spectacle. Unknown information remains unknown; estimates and interpretations must be distinguishable from observed facts.
- Local-first ownership. Visitor-selected archives are parsed and stored in the browser.
- Source awareness. Each provider exposes different fields, so rooms only claim capabilities their active archive can support.
- A museum, not a spreadsheet. Motion, sound-inspired art, narrative and exploration make the evidence emotionally legible.
- Reflection, not diagnosis. Emotional and personality language is an evidence-aware creative interpretation; it does not assess mental health or replace professional care.
| Mode | Purpose | Data boundary |
|---|---|---|
| Kevin / Lirioth Exhibition | Kevin Cusnir / Lirioth Teltanion's real personal listening history, presented as the public museum and Nova's complete visual demonstration. | A reviewed aggregate dataset is intentionally published with the static site and governed by public_dataset_manifest.json. |
| My Museum | A visitor imports supported listening-history exports and rebuilds every view the source can honestly support, including derived and clearly labelled interpretive rooms. | Raw files stay in the browser; the app does not upload them to a Nova Music Lab server. Missing source capabilities remain unavailable rather than being invented. |
1.4.0 β deployed 2026-07-29 β makes My Museum a clear
Guest Museum journey. A visitor may add an optional browser-local display name,
but that label is not a login, password or public account. Compare Museums loads
the reviewed public artist catalog only when needed and labels older
top-list-only datasets as partial instead of overstating their overlap.
The evidence-first milestone, completed in 1.0.0 β published 2026-07-16 and now superseded β formalized this boundary everywhere: flagship-only stories must never masquerade as visitor-derived analysis, and every interpretive room must disclose its evidence level.
| Source | Supported export | Strongest evidence | Role |
|---|---|---|---|
| Last.fm | CSV export | Long chronology, scrobbles, sessions and streaks | Event timeline |
| Spotify | Extended Streaming History JSON | Duration, platforms, country, skips and short plays | Event timeline |
| Apple Music | Play Activity.csv |
Apple listening activity and playback history | Event timeline |
| ListenBrainz | Listen JSON export | Open timestamped listening records | Event timeline |
| YouTube / YouTube Music | Google Takeout JSON or HTML history | Music video and YouTube Music activity | Event timeline |
| MusicBee | iTunes-compatible library XML | Local artists, albums, tracks, genres and saved counters | Separate library snapshot |
| Combined museum | Any supported combination | Source labels, normalization and evidence-aware overlap handling | Evidence-aware view |
Imports can be mixed. Source-specific fields remain source-specific: for example, Last.fm alone cannot prove Spotify device or skip behavior.
Repository operators can create a complete private Last.fm CSV with the local Last.fm export guide. The tool prompts for the key locally and stores the raw result outside Git and OneDrive; it is a manual snapshot, not a live connection and does not alter the public flagship exhibition.
MusicBee is intentionally different: it shows what is in a local library, but its cumulative play counts are not added to Spotify, Last.fm or the historical timeline. Read the MusicBee import guide for the simple export steps, retained fields and privacy boundary.
The public exhibition is a local historical snapshot, not a live account connection:
| Evidence date | Verified value |
|---|---|
| Observed listening period | 2015-03-01 through 2026-08-06 |
| Dataset generated | 2026-08-07 in Asia/Jerusalem (2026-08-06T21:44:39.498Z) |
| Artist enrichment generated | 2026-07-29 |
| Recent Pulse synchronized | 2026-07-02 |
| Automatic synchronization | No |
The app never labels this archive βupdated 2026-08-09.β These dates describe different evidence layers, not a live Spotify, Last.fm or MusicBee connection. Any future refresh must be compiled privately, reconciled and pass the public-bundle privacy audit before it can replace them.
The museum is organized into five stable hubs. Their visible names prioritize plain purpose; internal routes remain stable for old links:
- Overview β orientation, archive purpose, sharing and feedback.
- Pulse β recent movement, loops, achievements and yearly summaries.
- Artists β Living Artist Atlas, rankings and cultural geography.
- Stories β eras, identity, emotion and the final narrative.
- Create β import a private museum, local audio, comparisons, quality and advanced statistics.
Three persistent depths change how information is presented without hiding rooms or changing the URL:
- Guided β uses simpler language and keeps essential context visible.
- Explore β the balanced default: a calm, visual, self-directed museum visit.
- Deep Dive β opens methodology and prioritizes evidence, limits and advanced controls.
The Expedition Console keeps depth and the active-archive capsule visible across desktop and mobile. Ctrl/Cmd+K opens Nova Command for keyboard-first access to the complete museum. Read the experience contract.
Representative rooms include:
| Experience | What it explores |
|---|---|
| Dashboard | Archive identity, coverage and high-level signals |
| Era Explorer | How listening identity changes across years |
| Top HistΓ³rico | Artist, track and album dossiers with evidence-linked context |
| Obsession Detector | A cover-led spotlight, visual replay loops, streaks and concentrated listening periods |
| Emotional Map | Interpretive mood stations grounded in available signals |
| Cultural Map | Artist origins and listening geography |
| Living Artist Atlas | The complete exact-name catalog by listens or AβZ, with search, letter filters, human-first artist stories, galleries, tracks, albums, provenance and opt-in official media |
| Share & Feedback | Browser sharing, WhatsApp invitation and structured local feedback without requiring an account |
| Audio Lab | Private local preview and file evidence boundary; advanced acoustic analysis is explicitly not run yet |
| Source Observatory | Last.fm, Spotify, YouTube, Apple Music and ListenBrainz coverage, field capabilities and honest missing-source states |
| Data Quality Center | Coverage, limitations and enrichment priorities |
| Final Report | A guided closing narrative and exportable summary |
Heavy rooms and data catalogs are lazy-loaded so the museum shell can appear before rarely visited analysis code is downloaded.
- Visitor-selected raw exports are parsed in the browser.
- A selected MusicBee XML is reduced to an allowlisted library snapshot; local file paths and persistent IDs are discarded.
- Imported museum state is stored in browser IndexedDB, not in a Nova backend database.
- Raw Spotify fields that are not required for analysis, such as IP addresses, are not retained.
- Clearing browser storage removes the local visitor museum from that browser profile.
- The GitHub repository and Pages site contain a reviewed flagship aggregate dataset.
- Exact-granularity flagship sections require an explicit declaration in the public dataset manifest.
- CI audits the bundle for undeclared sections and raw identity/network fields.
| Request | When it happens | What leaves the device |
|---|---|---|
| Google Fonts | Initial document load | Normal font request metadata |
| Remote artwork | A room displays curated external media | Image request metadata |
| YouTube/Spotify media | A visitor opens an embed or verified external link | The provider receives the request |
| Gemini | Only after a visitor explicitly configures a personal key and sends a question | The question and a bounded aggregate summary; never the raw export file |
| Share / WhatsApp | A visitor explicitly opens the share sheet or WhatsApp draft | The chosen app receives the prepared public link and text |
Nova Music Lab is therefore local-first, not network-isolated. A stricter no-remote-media Privacy Mode is tracked in the roadmap.
Read the full privacy threat model and public data policy.
Every analytical or narrative output should be classified as one of:
- Observed β directly supported by normalized archive events.
- Derived β deterministically calculated from observed data.
- Inferred β an interpretation with visible evidence and limitations.
- Unavailable β the active source cannot support the claim.
The project deliberately rejects plausible-looking fabricated numbers. Data reconciliation, source coverage, media identities and public-bundle privacy are enforced through scripts and tests.
The generated artist manifest currently contains 100 artist records and 295 provenance-aware visual assets. Artist aliases, MusicBrainz/Wikidata identifiers, countries, genres, releases, members and official links remain separate from private play counts. Each image record carries its source, license-review state, attribution, focal point and cache/privacy policy; after the reviewed Wikimedia Commons metadata pass, 6 assets remain visibly queued for license review rather than being mislabeled as reusable.
The Living Artist Atlas turns those records into explorable territories. Its lazy navigator opens all 6,593 exact-name catalog entries by listening rank, AβZ, letter or search without placing the complete catalog in the entry bundle. Artist copy starts with a readable introduction before technical evidence. Progressive galleries, archive-ranked tracks and albums, documented discography, official links and an on-demand evidence panel remain available. The primary portrait index matches 5,691 / 6,593 catalog rows by normalized exact name; unavailable or failed remote images use deterministic generated art rather than a wrong face. Spotify and YouTube players stay behind an explicit privacy gate, and remote gallery images disclose their provider and network boundary instead of being described as local assets.
The 1.6.0 release deployed 2026-08-09 explains three different coverage
layers instead of collapsing them into one number. Analytical genre families
cover 94.2% of 82,661 plays; detailed evidence exists for 457 of 6,593
catalog entries; and 1,648 entries remain unclassified. The evidence bundle
contains 1,290 assertions: 85 accepted, 1,203 candidate and 2
rejected. Accepted assertions appear as documented facts, candidates remain
visible suggestions, rejected relationships stay hidden and unresolved entries
say βTo research.β Observed means an automatic classification derived from
listening evidence. Unclassified always stays separate; compact charts name
the number of smaller classified families they group, while the complete view
shows all 36 rows without inventing an Other genre. Emotional readings remain
a separate, non-clinical interpretive layer rather than masquerading as genres.
The track-art index contains 170 exact artist/title mappings and covers all 50 / 50 bundled Obsessions moments. This describes exact metadata matches, not guaranteed network availability; deterministic generated covers remain the honest runtime fallback.
The 6,593-entry catalog is not a claim of 6,593 unique people or canonical artist identities. The current reversible identity registry documents 182 known normalized-name variant groups; this release does not delete or merge the historical rows.
External identity relationships and rejected matches are governed by artist_external_identity_policy.json. The identity audit detects duplicate external IDs unless an exact transliteration or historical-rename relationship is declared; it also prevents known bad matches, including the rejected nightlife MusicBrainz identity, from returning silently.
The manifest installs into the local Dexie database only when its source fingerprint changes. Returning visitors download the small metadata fingerprint during idle bootstrap, not the complete artist catalog on every visit.
The interface uses a shared Living Sonic Cartography registry for room palettes, atmospheric geometry and semantic navigation icons. The Nova orbit/waveform mark now drives crisp favicon, PWA, maskable and monochrome icon variants as well as the repository's static social preview.
flowchart LR
F["Listening exports"] --> P["Source adapters"]
P --> N["Normalize and validate"]
N --> D["Cross-source deduplication"]
D --> A["Shared analytics"]
A --> S["Archive capability and provenance"]
S --> R["Lazy museum rooms"]
R --> V["Charts, stories and exports"]
S --> I["Browser IndexedDB"]
A -. "bounded aggregate, opt-in" .-> G["Gemini"]
A --> C["Local museum comparison"]
K["Lazy public artist catalog"] --> C
| Layer | Primary responsibility |
|---|---|
src/utils/parser.ts |
Source parsing, normalization and merged dataset construction |
src/utils/musicBeeSnapshot.ts |
Privacy-safe MusicBee XML parsing into a separate local library snapshot |
src/utils/analytics.ts |
Shared quantitative calculations |
src/utils/datasetStorage.ts |
Local browser persistence and portable dataset validation |
src/db/ |
Dexie/IndexedDB schema revision 4, typed storage outcomes, atomic museum activation and compatibility stores |
src/knowledge/ |
Validated artist-knowledge manifest and provenance-rich visual records |
src/components/museumVisualIdentity.ts |
Shared room families, palettes, motion atmospheres and icon identity |
src/utils/identityEngine.ts |
Deterministic generative identity |
src/context/AppContext.tsx |
Language, theme and navigation state |
src/context/ExperienceContext.tsx |
Guided, Explore and Deep Dive preference with additive legacy migration |
src/components/shell/museumNavigation.ts |
Five-hub room ownership and canonical hub entry points |
src/App.tsx |
Museum shell, routing, transitions and data gate |
src/data/ |
Curated public enrichment and the reviewed flagship bundle |
Database design, migrations and failure states are documented in Storage and migrations.
- English, Spanish and Hebrew interfaces.
- Correct Hebrew RTL document direction and
he-ILformatting. - Fourteen dark and light museum themes.
- Keyboard-aware navigation, focus restoration and mobile drawer behavior.
- Expressive, Calm and Static atmosphere modes; Calm is the default and the operating-system reduced-motion preference overrides animation.
- Reduced-motion behavior across application transitions, charts, canvas art and static repository artwork.
- Exact-value chart tables and CSV exports for non-visual access.
1.2.0 β deployed 2026-07-29 β adds Playwright browser checks at 1440Γ900 and 390Γ844 plus automated axe WCAG A/AA checks. Automated scans catch only some issues, so keyboard, screen-reader semantics, contrast, RTL and visual review remain ongoing manual quality gates. See Accessibility.
npm run verify
node scripts/audit_public_bundle_privacy.mjsThe verified Pages pipeline runs:
lint
β strict data audit
β artist-identity relationship audit
β strict media-link audit
β artist-knowledge manifest audit
β public-bundle privacy audit
β PWA/installability contract audit
β tests
β TypeScript + production build
β bundle budgets
β Pages artifact
β exact commit/version deployment smoke test
GitHub also runs CodeQL and dependency review. The Pages job can only deploy the artifact produced by the successful verification job.
Requirements: Git and the Node version declared in .nvmrc.
git clone https://github.com/LiriothTeltanion/NovaMusicLab.git
cd NovaMusicLab
npm ci
npm run devBefore opening a pull request:
npm run verify
node scripts/audit_public_bundle_privacy.mjs
git diff --check
git statusUseful commands:
| Command | Purpose |
|---|---|
npm run dev |
Start the local Vite server |
npm run build:check |
Build and enforce bundle budgets |
npm run verify |
Run the canonical code/data/test/build gate |
npm run audit:data |
Print current data coverage and priority queues |
npm run audit:identity |
Reject undeclared duplicate artist identities and known bad external matches |
npm run audit:links |
Validate curated media profiles and embeds |
npm run compile:data -- --source-dir <path> [--lastfm-file <csv>] |
Compile an explicitly selected local archive; ambiguous CSVs require an explicit path |
npm run preview |
Preview the production bundle locally |
The compiler never searches personal directories automatically. Use a review output and run the public-data audit before replacing any bundled flagship data.
The creator CV call-to-action is off by default and is never bundled as a file. CreatorCvLink reads a public HTTPS URL from the environment, validates the protocol, and omits the link entirely when unset β so a fork never ships a broken or borrowed CV link.
| Variable | Effect |
|---|---|
VITE_CREATOR_CV_EN_URL |
Enables the CV link in English |
VITE_CREATOR_CV_ES_URL |
Enables the CV link in Spanish |
VITE_CREATOR_CV_HE_URL |
Enables the CV link in Hebrew (falls back to the English URL when unset, and the Hebrew label says so) |
Set them in .env.local for local runs, or as repository variables for the Pages build:
VITE_CREATOR_CV_EN_URL="https://example.com/cv-en.pdf"Only https: URLs are accepted; anything else is ignored and the link stays hidden.
| Guide | Purpose |
|---|---|
| Current status | Verified public status, snapshot dates and release evidence |
| Architecture overview | System boundaries and data flow |
| Guest Museum | Account-free visitor import, comparison and optional future identity |
| Storage and migrations | IndexedDB, dataset envelopes and recovery |
| Privacy threat model | Assets, imports, network and public-data risks |
| Data sources | Source capabilities and honest limitations |
| Private Last.fm export | Hidden-key local download, validation and private import workflow |
| MusicBee library snapshot | MusicBee XML export, retained fields, privacy and non-timeline limits |
| Public data policy | Rules for the published flagship bundle |
| Artwork schema | Artist, album, track and gallery asset contracts |
| Visual system | Living Sonic Cartography, icons and motion tiers |
| Quality gates | Local and CI verification |
| Release guide | Versioning, tags, Pages and rollback process |
| Contributing | Branch, commit, privacy and review expectations |
| Security | Private vulnerability reporting |
| Roadmap | Ordered current and future product priorities |
| Changelog | Durable release history |
The production museum is deployed through GitHub Pages from the verified main artifact:
https://liriothteltanion.github.io/NovaMusicLab/
main is intended to remain deployable. Product work should use focused branches and pull requests; the release process is documented in docs/operations/RELEASE.md.
1.5.0 β deployed 2026-08-01 β was superseded by 1.6.0 on 2026-08-09. Pull request #27 and workflow run 30693829107 preserve its historical release evidence.
1.6.0 β deployed 2026-08-09 β integrates the clearer purpose, navigation, Atlas, Genres, Obsessions, media fallback and interpretive boundary described above. Pull request #38 promoted the reviewed source, and workflow run 31319814024 verified, deployed and smoke-tested release commit e0d49d2940343fe2ebd7cfb4eee4cbd4d8d39cae. The annotated tag and GitHub Release target that commit. The live build metadata remains the authoritative artifact identity after documentation-only deployments. Product versions and IndexedDB schema versions remain deliberately independent.
Kevin Cusnir β LiriothTeltanion on GitHub
Nova Music Lab combines frontend engineering, data visualization, music technology, privacy-conscious personal analytics, multilingual interaction, accessibility and generative art.
The software is MIT licensed β fork it, learn from it, build your own museum with it.
The flagship dataset, generated visuals, narrative copy and brand are reserved: that dataset is one person's listening history, published so the analysis is verifiable rather than as a dataset to redistribute. See DATA_LICENSE.md.
Album art, artist photographs and structured metadata are linked, never redistributed, and remain with their rightsholders; see THIRD_PARTY_NOTICES.md.



