tapedeck.local
v1.1 · runs on your machine
Get it on GitHub Buy me a coffee
Local-first audio capture · open source

Web audio, extracted locally and privately.

tapedeck.local pulls audio from YouTube and 1000+ other sites as MP3, M4A, Opus, WAV, or FLAC, entirely on your machine. No cloud. No browser save dialog. Just files where you wanted them.

Python 3.8+ · FFmpeg-powered · Single-exe build · Light + dark
http://127.0.0.1:5050 · tapedeck.local
Main view: paste, watch reels spin, file lands on disk.
Why tapedeck

Four opinions web downloaders missed.

Built for the small frictions: where files go, what they're named, what the page is trying to push on you, and whether the web app feels like an app or a script in disguise.

Disk-save, not browser-save

Files land directly in your configured folder, no ~/Downloads detour, no save dialog, no mystery filename.

Local, period.

Flask + yt-dlp + FFmpeg, all on 127.0.0.1. Nothing leaves your computer. No accounts. No telemetry. No API.

No ads. No scams. No malware.

The usual "YouTube to MP3" sites are a minefield of pop-ups, fake download buttons, sketchy installers, and trackers. This is a static page on localhost, with zero ads, zero redirects, zero third parties watching.

File-manager native

Reveal-in-folder pops Explorer / Finder / your file manager focused on the exact file. Collision-safe names. Zero hunt-and-peck.

The queue

Phase-aware progress, in plain words.

Each row narrates its own state: resolving… → queued → downloading 47% → converting… → ✓ saved, backed by a slim accent-coloured fill bar tied to real yt-dlp progress hooks. No spinners pretending to be busy, no localhost transfer theatre.

  • Up to 4 parallel downloads, configurable
  • Click a queued row to promote it to front of line
  • Retry failed, clear ✓, clear all: one click each
  • Queue survives reloads & re-attaches to live workers
http://127.0.0.1:5050 · tapedeck.local
Active queue with two rows mid-download
Formats

Five formats. Four bitrates. Persisted preferences.

mp3 128 · 192 · 256 · 320 m4a aac opus webm wav lossless flac lossless
Filename template

Drag pills. Name files. Move on.

The filename builder is a drag-and-drop pill canvas: drop a token ({title}, {channel}, {uploader}, {id}), drop a separator (–, ·, _, space), reorder by dragging, click × to remove. A live preview shows the rendered filename.

  • Drop anywhere, pills snap into place
  • Live preview using sample metadata
  • Persists in config.json alongside output folder
http://127.0.0.1:5050 · tapedeck.local
Settings modal, filename template builder open
Themes

Light by day. Dark by night. Amber either way.

The whole palette runs on OKLCH tokens, so light and dark match in perceived contrast, and the amber accent stays itself in both. A grain texture sits on top of everything for the cassette feel without the cassette weight.

  • Light · dark · accent & density tweaks
  • Geist + Geist Mono, with ligatures off in mono for clarity
  • Reduced-motion friendly: reels stop, shimmers pause
http://127.0.0.1:5050 · tapedeck.local
Dark-mode hero: same deck, amber accent shifted to brand mark.
Input

Paste anything. We’ll figure it out.

Drop a browser tab on the page. Paste five URLs separated by spaces, commas, or newlines, and each becomes its own row. The app even peeks at your clipboard on focus and offers an "add" pill when it spots a YouTube link. Press Enter on a duplicate and the existing row shakes so you don’t doubt you hit the key.

  • Multi-paste, drag-drop, clipboard detect
  • Playlist expansion: one URL becomes N rows
  • Ctrl/Cmd+K or / focuses input from anywhere
http://127.0.0.1:5050 · tapedeck.local
Clipboard hint and expanded playlist
How it works

Four complex pieces. One nice surface.

No build step, no framework lock-in. React 18 via UMD, Babel-standalone for JSX, and a tiny Flask app gluing yt-dlp and FFmpeg together.

Web server Flask + Waitress Localhost-only WSGI, threaded jobs, polling progress endpoint.
Audio download yt-dlp YouTube + 1000+ sites, progress hooks streamed to the client.
Conversion FFmpeg External binary, auto-detected from PATH or common install dirs.
Frontend React 18 (UMD) JSX via Babel-standalone, no bundler, no node_modules, no build.

Local audio. Yours to keep.

Download the zip file from GitHub, uncompress, double-click, done. Your browser opens it automatically.
If it saves you an afternoon of fighting browser save dialogs and ads, coffee is appreciated.