{"id":34644634,"url":"https://github.com/dickwu/r2","last_synced_at":"2026-04-01T18:55:07.434Z","repository":{"id":329447885,"uuid":"1110747493","full_name":"dickwu/r2","owner":"dickwu","description":"A desktop application for managing Cloudflare R2 storage buckets. Built with Tauri, Next.js, and React. GUI","archived":false,"fork":false,"pushed_at":"2026-01-20T14:58:08.000Z","size":5634,"stargazers_count":16,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-21T13:35:06.190Z","etag":null,"topics":["cloudflare","gui","multiaccount","tools","uploader"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dickwu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-05T16:54:25.000Z","updated_at":"2026-01-20T15:00:05.000Z","dependencies_parsed_at":"2026-01-21T04:01:58.861Z","dependency_job_id":null,"html_url":"https://github.com/dickwu/r2","commit_stats":null,"previous_names":["dickwu/r2"],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/dickwu/r2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dickwu%2Fr2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dickwu%2Fr2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dickwu%2Fr2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dickwu%2Fr2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dickwu","download_url":"https://codeload.github.com/dickwu/r2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dickwu%2Fr2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28805492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T05:43:52.625Z","status":"ssl_error","status_checked_at":"2026-01-27T05:43:48.957Z","response_time":168,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare","gui","multiaccount","tools","uploader"],"created_at":"2025-12-24T17:37:04.027Z","updated_at":"2026-04-01T18:55:07.423Z","avatar_url":"https://github.com/dickwu.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloudflare R2 Client\n\nA desktop application for managing S3-compatible storage (Cloudflare R2, AWS S3, MinIO, RustFS). Built with Tauri, Next.js, and React.\n\n## Features\n\n- **Multi-Provider Support** - R2, AWS S3, MinIO, and RustFS (path-style forced)\n- **Multi-Account Support** - Manage multiple accounts across providers\n- **Multiple Tokens per Account (R2)** - Each account can have multiple API tokens with different bucket access\n- Browse and manage files in S3-compatible buckets\n- Upload files and folders with resumable multipart uploads\n- **File Preview** - Preview files directly in the app:\n  - **Images**: jpg, jpeg, png, gif, webp, svg, bmp, ico\n  - **Videos**: mp4, webm, ogg, mov, m4v\n  - **PDFs**: Full PDF viewer with page navigation\n  - **Text/Code**: Syntax-highlighted viewer with Monaco Editor supporting:\n    - Code: js, ts, jsx, tsx, css, scss, less, html, vue, svelte\n    - Config: json, yaml, yml, toml, xml, ini, env\n    - Documents: txt, md, markdown, rst, log\n    - Scripts: sh, bash, zsh, fish, ps1, bat, cmd\n    - Data: csv, sql\n- **Batch Operations** - Multi-select files and folders for:\n  - **Batch Download** - Download multiple files with progress tracking, pause/resume support\n  - **Batch Move** - Move files to different folders with folder tree picker\n  - **Batch Delete** - Delete multiple files with confirmation and progress indicator\n  - **Batch Rename for files in folder** - Rename files in a folder with confirmation and progress indicator\n- **Cross-Account Transfer** - High-performance file transfer between different accounts/providers:\n  - Transfer files between R2, AWS S3, MinIO, and RustFS\n  - Server-side copy when possible (same provider)\n  - Streaming transfer with no temp files for cross-provider moves\n  - Parallel multipart uploads for large files (4 concurrent parts)\n  - Up to 5 concurrent transfers\n  - Real-time progress tracking with speed display\n  - Pause/Resume/Cancel individual or all transfers\n  - Background processing - queue continues even when modal is closed\n  - Automatic queue continuation after each transfer completes\n- Video thumbnail generation (via ffmpeg)\n- Copy signed or public URLs to clipboard (provider-aware link building)\n- Dark mode support\n- Auto-updates\n\n## Install\n\n### Homebrew (macOS)\n\n```bash\nbrew install dickwu/tap/r2\n```\n\n### Download\n\nDownload the latest release for your platform from the [Releases page](https://github.com/dickwu/r2/releases/latest):\n\n- **macOS**: `.dmg` (Apple Silicon \u0026 Intel)\n- **Windows**: `.msi` or `.exe` installer\n- **Linux**: `.deb`, `.rpm`, or `.AppImage`\n\n## Screenshots\n\n![Prerequisites](./images/create-account.png)\n\n### Required\n\n- [Node.js](https://nodejs.org/) (v18+)\n- [Bun](https://bun.sh/) - Package manager\n- [Rust](https://www.rust-lang.org/tools/install) - For Tauri backend\n\n### Optional (for video thumbnails)\n\n- [ffmpeg](https://ffmpeg.org/) - Required for video thumbnail generation\n\n```bash\n# macOS\nbrew install ffmpeg\n\n# Ubuntu/Debian\nsudo apt install ffmpeg\n\n# Windows (via Chocolatey)\nchoco install ffmpeg\n```\n\n## macOS Installation\n\nOn macOS, you need to manually allow the app to run:\n\n1. Open **System Preferences** → **Privacy \u0026 Security**\n2. Click **\"Open Anyway\"** next to the blocked app message\n\nIf the app doesn't appear in Privacy \u0026 Security settings, run:\n\n```bash\nsudo xattr -d com.apple.quarantine /Applications/r2.app/\n```\n\nif you are getting error that can not run, try to run:\n\n```bash\nrm -rf ~/Library/Application\\ Support/com.lifefarmer.r2/\nrm -rf ~/Library/Caches/com.lifefarmer.r2/\nrm -rf ~/Library/Saved\\ Application\\ State/com.lifefarmer.r2.savedState/\n```\n\n## Development\n\n```bash\n# Install dependencies\nbun install\n\n# Run development server\nbun run tauri dev\n```\n\n### Debugging with tauri-connector\n\n[tauri-connector](https://github.com/dickwu/tauri-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.\n\n```bash\n# Start with connector enabled\nbun run tauri:dev\n\n# CLI commands (after app is running)\ntauri-connector snapshot -i          # AI DOM snapshot with element refs\ntauri-connector click @e5            # Click element by ref\ntauri-connector fill @e18 \"query\"    # Fill search box\ntauri-connector screenshot /tmp/r2.png  # Take screenshot\ntauri-connector logs -n 20           # View console logs\n```\n\nInstall the CLI: `cargo install connector-cli`\n\n## Build\n\n```bash\n# Build for production\nbun run tauri build\n```\n\n### Cross-compiling for Windows (from macOS/Linux)\n\nTo build Windows binaries from macOS or Linux, you need additional tools:\n\n```bash\n# Install required dependencies\n# macOS\nbrew install cmake ninja llvm nsis\n\n# Ubuntu/Debian\nsudo apt-get install cmake ninja-build llvm nsis\n\n# Install cargo-xwin\ncargo install --locked cargo-xwin\n\n# Setup Windows toolchain\ncargo xwin setup\n\n# Add Windows target\nrustup target add x86_64-pc-windows-msvc\n\n# Build for Windows\nbun run tauri build --runner cargo-xwin --target x86_64-pc-windows-msvc\n```\n\n**Note:** Cross-compilation is experimental. For production builds, consider using GitHub Actions or a Windows VM.\n\n## Configuration\n\n### Adding an Account\n\n1. On first launch, the \"Add Account\" dialog will open automatically\n2. Choose the provider (R2, AWS, MinIO, RustFS) via the clickable tags\n3. Enter provider-specific credentials:\n   - **R2**:\n     - **Account ID** (required) - Cloudflare account ID (from dashboard URL)\n     - **Token Name** (optional)\n     - **API Token** - R2 read/write token\n     - **Access Key ID** / **Secret Access Key**\n   - **AWS S3**:\n     - **Access Key ID** / **Secret Access Key**\n     - **Region** (required)\n     - **Endpoint** (optional custom scheme + host)\n     - **Force Path Style** (optional)\n   - **MinIO**:\n     - **Access Key ID** / **Secret Access Key**\n     - **Endpoint** (scheme + host/port)\n     - **Force Path Style** (optional)\n   - **RustFS**:\n     - **Access Key ID** / **Secret Access Key**\n     - **Endpoint** (scheme + host/port)\n     - **Force Path Style** is always enabled (not configurable)\n4. Click \"Load\" to fetch available buckets, or manually add bucket names\n5. Configure public domain per bucket (optional, R2/AWS only)\n\n**Endpoint/Domain Tips**\n\n- Endpoint and domain inputs accept full URLs (scheme + host) and normalize automatically.\n- For R2/AWS public domains, you can select `http`/`https` explicitly.\n\n### Managing Multiple Accounts\n\n- **Sidebar** - Shows all configured accounts with token/bucket counts\n- **Click account** - Opens drawer with all tokens and buckets for that account\n- **Click bucket** - Switches to that bucket\n- **Context menu** - Edit or delete accounts/tokens\n- **Collapse sidebar** - Click the collapse icon to minimize to icon-only view\n\n### Sync to a Different Account (Move/Copy)\n\nUse the Batch Move workflow to sync files between accounts/providers:\n\n1. Add both the source and destination accounts.\n2. Switch to the **source** bucket in the sidebar.\n3. Select files/folders -\u003e **Batch Move**.\n4. Choose the destination account + bucket, and an optional target folder.\n5. Toggle **Delete original**:\n   - **On** = move (source files removed after transfer)\n   - **Off** = copy (source files preserved)\n6. Start the transfer and track progress in the Move modal/status bar.\n\nTransfers are queued (up to 5 concurrent), and same-provider transfers prefer server-side copy.\n\n### Getting API Credentials\n\n**Cloudflare R2**\n\n1. Go to [Cloudflare Dashboard](https://dash.cloudflare.com/)\n2. Navigate to **R2** → **Overview** → **Manage R2 API Tokens**\n3. Create a token with appropriate permissions\n4. Note the **Access Key ID** and **Secret Access Key** (shown only once)\n\n**AWS S3**\n\n- Create an IAM user with S3 permissions and generate access keys.\n- Note the **Region** for your buckets.\n\n**MinIO / RustFS**\n\n- Use the access/secret keys from your deployment.\n- Set the endpoint host/port and scheme (http/https).\n\n## Data Storage\n\nAccount configurations are stored locally in a SQLite database:\n\n- **macOS**: `~/Library/Application Support/r2/uploads-turso.db`\n- **Windows**: `%APPDATA%\\r2\\uploads-turso.db`\n- **Linux**: `~/.local/share/r2/uploads-turso.db`\n\n## Tech Stack\n\n- **Frontend**: Next.js, React, Ant Design, Zustand\n- **Backend**: Tauri (Rust)\n- **Storage**: Cloudflare R2, AWS S3, MinIO, RustFS (S3-compatible)\n- **Database**: SQLite (via Turso - Rust-based SQLite-compatible database)\n- **State**: TanStack Query, Zustand\n\n## IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdickwu%2Fr2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdickwu%2Fr2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdickwu%2Fr2/lists"}