Version 0.3.21, released November 3, 2026
R2 Client is a desktop app for Cloudflare R2, AWS S3, MinIO, and RustFS. Browse and preview objects, move them between providers, or mount a bucket as a local drive.
brew install dickwu/tap/r2
Also for Windows and Linux. Free and open source under the MIT license.
The folder in Finder is the bucket, mounted as a drive. Save a file there and the app uploads it in the background.
Pick a bucket and a folder, and the bucket shows up in Finder, Explorer, or your file manager. Open, save, rename, and delete files there. Changes upload in the background, renames happen inside the bucket with no re-upload, and a toggle makes any mount read-only.
The app serves the mount itself over NFS on localhost, so there is nothing to install: no macFUSE, no WinFsp, no kernel extensions. Reads arrive in 4 MiB chunks with read-ahead and a per-mount cache, and every mount transfer shows live progress in the transfer dock. Since 0.3.5, a large folder lists as each page arrives, so it opens right away instead of after the whole listing.
Select files in one account and send them to another, even on a different provider. Moves within one provider copy server-side. Moves across providers stream through the app with no temp files and no local disk hit.
Up to five transfers run at once with four parallel parts each. Pause, resume, or cancel any of them, and the queue keeps going after you close the dialog. If a backend fails mid-transfer, the app keeps track of what it was moving and resumes without repeating work the backend already acknowledged. Failed moves retry on their own with backoff, and a transfer that still fails opens a dialog with the provider's exact error code and message.
Images, video, PDFs, Markdown, and code open inline without a download. Code uses the Monaco editor with syntax highlighting, and image and video thumbnails are made in the app with a bundled copy of ffmpeg, then kept on disk so a folder you have opened before shows them right away. HEIC, AVIF, PSD, and JXL files get thumbnails too.
Since 0.3.11, about 250 file extensions open in a read-only viewer bundled with the app, from Office documents to archives, e-books, CAD, and 3D models. Files with no extension or the wrong one are identified by their content and open in the right viewer.
Provider-aware sign-in, endpoints, path-style rules, and link builders.
Any other S3-compatible service works with the AWS or MinIO account type and a custom endpoint.
| Setting | R2Cloudflare R2 | S3AWS S3 | MMinIO | rsRustFS |
|---|---|---|---|---|
| Credentials | Account ID and API token, plus an access key pair. Several tokens per account, each with its own bucket access. | Access key pair for an IAM user with S3 permissions. | Access key pair from your deployment. | Access key pair from your deployment. |
| Endpoint | Derived from your account ID. | A region, or a custom endpoint for S3 clones. | Your host and port, http or https. | Your host and port, http or https. |
| Path-style | Not needed. | Optional. | Optional. | Always on. |
| Links | Signed URLs, and a public domain per bucket. | Signed URLs, and a public domain per bucket. | Signed URLs. | Signed URLs. |
Endpoint and domain fields accept full URLs and normalize them. Buckets can be fetched with one click or added by name.
Native builds for macOS, Windows, and Linux, with auto-updates on every platform.
Use Homebrew on macOS, or download the installer for your platform. Building from source needs Bun and Rust.
The Add Account dialog opens on first launch. Pick a provider, paste your credentials, and click Load to fetch your buckets.
Click a bucket in the sidebar to browse it. Upload, preview, rename, and copy signed or public links from the file list.
Open a bucket's menu and choose Mount as local drive to work in Finder, or select files and choose Batch Move to send them to another account.
# Install with Homebrew brew install dickwu/tap/r2 # Installed from the .dmg instead and macOS blocked it? # System Settings → Privacy & Security → Open Anyway, or: sudo xattr -d com.apple.quarantine /Applications/r2.app/
# Debian / Ubuntu sudo dpkg -i r2_*_amd64.deb # Fedora / RHEL sudo rpm -i r2-*.x86_64.rpm # Or run the AppImage directly chmod +x r2_*_amd64.AppImage && ./r2_*_amd64.AppImage # Optional: nfs-utils for mounting buckets sudo apt install nfs-common # Debian / Ubuntu sudo dnf install nfs-utils # Fedora
# Run the .msi or the -setup.exe installer, then launch R2 Client # from the Start menu. Auto-updates are on by default. # Optional: mounting buckets needs the Client for NFS feature (Pro / Enterprise) Enable-WindowsOptionalFeature -Online -FeatureName ServicesForNFS-ClientOnly
# Clone and install git clone https://github.com/dickwu/r2.git cd r2 bun install # Run the dev build bun run tauri dev # Or produce a release build bun run tauri build
The main changes from recent releases. Every release ships for all three platforms and installs itself through auto-update.
Image and video thumbnails are now made once and kept on disk, so a folder you have opened before shows its thumbnails right away, even after a restart. The grid loads small thumbnails instead of the full images, and HEIC, AVIF, PSD and JXL files get thumbnails too. The cache cleans itself up, and a new Storage tab in Settings shows how much space it uses and lets you set a limit or clear it. I also fixed video thumbnails for files in a bucket, which could show a black tile.
Video thumbnails in the file grid now show the frame at one second on every Mac, Windows, and Linux machine, because the app ships its own copy of ffmpeg. Before, a Mac app opened from Finder or the Dock couldn't find a Homebrew ffmpeg, so MP4 files showed only a play icon. If ffmpeg can't read a video, the thumbnail falls back to the app's built-in player, and a tile without a preview says why.
A custom domain saved for a bucket now drives copied and shared links immediately, without quitting and reopening the app, and a bucket with a domain can stay Private. I also fixed the Move button in list view, made the title bar show the bucket apart from the folder path, and made the batch move Delete original switch work with the keyboard and screen readers.
The update dialog lists what changed in every version between yours and the new one, the download shows its progress, and a failed download offers Try again and Download from GitHub. If transfers are running or the editor has unsaved changes, the update can install now and restart later. After an update, a What's new note lists the changes once, and Settings shows the app version and the release notes.
Text and code, Markdown, JSON, CSV and TSV files, and PNG, JPEG, and WebP images open in an editor and save back to the bucket with Cmd/Ctrl+S. A save first checks that nobody changed the object since you opened it, and keeps its Content-Type, encoding, byte-order mark, and line endings. Previews and the editor go fullscreen with a button or F, and an edited copy can be downloaded to disk at any time, even with read-only credentials.
Dropping a large batch of files no longer starts every upload at once. Uploads wait in a queue that runs 3 at a time by default, adjustable up to 5, and the upload list shows which files are queued and which are retrying. Transient failures such as network errors, timeouts, throttling (429), and server errors (5xx) retry on their own with backoff on R2, AWS S3, MinIO, and RustFS, while permission and not-found errors fail right away (fixes #18).
Mounting a bucket as a drive on Windows now works: drives no longer show as Unavailable, lookups are case-sensitive, existing files can be overwritten, and a failed mount shows what mount.exe printed. Each mount listens on its own localhost address, so a drive letter left behind by a crash can never show another mount's bucket. The text preview and editor load Monaco from the app instead of a CDN, so they work offline.
Objects with no extension, such as UUID or hash keys, now preview in the right viewer: the app reads the first 3 KB and identifies the format. Grid thumbnails, file icons, and type labels work for them too. When a file's content doesn't match its name, the preview says so and offers both renderings, and files saved from the text editor keep their original Content-Type.
Word, Excel, PowerPoint, and other Office files, archives, e-books, e-mail, CAD, 3D models, and design files open in a read-only viewer without leaving the app. PDFs render with a viewer bundled in the app instead of a CDN worker, and objects over 100 MB wait behind a Load preview button instead of downloading as soon as you select them. Installers are larger because the viewer ships inside the app.
A failed upload, download, move, or rename opens a dialog with the provider's error code and message, selectable and copyable, plus the account, bucket, key, and time. Several failures are listed together, and Report a problem prefills an issue from them. Batch delete now shows the reason for every key that failed.
Self-hosted RustFS or MinIO on your local network connects on macOS 15 and later instead of failing with "No route to host". macOS asks for Local Network access the first time; choose Allow.
Same-account R2 moves copy on the server again, pausing or cancelling a move no longer marks it failed, and failed moves retry on their own with backoff. Writes to a mounted drive are acknowledged only once they are durably logged, using a new write-ahead log that survives a crash or power loss, and unmounting waits for pending uploads of any size. A folder you opened before shows its cached contents right away while it refreshes.
A mounted bucket shows a folder's entries as each page arrives instead of waiting for the full listing, so large prefixes are browsable immediately, and the app no longer re-sorts and rebuilds the file list on every update while a listing streams in. A transfer interrupted by a backend failure keeps track of what it was moving, and expired multipart work resumes without repeating copies the backend already acknowledged. Directory caches are now bound to the account and bucket that produced them, so entries from one can no longer show up under another.
One folder the provider refuses to list no longer takes the whole sync down. The crawl skips it, finishes, and lists that folder live so it shows the real error instead of appearing empty. List requests retry transient failures with exponential backoff, a later successful sync clears an earlier failure, and error messages now carry the provider's own code and message.
A status-bar button, also in the command palette, opens a prefilled GitHub issue with your app version, OS, and the errors recorded this session. Credential-shaped strings are redacted as they are logged, you review the draft first, and nothing is filed until you press Submit on GitHub. S3 failures now report the provider's own error instead of a bare "service error".
Reads from a mounted bucket fetch 4 MiB chunks with read-ahead and a per-mount cache instead of one request per 128 KiB. Files copied into a mount show up in the transfer dock with live bytes, speed, and ETA. Mounting now works on Windows Pro and Enterprise through the built-in Client for NFS, with each bucket on its own drive letter.
Save, rename, move, and delete files right in a mounted folder. Changes upload in the background, renames happen server-side with no re-upload, and unmounting waits for pending uploads. Each mount has a read-only toggle, and a Settings panel manages every active mount.
Every bucket gets a Mount as local drive action. The app serves it as an NFSv3 filesystem on 127.0.0.1 and the OS's built-in NFS client mounts it. Works across R2, S3, MinIO, and RustFS with no macFUSE and no kernel extensions.
Uploading a folder preserves its nested directories on every OS, fixing a Windows bug where subfolders collapsed into backslash-prefixed names. The selected folder's own name stays as the top-level prefix, so site/ lands as site/css/app.css.
Parallel HTTP Range requests: files of 10 MB or more are split into 8 MB chunks with per-chunk progress and an always-visible status bar.
Every folder opens in under a second regardless of bucket size, on buckets with millions of objects across R2, AWS, and MinIO.
Something missing? Open an issue and it will be answered there.
Cloudflare R2, AWS S3, MinIO, and RustFS, plus any other S3-compatible service through a custom endpoint. You can add several accounts per provider, and R2 accounts can hold several API tokens with different bucket access.
Yes. It is free and open source under the MIT license, and no account is needed to download or use it. The source is at github.com/dickwu/r2.
macOS, Windows, and Linux, with native builds and auto-updates for each. On macOS you can also install it with Homebrew: brew install dickwu/tap/r2.
Yes. Pick a bucket, choose a folder, and it appears in Finder or your file manager as a writable drive; a toggle makes it read-only. The app serves the mount itself over NFS on localhost, so there is nothing else to install. macOS works out of the box, Linux needs nfs-utils, and Windows Pro or Enterprise uses the built-in Client for NFS and mounts to a drive letter.
Select files and choose Batch Move with another account as the destination. Moves within one provider copy server-side; moves across providers stream through the app without temp files. Up to five transfers run at once with four parallel parts each, and every transfer can be paused, resumed, or cancelled.
Images, video, PDFs, Markdown, and code open inline. Code uses the Monaco editor with syntax highlighting for more than 30 languages, and image and video thumbnails are generated with a bundled copy of ffmpeg and kept on disk. Since 0.3.11, about 250 file extensions open in a read-only viewer, including Word, Excel, and PowerPoint files, archives, e-books, e-mail, CAD, and 3D models, and since 0.3.12 a file with no extension or the wrong one is identified by its content.
The app opens a GitHub issue draft in your browser, prefilled with your app version, operating system, and the errors it recorded during the session. Access keys and secrets are redacted as each line is logged, you can review everything first, and nothing is sent until you submit the issue on GitHub.
No. R2 Client is a Tauri app with a Rust backend and a React frontend, so the binary is small and it opens quickly.
Native builds for every desktop OS. No account required, and updates install themselves.
.dmg for Apple Silicon and Intel, or brew install dickwu/tap/r2
Download
.msi or .exe installer, 64-bit
Download
.deb, .rpm, or .AppImage, x86_64
Download
Every build is signed for auto-update. MIT licensed. Older releases