Back

Orfeo

macOS

The party picks the music. The app mixes it.

Participative auto-DJ — guests propose and vote from their phones, an autonomous brain decides what to play and when.

SwiftSwiftUIMusicKitSupabaseNext.jsTypeScript
Private code

About

The party decides, the app executes

Orfeo — after Monteverdi's L'Orfeo — is a participative auto-DJ. Guests at a party propose and vote on tracks from their phones, without installing any app, and an autonomous brain decides what to play and when, mixing on its own when the stream of suggestions dries up.

The constraint that defines the project: the app is the DJ. It schedules and drives playback in real time, while the curation logic stays entirely platform-agnostic.

Three layers, one golden rule

On the guest side, a web app (Next.js) serves catalog search, voting and dedications. On the host side, a native macOS app (SwiftUI + MusicKit) subscribes to live state and drives ApplicationMusicPlayer. Between them, Supabase is the source of truth — every track is keyed by its ISRC, never a native URI.

The golden rule: the brain (CurationEngine) never knows the playback platform. It receives a snapshot of live state and emits an ordered plan of tracks. Only the adapters touch Apple Music. All business logic lives in pure, testable units — never in a SwiftUI View or a React component.

The brain

The CurationEngine scores each candidate — log-normalized votes, energy/mood fit, party-phase fit, dedication bonus, anti-repetition penalties on artist and genre — and produces an ordered queue, deterministic aside from injected jitter. When proposals run dry, auto-continue navigates a real catalog from what the room is listening to — each track leads to its artist, that artist's radio and related artists — and falls back on reference tracks chosen by the organiser. The local LLM never proposes a title: it only supplies genres and tags, so a filler can never be a track that doesn't exist.

Why

Orfeo started from a concrete need: run the music for a real party without anyone glued to the speakers all night. v1 did it on August 14, 2026: a 45-guest birthday, from noon to 3 a.m.; what follows explores a self-serve service so anyone can do the same.

Roadmap

  1. v2 — Self-serve service

    Planned

    iOS host, hosted LLM inference (dropping the local Ollama dependency), Stripe billing + self-serve accounts, and the legal compliance of a paid service.

  2. vNext — Sharpening & openness

    Planned

    Spotify adapter (the brain stays agnostic), a post-event souvenir playlist, and scoring refinements (velocity, era, transitions).

  3. v1 — End-to-end live party

    Shipped2026-08

    Guest web app (propose/vote/mood/dedication), a macOS host driving Apple Music, a platform-agnostic curation brain, and auto-continue when the pool runs dry. Ran a 45-guest birthday party, from noon to 3 a.m.

  4. Pure, testable curation brain

    Shipped2026-06

    Deterministic scoring (log-normalized votes, energy/mood/phase fit, anti-repetition penalties) fully isolated from any playback platform.

  5. Real-time playback via Apple Music

    Shipped2026-06

    The macOS host resolves ISRCs and reconciles the ApplicationMusicPlayer queue, synced in real time through Supabase.

  6. No-install guest web app

    Shipped2026-06

    Catalog search, proposing, upvoting, mood and dedications from the browser — nothing to install.

More from patolabs