Flucto - creator-first desktop media downloader and caption-to-Markdown exporter for short-form and long-form captures.
Flucto is an open-source desktop application for creators and curators who want one flowing way to capture media and turn available captions into Markdown notes from YouTube, X, Reddit, Bilibili, Instagram, Threads, TikTok, and Vimeo.
- ✨ Stunning UI: Apple-inspired dark mode with glassmorphism & smooth animations
- 🌍 Universal Support: Download from YouTube, X, Reddit, Bilibili, Instagram, Threads, TikTok, Vimeo
- 📝 Caption to Markdown: Convert available subtitles/captions into clean
.mdfiles with metadata and timestamps - 📦 Batch Processing: Import
.txtlists to download media or convert caption queues automatically - ⚡ Auto-Setup: Automatically fetches and configures
yt-dlpandffmpegbinaries - 🔒 Privacy First: No tracking, local processing, and proxied thumbnail loading
- 🎵 Format Choice: Save video (MP4), audio extraction (MP3), or Markdown transcript output
- 🛡️ Type Safe: Built with 100% TypeScript for stability and reliability
CLI demo — one channel → many Markdown notes in a dedicated job folder
- Smart Media Engine: Flucto parses single video, playlist, and social-media URLs while sharing platform-specific
yt-dlpheaders, referers, and retry behavior across preview, download, and transcript flows. - Extensible Platform Architecture: Plugin-based
PlatformAdaptersystem — adding a new platform is one file. Supports yt-dlp-based platforms, custom API extraction, and browser-based fallback strategies. - Caption-to-Markdown Conversion: Uses
yt-dlpsubtitle/caption output when available, parses JSON3, XML/SRV3, and VTT captions, cleans caption markup, groups nearby captions into readable paragraphs, and writes filesystem-safe.mdfiles. - Transcript Options: Default new Markdown conversions to English captions (
en) while still allowingAutoor a concrete caption language, include/exclude timestamps and metadata, choose paragraph gap rules, save Markdown files, and optionally copy generated Markdown to the clipboard. - Batch Queue System: Supports loading hundreds of URLs via text files. Batch media downloads and batch transcript conversions both use bounded concurrency so large queues remain responsive.
- Download History: Records output type (
mp4,mp3, ormd) so media downloads and Markdown conversions stay visible in history. - Zero Configuration: Unlike other GUI wrappers, Flucto includes a
setup-binariesscript that automatically downloads the correct version ofyt-dlpandffmpegfor your OS upon installation. - Network Resilience: Implements retry logic, updater metadata checks, and transcript circuit-breaker behavior for unstable connections, rate limits, and unavailable caption sources.
Flucto's logo is a wave-download mark: the 🌊 idea reshaped into a cyan-to-violet flow that curls like a wave and lands as a download arrow. The mark is used consistently across the packaged app icon, favicon, Apple touch icon, web manifest, and social preview card.
Brand assets live in:
| Asset | Path |
|---|---|
| App icon source | assets/icon.png |
| Windows icon | assets/icon.ico |
| Web logo | src/renderer/public/logo.svg |
| Favicon | src/renderer/public/favicon.svg |
| Social preview | src/renderer/public/og-image.svg |
| Brand source of truth | DESIGN.md |
| Mode | What it creates | Best for |
|---|---|---|
MP4 |
Video files from supported URLs | Archiving videos, clips, playlists, and social media posts |
MP3 |
Extracted audio files | Podcasts, lectures, music, and offline listening |
MD |
Markdown transcript files from available captions/subtitles | Research notes, summaries, quote extraction, and searchable archives |
Markdown conversion is caption-based. If a platform or video does not expose captions/subtitles through yt-dlp, Flucto reports the transcript as unavailable instead of silently falling back to speech-to-text. No Python/FastAPI server, Whisper runtime, or external transcription service is embedded.
Flucto ships flucto and the shorter fl command for automation, batch jobs, and AI-agent workflows. The CLI uses the same TypeScript service layer as the desktop app; it does not launch the Electron window and does not call desktop IPC handlers.
# Real command (creates a dedicated job folder under --out)
flucto channel to-md "@LIFECODEofficial" --limit 100 --out ./notes
# → ./notes/<channel>-channel-md-<timestamp>/001_….md …Demo assets: assets/demo/flucto-channel-to-md.gif, assets/demo/flucto-channel-to-md.mp4
(MP4 is used for Threads / social video posts; GIF for README embeds.)
npm install
npm run build:electron
npm link
fl h
fl docnpm link registers the local build as both flucto and fl. Without linking, use npm run cli -- --help from the project root.
Packaged releases expose both commands through package.json's bin entry. Short command aliases are available for common flows.
| Command | Short form | Purpose | Typical output |
|---|---|---|---|
flucto doctor |
fl doc |
Verify yt-dlp and ffmpeg discovery |
Binary paths and versions |
flucto setup |
fl s |
Provision missing managed yt-dlp and ffmpeg binaries |
Setup status, paths, versions, and fix guidance |
flucto info <url> |
fl i <url> |
Read media metadata | id, title, thumbnail, duration, uploader, view count |
flucto formats <url> |
fl f <url> |
List downloadable formats | format id, extension, resolution, note |
flucto download <url> |
fl d <url> |
Download MP4 video or MP3 audio | Generated media file |
flucto languages <url> |
fl l <url> |
List available caption languages | language code/name and auto/manual flag |
flucto transcript <url> |
fl t <url> |
Convert available captions/subtitles to Markdown | .md file or stdout Markdown |
flucto md <url> |
fl md <url> |
Download media and convert to Markdown in one step | .md file with metadata + transcript |
flucto update check |
fl u check |
Check GitHub releases for a newer Flucto version | Current/latest version and recommended asset |
flucto update download |
fl u download |
Download the recommended GitHub release asset | Downloaded asset path and checksum status |
flucto update apply |
fl u apply |
Apply an already downloaded asset when safe | Conservative apply result or manual install instructions |
Short option aliases: -j = --json, -p = --progress-json, -f = --format, -q = --quality, -a = --audio-quality, -l = --language, -s = --stdout, -o = --output-dir, and -c = --concurrency.
# Check bundled or configured binaries
fl doc -j
# Provision managed binaries without touching system package managers
fl s -j
fl s --check-only --bin-dir ./bin -j
# Inspect a media URL before downloading
fl i "https://www.youtube.com/watch?v=..." -j
fl f "https://www.youtube.com/watch?v=..."
# Download video or audio
fl d "https://www.youtube.com/watch?v=..." -f mp4 -o ./captures -j
fl d "https://www.threads.com/@user/post/ABC" -f mp4 -o ./captures
fl d "https://www.tiktok.com/@user/video/123" -f mp4 -o ./captures
fl l "https://www.youtube.com/watch?v=..." -j
fl t "https://www.youtube.com/watch?v=..." -l en -o ./notes -j
fl t "https://www.youtube.com/watch?v=..." -l auto -s > transcript.md
# Whole channel → Markdown notes (capped by --limit; dedicated job folder under --out)
fl channel to-md "@LIFECODEofficial" --limit 100 -o ./notes
flucto channel to-md "https://www.youtube.com/@learn-ai-lab" --limit 20 -o ./notes -l ko -c 2
# Process URL lists (also creates a dedicated job subfolder under the base output dir)
fl b urls.txt -f mp4 -c 2 -o ./captures -j
fl b urls.txt -f md -c 2 -o ./notes -j
# Check and download GitHub release updates from CLI
fl u check -j
fl u download -o ~/Downloads -j
fl u apply --asset ~/Downloads/Flucto-1.9.2-x86_64.AppImage -jbatch files are plain text. Empty lines and lines starting with #, ;, or ] are ignored, so URL lists can contain comments:
# research clips
https://www.youtube.com/watch?v=...
https://samplelib.com/lib/preview/mp4/sample-5s.mp4
--json/-j: writes the final result object to stdout.--progress-json/-p: writes progress events as newline-delimited JSON to stderr.- Human progress messages are written to stderr when
--progress-jsonis not set. --stdout/-sontranscriptwrites Markdown content to stdout instead of only saving a file.- Multi-file jobs (
batch,channel to-md) always create a dedicated subfolder under--output-dir/--out(or the current working directory). Files are never dumped loose into the base path.- Channel example:
./notes/라이프코드_LIFECODE-channel-md-20260710-143012/001_….md - Batch example:
./captures/urls-batch-mp4-20260710-143012/….mp4
- Channel example:
- JSON results for multi-file jobs include the resolved
outputDir(the job folder). - Non-zero exit codes indicate command failure; the JSON response includes the error message when
--jsonis set.
Flucto bundles yt-dlp and ffmpeg for the desktop release. The CLI also supports fl s, which provisions missing managed binaries without mutating system package managers.
fl doc --bin-dir /opt/flucto/bin -j
fl d "$URL" --yt-dlp /usr/local/bin/yt-dlp --ffmpeg /usr/local/bin/ffmpegUseful settings:
--output-dir DIR: write generated media or Markdown files toDIR.FLUCTO_OUTPUT_DIR: default output directory when--output-diris omitted.--bin-dir DIR: directory containing bothyt-dlpandffmpeg.--yt-dlp PATH,--ffmpeg PATH: explicit binary paths.FLUCTO_BIN_DIR: default managed binary directory override forflucto setup.
Managed binary defaults:
| OS | Default managed bin directory |
|---|---|
| Linux | ~/.local/share/flucto/bin or $XDG_DATA_HOME/flucto/bin |
| macOS | ~/Library/Application Support/Flucto/bin |
| Windows | %LOCALAPPDATA%\\Flucto\\bin |
Resolution order is explicit paths, environment paths, --bin-dir, managed bin directory, package-local bin/, module-relative bin/, then system PATH.
The desktop app continues to use Electron's auto-updater. CLI update commands use GitHub releases directly:
flucto update check --json
flucto update download --output-dir ~/Downloads --json
flucto update apply --asset ~/Downloads/Flucto-1.9.2-x86_64.AppImage --jsoncheck and download are safe automation commands. apply is intentionally conservative: unsupported install modes return manual installation instructions instead of silently overwriting application files. When a release includes checksums-sha256.txt, downloaded assets are verified before the command reports success.
- Markdown conversion is caption-based. If the platform/video does not expose captions through
yt-dlp, Flucto reports the transcript as unavailable; it does not run Whisper or another speech-to-text engine. - Some platforms, including YouTube, can return media-download
403/rate-limit/cookie errors while still allowing metadata, format, language, or caption reads. In that case the CLI returns a structured error instead of silently retrying with credentials. - Direct media URLs from generic extractors are supported by the
v1.9.1MP4 selector fallback.
- Threads Support: Added Threads (threads.com/threads.net) video download via dedicated
threadsdl.appAPI extraction, bypassing yt-dlp. - Extensible Platform Architecture: Refactored platform-specific code into a plugin-based
PlatformAdaptersystem withPlatformRegistry,MediaOrchestrator, and typed error handling (PlatformError). - New Platforms: Added TikTok and Vimeo adapters (yt-dlp-based).
- Markdown Pipeline: Added
MarkdownPipelineservice andflucto mdCLI command for direct URL-to-Markdown conversion. - Platform Adapters: YouTube, Twitter/X, Instagram, Reddit, Bilibili, Threads, TikTok, Vimeo — each as a single adapter file.
- Fixed CLI MP4 downloads for generic direct media URLs where
yt-dlpexposes a literalmp4format id instead of YouTube-stylebestvideo/bestaudioformats. - Verified real CLI flows for binary discovery, metadata, format listing, caption language listing, caption-to-Markdown conversion, generic MP4 download, and generated artifact cleanup.
- Added first-class
fluctoCLI mode for automation and AI-agent workflows. - Added CLI commands for
doctor,info,formats,download,languages,transcript, andbatch. - Reused the desktop TypeScript service layer without launching Electron or importing desktop IPC handlers.
- Added JSON output and NDJSON progress streams for script-friendly automation.
- Fixed Linux
.debupdater metadata so installed Debian/Ubuntu builds can select the.debupdate asset instead of failing insideDebUpdater. - Refreshed update metadata before manual app-update downloads so stale update checks do not trigger
electron-updaterprovider-cache errors.
- Added Markdown transcript output mode next to MP4 and MP3.
- Added transcript language selection, timestamp/metadata toggles, paragraph gap control, file saving, and clipboard copy options.
- Added JSON3, XML/SRV3, and VTT caption parsing for
yt-dlpsubtitle outputs. - Added transcript progress UI for analyzing, extracting, formatting, saving, and completion/error states.
- Added
mdentries to download history so generated Markdown files remain visible after conversion.
Flucto uses GitHub Actions and semantic-release for automated CI/CD:
- Automatic Versioning: Semantic versioning based on Conventional Commit types
- Generated Release Notes:
feat,fix, and breaking-change commits become GitHub Release notes andCHANGELOG.mdentries - Multi-Platform Builds: Windows, macOS, and Linux binaries built automatically
- Auto-Release: New GitHub releases created on push to main/master branch
Follow Conventional Commits to trigger automatic releases. Keep commit subjects release-note ready because they are copied into GitHub Releases and CHANGELOG.md.
# Feature release
git commit -m "feat(transcript): add caption-to-markdown output mode"
# Bug fix release
git commit -m "fix(updater): publish deb updater metadata"
# Breaking change release
git commit -m "feat!: redesign download request API"For user-facing changes, include concrete behavior in the commit subject or body: supported output modes, parser formats, UI controls, platform-specific updater behavior, and known limitations. See COMMIT_CONVENTIONS.md for full guidelines.
-
Clone the repository to your local machine.
git clone https://github.com/DeclanJeon/flucto.git cd flucto -
Install dependencies
npm install
-
Setup Binaries - This script will detect your OS and download the required
yt-dlpandffmpegbinaries to the/bindirectory.npm run postinstall
-
Set Supabase environment variables before running forum features
cp .env.example .env
Required values:
SUPABASE_URLSUPABASE_PUBLISHABLE_KEY(orSUPABASE_ANON_KEY)SUPABASE_SERVICE_ROLE_KEY(optional)
You can verify Supabase auth/RLS write behavior with:
npm run supabase:smoke
-
Start the development server - This runs both the Vite renderer and the Electron main process concurrently.
npm run dev
Flucto is built with a modern stack prioritizing performance and developer experience:
- Runtime: Electron + Node.js
- Frontend: React 19, Tailwind CSS v4, Framer Motion
- Language: TypeScript (Strict Mode)
- Core Engine:
yt-dlp(Python backend),ffmpeg(Media processing) - Build Tooling: Vite, Electron-Builder, Rolldown
- State Management: React Hooks (
useDownloader,useDownloadMonitor)
To create installers for your platform (NSIS for Windows, DMG for macOS, AppImage for Linux):
# Build the renderer and main process
npm run build
# Package the application
npm run distContributions are welcome! Whether it's fixing bugs, improving the documentation, or proposing new features.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the MIT License. See LICENSE for more information.
Made with ❤️ by Flucto Team
