A modern, sleek file browser with native performance and beautiful UI
π Features β’ π¦ Installation β’ π οΈ Development β’ π¨ Screenshots β’ π€ Contributing
- Dark-first UI with system theme detection
- Smooth animations and clean modern interface
- Customizable sidebar with collapsible file tree
- Native system colors integration
- 10x smaller than Electron alternatives (~10-20MB vs 200MB+)
- Native performance with Rust backend
- Memory efficient - uses system WebView instead of Chromium
- Instant file operations with async processing
- Editable path bar with autocomplete (always-on editing)
- Multiple view modes: Grid, List, and Details
- Smart sorting by name, size, date, or type
- Per-directory preferences that persist
- Hidden files toggle with visual distinction
- Advanced file operations: Copy, Cut, Paste, Rename, Delete
- Cross-platform: Windows, macOS, and Linux
- Modern tech stack: Tauri 2.0 + React 18 + TypeScript
- Extensible architecture with plugin support
- Hot reload development with Vite
Marlin uses Tauri instead of Electron for superior performance:
βββββββββββββββββββ ββββββββββββββββββββ
β Frontend β β Backend β
β β β β
β React 18 βββββΊβ Rust (Tokio) β
β TypeScript β β File Operations β
β Tailwind CSS β β System APIs β
β Zustand β β Native Perf β
βββββββββββββββββββ ββββββββββββββββββββ
| Feature | Marlin (Tauri) | Electron Apps |
|---|---|---|
| Bundle Size | ~10-20 MB | ~200+ MB |
| Memory Usage | ~50-80 MB | ~200-400 MB |
| Startup Time | <1 second | 2-5 seconds |
| Security | Sandboxed + Rust | Node.js runtime |
| Native Feel | System WebView | Chromium |
Publishing a Git tag that starts with v (for example v0.1.0) triggers our release
workflow. Once the build finishes you will find platform installers on the
Releases page:
- macOS:
Marlin_<version>_universal.dmg - Windows:
Marlin_<version>_x64_en-US.msi(Intel/AMD) andMarlin_<version>_arm64_en-US.msi - Linux:
Marlin_<version>_amd64.AppImage/.debandMarlin_<version>_aarch64.AppImage/_arm64.deb
Use the latest published release by querying the GitHub API in each snippet below.
YOLO (macOS & Linux x86_64/arm64)
curl -fsSL https://raw.githubusercontent.com/StirlingMarketingGroup/marlin/main/scripts/install.sh | bashInstalls to
/Applicationson macOS and/usr/local/bin/marlinon Linux using the latest release. Review the script before piping tobashif you prefer.
npm global CLI (macOS, Windows, Linux)
npm install -g github:StirlingMarketingGroup/marlin
marlin-installInstalls a cross-platform Node.js helper (requires Node.js 18+) that fetches and runs the latest Marlin desktop installer for your OS. Re-run
marlin-installwhenever you want to pick up a newer release. On macOS you may need to prefix the command withsudoso it can write to/Applications.
macOS (Terminal)
TAG=$(curl -fsSL https://api.github.com/repos/StirlingMarketingGroup/marlin/releases/latest \
| python3 -c "import sys, json; print(json.load(sys.stdin)['tag_name'])")
VERSION=${TAG#v}
curl -L -o Marlin.dmg \
"https://github.com/StirlingMarketingGroup/marlin/releases/download/$TAG/Marlin_${VERSION}_universal.dmg"
hdiutil attach Marlin.dmg
sudo cp -R /Volumes/Marlin/Marlin.app /Applications # may prompt for your password
hdiutil detach /Volumes/MarlinWindows (PowerShell)
$tag = (Invoke-RestMethod https://api.github.com/repos/StirlingMarketingGroup/marlin/releases/latest).tag_name
$version = $tag.TrimStart('v')
$arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'x64' }
$asset = "Marlin_${version}_${arch}_en-US.msi"
Invoke-WebRequest "https://github.com/StirlingMarketingGroup/marlin/releases/download/$tag/$asset" `
-OutFile "$env:TEMP\$asset"
Start-Process msiexec.exe -Wait -ArgumentList "/i `"$env:TEMP\$asset`""Linux (AppImage)
TAG=$(curl -fsSL https://api.github.com/repos/StirlingMarketingGroup/marlin/releases/latest \
| python3 -c "import sys, json; print(json.load(sys.stdin)['tag_name'])")
ARCH=$(uname -m)
case "$ARCH" in
x86_64|amd64)
SUFFIX="amd64"
;;
aarch64|arm64)
SUFFIX="aarch64"
;;
*)
echo "Unsupported architecture: $ARCH" >&2
exit 1
;;
esac
ASSET="Marlin_${TAG#v}_${SUFFIX}.AppImage"
curl -L -o "$ASSET" \
"https://github.com/StirlingMarketingGroup/marlin/releases/download/$TAG/$ASSET"
chmod +x "$ASSET"
sudo mv "$ASSET" /usr/local/bin/marlin # or move it anywhere on your PATH
marlinPrefer to build locally or script your own pipeline? See the Development section for source-based setup instructions.
-
Node.js 18+
-
Rust 1.77+
-
Linux (Debian/Ubuntu) builds also need the GTK/WebKit toolchain:
sudo apt update sudo apt install build-essential pkg-config libssl-dev \ libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev sudo apt install libwebkit2gtk-4.1-dev || sudo apt install libwebkit2gtk-4.0-devUse whichever
libwebkit2gtkversion your distro provides (24.04 ships 4.1, while older LTS releases still use 4.0).
# Clone the repository
git clone https://github.com/StirlingMarketingGroup/marlin.git
cd marlin
# Install dependencies
npm install
# Start development server
npm run tauri devTip: running inside a Snap-distributed terminal/editor can inject an old
LD_LIBRARY_PATH. Launch the dev server withenv -u LD_LIBRARY_PATH npm run tauri devif you hit glibc-related symbol errors.
# Build for production
npm run tauri build- Make sure
npm run checkpasses on the commit you plan to tag. - Create an annotated tag that follows the
v*convention, for example:git tag -a v0.1.0 -m "Marlin 0.1.0". - Push the tag:
git push origin v0.1.0. - Watch the Release workflow; when it finishes the DMG, MSI, AppImage, and Debian installers will be attached to the tag's release page.
- The Sync Version workflow runs right after publishing and bumps
package.json,package-lock.json, andsrc-tauri/tauri.conf.jsonto match the tag. - (Optional) Run
marlin-installor the YOLO script on each platform/architecture (x64 + ARM) to spot-check the uploaded binaries.
After pushing v0.1.0 you'll have the first pre-1.0 release ready to share.
The installation snippets above always fetch the latest release tag, so no README updates are needed after tagging.
Every pull request runs the release workflow in a dry-run matrix to make sure the desktop bundles continue to build across macOS, Windows (x64/ARM64), and Linux (x64/ARM64) before you tag a real release.
The YOLO installer script and the npm helper consume the same release assets; if you
change asset names adjust scripts/install.sh and scripts/install.mjs accordingly
before tagging.
marlin/
βββ src/ # React frontend
β βββ components/ # UI components
β βββ hooks/ # Custom hooks
β βββ store/ # State management
β βββ types/ # TypeScript types
βββ src-tauri/ # Rust backend
β βββ src/ # Rust source code
β βββ Cargo.toml # Rust dependencies
βββ public/ # Static assets
βββ docs/ # Documentation
See our detailed roadmap for planned features and development timeline.
- Basic Tauri + React setup
- Modern UI design
- File system operations
- Editable path bar
- File operations (copy, cut, paste)
- Search functionality
- Context menus
- Keyboard shortcuts
- File preview panel
- Plugin system
- Themes and customization
- Performance optimizations
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow Rust and TypeScript style guides
- Add tests for new features
- Update documentation as needed
- Ensure CI passes before submitting PR
This project is licensed under the MIT License - see the LICENSE file for details.
- Tauri - For the amazing framework
- Lucide - For beautiful icons
- Tailwind CSS - For utility-first CSS
β Star this repo if you find it useful!
Made with β€οΈ by the Marlin team


