A cross-platform Digital Asset Manager (DAM) built with Flutter — manage your local media library across Linux, Windows, macOS, Android and iOS.
MediaShelf is a port of Nexus Explorer with full library compatibility (shared .mediashelf/index.db schema and Smart Filter JSON format).
- Multi-platform — Linux · Windows · macOS · Android · iOS (one codebase)
- Self-contained libraries — every library is a folder with
.mediashelf/index.db; move it anywhere and it still works - Fast file scanner — runs in a Dart Isolate, MD5-based move/rename detection, FTS5 full-text search
- Auto-thumbnails — 256 × 256 JPEG cache, generated in an Isolate pool (4 workers)
- Smart Filters — rule-based JSON queries (
{logic, rules}) compatible with Nexus Explorer - Rich metadata — star rating (0–5), color labels, free-text notes, tags, collections
- Media playback — video (chewie) and audio (just_audio) with resume support
- Responsive layout — 3-panel desktop shell (sidebar · grid · detail panel) and mobile bottom-nav shell
- Filesystem watcher — live updates with 800 ms debounce
- Activity Journal — tracks added / missing / restored events
| Phase | Scope |
|---|---|
| 1 — MVP (current) | Core DAM: scanner, thumbnails, tags, collections, smart filters, basic player |
| 2 | AI features: semantic search, auto-tagging, duplicate detection |
| 3 | Sync: multi-device, cloud backup |
| 4 | Extended formats: EPUB reader, advanced video analysis |
flutter --version # >= 3.41On Linux the video player needs GStreamer:
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
gstreamer1.0-plugins-good gstreamer1.0-plugins-badflutter pub get
dart run build_runner build --delete-conflicting-outputs
flutter run -d linux # or: windows / macos / android / iosflutter build linux --releaselib/
├── core/ # Constants, file hashing (MD5), MIME resolver
├── data/
│ ├── database/ # Drift ORM — 8 tables + FTS5 + triggers, 4 DAOs
│ ├── scanner/ # LibraryScanner (Dart Isolate, sqlite3 direct)
│ ├── thumbnailer/ # ensureThumbnail (Isolate pool, image pkg)
│ ├── watcher/ # LibraryWatcher (watcher pkg, 800 ms debounce)
│ └── repositories/
├── domain/models/ # AssetFilter, ScanResult
├── providers/ # Riverpod state (library, assets, tags, scan, playback …)
└── ui/
├── screens/ # WelcomeScreen, LibraryScreen, PlayerScreen, ActivityScreen
├── layout/ # ResponsiveShell → DesktopShell / MobileShell
└── widgets/ # AssetGrid, AssetCard, ThumbnailImage, Sidebar, DetailPanel …
State management: Riverpod 2 Navigation: go_router 14 Database: Drift 2 + sqlite3_flutter_libs (FTS5 enabled) Thumbnails: image 4 (pure Dart, Isolate-safe) Media: video_player + chewie (video) · just_audio (audio)
MediaShelf libraries are fully compatible with Nexus Explorer:
- Same folder layout:
<root>/.mediashelf/index.db+<root>/.mediashelf/thumbnails/ - Identical SQL schema (same column names, types, defaults)
- Smart Filter JSON format:
{"logic":"AND","rules":[…]}— identical on both apps
You can open the same library folder in either application without migration.
MIT — see LICENSE