A self-hosted media toolkit — format conversion, duplicate detection, and file organisation in a single dark-themed web UI, built entirely in Go.
Convert images and videos between popular formats directly in the browser.
- Scan any folder (with optional subfolder recursion) filtered by images, videos, or both
- Per-extension summary with badge counts and filter pills
- Select individual files or batch-select by extension
- Pick a target format and convert in one click — live progress bar with per-file feedback
- Images — jpg, png, tif, bmp, webp, gif, ico, avif (via the
imaginglibrary) - Videos — mp4, mov, avi, mkv, webm, flv, wmv, m4v, mpeg, 3gp, ts (via ffmpeg)
- Optionally delete originals after a successful conversion
- Stop an in-flight conversion at any time
Find visually similar media using perceptual hashing — catches re-encoded or resized duplicates that byte-comparison misses.
- Three hash types combined (pHash, aHash, dHash) for higher accuracy
- Configurable similarity threshold per type (images: 90 %, videos: 85 % default)
- Video analysis by comparing frame hashes across a clip
- Multi-worker concurrent hashing with a configurable worker count
- Grouped results with thumbnail previews, file sizes, and space-savings estimate
- One-click auto-select of duplicates (keeps the largest file in each group)
- Stop scan mid-flight and discard partial results
Restructure a media collection into clean date-based folders or rename files in bulk.
- Date sort — moves/copies files into
{year}/{month}/{day}trees using EXIF date or mtime fallback - Rename — template tokens:
{date},{datetime},{original},{ext},{seq},{seq:N}(zero-padded) - Preview the full plan before executing — see every source → destination path
- Move or copy mode
- Conflict detection — skips renames that would overwrite another file
git clone https://github.com/exterex/morphic
cd morphic
make build # compiles to ./bin/morphic
./bin/morphic # opens http://127.0.0.1:8000 in the browser# Custom options
./bin/morphic --port 9000 --folder ~/Pictures --no-browser| Dependency | Required for | Install |
|---|---|---|
| Go 1.22+ | Building | https://go.dev/dl/ |
| ffmpeg | Video conversion & video duplicate detection | sudo apt install ffmpeg |
ffmpeg is optional — the app starts without it and greys out video features automatically.
make tidy # go mod tidy
make build # build binary → ./bin/morphic
make test# go test ./...
make vet # go vet ./...
make run # build + start dev servercmd/morphic/ CLI entry-point (flags, server startup)
internal/
converter/ Folder scanner, image/video conversion logic
dupfinder/ Perceptual hashing, duplicate grouping, job runner
organizer/ Date sorter, batch renamer, plan executor
shared/ Job store, file browser, thumbnail generator, constants
web/
server.go Gin router, embedded static assets
routes_*.go HTTP handlers per module
templates/ index.html (single-page UI)
static/ app.js, style.css
All endpoints are under /api/.
| Method | Path | Description |
|---|---|---|
POST | /api/converter/scan | Scan a folder for convertible media |
POST | /api/converter/convert | Start a batch conversion job |
GET | /api/converter/progress/:id/poll | Poll conversion progress |
POST | /api/converter/progress/:id/cancel | Cancel a running conversion |
POST | /api/dupfinder/scan | Start a duplicate scan job |
GET | /api/dupfinder/scan/:id/status | Poll scan status |
GET | /api/dupfinder/scan/:id/results | Fetch scan results |
POST | /api/dupfinder/scan/:id/cancel | Cancel a running scan |
POST | /api/organizer/plan | Create an organisation plan |
POST | /api/organizer/execute/:id | Execute a previewed plan |
POST | /api/organizer/cancel/:id | Cancel a running plan job |
GET | /api/browse | List directories (in-page browser) |
GET | /api/thumbnail | Generate a JPEG thumbnail |
GET | /api/system_info | Report Go/ffmpeg version info |
Released under the MIT License.