Spencer Morris
← Project index
ENGINEERING NOTES / 24 3 MIN READ

Musephoria

A structured music-feedback exchange, from early incentive-design experiments to a later Next.js application with listening requirements and review credits.

Prototype / multiple iterationsVisit project ↗
Musephoria example reviews page with timestamped mix and arrangement feedbackView full size ↗
Original Musephoria app running locally from the July 6, 2026 repository revision. These are the built-in example reviews, not user submissions. This Next.js version is distinct from the earlier Solid/Hono experiment.
01 / THE PROBLEM

What needed solving.

A simple give-feedback-to-get-feedback exchange rewards the cheapest review that satisfies the rule, not necessarily a useful critique.

02 / SYSTEM OUTLINE
  1. 01Track + timed prompts
  2. 02Designed review incentives
  3. 03Feedback quality hypothesis

Simplified from the implementation and project notes.

03 / TECHNICAL DECISIONS

How it fits together.

The proposed mechanism tied structured questions to audio playback, used model scoring to influence reputation rather than block every submission, and weighted recipients’ ratings by standing. Arbitration was designed for contested cases.

Earlier versions explored PlanetScale, Firebase, Supabase and a Postgres/Zero design with Solid, Hono and Bun. A later July 2026 repository revision uses Next.js, React and SQLite through Drizzle, with local media in development and S3 storage support. The screenshots show that later application.

The retrospective records two working hackathon pieces built with a collaborator: an inline review-writing assistant and a multi-agent quorum validator. It separately acknowledges that the wider exchange never reached a real musician trial.

The later code organizes credits and karma as append-only ledgers. Review requests and assignments have expiry rules, and domain functions accept the database and time explicitly for testing. The review cockpit uses wavesurfer.js for listening requirements and timestamped feedback; quality scoring combines a heuristic pass with an optional model pass.

FEATURE WALKTHROUGH

Inside the software.

A collaborative music workspace for song versions, stem playback, timestamped reviews, and guest listening. This walkthrough uses the July 6, 2026 Next.js snapshot (d2e09cff), running locally with synthetic tracks and reviews.

01 / FEATURE

Song and version workspace

Creators upload songs and revisions into a project workspace and track releases and feedback through a version tree.

Song and version workspace in the running musephoria interfaceView full size ↗
Two song versions, revision notes, listener reactions, and collaborator controls. Synthetic tracks and reviews in the July 6 Next.js snapshot; no stems have been uploaded in this fixture.
HOW IT WORKS

Next.js app with SQLite/Drizzle domain and upload/media routes; version-tree UI visualizes relationships between versions.

UI captured locally. Data and integration limits are noted above.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/app/dashboard/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/submit/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/songs/[id]/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/versionTree/VersionTree.tsx
  • spencermorris04/musephoria @ d2e09cff: src/domain/releases.ts
02 / FEATURE

Multistem listening and mix controls

The player presents uploaded stems in a synchronized timeline with per-stem controls, meters, and a shared transport for listening to a mix.

HOW IT WORKS

Stem console, PlayerProvider, waveform strips, annotated timeline, audio queue and media streaming/peaks endpoints support playback UI.

Present in the reviewed source.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/components/player/StemsConsole.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/player/PlayerProvider.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/player/AnnotatedTimeline.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/api/media/[id]/stream/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/media/[id]/peaks/route.ts
03 / FEATURE

Version comparison and A/B listening

Listeners can compare song versions and mix snapshots, switching between takes to hear changes in context.

HOW IT WORKS

Dedicated compare route and compare state/bar components keep selection state for versions and mix snapshots.

Present in the reviewed source.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/app/songs/[id]/compare/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/player/CompareBar.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/player/compareState.ts
  • spencermorris04/musephoria @ d2e09cff: src/components/player/snapshotMix.ts
04 / FEATURE

Timestamped listening feedback

Reviewers can attach comments and reactions to moments in a song, tying discussion to what they heard in the track.

Timestamped listening feedback in the running musephoria interfaceView full size ↗
Review cockpit with listen-gated prompts, timestamped notes, specificity checks, and the persistent player. Synthetic local audio and assignment; no review was submitted.
HOW IT WORKS

Draft comments and feedback context are handled in player components; feedback and reaction domain/API routes persist interactions.

UI captured locally. Data and integration limits are noted above.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/app/review/[id]/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/player/draftComments.ts
  • spencermorris04/musephoria @ d2e09cff: src/components/player/feedbackContext.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/reactions.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/feedback/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/reactions/route.ts
05 / FEATURE

Reviewer queue and assignments

The review queue organizes assigned listening work, while reviewers claim or submit feedback through request-specific review screens.

Reviewer queue and assignments in the running musephoria interfaceView full size ↗
Authenticated dashboard with review assignments, credits, and received feedback. July 6 Next.js snapshot running locally with synthetic users and tracks.
HOW IT WORKS

Queue and assignment claim/submit APIs connect queue pages to persisted review requests and reviewer work.

UI captured locally. Data and integration limits are noted above.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/app/queue/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/reviewers/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/api/assignments/claim/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/assignments/[id]/submit/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/queue.ts
06 / FEATURE

Feedback quality and reviewer reputation

The product tracks reviewer quality and reputation signals, supporting trust-aware assignment and progression rather than treating every review as equivalent.

Feedback quality and reviewer reputation in the running musephoria interfaceView full size ↗
Received feedback with ratings and an applied marker. These are seeded reviews and ratings, not feedback from real musicians.
HOW IT WORKS

Quality, karma, and matching modules calculate feedback and reviewer signals; the reputation page exposes a selected view.

UI captured locally. Data and integration limits are noted above.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/domain/quality.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/karma.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/matching.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/reputation/page.tsx
  • spencermorris04/musephoria @ d2e09cff: docs/self-review-and-matching-design.md
07 / FEATURE

Reviewer levels and feature unlocks

Reviewer progress unlocks selected capabilities as quality and contribution thresholds are met; locked features explain their progression requirement.

Reviewer levels and feature unlocks in the running musephoria interfaceView full size ↗
Reviewer levels, reliability, and badges. This fixture uses an admin account with all levels unlocked; it does not demonstrate a user earning those levels.
HOW IT WORKS

Shared feature-shape mapping drives gates and unlock API; LockedCard and LevelChip communicate state in UI.

UI captured locally. Data and integration limits are noted above.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: docs/BUILD-LOG.md
  • spencermorris04/musephoria @ d2e09cff: src/domain/unlocks.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/me/unlocks/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/components/unlocks/LockedCard.tsx
  • spencermorris04/musephoria @ d2e09cff: src/components/unlocks/LevelChip.tsx
08 / FEATURE

Guest listening links

Creators can share a song with a guest listener through a tokenized route that renders a guest player without granting account or workspace access.

HOW IT WORKS

Share token page and guest-player UI resolve allowed media URLs separately; share/access domain limits what the guest can fetch.

Present in the reviewed source.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: docs/BUILD-LOG.md
  • spencermorris04/musephoria @ d2e09cff: src/app/s/[token]/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/s/[token]/GuestPlayer.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/api/share/[token]/urls/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/mediaAccess.ts
09 / FEATURE

Reviewer practice and calibration

Practice tasks and calibration flows let reviewers build and check feedback skill before taking on more demanding work.

HOW IT WORKS

Practice and forms domain modules support onboarding/training completion and related quality calibration records.

Present in the reviewed source.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/domain/practice.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/forms.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/onboarding/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/api/onboarding/practice/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/app/api/training/complete/route.ts
  • spencermorris04/musephoria @ d2e09cff: docs/BUILD-LOG.md
10 / FEATURE

Notifications and feedback forms

Members can manage notifications and community feedback forms provide structured collection and result views.

HOW IT WORKS

Notification preferences and forms have dedicated pages/APIs; form results are permissioned through separate routes.

Present in the reviewed source.

Implementation references
  • spencermorris04/musephoria @ d2e09cff: src/app/notifications/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/feedback/forms/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/feedback/forms/[id]/results/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/app/api/notifications/route.ts
  • spencermorris04/musephoria @ d2e09cff: src/domain/notify.ts
04 / WORKING METHOD

Building and checking it.

Most of the work went into mechanism design and successive foundations. The published retrospective identifies that imbalance directly: each migration solved a real technical limitation while delaying the test of the core social behavior.

The lesson is to build the smallest experiment that can disprove the central assumption. In this case, that was whether two strangers would exchange useful feedback under a simple playback constraint.

05 / STATUS & LIMITS

The earlier retrospective describes an unlaunched exchange and collaborative hackathon components. The later Next.js app runs locally, including its built-in example review pages. This capture does not establish production adoption, successful peer exchanges or the validity of the incentive model.

Source notes

Based on repository code and project records reviewed on October 30, 2026. Historical checks are described as recorded, not rerun for this article. Screenshots, renders, and mockups are labeled individually.

  • aspera-protocol/src/content/projects/musephoria.mdx
  • spencermorris04/musephoria @ d2e09cff: README.md
  • spencermorris04/musephoria @ d2e09cff: src/app/examples/page.tsx
  • spencermorris04/musephoria @ d2e09cff: src/domain/quality.ts
← All projectsNEXT PROJECTSecond Renaissance →