Private desktop-first music lounge built with Nuxt 4, NuxtHub and the Cloudflare stack.
- Passcode-gated private app shell
- Track upload flow with client-side metadata extraction
- Direct-to-R2 signed upload/download path when R2 credentials are configured
- Local storage proxy fallback for development via NuxtHub Blob
- PostgreSQL-backed metadata for tracks, playlists, settings, queue snapshots and upload jobs
- HTML audio player with queue, repeat, shuffle, volume and Media Session API support
- Animated shader backgrounds plus built-in muted MP4 loop scenes
- PWA manifest and installable desktop experience
nuxt@4@nuxthub/core- Neon/PostgreSQL via NuxtHub database
- Cloudflare
R2via NuxtHub blob and optional S3 presigned URLs Piniafor app statemusic-metadata-browserfor client-side ID3/basic metadataVitestfor utility smoke tests
- Install dependencies:
pnpm install- Copy envs:
cp .env.example .env- Start the app:
pnpm devThe app works without R2 credentials. In that mode uploads are proxied through the app and stored with the local NuxtHub blob driver under .data/.
pnpm dev
pnpm test
pnpm typecheck
pnpm build
pnpm build:cloudflare
pnpm db:generate
pnpm db:migrateProduction deploys run through GitHub Actions and publish the Worker on https://vibe.youwillmiss.dev.
- Make sure the
youwillmiss.devzone stays on Cloudflare DNS. - Create an R2 bucket for media storage.
- Create a GitHub Actions
productionenvironment and set these required secrets:CLOUDFLARE_API_TOKENNUXT_APP_PASSCODENUXT_SESSION_SECRETCLOUDFLARE_ACCOUNT_IDDATABASE_URLR2_ACCESS_KEY_IDR2_SECRET_ACCESS_KEYR2_BUCKET
- Optionally set these production secrets when you need non-default R2 settings:
R2_ENDPOINTR2_REGION
- Push to
mainor manually run theDeploy Cloudflare Productionworkflow.
The deploy workflow runs pnpm test, pnpm typecheck, pnpm db:migrate, pnpm build:cloudflare, and then deploys with Wrangler from the repo root. Schema changes are applied by the explicit CI migration step, not by nuxt build.
If you need to deploy outside GitHub Actions, run the migration explicitly before deploying:
DATABASE_URL=... pnpm db:migrate
pnpm build:cloudflare
pnpm deploy- Built-in loop videos live in public/loops for immediate demo use.
- In production you can upload matching keys like
backgrounds/city-rain.mp4to R2 and the app will start issuing signed playback URLs for them. - The player intentionally does not integrate Spotify or YouTube playback.