High-school sweethearts
I chose the songs, wrote every insert, balanced Side A and Side B, and gave each tape to the girl I hoped would hear what I was trying to say.
My wife and I were high-school sweethearts. I made her mixtapes to share what I felt. Years later, she showed me she had kept them. So I built a way for us to keep listening together.

While we were dating, the tapes were my attempt to say through music what I did not always know how to put into words.
We married after college. Since then, we have built an amazing family, share a Christian faith that is central to our life together, and watch our relationship continue to grow stronger every day. I think I’m the luckiest man alive. I found the best woman and partner to do life with.
The mixtapes were there near the beginning. Every track had to earn its place. Every side of the tape had a limit. The order meant something. Each mixtape was a small, handmade message about how I felt about her. Obviously the mixtapes don't deserve credit for everything that followed, but they certainly earned a place in our story.
Recently, my wife showed me that she still had them. The handwriting was fading, there was no way to play them, and music had moved to streaming. When she brought the tapes back out, it became an invitation to learn something new while preserving something irreplaceable.
I chose the songs, wrote every insert, balanced Side A and Side B, and gave each tape to the girl I hoped would hear what I was trying to say.
We married after college and built a family, a shared faith, and a partnership that continues to grow stronger with time.
When she brought the tapes back out, it became an invitation to learn something new while preserving something irreplaceable.
The interface keeps the process understandable: capture the source, review what OCR extracted, connect Spotify, and create the playlist. Automation does the tedious work; the person keeps the final say.
Take a photo or upload an existing image. The original image is stored in Supabase, while a resized JPEG copy is sent to OCR.
Google Vision reads the handwriting; the parser separates columns and proposes titles and artists.
Spotify OAuth uses Proof Key for Code Exchange (PKCE) and requests permission to create public or private playlists and read basic Spotify account details, including email.
Matched tracks are added in order and the mixtape, songs, image, and playlist record are preserved.
The capture flow accepts a camera photo or upload, then shows the exact image that will be analyzed. That matters because the original insert remains the source of truth.
Handwriting recognition gets the process moving, but the review screen makes every detected song editable. The correction step is deliberately visible because confidence is not the same thing as correctness.
The matcher searches Spotify with the parsed title and artist, then scores the candidates using title similarity, artist similarity, Levenshtein distance, and era. Strong matches move forward; uncertain ones remain reviewable.
That makes a useful failure visible. If “You’re the Inspiration” is incorrectly resolved as “You’re the One That I Want,” the original OCR line remains on the card so a person can catch it before creating the playlist.
The final confirmation closes the loop: 20 handwritten entries become 20 playable songs, while the saved history keeps the insert and playlist connected to the story that created them.
The result is more than a Spotify link. Mixtape Memory saves the photographed insert, the OCR text, each matched song, and the finished playlist as one connected record.
The cassette remains the keepsake. The playlist lets the music travel with us again.
The system joins a typed React interface to managed storage, server-side OCR, a purpose-built parser, Spotify search and playlist APIs, and a relational history protected by row-level security.
Vision returns positioned text lines; the client parser turns them into structured tracks.
Each parsed song becomes a Spotify search, then candidate results are ranked instead of blindly accepted.
The application preserves more than a playlist URL; it keeps the source, extraction, match, and result connected.
Secrets and large images are handled where they belong, while the browser stays lightweight.
The workflow screens above show the core transformation. These remaining views complete the product: the invitation to begin, an account that organizes the collection, and the insert at full resolution.





The tapes are part of our story. This project continues it with a modern twist.