
Product
Socket MCP Adds Org Alerts, Threat Feed Review, and Package Inspection
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.
streamline-md
Advanced tools
A beautiful, open-source WebUI for yt-dlp
Download videos and audio from 1000+ platforms — YouTube, TikTok, Instagram, Twitter/X, Facebook, and more.
| Tool | Version | Notes |
|---|---|---|
| Bun | >= 1.1 | JavaScript runtime + package manager |
| Python | >= 3.9 | Required for yt-dlp |
| yt-dlp | latest | Auto-installed on first run |
| ffmpeg | any | Auto-installed via npm package |
# Install (downloads yt-dlp and ffmpeg automatically)
npx streamline
# Or install globally:
npm install -g streamline
streamline
The app opens at http://localhost:7979
git clone https://github.com/flameonlabs/streamline
cd streamline
bun install
bun run dev
Click Batch next to the URL bar, paste multiple URLs (one per line or comma-separated), then click Download All.
Paste a playlist URL — Streamline detects it automatically and shows a checklist. Select individual entries, then click Download Selected.
| Setting | Default | Description |
|---|---|---|
| Output folder | ~/Downloads/Streamline | Where completed files are saved |
| Filename template | %(title)s.%(ext)s | yt-dlp output template |
| Option | Default |
|---|---|
| Video format | MP4 |
| Audio format (audio-only) | MP3 |
| Subtitles | Off |
| Embed metadata | Off |
| SponsorBlock | Off |
| Concurrent fragments | 8 |
| Rate limit | Unlimited |
| Custom yt-dlp flags | - |
For age-restricted, members-only, or login-required content, export cookies from your browser using the cookies.txt format and upload in Settings → Cookie Authentication.
If yt-dlp or ffmpeg is not detected, go to Settings → Environment and click Repair to re-provision all dependencies.
streamline/
├── server/ # Bun + Elysia backend
│ ├── index.js # Server entry, WebSocket upgrade
│ ├── routes/ # REST API routes
│ │ ├── download.js # Queue management endpoints
│ │ ├── formats.js # yt-dlp metadata fetch
│ │ ├── env.js # Environment status + repair
│ │ ├── history.js # Download history
│ │ └── cookies.js # Cookie file management
│ ├── services/
│ │ ├── ytdlp.js # yt-dlp process management + progress parsing
│ │ ├── queue.js # Sequential download queue
│ │ ├── environment.js # Tool resolution (yt-dlp, ffmpeg, bun)
│ │ ├── history.js # Persistent history (JSON file)
│ │ ├── cookies.js # Cookie file storage
│ │ └── temp.js # Temp directory lifecycle management
│ └── ws/
│ └── handler.js # WebSocket client manager + broadcast
│
├── src/ # React frontend
│ ├── App.jsx
│ ├── pages/
│ │ ├── DownloadPage.jsx
│ │ ├── HistoryPage.jsx
│ │ └── SettingsPage.jsx
│ ├── components/ # All UI components
│ ├── hooks/
│ │ ├── useStore.js # Zustand global state
│ │ └── useWebSocket.js # WS client + polling fallback
│ └── lib/utils.js
│
├── bin/streamline.js # npx entry point
├── scripts/
│ └── provision.js # yt-dlp + ffmpeg setup
└── dist/ # Built frontend (generated)
User pastes URL
→ GET /api/formats → yt-dlp --dump-json → media info displayed
User clicks Download
→ POST /api/download → DownloadQueue.add()
→ processNext() → ytdlp.startDownload()
→ stdout/stderr piped → onProgress / onLog callbacks
→ queue.emit({ type: 'progress'|'log', ... })
→ wsManager.broadcast() → WebSocket → useWebSocket.js
→ Zustand store.updateDownload() / appendLog()
→ React re-render → progress bar + live logs update
| Method | Endpoint | Description |
|---|---|---|
GET | /api/formats?url= | Fetch media metadata and formats |
POST | /api/download | Queue a new download |
GET | /api/download/status | Get current queue state |
DELETE | /api/download/:id | Cancel/remove a download |
POST | /api/download/retry | Retry a failed download |
PATCH | /api/download/reorder | Reorder queue |
POST | /api/download/open-folder | Open file location in OS |
GET | /api/history | Get download history |
DELETE | /api/history | Clear all history |
GET | /api/env | Get environment status |
POST | /api/env/repair | Re-provision dependencies |
WS | /ws | Real-time progress + log events |
| Event type | Fields | Description |
|---|---|---|
started | downloadId | Download process spawned |
progress | downloadId, progress, speed, eta, filesize, line | Progress update |
merging | downloadId, line | ffmpeg merge started |
complete | downloadId, filepath, title | Download finished |
error | downloadId, error | Download failed |
log | downloadId, line | Raw yt-dlp output line |
paused | downloadId, progress | Download paused |
env_status | data | Environment health update |
provision_log | line | Provisioning log line |
provision_done | success | Provisioning complete |
Downloads stuck at 0%
"Sign in to confirm you're not a bot"
No Live Logs appearing
yt-dlp binary not found
pip install -U yt-dlpffmpeg not found / merge errors
bun install to reinstallContributions are welcome! Please read the contributing guidelines and open an issue before submitting large PRs.
bun run test # Run all tests
bun run test:server # Server-side tests only
bun run build # Production build
MIT © FlameonLabs
FAQs
Streamline by FlameonLabs - an open-source WebUI for yt-dlp.
We found that streamline-md demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.

Product
Socket Firewall blocks malicious VS Code and Open VSX extensions before install, protecting developers from compromised editor marketplaces.

Research
More than 140 Mastra npm packages were compromised in a supply chain attack that used a typosquatted dependency to deliver a cross-platform infostealer during installation.