A web application for syncing YouTube content to Yoto cards. Download audio from YouTube videos or playlists and upload them directly to your Yoto cards. Deployed on Cloudflare Workers with Containers for YouTube downloading.
- Browse and manage your Yoto cards
- Import audio from YouTube videos and playlists
- Drag-and-drop track reordering
- Track deletion and card management
- Search and sort cards
- Node.js 20+
- Docker Desktop (for local development)
git clone https://github.com/bradgarropy/yoto.git
cd yoto
npm installStart the development server:
npm run devOpen http://localhost:3000 in your browser.
- Click "Login" to authenticate with your Yoto account
- Follow the device code flow instructions
- Once logged in, you'll see all your Yoto cards
- Navigate to a card's detail page
- Click "Add Tracks"
- Paste a YouTube video or playlist URL
- Click "Import" and wait for the sync to complete
npm run dev # Start development server
npm run build # Build for production
npm run deploy # Build and deploy to Cloudflare
npm run test # Run tests
npm run lint # Check for lint errors
npm run typecheck # Check TypeScript types
npm run format # Check code formattingThis app uses Cloudflare Containers for YouTube downloading via yt-dlp. For local development:
- Docker must be installed and running - The Vite dev server uses Docker to run containers locally
- First run builds the container - Takes 2-3 minutes; subsequent runs use cached layers
- Rebuild containers - Press
r+ Enter in the terminal to rebuild after Dockerfile changes
The local development environment runs your Worker code in workerd (the same runtime as production) and containers in Docker, providing near-production behavior.
yoto/
βββ app/
β βββ routes/ # React Router pages
β β βββ home.tsx # Card grid dashboard
β β βββ login.tsx # Device code auth flow
β β βββ cards.$id.tsx # Card detail with tracks
β βββ components/ui/ # shadcn/ui components
β βββ lib/ # Server-side utilities
β βββ auth.server.ts
β βββ youtube.server.ts
β βββ sync.server.ts
βββ public/ # Static assets
βββ images/ # Image assets
- Cloudflare Workers - Edge runtime
- Cloudflare Containers - Serverless containers for yt-dlp
- React Router v7 - Full-stack React framework
- Tailwind CSS - Styling
- shadcn/ui - UI components
- yt-dlp - YouTube downloading (runs in container)
- @yotoplay/yoto-sdk - Yoto API client