Cloudflare R2 Client is a free, open-source desktop application (GUI) for managing Cloudflare R2, AWS S3, MinIO, and RustFS object storage from your Mac, Windows PC, or Linux machine. Browse buckets, upload and download files with resumable multipart transfers, preview images / videos / PDFs / code, manage multiple accounts and tokens, and move files between providers — all from a fast native app built with Tauri, Next.js, and React.
Looking for a free Cloudflare R2 GUI, an S3 client for Mac, a MinIO desktop browser, or a RustFS file manager? This is the all-in-one S3-compatible storage client you've been looking for.
Keywords: Cloudflare R2 desktop client, R2 GUI, S3 client macOS, S3 GUI Windows, MinIO browser, RustFS GUI, S3 file manager, object storage desktop app, Tauri R2 uploader.
- Multi-Provider Support - R2, AWS S3, MinIO, and RustFS (path-style forced)
- Multi-Account Support - Manage multiple accounts across providers
- Multiple Tokens per Account (R2) - Each account can have multiple API tokens with different bucket access
- Browse and manage files in S3-compatible buckets
- Upload files and folders with resumable multipart uploads
- File Preview - Preview files directly in the app:
- Images: jpg, jpeg, png, gif, webp, svg, bmp, ico
- Videos: mp4, webm, ogg, mov, m4v
- PDFs: Full PDF viewer with page navigation
- Text/Code: Syntax-highlighted viewer with Monaco Editor supporting:
- Code: js, ts, jsx, tsx, css, scss, less, html, vue, svelte
- Config: json, yaml, yml, toml, xml, ini, env
- Documents: txt, md, markdown, rst, log
- Scripts: sh, bash, zsh, fish, ps1, bat, cmd
- Data: csv, sql
- Batch Operations - Multi-select files and folders for:
- Batch Download - Download multiple files with progress tracking, pause/resume support
- Batch Move - Move files to different folders with folder tree picker
- Batch Delete - Delete multiple files with confirmation and progress indicator
- Batch Rename for files in folder - Rename files in a folder with confirmation and progress indicator
- Cross-Account Transfer - High-performance file transfer between different accounts/providers:
- Transfer files between R2, AWS S3, MinIO, and RustFS
- Server-side copy when possible (same provider)
- Streaming transfer with no temp files for cross-provider moves
- Parallel multipart uploads for large files (4 concurrent parts)
- Up to 5 concurrent transfers
- Real-time progress tracking with speed display
- Pause/Resume/Cancel individual or all transfers
- Background processing - queue continues even when modal is closed
- Automatic queue continuation after each transfer completes
- Mount as Local Drive - Mount any bucket to a local folder and work with it in Finder / Explorer:
- Read-write by default — save, rename, and delete files right in the folder; a per-mount toggle makes it read-only
- NFS mount served by the app itself — no macFUSE, WinFsp, or kernel extensions
- Manage every active mount from Settings → Mounts
- Works with all providers (R2, AWS S3, MinIO, RustFS)
- macOS mounts instantly with no extra software; Linux needs nfs-utils; Windows support is planned
- All mounts are removed automatically when the app quits
- Video thumbnail generation (via ffmpeg)
- Copy signed or public URLs to clipboard (provider-aware link building)
- Dark mode support
- Auto-updates
brew install dickwu/tap/r2Download the latest release for your platform from the Releases page:
- macOS: .dmg (Apple Silicon & Intel)
- Windows: .msi or .exe installer
- Linux: .deb, .rpm, or .AppImage
- ffmpeg - Required for video thumbnail generation
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Windows (via Chocolatey)
choco install ffmpegOn macOS, you need to manually allow the app to run:
- Open System Preferences → Privacy & Security
- Click "Open Anyway" next to the blocked app message
If the app doesn't appear in Privacy & Security settings, run:
sudo xattr -d com.apple.quarantine /Applications/r2.app/if you are getting error that can not run, try to run:
rm -rf ~/Library/Application\ Support/com.lifefarmer.r2/
rm -rf ~/Library/Caches/com.lifefarmer.r2/
rm -rf ~/Library/Saved\ Application\ State/com.lifefarmer.r2.savedState/# Install dependencies
bun install
# Run development server
bun run tauri devtauri-connector is integrated for AI-assisted debugging and testing. It provides DOM inspection, element interaction, screenshots, and console log access via CLI or MCP server.
# Start with connector enabled
bun run tauri:dev
# CLI commands (after app is running)
tauri-connector snapshot -i # AI DOM snapshot with element refs
tauri-connector click @e5 # Click element by ref
tauri-connector fill @e18 "query" # Fill search box
tauri-connector screenshot /tmp/r2.png # Take screenshot
tauri-connector logs -n 20 # View console logsInstall the CLI: cargo install connector-cli
# Build for production
bun run tauri buildTo build Windows binaries from macOS or Linux, you need additional tools:
# Install required dependencies
# macOS
brew install cmake ninja llvm nsis
# Ubuntu/Debian
sudo apt-get install cmake ninja-build llvm nsis
# Install cargo-xwin
cargo install --locked cargo-xwin
# Setup Windows toolchain
cargo xwin setup
# Add Windows target
rustup target add x86_64-pc-windows-msvc
# Build for Windows
bun run tauri build --runner cargo-xwin --target x86_64-pc-windows-msvcNote: Cross-compilation is experimental. For production builds, consider using GitHub Actions or a Windows VM.
- On first launch, the "Add Account" dialog will open automatically
- Choose the provider (R2, AWS, MinIO, RustFS) via the clickable tags
- Enter provider-specific credentials:
- R2:
- Account ID (required) - Cloudflare account ID (from dashboard URL)
- Token Name (optional)
- API Token - R2 read/write token
- Access Key ID / Secret Access Key
- AWS S3:
- Access Key ID / Secret Access Key
- Region (required)
- Endpoint (optional custom scheme + host)
- Force Path Style (optional)
- MinIO:
- Access Key ID / Secret Access Key
- Endpoint (scheme + host/port)
- Force Path Style (optional)
- RustFS:
- Access Key ID / Secret Access Key
- Endpoint (scheme + host/port)
- Force Path Style is always enabled (not configurable)
- R2:
- Click "Load" to fetch available buckets, or manually add bucket names
- Configure public domain per bucket (optional, R2/AWS only)
Endpoint/Domain Tips
- Endpoint and domain inputs accept full URLs (scheme + host) and normalize automatically.
- For R2/AWS public domains, you can select http/https explicitly.
- Sidebar - Shows all configured accounts with token/bucket counts
- Click account - Opens drawer with all tokens and buckets for that account
- Click bucket - Switches to that bucket
- Context menu - Edit or delete accounts/tokens
- Collapse sidebar - Click the collapse icon to minimize to icon-only view
Use the Batch Move workflow to sync files between accounts/providers:
- Add both the source and destination accounts.
- Switch to the source bucket in the sidebar.
- Select files/folders -> Batch Move.
- Choose the destination account + bucket, and an optional target folder.
- Toggle Delete original:
- On = move (source files removed after transfer)
- Off = copy (source files preserved)
- Start the transfer and track progress in the Move modal/status bar.
Transfers are queued (up to 5 concurrent), and same-provider transfers prefer server-side copy.
Mount any bucket to a local folder and work with it like a normal disk:
- Open the bucket's menu in the sidebar (⋯) → Mount as local drive.
- Pick a local folder (defaults to
~/CloudMounts/<bucket>). Mounts are writable by default — turn off "Allow changes" for a read-only mount. - Use the folder in Finder / your file manager: open, copy, save, rename, and delete files. Changes upload to the bucket in the background a moment after you finish writing.
- Manage active mounts in Settings → Mounts (reveal, unmount), or from the bucket menu. All mounts are removed when the app quits.
How it works: the app runs a small NFSv3 server on 127.0.0.1 and mounts it with your OS's built-in NFS client — no macFUSE, WinFsp, or kernel extensions required. Renaming or moving files inside a mount is done server-side in the bucket (no re-upload), the same way the app's own move works. Note: like any local mount, while a bucket is mounted its files are readable — and, for writable mounts, changeable — by other apps on your machine; the server is never reachable from the network.
Good to know for writable mounts:
- Uploads finish in the background — keep the app running until they do. Unmounting waits for pending uploads; quitting mid-upload keeps the unsent file in the app's cache folder and logs its location.
- Deletes and overwrites in the folder are real bucket operations.
- macOS writes its usual
.DS_Storeand._*helper files into the folder, so they end up in the bucket too. - Moving files between two mounted buckets streams the data through your machine (an NFSv3 limit) — for large transfers across buckets, the app's Batch Move is much faster because it copies server-side.
Platform notes:
- macOS - Mounts instantly; no extra software, no sudo.
- Linux - Requires
nfs-utils(ornfs-common). If your distro needs root for NFS mounts, the app shows the exactsudo mountcommand to run once in a terminal. - Windows - Not supported yet; planned for a future release.
Cloudflare R2
- Go to Cloudflare Dashboard
- Navigate to R2 → Overview → Manage R2 API Tokens
- Create a token with appropriate permissions
- Note the Access Key ID and Secret Access Key (shown only once)
AWS S3
- Create an IAM user with S3 permissions and generate access keys.
- Note the Region for your buckets.
MinIO / RustFS
- Use the access/secret keys from your deployment.
- Set the endpoint host/port and scheme (http/https).
Account configurations are stored locally in a SQLite database:
- macOS:
~/Library/Application Support/r2/uploads-turso.db - Windows:
%APPDATA%\r2\uploads-turso.db - Linux:
~/.local/share/r2/uploads-turso.db
- Frontend: Next.js, React, Ant Design, Zustand
- Backend: Tauri (Rust)
- Storage: Cloudflare R2, AWS S3, MinIO, RustFS (S3-compatible)
- Database: SQLite (via Turso - Rust-based SQLite-compatible database)
- State: TanStack Query, Zustand
