A fast, private, local-first file converter — running entirely in your browser.
Live Demo → · Report Bug · Request Feature
Most online converters upload your files to a remote server, process them there, and keep a copy. Morph does the opposite — every byte stays on your machine, every conversion happens locally, and nothing ever touches a server.
| Morph | typical online converter | |
|---|---|---|
| Files leave your device | ✗ Never | ✓ Always |
| Works offline | ✓ Yes | ✗ No |
| File size limits | ✗ None | ✓ Usually |
| Ads / tracking | ✗ None | ✓ Usually |
| Speed | ⚡ Hardware-accelerated | 🐢 Server queue |
Video conversion uses a custom three-tier engine that picks the fastest method available in your browser:
MP4 → WebM conversion pipeline:
1. ⚡ WebCodecs (GPU hardware encoder/decoder)
└─ Fastest. Uses your GPU directly via the WebCodecs API.
Video encode runs at hardware speed, audio is AAC copy (zero re-encode).
2. 🎥 MediaRecorder (browser capture API)
└─ Fallback for browsers without full WebCodecs support.
3. 🔧 FFmpeg WASM
└─ Universal fallback. Handles any format, any codec, any browser.
Slightly slower but works everywhere.
In practice, WebCodecs on a modern machine converts a 4K 60fps MP4 in under 180 seconds — compared to minutes with traditional server-side tools.
Morph has no backend. There is no server, no database, no analytics, no telemetry.
- All processing happens in your browser using WebCodecs, Canvas API, Web Audio API, and FFmpeg compiled to WebAssembly
- Files are read directly from your disk into browser memory and never serialized to a network request
- Closing the tab wipes everything — no residual data, no cached files, no logs
This isn't a privacy policy. It's an architectural fact.
| Input | Output | Engine |
|---|---|---|
| MP4, AVI, MOV, MKV, WebM | WebM | WebCodecs ⚡ / MediaRecorder / FFmpeg |
| MP4, AVI, MOV, MKV, WebM | MP4, AVI, MOV, MKV | FFmpeg |
| Input | Output |
|---|---|
| MP3, WAV, AAC, OGG, FLAC | Opus (OGG container) |
| Input | Output |
|---|---|
| PNG, JPG, WebP, AVIF, GIF | PNG, JPG, WebP, AVIF |
| Input | Output |
|---|---|
| TXT, JSON, YAML, CSV | JSON, YAML, CSV, HTML, Base64, LOG |
React + TypeScript — UI framework
WebCodecs API — GPU-accelerated video encode/decode
FFmpeg.wasm — Universal media processing fallback
MP4Box.js — MP4 demuxing and streaming
webm-muxer — WebM container muxing
jsquash/avif — AVIF encoding via WebAssembly
DM Sans + DM Mono — Typography
git clone https://github.com/geamnegru/morph.git
cd morph
npm install
npm run devOpen http://localhost:5173 and start converting.
npm run build
npm run previewNote: FFmpeg WASM requires specific HTTP headers to enable
SharedArrayBuffer. Make sure your server sets:Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corpThese are already configured in
vite.config.ts.
src/
├── components/
│ ├── VideoConverter.tsx # WebCodecs + FFmpeg video pipeline
│ ├── AudioConverter.tsx # FFmpeg audio conversion
│ ├── ImageConverter.tsx # Canvas + jsquash image conversion
│ └── TextConverter.tsx # Pure JS text/data conversion
├── App.tsx # Tab navigation shell
├── styles.css # Design system (DM Sans, purple/white palette)
├── constants.ts # Format definitions
└── types.ts # TypeScript types
Pull requests are welcome. For major changes, open an issue first.
- Fork the repo
- Create a branch:
git checkout -b feature/your-feature - Commit:
git commit -m 'feat: add your feature' - Push:
git push origin feature/your-feature - Open a pull request
Made with 0 servers and 100% local processing.
If Morph saved you from uploading a file somewhere sketchy, consider leaving a ⭐