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.

web

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
dns

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
storage

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
cloud

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
lock

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
hub

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. link
    Paste or searchA YouTube / Spotify URL or a plain query
    arrow_forward
  2. download
    Downloadyt-dlp pulls best-available audio
    arrow_forward
  3. graphic_eq
    Transcodeffmpeg → MP3 or AAC at 192 / 320 kbps
    arrow_forward
  4. cloud_upload
    Store in R2Uploaded to Cloudflare under a UUID key
    arrow_forward
  5. vpn_key
    Signed linkA short-lived signed URL to play / save

Inside the app

Dashboard and live search.

Dashboard — download form + history