vidcord is a free, open-source video compressor for Discord on Windows, macOS, and Linux. It shrinks MP4, MOV, MKV, AVI, WebM, FLV, and WMV files under Discord's upload size limits — 10 MB (free), 25 MB (legacy), 50 MB (Nitro Basic / Server Boost Level 2), 100 MB (Boost Level 3), and 500 MB (Nitro Full) — by wrapping the system FFmpeg binary with a trim timeline, hardware-accelerated encoding (NVIDIA NVENC, AMD AMF, Intel Quick Sync, Linux VAAPI, Apple VideoToolbox), and a ~10 MB installer. Built with Tauri 2 (Rust + React). 100% local — no accounts, no uploads, no telemetry.
At a glance — Cross-platform desktop app (Windows 10/11, macOS 11+, Linux) · x86_64 + aarch64 · ~10 MB installer · Compresses MP4, MOV, MKV, AVI, WebM, FLV, WMV to
.mp4· Targets Discord's 10 / 25 / 50 / 100 / 500 MB limits · Hardware-accelerated (NVENC / AMF / QSV / VAAPI / VideoToolbox) · Requires system FFmpeg onPATH· MIT licensed · Works fully offline.
- Why vidcord
- Features
- Screenshots
- Install
- FFmpeg setup
- Usage
- Keyboard shortcuts
- Hardware acceleration
- Building from source
- Project layout
- Troubleshooting
- FAQ
- Contributing
- License
- Acknowledgements
Discord caps uploads at 10 MB (free), 25 MB (legacy), 50 MB (Nitro Basic / Boost Level 2), 100 MB (Boost Level 3), and 500 MB (Nitro). vidcord picks a target bitrate for the clip length you want, runs FFmpeg with the right hardware encoder for your GPU, and drops the result in your Downloads folder — under the size limit you asked for, on the first try.
- ~10 MB installer. Tauri uses the system WebView (Edge on Windows, WebKit on macOS/Linux) instead of bundling Chromium.
- Native-speed encoding. Hardware encoders auto-detected: NVENC, AMF, QSV, VAAPI, VideoToolbox.
- No telemetry, no accounts, no uploads. Files never leave your machine.
- Five quality presets mapped to Discord's tiers:
- 10 MB @ 480p — Discord free tier
- 25 MB @ 480p — Discord free tier (legacy)
- 50 MB @ 720p — Nitro Basic / Boost Level 2
- 100 MB @ 1080p — Boost Level 3 or Clips Bypass
- 500 MB @ native — Nitro Full
- Advanced mode — custom target size (MB), output resolution, and any FFmpeg video encoder string.
- Trim timeline with frame-accurate handles, draggable playhead, snap tick marks, and a minimap when zoomed in.
- In-app preview of the trimmed segment before you commit to a compress.
- Hardware acceleration, auto-detected at startup:
- NVIDIA NVENC (
h264_nvenc,hevc_nvenc) - AMD AMF (
h264_amf,hevc_amf) - Intel Quick Sync (
h264_qsv,hevc_qsv) - Linux VAAPI (
h264_vaapi) - Apple Silicon VideoToolbox (
h264_videotoolbox)
- NVIDIA NVENC (
- Three ways to open a video: drag-and-drop onto the window, "Open with vidcord" from Explorer/Finder, or the in-app Browse button.
- Remove audio — strip the audio track to reclaim space.
- Real-time progress with ETA parsed from FFmpeg's stderr.
- Auto-increment output — saves
name-vidcord.mp4and bumps-1,-2, … if the filename is taken, never overwriting. - In-app FFmpeg install banner when it's missing —
wingeton Windows,brewon macOS, or distro package manager on Linux (with confirmation). - Cross-platform installers: Windows NSIS (x86_64 + aarch64), macOS
universal
.dmg, Linux.AppImage(x86_64 + aarch64).
MP4, MOV, MKV, AVI, WebM, FLV, WMV, and any other container / codec
combination your system FFmpeg can demux. Output is always .mp4 — H.264
(AVC) by default, H.265 (HEVC) if you pick an hevc_* encoder in Advanced
mode.
| Main window | Advanced mode |
|---|---|
![]() |
![]() |
| Output file | Windows context menu | macOS Finder |
|---|---|---|
![]() |
![]() |
![]() |
Grab the latest installer for your platform from the releases page:
| Platform | Architecture | File |
|---|---|---|
| Windows 10/11 | x86_64 | vidcord_<version>_x64-setup.exe |
| Windows 10/11 | aarch64 | vidcord_<version>_arm64-setup.exe |
| macOS 11+ | universal | vidcord_<version>_universal.dmg |
| Linux (any distro with glibc) | x86_64 | vidcord_<version>_amd64.AppImage |
| Linux (any distro with glibc) | aarch64 | vidcord_<version>_aarch64.AppImage |
You still need FFmpeg. vidcord does not bundle FFmpeg. See the next section.
vidcord shells out to the system ffmpeg and ffprobe binaries, which must
be on PATH. If they aren't, vidcord shows an in-app banner with a
one-click install for your platform.
winget install Gyan.FFmpegRestart vidcord (or sign out and back in) so the new PATH takes effect.
No official ARM64 build exists yet. See FFMPEG_SETUP.md for the community build and manual PATH steps.
brew install ffmpegsudo apt install ffmpeg # Debian / Ubuntu
sudo dnf install ffmpeg # Fedora (needs RPM Fusion)
sudo pacman -S ffmpeg # Arch / ManjaroFor more distros, manual installs, or troubleshooting, read FFMPEG_SETUP.md.
- Open a video — drop it onto the window, right-click → Open with vidcord from Explorer/Finder, or click Browse File.
- Pick a preset — 10/25/50/100/500 MB, or flip on Advanced mode for a custom target size, resolution, and encoder.
- Trim (optional) — drag the handles or use
I/Oto stamp the playhead.Spaceplays the selected range. - Toggle Remove Audio to strip audio if you need more video bitrate.
- Click Compress. Progress and ETA update live. When it's done vidcord highlights the file in your file explorer.
Output goes to ~/Downloads/<original-name>-vidcord.mp4 by default, with
-1, -2, … appended if the name is taken.
| Key | Action |
|---|---|
Space |
Play / stop preview |
, / . |
Step one frame back / forward |
Shift + , / . |
Nudge active trim handle by one frame |
J / K |
Jump playhead to trim start / end |
[ / ] |
Nudge trim start / end by a small step |
I / O |
Set trim in / out to current playhead |
R |
Reset trim to full clip |
? |
Open shortcuts cheat-sheet |
Esc |
Dismiss overlays |
At startup vidcord runs ffmpeg -encoders and picks the best available
hardware encoder for the GPU it detects. You can override this from the
Encoders dialog.
| Vendor / Platform | Encoder | Notes |
|---|---|---|
| NVIDIA | h264_nvenc, hevc_nvenc |
Maxwell 2nd-gen and newer |
| AMD | h264_amf, hevc_amf |
Windows only; Linux uses VAAPI |
| Intel | h264_qsv, hevc_qsv |
HD Graphics 500-series and newer |
| Linux (any GPU) | h264_vaapi |
Requires a working /dev/dri/renderD* |
| Apple Silicon | h264_videotoolbox |
Native on M-series Macs |
| Fallback (CPU) | libx264, libx265 |
Always available |
On Linux, vidcord probes /dev/dri/renderD* once per session to pick the
right VAAPI device, and sets LIBVA_DRIVER_NAME=radeonsi for AMD systems.
| Tool | Version | Notes |
|---|---|---|
| Rust | stable (2021 edition) | rustup default stable |
| Node.js | ^20.19 or >=22.12 |
see package.json engines |
| FFmpeg | any recent | must be on PATH at runtime |
| Linux extras | — | libwebkit2gtk-4.1-dev, libappindicator3-dev, librsvg2-dev, patchelf |
| Windows extras | — | WebView2 Runtime (pre-installed on Windows 11) |
git clone https://github.com/cyroz1/vidcord
cd vidcord
npm install
npm run tauri devVite serves the frontend on :5173 and Tauri launches the window with
hot-reload.
npm run tauri buildInstallers / bundles land in src-tauri/target/release/bundle/.
npm run lint # eslint src
npm run typecheck # tsc --noEmit
npm test # vitest
npm run format # prettier --write src
cargo fmt --check --manifest-path src-tauri/Cargo.toml
cargo clippy --manifest-path src-tauri/Cargo.toml --tests -- -D warnings
cargo test --manifest-path src-tauri/Cargo.toml
cargo audit --manifest-path src-tauri/Cargo.toml # respects .cargo/audit.tomlCI treats any clippy warning as an error — keep new Rust code warning-clean.
release— LTO,codegen-units = 1,strip,panic = abort. Used for taggedv*releases.ci— inheritsreleasewithlto = false,codegen-units = 4,opt-level = 1. Used by non-tag CI builds for speed.dev.package."*"— third-party deps built atopt-level = 1so FFmpeg stderr parsing and regex stay responsive intauri devwhile our own crate stays unoptimised for fast incremental compiles.
.github/workflows/build.yml runs five jobs:
a shared frontend build, Rust lint + audit, clippy + tests, a 5-way bundle
matrix (Windows x86_64/aarch64, macOS universal, Linux x86_64/aarch64), and
a release job that extracts the matching CHANGELOG.md section and drafts
a GitHub release on v* tags.
src/ React + TypeScript frontend
App.tsx Root component — trim UI, preset wiring, compress flow
components/ PreviewPane, ProgressSection, Toast, EncodersDialog
hooks/ useCompression, useEncoders, useSettings, useToasts
__tests__/ Vitest tests (node env, Tauri APIs mocked)
src-tauri/ Rust backend
src/lib.rs Tauri builder, plugins, Linux env shims, file-open routing
src/ffmpeg.rs Probe / preview / filmstrip / encoder detection + caches
src/gpu.rs Vendor detection (lspci / system_profiler / CIM)
src/settings.rs Typed settings persisted via atomic rename
src/commands/ #[tauri::command] handlers (compression, encoders, files, updates)
tauri.conf.json Product config, CSP, file associations, bundle targets
A deeper architectural tour — IPC boundary, file-open race conditions, cache layout, settings migration — lives in CLAUDE.md.
"FFmpeg not found" after installing it.
PATH changes don't propagate to running processes. Quit vidcord fully
(check the tray / dock) and relaunch. On Windows, sign out and back in if
that doesn't help.
The output file exceeds the target size.
vidcord reserves a small overhead for container + audio. If you're still
over, try Remove audio, drop to a lower resolution in Advanced mode,
or pick hevc_* (H.265) if your recipient can decode it.
Preview is blank on Linux.
WebKit2GTK's <video> element has spotty codec coverage. Install
gstreamer1.0-libav and gstreamer1.0-plugins-bad (Debian/Ubuntu naming)
and relaunch.
Windows console flashes during a compress.
Shouldn't happen — every FFmpeg invocation sets CREATE_NO_WINDOW
(0x08000000). If you see it, open an issue with the vidcord log
(%LOCALAPPDATA%\vidcord\vidcord.log).
Where do settings live?
| OS | Path |
|---|---|
| Windows | %LOCALAPPDATA%\vidcord\settings.json |
| macOS | ~/Library/Application Support/vidcord/settings.json |
| Linux | ~/.local/share/vidcord/settings.json |
Logs live alongside settings.json as vidcord.log (rotated at 5 MB).
Yes. vidcord is released under the MIT License with the full source on GitHub. There are no paid tiers, accounts, or trials.
No. vidcord runs entirely on your computer — no server, no account, no telemetry. The only network call is an optional background check against the GitHub Releases API for new versions, which you can disable in settings.
- Free accounts: 10 MB per file (was 8 MB before late 2022; 25 MB is a legacy value still applied to some accounts).
- Server Boost Level 2 / Nitro Basic uploads: 50 MB.
- Server Boost Level 3 uploads: 100 MB (also the ceiling for the Clips Bypass trick).
- Nitro Full: 500 MB per file.
vidcord ships one preset per tier and picks a resolution cap that usually still looks reasonable at that bitrate.
Any container your system FFmpeg can demux: MP4, MOV, MKV, AVI, WebM,
FLV, WMV, and more. Output is always .mp4 (H.264 by default, H.265
if you pick an hevc_* encoder in Advanced mode).
No. The 10 MB and 25 MB presets target free Discord accounts specifically; the 50 / 100 / 500 MB presets are there for boosted servers and Nitro subscribers.
vidcord calculates the right target bitrate for your clip length and size limit, picks the best hardware encoder for your GPU, streams progress and ETA back while FFmpeg runs, handles visual trimming, and writes to a predictable, auto-incremented path in your Downloads folder. Under the hood it's still FFmpeg — Advanced mode exposes the encoder string so you can override any of it.
Not currently. Hitting a specific target size under Discord's limits requires re-encoding at a calculated bitrate; stream-copy wouldn't guarantee the output fits.
Yes. vidcord ships as an .AppImage for x86_64 and aarch64 and is
tested on GNOME, KDE Plasma, LXQt, Sway, and Hyprland on both X11 and
Wayland. Hardware-accelerated encoding uses VAAPI via /dev/dri/renderD*.
No — vidcord is a GUI app. For scripted workflows, call FFmpeg directly; the presets in vidcord are just wrappers around standard FFmpeg arguments.
Yes. Once vidcord and FFmpeg are installed, no internet connection is needed to compress a video.
- Windows 10 or 11 (x86_64 or aarch64) with the WebView2 Runtime (pre-installed on Windows 11).
- macOS 11 (Big Sur) or newer, Intel or Apple Silicon.
- Linux with
glibcand WebKit2GTK 4.1 (almost every modern desktop distribution). - ~50 MB disk for the app, plus whatever FFmpeg needs (~100 MB).
Issues and PRs are welcome. Before opening a PR:
- Run all quality gates above — CI is strict about clippy and formatting.
- Add a
## vX.Ysection at the top of CHANGELOG.md for user-visible changes. The release workflow uses it as the GitHub release body. - Don't bump version numbers casually.
package.json,src-tauri/Cargo.toml, andsrc-tauri/tauri.conf.jsonmust stay in sync, and any bump triggers a release the next time a tag is pushed.
Read CLAUDE.md for the architectural invariants you're
expected not to break (Tauri command registration, blocking work and
spawn_blocking, the three file-open delivery paths, Linux env shims for
KDE / LXQt / Sway / Hyprland, cache invalidation rules).
vidcord is released under the MIT License. FFmpeg is a separate
dependency and is licensed under the LGPL/GPL by its own authors — vidcord
invokes the ffmpeg and ffprobe binaries on your system but does not
redistribute them.
- FFmpeg — the actual video compression.
- Tauri — cross-platform desktop shell.
- React + Vite — frontend.
- YABDP4Nitro — documented the Discord Clips size-limit quirk that the 100 MB preset targets.
Keywords: Discord video compressor, compress video for Discord, Discord 10 MB limit, Discord 25 MB limit, Discord 50 MB upload, Discord 100 MB upload, Discord 500 MB Nitro, shrink MP4 for Discord, FFmpeg GUI, FFmpeg frontend, cross-platform video compressor, Windows video compressor, macOS video compressor, Linux video compressor, open-source video compressor, free video compressor.




