A privacy-first, offline media conversion desktop app. All processing happens locally — no files are ever uploaded, no internet connection required.
Built with Electron, SvelteKit, and FFmpeg.
brew tap Sergeant61/tap
brew install --cask local-privacy-converter
To upgrade later:
brew upgrade --cask local-privacy-converter
If macOS shows "Local Privacy Converter.app is damaged and can't be opened", run this once in Terminal:
xattr -cr /Applications/Local\ Privacy\ Converter.app
This happens because the app is not yet notarized with an Apple Developer certificate. The command removes the quarantine flag Apple sets on downloaded files.
Pre-built installers are available on the Releases page.
| Platform | Installer |
|---|---|
| macOS (Apple Silicon) | Local.Privacy.Converter-x.x.x-arm64.dmg |
| macOS (Intel) | Local.Privacy.Converter-x.x.x.dmg |
| Windows | Local.Privacy.Converter.Setup.x.x.x.exe |
| Linux | Local.Privacy.Converter-x.x.x.AppImage / .deb |
| Tool | Description |
|---|---|
| Batch conversion | Convert multiple files at once with per-file status tracking |
| Video trim | Cut a time range with stream-copy (fast) or re-encode (precise) |
| Audio merge | Concatenate or mix multiple audio files |
| Video merge | Concatenate multiple video files |
| Frame extract | Pull image frames at a set interval (PNG / JPG) |
| GIF creator | High-quality GIF with two-pass palette optimization |
| APNG creator | Animated PNG with full 32-bit color and alpha transparency |
| PDF → Image | Convert PDF pages to PNG / JPG / PPM via Poppler |
| Multi-output | Generate multiple formats from a single input in one run |
| Aspect ratio | Crop or pad video to a target ratio (16:9, 1:1, 9:16, …) |
| Resolution scale | Upscale or downscale to any preset or custom resolution |
| Audio normalize | EBU R128 loudness normalization (loudnorm filter) |
| Watermark | Overlay text or image with configurable position and opacity |
| Metadata editor | Read and write ID3 / MP4 tags |
| Subtitle extract | List and extract embedded subtitle streams |
Ready-made profiles with correct codecs, resolution, bitrate, and file-size limits baked in.
| Platform | Type | Format | Details |
|---|---|---|---|
| WhatsApp Business | Video | MP4 H.264+AAC | 1280×720, 16 MB |
| WhatsApp Business | Image | JPEG | 5 MB |
| WhatsApp Business | Audio | M4A AAC | 16 MB |
| Instagram Business | Feed Video | MP4 H.264+AAC | 1080×1080, 100 MB |
| Instagram Business | Reels / Stories | MP4 H.264+AAC | 1080×1920, 100 MB |
| Instagram Business | Image | JPEG | 1080×1080, 8 MB |
| Messenger Business | Video | MP4 H.264+AAC | 1280×720, 25 MB |
| Messenger Business | Image | JPEG | 25 MB |
| Telegram Business | Video | MP4 H.264+AAC | 1280×720, 2 GB |
| Telegram Business | Image | JPEG | 10 MB |
| Telegram Business | Audio | MP3 | 2 GB |
| YouTube | 1080p | MP4 H.264+AAC | 1920×1080 |
| YouTube | 4K | MP4 H.264+AAC | 3840×2160 |
| TikTok | Video | MP4 H.264+AAC | 1080×1920 |
| Video | MP4 H.264+AAC | 1920×1080 | |
| X (Twitter) | Video | MP4 H.264+AAC | 1280×720 |
| Discord | Video | MP4 H.264+AAC | 1280×720 |
Coming soon
pnpm install
pnpm dev
Starts the SvelteKit renderer on port 5173, bundles the Electron main/preload in watch mode, and launches the Electron window pointing at the dev server.
pnpm typecheck
pnpm lint
node scripts/prepare-ffmpeg.mjs
pnpm --filter desktop run package
Output is written to apps/desktop/release/<version>/.
Pushing a semver tag triggers the GitHub Actions release workflow, which builds on four runners (macOS arm64, macOS x64, Windows x64, Ubuntu x64), collects all artifacts, and publishes them to a GitHub Release with auto-generated release notes.
git tag v1.1.0
git push origin v1.1.0
.
├── apps/
│ └── desktop/ # Electron + SvelteKit UI
│ ├── electron/ # Main process (main.ts, preload.ts)
│ └── src/
│ ├── lib/
│ │ ├── components/ # AppShell, Sidebar, HomeConverter, …
│ │ ├── history/ # IndexedDB conversion history store
│ │ └── i18n/ # svelte-i18n locale files (tr, en)
│ └── routes/ # One directory per tool page
├── packages/
│ ├── ffmpeg-core/ # FFmpeg/ffprobe spawn helpers, arg builder
│ ├── media-formats/ # Target profiles, conversion matrix, job hints, UI meta
│ ├── types/ # Shared TypeScript interfaces
│ ├── validators/ # Zod schemas for IPC payloads
│ └── config/ # Shared ESLint / TypeScript config
├── scripts/
│ ├── prepare-ffmpeg.mjs # Stages platform binaries before packaging
│ └── set-version.mjs # Writes version to package.json (used in CI)
└── .github/workflows/
└── release.yml # Automated cross-platform release pipeline
| Layer | Technology |
|---|---|
| Desktop shell | Electron 39 |
| UI framework | SvelteKit 2 + Svelte 5 (runes) |
| Media processing | FFmpeg 7.x (bundled binary) |
| i18n | svelte-i18n 4 |
| Validation | Zod |
| Build system | Turbo + pnpm workspaces |
| Packaging | electron-builder 25 |
| Language | TypeScript 5.7 |
MIT — see LICENSE for details.