🚀. Socket Launch Week Day 3:Socket Firewall Now Blocks Malicious VS Code and Open VSX Extensions.Learn more
Sign In

streamline-md

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

streamline-md

Streamline by FlameonLabs - an open-source WebUI for yt-dlp.

latest
Source
npmnpm
Version
1.2.0
Version published
Maintainers
1
Created
Source
Streamline

Streamline

A beautiful, open-source WebUI for yt-dlp

Download videos and audio from 1000+ platforms — YouTube, TikTok, Instagram, Twitter/X, Facebook, and more.

Version License Bun

Streamline Screenshot

✨ Features

  • 1000+ supported platforms via yt-dlp — YouTube, TikTok, Instagram, Twitter/X, SoundCloud, Bandcamp, and hundreds more
  • Format picker — choose resolution (4K, 1080p, 720p, 480p) or audio-only; defaults to best MP4
  • Download queue — sequential queue with drag-to-reorder, pause/resume, and retry
  • Live logs — real-time yt-dlp stdout/stderr streamed to the terminal panel via WebSocket
  • Download history — persistent log of all past downloads with file-open shortcut
  • Playlist support — bulk-select individual playlist entries before downloading
  • Advanced options — subtitles, thumbnails, metadata embedding, SponsorBlock, rate limiting, custom yt-dlp flags
  • Cookie authentication — upload browser cookies for age-restricted or members-only content
  • Dark & light theme — toggle in the sidebar; preference persisted to localStorage
  • Desktop notifications — browser notifications on download complete

🚀 Quick Start

Prerequisites

ToolVersionNotes
Bun>= 1.1JavaScript runtime + package manager
Python>= 3.9Required for yt-dlp
yt-dlplatestAuto-installed on first run
ffmpeganyAuto-installed via npm package

Install & Run

# Install (downloads yt-dlp and ffmpeg automatically)
npx streamline

# Or install globally:
npm install -g streamline
streamline

The app opens at http://localhost:7979

Development Mode

git clone https://github.com/flameonlabs/streamline
cd streamline
bun install
bun run dev

🖥️ Usage

  • Paste a URL into the input bar — metadata is fetched automatically
  • Pick a format in the right panel (defaults to best MP4)
  • Click Download — the video moves to the queue immediately
  • Watch progress in the Queue panel and live yt-dlp output in the Logs panel
  • Open the file when complete using the folder icon

Batch Downloads

Click Batch next to the URL bar, paste multiple URLs (one per line or comma-separated), then click Download All.

Playlists

Paste a playlist URL — Streamline detects it automatically and shows a checklist. Select individual entries, then click Download Selected.

⚙️ Settings

General

SettingDefaultDescription
Output folder~/Downloads/StreamlineWhere completed files are saved
Filename template%(title)s.%(ext)syt-dlp output template

Download Options

OptionDefault
Video formatMP4
Audio format (audio-only)MP3
SubtitlesOff
Embed metadataOff
SponsorBlockOff
Concurrent fragments8
Rate limitUnlimited
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.

Environment

If yt-dlp or ffmpeg is not detected, go to Settings → Environment and click Repair to re-provision all dependencies.

🏗️ Architecture

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)

Data Flow

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

🔌 API Reference

MethodEndpointDescription
GET/api/formats?url=Fetch media metadata and formats
POST/api/downloadQueue a new download
GET/api/download/statusGet current queue state
DELETE/api/download/:idCancel/remove a download
POST/api/download/retryRetry a failed download
PATCH/api/download/reorderReorder queue
POST/api/download/open-folderOpen file location in OS
GET/api/historyGet download history
DELETE/api/historyClear all history
GET/api/envGet environment status
POST/api/env/repairRe-provision dependencies
WS/wsReal-time progress + log events

WebSocket Events (server → client)

Event typeFieldsDescription
starteddownloadIdDownload process spawned
progressdownloadId, progress, speed, eta, filesize, lineProgress update
mergingdownloadId, lineffmpeg merge started
completedownloadId, filepath, titleDownload finished
errordownloadId, errorDownload failed
logdownloadId, lineRaw yt-dlp output line
pauseddownloadId, progressDownload paused
env_statusdataEnvironment health update
provision_loglineProvisioning log line
provision_donesuccessProvisioning complete

🛠️ Troubleshooting

Downloads stuck at 0%

  • Check Settings → Environment — yt-dlp and ffmpeg must both show OK
  • For fragmented videos (YouTube 1080p+), progress updates in chunks — this is normal
  • Open the Live Logs panel to see raw yt-dlp output

"Sign in to confirm you're not a bot"

  • Upload YouTube cookies in Settings → Cookie Authentication
  • Export cookies from a fresh private/incognito YouTube session

No Live Logs appearing

  • Ensure the WebSocket indicator (bottom of sidebar) shows connected
  • Try refreshing — the WS auto-reconnects with exponential backoff

yt-dlp binary not found

  • Run repair: Settings → Environment → Repair
  • Or manually: pip install -U yt-dlp

ffmpeg not found / merge errors

  • ffmpeg is bundled via npm. Run bun install to reinstall
  • Or set a custom path in Settings → Environment

🤝 Contributing

Contributions 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

📄 License

MIT © FlameonLabs

Made with ♥ by FlameonLabs

Keywords

yt-dlp

FAQs

Package last updated on 06 May 2026

Did you know?

Socket

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.

Install

Related posts