Features · Screenshots · Getting Started · Architecture · Archive Support · Roadmap
** 🔨 Under active development 🔨. ** APIs and UI may change without notice.
- Finder-compatible clipboard — Copy/Paste from MiMi to Finder now works for all file types including
.appbundles. - Unified dialog buttons — glass-style
DownToolbarButtonViewacross all dialogs (Transfer, Onboarding, About, Toolbar Customize). - First notarized release — fancy DMG installer with drag-to-Applications UX.
- Convert Media feature: dialog + service with ffmpeg/ImageIO/Lottie for 20+ formats.
- External Tools registry with install popover, Settings pane, and system permission onboarding.
- Context menu overhaul: "File Ops" submenu,
⌥ R-Menufor file type operations. - Fixed APFS firmlink double-click, archive timestamp preservation, drag-drop same-panel drops.
MiMiNavigator is a dual-panel file manager inspired by Total Commander and Norton Commander, reimagined with native macOS technologies. It combines the efficiency of classic two-panel navigation with modern SwiftUI, Swift concurrency (actors, async/await), and macOS 26 liquid-glass design language.
Why another file manager?
- Finder lacks dual-panel workflow → MiMiNavigator gives you two panels side by side
- Total Commander doesn't exist on macOS → MiMiNavigator brings TC-style menus and hotkeys
- Built as a SwiftUI showcase → clean architecture, strict concurrency, modular packages
![]() |
| Preview |
![]() |
| History |
![]() |
| History |
| Feature | Description |
|---|---|
| Dual Panels | Two independent file panels with synchronized operations |
| Tabbed Interface | Multiple tabs per panel (⌘T open, ⌘W close, ⌘⇧]/[ switch); tab context menu; persistence between launches |
| List & Thumbnail Views | Toggle per panel via toolbar; thumbnail size 16–900 pt via inline status-bar slider |
| Finder-Style Table | Sortable columns: Name, Size, Date, Permissions, Owner, Type |
| Multi-Selection | Cmd+Click toggle, Shift+Click range, Insert mark+next, pattern matching, Ctrl+A |
| Group Operations | Batch Cut/Copy/Compress/Share/Delete on marked files; group context menu |
| Multi-File Drag & Drop | Drag all marked files together; badge preview with count; Finder-compatible; works in both list and thumbnail views |
| Media Actions | Native media info command plus a new placeholder Convert Media ... entry for convertible media files (currently disabled, planned for future conversion workflows) |
| Find Files | Advanced search: by name (wildcards), content, size, date — with archive search |
| Archive VFS | Open archives as virtual directories, navigate inside, auto-repack on exit |
| Parent Directory | ... entry pinned to top of every panel, archive-aware navigation |
| Navigation History | Per-panel history with quick-jump popover |
| Breadcrumb Nav | Click-to-navigate path bar with autocomplete popup (ESC/click-outside dismiss, slide animation) |
| Favorites Sidebar | Quick access to bookmarked locations (FavoritesKit package) |
| Real-time Updates | Automatic refresh on file system changes |
| FTP/SFTP | Remote file browsing via curl (FTP) and Citadel/NIOSSH (SFTP) |
| Network Neighborhood | SMB/AFP share discovery, mounting, and browsing across LAN |
| Connect to Server | Saved server bookmarks with keychain passwords, session reuse, disconnect |
| Key | Action | Key | Action |
|---|---|---|---|
↑ ↓ |
Navigate | Tab |
Switch panels |
Enter |
Open | ⌘R |
Refresh |
F5 |
Copy to other panel | ⌘. |
Toggle hidden files |
⌘O |
Open / Get Info | ⌘T |
New Tab |
⌘W |
Close Tab | ⌘⇧]/⌘⇧[ |
Next/Prev Tab |
Cmd+Click |
Toggle file mark | Shift+Click |
Range select |
Insert |
Toggle mark + next | Ctrl+A |
Mark all files |
Num+ |
Mark by pattern | Num- |
Unmark by pattern |
Num* |
Invert marks | ⌘⌫ |
Delete marked/selected |
Eight menu categories matching Total Commander conventions: Files (F6 Rename, Pack/Unpack, Compare) · Mark (Select/Deselect groups) · Commands (Terminal, CD Tree) · Net (FTP) · Show (View modes, Hidden files) · Configuration · Start (Tabs) · Help.
- macOS 26 Liquid-Glass menu bar with ultra-thin material, gradient borders, and multi-layered shadows
- Context menus reorganized around stable submenu groups instead of fragile Option-only branches
- Pixel-perfect Retina rendering via
backingScaleFactor - Sticky column headers, zebra-striped rows with themed colors (active/inactive panel)
- Zebra background fill extends below file rows to fill empty panel space
- Animated toolbar buttons, NSVisualEffectView popover for autocomplete
- Hidden files shown in bluish-gray, symlinks labeled as "Alias"
MiMiNavigator can browse archives as virtual directories. Double-click opens the archive, .. exits with automatic repacking if files were modified.
50+ formats supported:
| Category | Formats |
|---|---|
| Standard | zip 7z rar tar |
| Compressed TAR | tar.gz tar.bz2 tar.xz tar.zst tar.lz4 tar.lzo tar.lz tar.lzma |
| Packages | deb rpm cab cpio xar |
| macOS | dmg pkg |
| Java/Android | jar war ear aar apk |
| Disk Images | iso img vhd vmdk |
| Legacy | arj lha lzh ace sit sitx Z |
Extraction chain: /usr/bin/unzip → /usr/bin/tar (libarchive) → 7z (fallback). Install 7z for full format support: brew install p7zip.
The app is notarized by Apple. Starting from v0.9.7.4, macOS Gatekeeper will allow it to run without workarounds.
- Download the DMG from the link below
- Open the DMG, drag MiMiNavigator to Applications
- Launch MiMiNavigator from Applications
For older releases (before v0.9.7.4) you may need to run:
xattr -cr ~/Downloads/MiMiNavigator.app
Requirements:
- macOS 26+ (Apple Silicon)
- Xcode (latest) with Swift 6.2
- Optional:
brew install swiftlint swift-format p7zip
git clone --recurse-submodules https://github.com/senatov/MiMiNavigator.git
cd MiMiNavigator
zsh Scripts/stamp_version.zsh # sync version from git tag
open MiMiNavigator.xcodeproj
# ⌘R to build and runOr via command line:
zsh Scripts/stamp_version.zsh
xcodebuild -scheme MiMiNavigator -configuration Debug \
-destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO buildProduction Build:
xcodebuild -project MiMiNavigator.xcodeproj -scheme MiMiNavigator \
-configuration Release -derivedDataPath /tmp/mimi_build build CODE_SIGNING_ALLOWED=YESBinary output: /tmp/mimi_build/Build/Products/Release/MiMiNavigator.app
MiMiNavigator/
├── GUI/Sources/
│ ├── App/ # Entry point, AppLogger, toolbar
│ ├── AppDelegates/ # NSApplicationDelegate
│ ├── States/
│ │ ├── AppState/ # AppState (@Observable), SelectionManager,
│ │ │ # MultiSelectionManager, StatePersistence,
│ │ │ # FileListSnapshot, FileSortingService
│ │ ├── Commands/ # AppCommands (menu bindings)
│ │ └── History/ # PanelNavigationHistory, SelectionsHistory,
│ │ # HistoryEntry, FileSnapshot
│ ├── Features/
│ │ ├── Tabs/ # TabItem, TabManager, TabBarView, TabItemView,
│ │ │ # TabContextMenu
│ │ ├── Panels/ # FilePanelView, FileRow, FileRowView,
│ │ │ │ # FileTableRowsView, SelectionStatusBar,
│ │ │ │ # AliasIconComposer, PanelDividerView
│ │ │ ├── FileTable/ # FileTableView (+Actions, +State),
│ │ │ │ # TableHeaderView, TableKeyboardNavigation,
│ │ │ │ # ColumnLayoutModel, ResizableDivider
│ │ │ └── Filter/ # PanelFilterBar, PanelFilterHistory
│ │ ├── Network/ # NetworkNeighborhoodView, NetworkHost,
│ │ │ # NetworkMountService, NetworkDeviceFingerprinter,
│ │ │ # FritzBoxDiscovery, WebUIProber
│ │ ├── ConnectToServer/# ConnectToServerView, RemoteFileProvider,
│ │ │ # RemoteConnectionManager, RemoteServerStore
│ │ └── Popups/ # FileInfoPopupController, InfoPopupController, ConnectErrorPopupController, FileInfoPopupController,
│ │ # PopupEventMonitors (@MainActor, deinit-safe monitors)
│ ├── ContextMenu/
│ │ ├── ActionsEnums/ # FileAction, DirectoryAction, MultiSelectionAction,
│ │ │ # PanelBackgroundAction
│ │ ├── Menus/ # FileContextMenu, DirectoryContextMenu,
│ │ │ # MultiSelectionContextMenu, OpenWithSubmenu,
│ │ │ # submenu-based advanced operations
│ │ ├── Dialogs/ # ConfirmationDialog, RenameDialog, PackDialog,
│ │ │ │ # BatchConfirmation/Progress, CreateLinkDialog,
│ │ │ │ # ContextMenuDialogModifier+Builder
│ │ │ └── FileConflict/ # FileConflictDialog, ConflictResolution
│ │ └── Services/ # CntMenuCoord, ClipboardManager,
│ │ │ # CompressService, QuickLookService
│ │ ├── Coordinator/ # CntMenuCoord+FileActions,
│ │ │ # +DirectoryActions, +BackgroundActions,
│ │ │ # +MultiSelectionActions, ActiveDialog
│ │ └── FileOperations/ # FileOperationsService (core: copy/move/conflict),
│ │ # FileOpsService+Delete, +Rename, +SymLink,
│ │ # BatchOperationCoordinator, DirectorySizeCalculator
│ ├── Services/
│ │ ├── Archive/ # ArchiveManager (actor), ArchiveExtractor,
│ │ │ # ArchiveRepacker, ArchiveFormatDetector,
│ │ │ # ArchiveNavigationState, ArchivePasswordStore
│ │ ├── Scanner/ # DualDirectoryScanner (actor), FileScanner,
│ │ │ # FSEventsDirectoryWatcher
│ │ ├── FileOperations/ # BasicFileOperations, FileDialogs, VSCodeIntegration
│ │ ├── ErrorAlertService.swift # show / confirm / promptPassword helpers
│ │ └── Diagnostics/ # SpinnerWatchdog
│ ├── FindFiles/ # FindFilesViewModel, FindFilesCoordinator,
│ │ │ # FindFilesWindowContent, SearchHistoryManager
│ │ └── Engine/ # FindFilesEngine (actor), FindFilesNameMatcher,
│ │ # FindFilesContentSearcher, FindFilesArchiveSearcher,
│ │ # NativeZipReader, FindFilesResultBuffer
│ ├── DragDrop/ # DragDropManager, DragPreviewView,
│ │ # FileTransferConfirmationDialog
│ ├── Menus/ # TC-style glass menu bar, MenuCategory, MenuItem
│ ├── BreadCrumbNav/ # BreadCrumbView, PathAutoCompleteField
│ ├── HotKeys/ # HotKeyStore, HotKeySettingsView, HotKeyRecorderView,
│ │ # ShortcutConflictValidator
│ ├── History/ # HistoryRow, HistoryWindowContent
│ ├── Favorites/ # FavoritesNavigationAdapter, BookmarkStore
│ ├── Settings/ # SettingsWindowView, SettingsColorsPane,
│ │ # DiffToolRegistry, SettingsPermissionsPane
│ ├── SplitLine/ # OrangeSplitView, SplitContainer, DividerAppearance
│ ├── Toolbar/ # ToolbarStore, ToolbarCustomizeView
│ ├── Config/ # DesignTokens, UserPreferences, AppConstants,
│ │ # InterfaceScaleStore, PreferenceKeys
│ └── Localization/ # L10n.swift
├── Packages/ # git submodule → github.com/senatov/MiMiKits (private)
│ ├── ArchiveKit/ # Archive format support module
│ ├── FavoritesKit/ # Reusable favorites module (.dylib)
│ ├── FileModelKit/ # CustomFile model and utilities
│ ├── LogKit/ # Centralized logging (SwiftyBeaver)
│ ├── NetworkKit/ # Network neighborhood discovery (SMB/AFP)
│ └── ScannerKit/ # File scanning utilities
└── GUI/Docs/ # Architecture docs, screenshots
| Pattern | Usage |
|---|---|
@Observable + @MainActor |
AppState — global app state, panels, archive states |
@Observable + @MainActor |
MultiSelectionManager — Cmd/Shift click, Insert mark, pattern match |
@Observable + @MainActor |
TabManager — per-panel tab collection, persistence, navigation |
@Observable + @MainActor |
CntMenuCoord — singleton handling all context menu actions |
actor |
DualDirectoryScanner — thread-safe file scanning |
actor |
ArchiveManager — session lifecycle, dirty tracking, extraction, repacking |
AsyncStream |
FindFilesEngine — streaming search results with cancellation |
PopupEventMonitors |
@MainActor class, owns NSEvent monitors, nonisolated(unsafe) only in deinit |
ErrorAlertService |
@MainActor enum, replaces scattered NSAlert.runModal() calls |
filesForOperation() |
Unified API: returns marked files if any, single selected file otherwise |
NSEvent.modifierFlags |
Detecting Cmd/Shift during SwiftUI gesture handlers |
| Security-Scoped Bookmarks | Persistent file access in sandboxed mode |
| Swift Package (dynamic) | FavoritesKit — extracted as reusable .dylib |
Uses SwiftyBeaver with tags: [FindEngine] [ArchiveSearcher] [Extractor] [Repacker] [FormatDetector] [SELECT-FLOW] [NAV] [DOUBLE-CLICK]
Log files:
- Sandboxed:
~/Library/Containers/Senatov.MiMiNavigator/Data/Library/Application Support/MiMiNavigator/Logs/MiMiNavigator.log - External (dev):
/private/tmp/MiMiNavigator.log
- Dual-panel navigation with breadcrumbs
- Finder-style sortable table (Name, Size, Date, Permissions, Owner)
- Drag & drop with HIG confirmation
- TC-style menu system (8 categories)
- macOS 26 liquid-glass UI
- Navigation history per panel
- File copy (F5), Open/Get Info (⌘O)
- Hidden files toggle with persistence
- Security-scoped bookmarks
- FavoritesKit Swift Package
- Archive virtual filesystem (50+ formats)
- Find Files with archive search
- Parent directory navigation (
..) - Multi-selection: Cmd+Click, Shift+Click, Insert, pattern matching, Ctrl+A
- Group context menu with batch operations
- Multi-file drag & drop with badge preview (list and thumbnail modes)
- Batch-aware file actions (Cut/Copy/Delete/Compress/Share on marked files)
- Total Commander style marking: dark red, .light, enlarged font
- Selection status bar (marked count + total size + disk free space + inline slider)
- Thumbnail grid view per panel (16–900 pt, QL thumbnails, context menu, drag-drop)
- Open With LRU per file extension (max 5, "Other..." picks persisted)
- Column width persistence
- Hotkey customization
- Tabbed interface (multiple tabs per panel, context menu, persistence)
- Archive Open → TC-style virtual directory (not Finder/Archive Utility)
- Media conversion dialog and scripts for
Convert Media... - Zebra-striped background fill for empty panel space
- Autocomplete popup: click-outside / ESC dismiss, slide animation, NSVisualEffectView
- FileOperationsService split into modular extensions (Delete, Rename, SymLink)
- HIGAlertDialog extracted to own file
- Firmlink handling for
/tmp,/var,/etcin scanner and file operations - Rename: panel tracking, scan cooldown fix, firmlink path resolution
- Version auto-sync from git tag via
Scripts/stamp_version.zsh
- Batch rename for marked files
- Terminal integration at current path
- Custom themes and color schemes
- Scroll-to-selection after rename/create operations
- Three-panel layout option
- FTP/SFTP connectivity (Citadel SFTP + curl-based FTP)
- Network filesystem (SMB/AFP mount, Network Neighborhood discovery)
- Cloud storage (iCloud, Dropbox)
- Advanced file comparison
- Plugin system
- App Store release
Contributions welcome! MiMiNavigator is a real-world SwiftUI project with clean architecture, strict Swift 6.2 concurrency, and plenty of room to grow.
Looking for a way to start? Here are areas where help is especially appreciated:
| Area | Difficulty | Description |
|---|---|---|
| Batch Rename | ⭐⭐ | Rename multiple marked files with pattern (e.g. Photo_{N}.jpg) |
| File Preview | ⭐⭐ | Quick Look panel for selected file (QLPreviewPanel integration) |
| Themes | ⭐⭐ | Dark/light/custom color schemes with persistence |
| Localization | ⭐ | Translate UI strings (German and Russian already done) |
| Unit Tests | ⭐⭐ | Tests for MultiSelectionManager, FileOperations, ArchiveManager |
| FTP/SFTP | ⭐⭐⭐ | Remote file system panel via Network framework |
| Performance | ⭐⭐ | Profile and optimize for directories with 10k+ files |
- Fork the repo and create a feature branch
- Read CONTRIBUTING.md for code style and commit guidelines
- Build and test locally (
⌘Rin Xcode) - Open a PR with a clear description and screenshots for UI changes
- Learn SwiftUI on a real dual-panel file manager (not a todo app)
- Swift 6.2 concurrency — actors, async/await,
@Observable, strict Sendable - macOS-native development — NSWorkspace, security-scoped bookmarks, Quick Look, AppleScript
- Clean architecture — modular structure, no file over 400 lines, extensive logging
- Friendly maintainer who reviews PRs quickly
I openly acknowledge using AI assistants for architecture discussions and code review. This README was crafted with care for both humans and crawlers.
Sincere thanks to the open-source community:
| Author | Project | License | Why it matters |
|---|---|---|---|
| Sebastian Kreutzberger | SwiftyBeaver | MIT | Clean, fast, low-friction logging that simply works |
| Joannis Orlandos | Citadel | MIT | An excellent SSH/SFTP library that fills an important gap not covered by SwiftNIO SSH |
| Thomas Zoechling | ZIPFoundation | MIT | A strong example of clean Swift API design and a likely future dependency |
| The Nmap Project | nmap | GPLv2 | The gold standard in network diagnostics, invaluable during LAN discovery development |
| Apple | SwiftNIO, SwiftUI, kqueue, NetServiceBrowser | Apple licenses | Making macOS-native development a genuine pleasure |
| Omar Albeik | VLC | MIT | Swift package wrapper used for extended media playback integration |
| VideoLAN | libVLC / VLC | LGPL v2 or later | Underlying playback engine for media formats not reliably handled by the native macOS media stack |
Full third-party license texts and notices should also be provided in the application bundle, About/Credits section, or in a dedicated Licenses / ThirdPartyNotices folder.
Special thanks to Anthropic / Claude for pair-programming support throughout this project, including architecture decisions, refactoring, debugging, and documentation.
MiMiNavigator is developed by Iakov Senatov -- Diplom-Ingenieur (Chemical Process Engineering), 35 years of programming experience.
AGPL-3.0 — Iakov Senatov
Made with ❤️ for macOS · Building the future of file management, one commit at a time


