Skip to content

Personal Projects

Personal apps I design, build, and ship end-to-end — beyond the day job.

Featured personal project

LoopBeat

Your music. Everywhere.

A passwordless, invite-gated personal music tool. Paste a YouTube URL, a search, or a Spotify / Apple Music playlist link — LoopBeat downloads the audio, transcodes it to MP3 or AAC, stores it in object storage, and hands you a short-lived signed download link.

Astro + React 19FastAPI · Python 3.11Postgres + Cloudflare R2

How it's built

Front to back, every connected service — at a glance.

Frontend

Astro 5 static site with React 19 "islands", deployed on Vercel. The browser only ever talks to its own origin — Vercel rewrites /api/* to the backend server-side, so sessions stay first-party.

Astro 5React 19TailwindTypeScriptVercel

Backend

FastAPI (Python 3.11) in a container on Render. Downloads run as background tasks — yt-dlp pulls the audio, ffmpeg transcodes it — and can be offloaded to a self-hosted worker on my home server, reached securely over a Cloudflare Tunnel.

FastAPIyt-dlpffmpegRenderCloudflare Tunnel

Database

Neon / Postgres via SQLAlchemy holds the metadata only — users, sessions, jobs, playlist matches. The audio itself never lives in the DB. Secrets are stored as hashes, never plaintext.

Neon PostgresSQLAlchemyAlembic

Audio storage

The actual audio files live in Cloudflare R2 object storage under random keys. Playback and downloads go through short-lived signed links that the app refreshes for you, so your library stays available without exposing the raw files.

Cloudflare R2Random keysAuto-refreshed links

Login

Passwordless and invite-gated. Request a magic link by email (delivered via Resend) or sign in with a passkey (WebAuthn) — either way you land in the same secure session, with no password ever stored.

Magic linkPasskeysResendInvite-gated

Connected services

Spotify & Apple Music supply playlist metadata; the YouTube Data API powers the live search autocomplete in the download box; yt-dlp fetches the real audio from YouTube.

Spotify APIApple MusicYouTube Data APIyt-dlp

From a link to your library

How a song actually gets stored and served.

  1. Paste or searchA YouTube / Spotify URL or a plain query
  2. Downloadyt-dlp pulls best-available audio
  3. Transcodeffmpeg → MP3 or AAC at 192 / 320 kbps
  4. Store in R2Uploaded to Cloudflare under a UUID key
  5. Signed linkA short-lived signed URL to play / save

Inside the app

Dashboard and live search.

Dashboard — download form + history