This software is provided as a technical demonstration and is intended for use only with content that you own or have explicit rights to download, such as CC0 or Creative Commons–licensed media. The author does not encourage, support, or condone the use of this software in violation of applicable laws or third-party terms of service.
A desktop YouTube downloader built with Wails (Go + React).
A few years back I built ElectronYoutubeDownloader as a fun weekend project to mess around with Electron. It worked, but Electron apps are... chunky.
When I discovered Wails, I wanted to see what a native Go backend with a React frontend felt like. This is basically a rewrite of that project, but lighter, faster, and with some extra goodies I always wanted to add.
- YouTube Downloads - Paste a URL, pick a format, download
- Multiple Formats - MP3, M4A, MP4, WebM
- Queue System - Add multiple videos, download them in parallel
- Browse & Search - Search YouTube or check trending videos directly in the app
- Standalone Converter - Convert local media files using FFmpeg with pre-made presets
- Auto FFmpeg - Don't have FFmpeg? The app will download it for you
- Auto Updates - Check for updates from within the app
- Themes - Light/dark mode + accent color customization
- Localization - English, German, Spanish, French, Portuguese, Bulgarian, Greek
- Cross-platform - Linux, Windows, macOS
| Layer | Tech |
|---|---|
| Backend | Go 1.25, kkdai/youtube |
| Frontend | React 19, TypeScript, Tailwind CSS, Zustand |
| Framework | Wails v2 |
| UI Components | shadcn/ui |
- Go 1.25+
- Node.js 20+
- Wails CLI:
go install github.com/wailsapp/wails/v2/cmd/wails@latest
Linux only:
# Ubuntu/Debian
sudo apt-get install libgtk-3-dev libwebkit2gtk-4.1-dev
# Fedora
sudo dnf install gtk3-devel webkit2gtk4.1-devel# Clone the repo
git clone https://github.com/teofanis/ybdownloader.git
cd ybdownloader
# Install deps
npm install # root (husky, lint-staged)
cd frontend && npm install && cd ..
# Run in dev mode (hot reload)
wails dev# Build for your current platform
wails build
# The binary ends up in build/bin/# Go tests
go test ./...
# Frontend tests
cd frontend && npm test
# With coverage
go test -cover ./...
cd frontend && npm run test:coveragePre-commit hooks are set up via Husky. On commit, it runs:
gofmt+go vet+golangci-lintfor Go filesprettier+eslintfor TypeScript/React files
You can also run manually:
npm run lint # lint everything
npm run lint:go # just Go
npm run lint:frontend # just frontend.
├── internal/
│ ├── app/ # Wails app, bindings to frontend
│ ├── core/ # Domain models, interfaces, errors
│ └── infra/ # Downloader, queue, converter, settings, updater
├── frontend/
│ ├── src/
│ │ ├── features/ # Downloads, Settings, Browse, Converter, About
│ │ ├── components/
│ │ ├── store/ # Zustand store
│ │ └── locales/ # i18n translations
│ └── wailsjs/ # Generated Go bindings
├── build/ # Build assets (icons, manifests, entitlements)
└── scripts/ # Lint scripts
- Playlist support
- Library support (Online Sync or Backup)
- Social Sharing / Listening now support ?
- Share Playlists from local (tunneling ?)
- Would be fun to play with (Listen together with friends)
- Add an actual player + system tray ?
- Auto-organising library /songs - perhaps could also do categorizing etc (AI playtime ?)
- Download history / persistence
- Custom FFmpeg presets in converter
- Subtitle downloads
- More languages
PRs welcome if you want to tackle any of these.
If you find this useful:
- ⭐ Star the repo
- ☕ Buy me a coffee
- 💰 PayPal
- 💖 Thanks.dev
- 💜 Sponsor on GitHub
- Wails - Great framework, makes Go + web UIs feel native
- kkdai/youtube - YouTube client library
- shadcn/ui - Clean component library
- FFmpeg - The backbone of media conversion
MIT - do whatever you want with it.
This started as a playground project and still is one. If something breaks, open an issue!