Skip to content
Waveline
Log in Log in Sign up

How Waveline works

A live signal, from source to screen

Waveline is a small production system, not a demo. Here's what actually runs behind every search.

Data sources

Last.fm supplies listener counts, scrobbles, tags and similar-artist relationships. Spotify supplies genres and popularity via the Client Credentials flow. Deezer supplies artist artwork, fan counts, 30-second track previews and the trending-albums strip — no API key required.

Automated Python pipeline

A single pipeline module fetches, cleans and merges the three sources for a searched artist, then hands the result to Claude for analysis before writing it to the database.

PostgreSQL storage

Searches, insights, users, posts, follows, likes, comments and notifications are stored in Postgres via raw parameterised SQL — no ORM — so every search builds a durable, queryable history.

Claude-generated insights

Anthropic's Claude reads the merged listening data and writes the plain-language artist insight, comparison verdicts and taste profiles you see on Waveline — always labelled as AI-generated.

Flask application

The product itself is a server-rendered Flask app: Jinja templates, a shared design system, and thin blueprints per feature (discovery, artist profiles, compare, news, taste, community).

Railway deployment

Waveline runs on Railway behind Gunicorn, with the same Postgres instance backing both the web app and the data pipeline.

Community system

Accounts, follows, posts, likes, comments and notifications are built on the same database and Flask-Login session model as the rest of the app — no separate service.

Python Flask PostgreSQL Anthropic Claude Spotify API Last.fm API Deezer API Railway

Interested in the project?

Waveline is built and maintained by Dimos Papageorgiou. Take a look at the code, or get in touch.

Build with Waveline → View source on GitHub