The most powerful local-first file conversion studio for macOS. Swift + SwiftUI. Built without Xcode.
Local-first · capability-driven adapters · drop anything, get the right format out
The latest release is signed with a Developer ID certificate, notarized by Apple, and stapled — so it opens cleanly on any Mac without Gatekeeper warnings.
Requires macOS 14 (Sonoma) or newer on Apple Silicon.
After downloading, open the DMG and drag Morphix.app into your Applications folder.
Phase-1 vertical slice: full modular architecture in place, three end-to-end conversions shipped.
| Input | Output | Engine |
|---|---|---|
.md · .txt · .html |
.pdf |
swift-markdown + WKWebView |
| Webpage URL (http/https) | .pdf |
WKWebView.createPDF |
.heic · .jpg · .png · .webp · .tiff · .gif · .bmp |
.png · .jpg · .heic · .webp · .tiff · .bmp |
ImageIO |
| Remote media URL | Any of the above (download then convert) | URLSession + adapters |
Also wired end-to-end: drag-and-drop, URL paste with HEAD-based content-type classification, actor-based job queue with concurrency/cancel/retry, persistent history + presets + settings, Reveal-in-Finder, capability-driven target pickers.
# Dev run
swift run Morphix
# Produce an unsigned .app bundle
./scripts/bundle.sh --open
# Full signed + notarized + stapled DMG (requires Developer ID cert
# in keychain and a notarytool keychain profile set up once):
./scripts/release.shThe build does not require Xcode — Command Line Tools are enough. The entire .icns app icon is rendered programmatically from assets/morphix-logo.svg by scripts/make-icons.swift so the pipeline has no external SVG dependency.
11 SwiftPM modules, clean dependency graph, capability-driven adapter registration.
Sources/
├── Utilities/ OSLog, paths, safe shell runner, IDs
├── ConversionDomain/ FileFormat, SourceAsset, Job, Preset, Adapter protocol
├── FileInspectionEngine/ UTType + extension detection, image metadata
├── URLImportEngine/ URL validation, HEAD classification, download
├── ConversionAdapters/ MarkdownPDF · WebpagePDF · Image + shared WebPDFRenderer
├── ConversionEngine/ Adapter registry + dispatch
├── JobQueueEngine/ Actor-backed queue + event stream
├── PersistenceStores/ History · Preset · Settings
├── DesignSystem/ Tokens, PanelCard, DropZone, FileChip, ProgressPill
├── AppCore/ @MainActor AppState ObservableObject, navigation
└── Morphix/ @main App + SwiftUI views
Adapters are the only layer that touches specific conversion engines (ImageIO, WebKit, swift-markdown); everything else talks in domain types. To add a new conversion, drop a struct into ConversionAdapters/, declare its capabilities: [Capability], and register it in ConversionEngine.defaultEngine() — the UI picks it up automatically.
See CLAUDE.md for the full product spec and roadmap.
Not yet shipped, but the module layout is ready:
- Audio / video adapters (ffmpeg via
ShellExec) - Archive · subtitle · structured-data · DOCX · EPUB · ODT adapters
- PDF merge / split / compress (PDFKit wrapper)
- Watch folders, Finder Quick Actions, Share extension
- Batch rename patterns, OCR
~/Library/Application Support/Morphix/
presets.json starter + user-added conversion recipes
history.json previous job outcomes
settings.json app preferences
~/Library/Caches/Morphix/jobs/<job-id>/
per-job scratch workspace
Delete the Morphix directory under Application Support to reset the app state.
MIT — see LICENSE.