Version 0.3.21, released November 3, 2026

Every bucket you own, in one native app.

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.

Download for macOS
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.

Mount a bucket as a local drive.

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.

  • macOSWorks out of the box, no extra software.
  • LinuxNeeds nfs-utils. If your distro wants root for NFS mounts, the app shows the exact command to run once.
  • WindowsPro and Enterprise mount to a drive letter through the built-in Client for NFS. Fixed in 0.3.14, so drives no longer show as Unavailable.
assets-prod
Cloudflare R2
reads, cached in 4 MiB chunks
saves, uploaded in the background
assets-prod
~/CloudMounts/assets-prod
NFS on 127.0.0.1, never reachable from the network Read-only toggle per mount Manage mounts in Settings

Move files between providers.

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.

production / photos
Cloudflare R2
streamed, no temp files
archive / photos
AWS S3
2026/launch/launch-trailer.mp4done
2026/launch/press-kit.pdfpart 3 of 4
2026/launch/hero-background.webppaused

Preview files where they live.

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.

Imagesjpg png gif webp svg bmp ico HEIC, AVIF, PSD, JXL thumbnails
Videomp4 webm mov m4v ogg cached thumbnails
Documentspdf md txt rst log csv
Officedocx xlsx pptx Word, Excel, PowerPoint
And morearchives, e-books, e-mail, CAD, 3D models, design files
Codets tsx js jsx css scss html vue svelte json yaml toml xml sql sh ps1 and more, in Monaco

Also in the box.

  • Resumable multipart uploadsDrop a 10 GB file, close the laptop, and pick up where you left off. Parts upload in parallel. Since 0.3.15, uploads wait in a queue that runs 3 to 5 at once, your choice, and retry network errors, timeouts, and throttling on their own.
  • Fast browsing on huge bucketsFolders open in under a second on buckets with millions of objects, backed by a local cache. Since 0.3.4, sync keeps going when one folder cannot be listed.
  • Thumbnail cacheImage and video thumbnails are kept on disk after the first visit. A Storage tab in Settings shows how much space they use and lets you set a limit or clear them.
  • Batch operationsSelect hundreds of files and download, move, delete, or rename them at once, with pause, resume, and cancel.
  • Several accounts and tokensAdd as many accounts as you like. An R2 account can hold several API tokens, each limited to its own buckets.
  • Signed and public linksCopy a provider-aware URL with one shortcut. Custom domains per bucket on R2 and S3.
  • Report a problemOne click opens a GitHub issue draft with your version, OS, and recent app errors, secrets redacted. Nothing is sent until you submit it.
  • Native, not ElectronA Tauri app with a Rust backend: small binary, quick launch, low memory.
  • Auto-updates and themesIn-app update checks, a Homebrew tap on macOS, and light and dark themes.

Four providers, configured the way each one expects.

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.

Install in a minute.

Native builds for macOS, Windows, and Linux, with auto-updates on every platform.

  1. Install R2 Client

    Use Homebrew on macOS, or download the installer for your platform. Building from source needs Bun and Rust.

  2. Add an account

    The Add Account dialog opens on first launch. Pick a provider, paste your credentials, and click Load to fetch your buckets.

  3. Browse, preview, and share

    Click a bucket in the sidebar to browse it. Upload, preview, rename, and copy signed or public links from the file list.

  4. Mount or move

    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/

What changed recently.

The main changes from recent releases. Every release ships for all three platforms and installs itself through auto-update.

  1. v0.3.21
    November 3, 2026
    Latest

    Thumbnails are kept on disk

    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.

  2. v0.3.20
    November 3, 2026

    Video thumbnails show the frame at one second

    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.

  3. v0.3.19
    October 30, 2026

    Custom domains work right away

    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.

  4. v0.3.18
    October 27, 2026

    Updates show what changed

    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.

  5. v0.3.17
    October 26, 2026

    Edit files in the app

    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.

  6. v0.3.15
    October 23, 2026

    Upload queue with automatic retries

    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).

  7. v0.3.14
    October 21, 2026

    Windows mounting fixed, offline text editor

    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.

  8. v0.3.12
    October 20, 2026

    Previews identify files by their content

    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.

  9. v0.3.11
    October 14, 2026

    Preview about 250 file formats

    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.

  10. v0.3.8
    September 25, 2026

    Transfer failures in one place

    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.

  11. v0.3.7
    September 24, 2026

    Local-network storage on macOS 15

    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.

  12. v0.3.6
    September 23, 2026

    Sturdier moves and crash-safe mount writes

    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.

  13. v0.3.5
    September 13, 2026

    Faster listings in mounts, safer recovery for interrupted transfers

    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.

  14. v0.3.4
    September 3, 2026

    Background sync survives a folder it cannot list

    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.

  15. v0.3.3
    September 2, 2026

    Report a problem

    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".

  16. v0.3.2
    August 28, 2026

    Faster mounts, live mount progress, Windows mounting

    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.

  17. v0.3.1
    August 7, 2026

    Mounted buckets are writable

    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.

  18. v0.3.0
    August 6, 2026

    Mount buckets as local drives

    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.

  19. v0.2.17
    June 9, 2026

    Folder uploads keep their structure

    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.

  20. v0.1.71
    March 22, 2026

    Multi-threaded download engine

    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.

  21. v0.1.68
    March 18, 2026

    Progressive lazy sync

    Every folder opens in under a second regardless of bucket size, on buckets with millions of objects across R2, AWS, and MinIO.

All releases on GitHub

Questions people ask.

Something missing? Open an issue and it will be answered there.

What providers does R2 Client support?

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.

Is R2 Client free and open source?

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.

Which operating systems does it run on?

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.

Can I mount a bucket as a local drive?

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.

How does it move files between providers?

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.

What file types can it preview?

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.

What happens when I use Report a problem?

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.

Is it built on Electron?

No. R2 Client is a Tauri app with a Rust backend and a React frontend, so the binary is small and it opens quickly.

Get R2 Client.

Native builds for every desktop OS. No account required, and updates install themselves.

Every build is signed for auto-update. MIT licensed. Older releases