Personal Project · Python · Terminal Application

Vibe.py

a personal terminal app for music discovery and movie roulette

ʕ •ᴥ•ʔ ✿ ✿ ✿ Vibe.py v1.0 · starting up ──────────────────── [1] movie roulette [2] song discovery ──────────────────── choose your adventure ›

Origin / Why I Built This

I was inspired by Justin Li, a CS department head at Occidental College, who uses Python terminal programs for everyday tasks. I wanted to build something similarly practical but personal: something that felt like mine. I started by asking what I actually needed. A way to stop being indecisive about movies, and a way to genuinely find music I had never heard, not just cycle back to artists I already know.

What It Does

Movie Roulette

Imports a Letterboxd watchlist CSV, spins a randomized selector, opens the film's page, and optionally removes it from the list.

Song Discovery

Five discovery paths: surprise genre, freeform vibe/mood, own playlists, public playlists, and a quiet/obscure instrumental mode. Filters out known songs and familiar artists. Uses Spotify audio features (energy, valence, danceability) to rank results by mood match.

  • Real-time feedback loop: "too upbeat," "too generic," "not niche enough," etc.
  • Adaptive scoring adjusts across each session based on your responses.

Video Demo

Screen recording walkthrough of movie roulette, song discovery modes, and the adaptive feedback loop.

Technical Highlights

Stack

Python, no heavy dependencies (stdlib + certifi only)

Auth

Spotify OAuth implemented from scratch

Audio Analysis

Audio feature scoring across 5 dimensions

Discovery Pipeline

Adaptive 4-stage discovery pipeline with fallback logic

Anti-Repeat

Session track window + artist rotation

Preferences

Persistent preference profile that evolves with feedback

Caching

Local JSON caching for liked songs, recent picks, and preferences

Browser

macOS browser integration (Opera same-tab behavior)

Skills Demonstrated

Python API Integration OAuth UX Thinking Systems Design Terminal UI

Every design decision in this project came from actual use: identifying where things broke, and going back in to fix them.