Back to portfolio

December 2, 2025

Soulprint

Consumer AI product that turns playlist exports into psychological profiles and shareable story cards without building a tracking business.

Consumer AI
Next.js
Product Engineering
View project

Soulprint is a consumer web app that analyses a user's music taste and turns it into an emotionally legible profile. The output is designed to be shared, but the product is deliberately built without surveillance mechanics.

The Product Logic

Most music products stop at taste classification: genre, artist overlap, listening stats. Soulprint goes after a more interesting question. What does a playlist reveal about the emotional structure underneath it, and how do you package that insight into something people actually want to share?

The business model was engineered around organic distribution rather than paid acquisition. The result is a shareable story card designed for Instagram and TikTok, paired with a privacy model strong enough to make the product feel safe to use.

The System

The application uses a serverless Next.js App Router stack with React 19 and TypeScript. Authentication runs through NextAuth v5 with Resend handling passwordless email delivery. Persistence lives in Vercel KV, with custom key mappings and TTL rules so verification tokens and sessions expire without manual cleanup.

Ephemeral identity

Email sign-in uses one-time magic links, which keeps onboarding fast and removes the operational burden of passwords while fitting the product's privacy stance.

AI analysis pipeline

Claude Sonnet 4, accessed through OpenRouter, receives up to 500 song and artist pairs and returns the structured psychological analysis behind the final experience.

Stateless storage model

Users, sessions, and verification tokens are stored directly in Redis-style keys with built-in expiry windows, including one hour for email tokens and seven days for active sessions.

Handling Messy Inputs Reliably

Consumer input data is never clean. Soulprint accepts playlist exports from multiple sources, including Spotify and YouTube Music, so the parser was built to inspect headers dynamically rather than rely on one rigid CSV template.

Strict JSON contract

The system prompt forces the model to return a predefined JSON structure that the React UI can trust, including colours, icon markers, cluster labels, and emotional framing.

Client-side story generation

Shareable story cards are rendered from a hidden DOM node with html2canvas-pro, producing a downloadable PNG on the user's device and enabling native share flows where supported.

Frontend and AI kept aligned

The UI is not trying to infer design data from prose. The model is required to generate the exact presentation fields the frontend needs, which keeps the experience deterministic.