All Projects MetaMusic Tag Generator

MetaMusic Tag Generator

An AI web app that generates sync licensing metadata from an uploaded audio track

Context
CS 394 — Agile Software Development, Northwestern. Team project for a real client, Robert Bismuth of Solo Hands Music LLC.
Role
Team member — full-stack contributor
React TypeScript Tailwind Vite Python FastAPI Essentia librosa Gemini API Firebase (Auth / Firestore / Storage) Render

Problem

Sync licensing platforms require tracks to carry standardized Disco metadata — genre, mood, instruments, vocals, tempo, lyric themes, artist references. Musicians and music supervisors tag this by hand, which takes hours and leaves tracks less discoverable when it’s skipped.

What It Does

Upload an MP3, WAV, FLAC, OGG, M4A, or AIFF file up to 50 MB and the app returns a full set of Disco tags with a confidence score. Tags can be edited inline, refined by describing the change in a chat interface, exported as CSV, and are saved to per-user analysis history.

MetaMusic Tag Generator app — upload screen with drag-and-drop and the What You Get summary

Screenshot — the app

Architecture

Three layers: a frontend SPA, a backend feature-extraction and tagging service, and Firebase — with the frontend talking to Firebase directly rather than proxying through the backend.

— internal call ┄ external call upload audio + API key tags, confidence, chat replies direct SDK — bypasses backend tag generation request Frontend SPA React + TypeScript · Firebase Hosting UI · file upload validation ·tag editing. Talks to Firebasedirectly via the SDK. Backend Service FastAPI (Python) · Render Essentia + librosa featureextraction → Gemini taggeneration → chat refinement Firebase Auth · Firestore · Storage Google OAuth · Firestore foranalysis history & profiles ·Storage for audio files Gemini API external, third-party Per-user API key, held inbrowser localStorage andforwarded — never stored server-side

Process

Worked in GitHub Projects with a swarmed user story backlog, prioritized into sprints. Every feature required a written story spec with acceptance criteria in docs/agent/stories/ before any code was written. TypeScript strict mode with no escape hatches without an ADR, ESLint and Prettier enforced by a pre-commit hook, and lint, tests, and build all required to pass before any PR.

Eric Oh

© 2025 Eric Oh. All rights reserved.

LinkedIn GitHub Email