Skip to content

cyroz1/vidcord

Repository files navigation

vidcord — video compressor for Discord

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.

Platforms Architectures Version Downloads Build Installer License

vidcord main window: loaded video with preset picker and compress button

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 on PATH · MIT licensed · Works fully offline.


Contents


Why vidcord

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.

Features

  • 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)
  • 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.mp4 and bumps -1, -2, … if the filename is taken, never overwriting.
  • In-app FFmpeg install banner when it's missing — winget on Windows, brew on 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).

Supported input formats

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.

Screenshots

Main window Advanced mode
vidcord main window with trim timeline, size preset picker, and progress bar vidcord Advanced mode: custom target size, output resolution, and FFmpeg encoder override
Output file Windows context menu macOS Finder
Compressed video saved to the Downloads folder as name-vidcord.mp4 Windows File Explorer right-click menu with Open with vidcord entry on a video file macOS Finder right-click menu with Open with vidcord entry on a video file

Install

Grab the latest installer for your platform from the releases page:

Download latest release

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.

FFmpeg setup

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.

Windows (x86_64)

winget install Gyan.FFmpeg

Restart vidcord (or sign out and back in) so the new PATH takes effect.

Windows (aarch64 — Surface Pro X, Snapdragon PCs)

No official ARM64 build exists yet. See FFMPEG_SETUP.md for the community build and manual PATH steps.

macOS

brew install ffmpeg

Linux

sudo apt install ffmpeg        # Debian / Ubuntu
sudo dnf install ffmpeg        # Fedora (needs RPM Fusion)
sudo pacman -S ffmpeg          # Arch / Manjaro

For more distros, manual installs, or troubleshooting, read FFMPEG_SETUP.md.

Usage

  1. Open a video — drop it onto the window, right-click → Open with vidcord from Explorer/Finder, or click Browse File.
  2. Pick a preset — 10/25/50/100/500 MB, or flip on Advanced mode for a custom target size, resolution, and encoder.
  3. Trim (optional) — drag the handles or use I / O to stamp the playhead. Space plays the selected range.
  4. Toggle Remove Audio to strip audio if you need more video bitrate.
  5. 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.

Keyboard shortcuts

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

Hardware acceleration

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.

Building from source

Prerequisites

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)

Run the dev build

git clone https://github.com/cyroz1/vidcord
cd vidcord
npm install
npm run tauri dev

Vite serves the frontend on :5173 and Tauri launches the window with hot-reload.

Produce a release binary

npm run tauri build

Installers / bundles land in src-tauri/target/release/bundle/.

Quality gates (what CI runs)

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.toml

CI treats any clippy warning as an error — keep new Rust code warning-clean.

Build profiles

  • release — LTO, codegen-units = 1, strip, panic = abort. Used for tagged v* releases.
  • ci — inherits release with lto = false, codegen-units = 4, opt-level = 1. Used by non-tag CI builds for speed.
  • dev.package."*" — third-party deps built at opt-level = 1 so FFmpeg stderr parsing and regex stay responsive in tauri dev while our own crate stays unoptimised for fast incremental compiles.

CI / releases

.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.

Project layout

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.

Troubleshooting

"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).

FAQ

Is vidcord free and open-source?

Yes. vidcord is released under the MIT License with the full source on GitHub. There are no paid tiers, accounts, or trials.

Does vidcord upload my videos anywhere?

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.

What are Discord's video upload size limits?

  • 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.

Which video formats does vidcord support?

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).

Does vidcord require Discord Nitro?

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.

How is vidcord different from using FFmpeg directly?

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.

Can vidcord compress a video without re-encoding?

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.

Does vidcord work on Linux and Wayland?

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*.

Is there a CLI version?

No — vidcord is a GUI app. For scripted workflows, call FFmpeg directly; the presets in vidcord are just wrappers around standard FFmpeg arguments.

Does vidcord work offline?

Yes. Once vidcord and FFmpeg are installed, no internet connection is needed to compress a video.

What are the system requirements?

  • 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 glibc and WebKit2GTK 4.1 (almost every modern desktop distribution).
  • ~50 MB disk for the app, plus whatever FFmpeg needs (~100 MB).

Contributing

Issues and PRs are welcome. Before opening a PR:

  1. Run all quality gates above — CI is strict about clippy and formatting.
  2. Add a ## vX.Y section at the top of CHANGELOG.md for user-visible changes. The release workflow uses it as the GitHub release body.
  3. Don't bump version numbers casually. package.json, src-tauri/Cargo.toml, and src-tauri/tauri.conf.json must 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).

License

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.

Acknowledgements

  • 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.

Packages

 
 
 

Contributors