A YouTube Frontend That Runs on Your Terms, Your Hardware, and Your Local AI
You know the feeling: you open YouTube to watch one video and forty minutes later you're three recommendations deep into something you didn't even want to see. The algorithm is doing its job—it's just not your job. What if you could keep the videos but ditch the noise, the clickbait thumbnails, and the endless scroll? That's exactly what my-yt is built for.
What It Does
my-yt is a minimal YouTube frontend that sits on top of yt-dlp. You run it yourself, add the channels you actually care about, and it fetches their latest videos every 30 minutes—no API key required. Everything shows up in chronological order, and from there you decide what's worth your time.
The app downloads videos locally using yt-dlp behind the scenes, which means you can watch them offline and stream them to any device on your home network. It strips out sponsor segments automatically via SponsorBlock, transcodes to h264 for compatibility (handy for iOS), and supports background playback, Picture-in-Picture, and Chromecast natively. There's also an optional AI layer: point it at a local model like Ollama or LMStudio, or a hosted provider like OpenAI or Anthropic, and it'll summarize video content for you. Persistence is handled entirely through JSON files—no database, no migration headaches, just files you can back up and inspect.
Why It's Cool
It's aggressively simple under the hood. No JS frameworks on the client or server side—just HTML and CSS. The only dependency is nano-spawn, which itself has no transient dependencies. In a world where a video player ships with a 200MB node_modules, that's a deliberate and refreshing choice. It also means less surface area for things to break.
The feature list reads like a wishlist of YouTube annoyances solved. You can disable clickbait thumbnails entirely. You can ignore videos you don't want to watch so they stop cluttering your feed. You can bookmark videos with timestamps and notes (just press b while watching). Subtitles use the native <track> element and WebVTT API rather than some custom player implementation.
The AI integration is provider-agnostic. You're not locked into one vendor. Set AI_HOST and AI_MODEL to point at a local instance, or swap in an API key for OpenAI or Anthropic. The defaults assume a local setup at 127.0.0.1:1234, which tells you where the author's priorities lie—local first, cloud optional.
Hosting it on your home network turns it into a personal media server. Download once, watch on your laptop, phone, or TV. Combined with offline playback and automatic transcoding, it covers the practical cases without asking you to set up Plex or Jellyfin.
JSON files for persistence is the right call here. You can open your data in any text editor, back it up with a copy command, and reason about it without a schema. For a single-user app, that's plenty.
How to Try It
You'll need Node.js, plus yt-dlp and ffmpeg installed on your system. Then:
git clone https://github.com/christian-fei/my-yt.git
cd my-yt
npm i
npm start
The app runs at http://localhost:3000. If you'd rather use Docker:
docker run -d -p 3000:3000 -v $HOME/my-yt-data:/app/data christianfei/my-yt:latest
To enable AI summaries, set the relevant environment variables—either in a .env file (copy .env.example as a template) or inline:
AI_MODEL=gpt-4o-mini AI_HOST=https://api.openai.com AI_APIKEY=sk-proj-123 npm start
You can also adjust UPDATE_INTERVAL_MINUTES (default 30) and AI_TEMPERATURE (default 0). Once it's running, head to the settings page to add channels, set download quality, and clean up disk space.
Full instructions and the current todo list live at github.com/christian-fei/my-yt.
Final Thoughts
my-yt isn't trying to replace YouTube—it's trying to make your slice of it quieter and more intentional. It's best suited for people who already self-host a thing or two, are comfortable with a terminal, and want their subscriptions to feel like a feed they chose rather than one chosen for them. The reliance on yt-dlp means you're always at the mercy of YouTube's changes, so expect occasional breakage. But if you've been looking for a reason to point a local model at something useful, this is a pretty good one.