{"id":33897434,"url":"https://github.com/neverinfamous/r2-manager-worker","last_synced_at":"2026-04-06T18:00:54.866Z","repository":{"id":262725830,"uuid":"888156030","full_name":"neverinfamous/R2-Manager-Worker","owner":"neverinfamous","description":"Self-hosted web app for Cloudflare R2 buckets. Supports drag-and-drop uploads, batch copy/move/delete, multi-file ZIP downloads, signed share links, folder hierarchies, advanced cross-bucket search + filters (extension, size, date), S3 imports, lifecycle management, local uploads, custom tags \u0026 GitHub SSO via Cloudflare Zero Trust.","archived":false,"fork":false,"pushed_at":"2026-03-11T03:05:27.000Z","size":2518,"stargazers_count":24,"open_issues_count":0,"forks_count":11,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-11T08:43:47.859Z","etag":null,"topics":["cloudflare","cloudflare-r2","cloudflare-workers","cloudflare-zero-trust","developer-productivity","developer-tool","developer-tools","development-tools","development-utility","github-sso","r2-bucket","r2-storage","react","s3-buckets","s3-compatible","storage-management","typescript","vite","webapp"],"latest_commit_sha":null,"homepage":"https://adamic.tech/articles/r2-manager","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neverinfamous.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY_CONTACT.md","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":"2024-11-13T23:01:28.000Z","updated_at":"2026-03-11T03:04:47.000Z","dependencies_parsed_at":"2025-12-29T07:04:11.816Z","dependency_job_id":null,"html_url":"https://github.com/neverinfamous/R2-Manager-Worker","commit_stats":null,"previous_names":["neverinfamous/worker","neverinfamous/r2-manager-worker"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/neverinfamous/R2-Manager-Worker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2FR2-Manager-Worker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2FR2-Manager-Worker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2FR2-Manager-Worker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2FR2-Manager-Worker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neverinfamous","download_url":"https://codeload.github.com/neverinfamous/R2-Manager-Worker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2FR2-Manager-Worker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31483380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: 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","cloudflare-r2","cloudflare-workers","cloudflare-zero-trust","developer-productivity","developer-tool","developer-tools","development-tools","development-utility","github-sso","r2-bucket","r2-storage","react","s3-buckets","s3-compatible","storage-management","typescript","vite","webapp"],"created_at":"2025-12-11T19:12:12.884Z","updated_at":"2026-04-06T18:00:54.860Z","avatar_url":"https://github.com/neverinfamous.png","language":"TypeScript","readme":"# R2 Bucket Manager\n\nA modern web application for managing Cloudflare R2 buckets with enterprise-grade authentication via Cloudflare Access Zero Trust.\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue)](https://opensource.org/licenses/MIT)\n![Version](https://img.shields.io/github/package-json/v/neverinfamous/R2-Manager-Worker?color=green\u0026label=version)\n![Status](https://img.shields.io/badge/status-Production%2FStable-brightgreen)\n[![Security](https://img.shields.io/badge/Security-Enhanced-green.svg)](https://github.com/neverinfamous/R2-Manager-Worker/blob/main/SECURITY.md)\n[![CodeQL](https://img.shields.io/badge/CodeQL-Passing-brightgreen.svg)](https://github.com/neverinfamous/R2-Manager-Worker/security/code-scanning)\n[![Type Safety](https://img.shields.io/badge/TypeScript-Strict-blue.svg)](https://github.com/neverinfamous/R2-Manager-Worker)\n\nR2 Bucket Manager for Cloudflare — A full-featured, self-hosted web app to manage Cloudflare R2 buckets and objects. Supports job history tracking, AI-powered search, drag-and-drop uploads with verification, batch copy/move/delete, multi-file ZIP downloads, signed share links, folder hierarchies, advanced search + filters (extension, size, date), S3 import, tags and GitHub SSO via Cloudflare Zero Trust.\n\n**[Live Demo](https://r2.adamic.tech/)** • **[Docker](https://hub.docker.com/r/writenotenow/r2-bucket-manager)** • **[Wiki](https://github.com/neverinfamous/R2-Manager-Worker/wiki)** • **[Changelog](https://github.com/neverinfamous/R2-Manager-Worker/blob/main/CHANGELOG.md)** • **[Release Article](https://adamic.tech/articles/r2-manager)**\n\n**Tech Stack:** React | Vite | TypeScript | Cloudflare Workers + Zero Trust\n\n---\n\n## ✨ Features\n\n| Feature                            | Description                                                                                                                                                                                                             |\n| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 🎯 **Custom Metadata**             | User-defined, searchable bucket tags                                                                                                                                                                                    |\n| 🚀 **S3 Import** `BETA`            | Migrate data from Amazon, Google, and All S3 Compatible buckets to R2 using Cloudflare's Super Slurper API.                                                                                                             |\n| 📊 **Metrics Dashboard**           | Comprehensive R2 analytics with tabbed interface (Overview \\| Storage), bucket-level filtering, storage trends, object count tracking, and Class A/B operation breakdowns powered by Cloudflare's GraphQL Analytics API |\n| 🏥 **Health Dashboard**            | At-a-glance operational status with health score, job monitoring, and bucket organization metrics                                                                                                                       |\n| 🪝 **WebHooks**                    | 15 event types for bucket operations (file uploads, moves, copies, renames, folder lifecycle, bucket operations, job status)                                                                                            |\n| 📋 **Job History \u0026 Audit Logging** | Complete audit trail for all operations (bulk and individual) with filterable job list and event timeline                                                                                                               |\n| 🤖 **AI Search Integration**       | Connect R2 buckets to Cloudflare AI Search for semantic search, natural language queries, and RAG capabilities. Supports PDF, DOCX, and 20+ file formats with automatic indexing and real-time status monitoring.       |\n| 🔎 **Cross-Bucket Search**         | Search for files across all buckets with advanced filtering                                                                                                                                                             |\n| 🪣 **Bucket Management**           | Create, rename, and delete R2 buckets (with bulk delete support)                                                                                                                                                        |\n| 📦 **Multi-Bucket Download**       | Select and download multiple buckets as a single ZIP archive with \"Select All\" button                                                                                                                                   |\n| 🧭 **Bucket Filtering**            | Filter buckets by name, size, and creation date with preset and custom ranges                                                                                                                                           |\n| ⏳ **Object Lifecycle Management** | Configure automated expiration and storage class transitions for cost optimization (33% savings with Infrequent Access)                                                                                                 |\n| ⚡ **Local Uploads**               | Enable per-bucket local uploads for up to 75% faster upload performance by writing data to storage near the client                                                                                                      |\n| 📁 **Folder Management**           | Create, rename, copy, move, and delete folders with hierarchical navigation                                                                                                                                             |\n| 📄 **File Management**             | Rename files via right-click context menu with validation                                                                                                                                                               |\n| 🔍 **Smart Filtering**             | Real-time client-side filtering by filename/folder name with type filters (All/Files/Folders)                                                                                                                           |\n| 🎯 **Advanced Filtering**          | Filter files by extension, size ranges, and upload dates with preset and custom options                                                                                                                                 |\n| 📤 **Smart Uploads**               | Chunked uploads with automatic retry and integrity verification (10MB chunks, up to 500MB files)\\*                                                                                                                      |\n| ✓ **Upload Verification**          | MD5 checksum verification ensures uploaded files match stored files exactly                                                                                                                                             |\n| 📥 **Bulk Downloads**              | Download multiple files as ZIP archives                                                                                                                                                                                 |\n| 🔗 **Shareable Links**             | Generate signed URLs to share files securely                                                                                                                                                                            |\n| 🔄 **Advanced File Operations**    | Move and copy files/folders between buckets and to specific folders within buckets                                                                                                                                      |\n| 🗑️ **Bulk Bucket Delete**          | Select and force delete multiple buckets at once with progress tracking                                                                                                                                                 |\n| 🧭 **Breadcrumb Navigation**       | Navigate through folder hierarchies with ease                                                                                                                                                                           |\n| 🔐 **Enterprise Auth**             | GitHub SSO via Cloudflare Access Zero Trust                                                                                                                                                                             |\n| 🛡️ **Rate Limiting**               | Tiered API rate limits (600/min reads, 200/min writes, 60/min deletes) with automatic enforcement                                                                                                                       |\n| ⚡ **Edge Performance**            | Deployed on Cloudflare's global network with intelligent client-side caching (5-min TTL)                                                                                                                                |\n| 🔄 **Smart Retry Logic**           | Automatic exponential backoff for rate limits and transient errors (429/503/504)                                                                                                                                        |\n| 🎨 **Modern UI**                   | Beautiful, responsive interface built with React 19                                                                                                                                                                     |\n| 🌓 **Light/Dark Mode**             | Auto-detects system preference with manual toggle (System → Light → Dark)                                                                                                                                               |\n\n**Upload Size Limits:** This application supports uploads up to 500MB per file. However, **Cloudflare enforces plan-based limits**:\n\n- **Free/Pro Plans:** 100MB maximum per file\n- **Business Plan:** 200MB maximum per file\n- **Enterprise Plan:** 500MB maximum per file\n\n### Supported File Types\n\n**Accepted file types and size limits:**\n\n- **Archives** (7Z, GZ, RAR, TAR, ZIP) - up to 500MB\n- **Audio** (AAC, FLAC, M4A, MP3, OGG, OPUS, WAV) - up to 100MB\n- **Code** (CSS, GO, HTML, HTM, Java, JS, JSX, Rust, SH, TS, TSX, Python, etc.) - up to 10MB\n- **Config \u0026 Metadata** (CONF, ENV, INI, JSON, JSONC, LOCK, PROPERTIES, TOML, XML, YAML, YML, etc.) - up to 10MB\n- **Data Formats** (AVRO, FEATHER, NDJSON) - up to 50MB\n- **Databases** (DB, PARQUET, SQL) - up to 50MB\n- **Dev Environment** (Dockerfile, editorconfig, .gitignore, nvmrc, etc.) - up to 1MB\n- **Documents** (CSV, Excel, LaTeX, Markdown, MDX, ODT, PDF, PowerPoint, RST, SGML, TXT, Word, etc.) - up to 50MB\n- **Documentation** (NFO) - up to 10MB\n- **Fonts** (EOT, OTF, TTF, WOFF, WOFF2) - up to 10MB\n- **Images** (AVIF, BMP, GIF, HEIC, JPG, PNG, PSD, SVG, WebP) - up to 15MB\n- **Jupyter Notebooks** (.ipynb) - up to 10MB\n- **Scripts** (BAT, PS1, SH) - up to 10MB\n- **Videos** (3GP, AVI, FLV, M4V, MKV, MOV, MP4, MPEG, OGG, WebM, WMV) - up to 500MB\n\n---\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- [Cloudflare account](https://dash.cloudflare.com/sign-up) (Free tier works!)\n- [Node.js](https://nodejs.org/) 24+ (LTS) and npm\n- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) (4.36.0+ for rate limiting)\n- Domain managed by Cloudflare (optional - can use Workers.dev subdomain)\n\n**Note:** Rate limiting requires a Cloudflare Workers paid plan. All other features work on the free tier.\n\n### Installation\n\n1. **Clone and install:**\n\n   ```bash\n   git clone https://github.com/neverinfamous/R2-Manager-Worker.git\n   cd R2-Manager-Worker\n   npm install\n   ```\n\n2. **Configure environment:**\n\n   ```bash\n   cp .env.example .env\n   cp wrangler.toml.example wrangler.toml\n   ```\n\n   Edit both files with your settings.\n\n   **Optional - Enable Rate Limiting:**\n   - Rate limiting is pre-configured in `wrangler.toml.example`\n   - Requires Wrangler 4.36.0+ and Workers paid plan\n   - If you don't have a paid plan, the app works fine without it\n\n3. **Create R2 bucket:**\n\n   ```bash\n   npx wrangler login\n   npx wrangler r2 bucket create your-bucket-name\n   ```\n\n4. **Configure Cloudflare Access:**\n   - Set up GitHub OAuth in [Zero Trust](https://one.dash.cloudflare.com/)\n   - Create an Access application for your domain\n   - Copy the Application Audience (AUD) Tag\n\n5. **Set Worker secrets:**\n\n   ```bash\n   npx wrangler secret put ACCOUNT_ID\n   npx wrangler secret put CF_EMAIL\n   npx wrangler secret put API_KEY\n   npx wrangler secret put TEAM_DOMAIN\n   npx wrangler secret put POLICY_AUD\n   ```\n\n6. **Deploy:**\n   ```bash\n   npm run build\n   npx wrangler deploy\n   ```\n\n**📖 For detailed instructions, see the [Installation \u0026 Setup Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Installation-\u0026-Setup).**\n\n---\n\n### Upgrading from v3.1.0\n\nIf you already have Job History set up and want to enable individual action logging (file uploads, downloads, deletes, etc.), run the schema migration to add the new `audit_log` table:\n\n```bash\nnpx wrangler d1 execute r2-manager-metadata --remote --file=worker/schema.sql\n```\n\n\u003e **Note:** This command is safe to run multiple times - it uses `CREATE TABLE IF NOT EXISTS` so existing tables are not affected. If you don't run the migration, the application will continue to work normally but individual actions won't be logged (only bulk operations).\n\n**📖 See the [Job History Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Job-History) for complete documentation.**\n\n---\n\n## 🐳 Docker Development Environment\n\nFor local development and testing, use the Docker image:\n\n```bash\ndocker pull writenotenow/r2-bucket-manager:latest\n```\n\n```bash\ndocker run -p 8787:8787 writenotenow/r2-bucket-manager:latest\n```\n\nAccess the development server at `http://localhost:8787`\n\n**Note:** Docker deployment is for development/testing only. For production, deploy to Cloudflare Workers using the instructions above.\n\n**📖 See the [Docker Hub page](https://hub.docker.com/r/writenotenow/r2-bucket-manager) for complete Docker documentation.**\n\n---\n\n## 📦 Bulk Operations\n\n### Multi-Bucket Download\n\nDownload multiple buckets simultaneously as a single, timestamped ZIP archive.\n\n- **Zero Dependencies:** Generates archives on the fly without size limits.\n- **Smart Structure:** Maintains full folder hierarchy (`/bucket-name/folder/file.ext`).\n- **Bulk Actions:** dedicated toolbar for \"Select All\" and batch processing.\n\n### Bulk Bucket Deletion\n\nSelect and force-delete multiple buckets in one operation.\n\n- **Safety First:** Enhanced confirmation modal calculates total files and size before deletion.\n- **Force Delete:** Automatically recursively empties buckets before removing them.\n- **Progress Tracking:** Visual feedback for long-running deletion tasks.\n\n---\n\n## 🔎 Search \u0026 Filtering\n\n### Cross-Bucket Search\n\nReal-time, server-side parallel search across **all** your buckets instantly.\n\n- **Performance:** Queries thousands of files in seconds with minimal overhead.\n- **Direct Actions:** Move, copy, download, or delete files directly from search results.\n- **Deep Linking:** Click bucket badges to navigate directly to the source.\n\n### Advanced Filtering\n\nComprehensive client-side filtering for large buckets.\n\n- **Smart Filters:** Filter by **File Type** (Images, Code, Docs), **Size** (Presets or custom ranges), and **Date** (Upload time).\n- **Context Aware:** Toggle between \"Files Only,\" \"Folders Only,\" or \"All.\"\n- **Persistent:** Active filters remain applied during batch operations and navigation.\n\n---\n\n## 📋 Job History \u0026 Audit Logging\n\nTrack all operations with a comprehensive audit trail and event timeline.\n\n### Features\n\n- **Bulk Operation Tracking**: Automatically track bulk downloads, uploads, deletions, moves, and copies\n- **Individual Action Logging**: Every file upload, download, delete, rename, move, and copy is logged\n- **Folder \u0026 Bucket Auditing**: Track folder creation, deletion, renaming, and all bucket operations\n- **Filterable List**: Filter by status (success, failed, running), operation type, bucket, and date range\n- **Grouped Operations**: Operation types organized by category (Bulk, File, Folder, Bucket, AI)\n- **Event Timeline**: View detailed progress history for bulk jobs in a modal dialog\n- **Real-time Progress**: See percentage completion and item counts during bulk operations\n- **Job Search**: Quickly find jobs by ID\n- **Sorting Options**: Sort by date, item count, or error count\n\n### Configuration\n\nJob history requires a D1 database. Add the binding to your `wrangler.toml`:\n\n```toml\n[[d1_databases]]\nbinding = \"METADATA\"\ndatabase_name = \"r2-manager-metadata\"\ndatabase_id = \"your-database-id\"\n```\n\nCreate the database and run the schema:\n\n```bash\nnpx wrangler d1 create r2-manager-metadata\nnpx wrangler d1 execute r2-manager-metadata --remote --file=worker/schema.sql\n```\n\n## 🤖 AI Search Integration\n\nConnect your R2 buckets to Cloudflare AI Search (formerly AutoRAG) for powerful semantic search and AI-powered question answering.\n\n### Features\n\n- **Compatibility Analysis**: See which files in your bucket can be indexed by AI Search\n- **Visual Reports**: Donut chart showing indexable vs non-indexable file ratios\n- **Dual Search Modes**:\n  - **AI Search**: Get AI-generated answers based on your data\n  - **Semantic Search**: Retrieve relevant documents without AI generation\n- **Instance Management**: List, sync, and query AI Search instances from the UI\n- **Direct Dashboard Link**: Quick access to Cloudflare Dashboard for instance creation\n\n### Supported File Types\n\nAI Search can index these file types (up to 4MB each):\n\n- **Text**: `.txt`, `.md`, `.rst`, `.log`\n- **Config**: `.json`, `.yaml`, `.yml`, `.toml`, `.ini`, `.conf`, `.env`\n- **Code**: `.js`, `.ts`, `.py`, `.html`, `.css`, `.xml`\n- **Documents**: `.tex`, `.latex`, `.sh`, `.bat`, `.ps1`\n\n### Configuration\n\nAdd the AI binding to your `wrangler.toml`:\n\n```toml\n[ai]\nbinding = \"AI\"\n```\n\n**📖 See the [AI Search Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/AI-Search) for complete setup instructions.**\n\n---\n\n## 🛡️ Rate Limiting\n\nIntelligent, per-user rate limiting prevents abuse while ensuring fair resource access. Limits are applied based on the authenticated user's email.\n\n| Tier       | Operations                | Limit   | Period | Scope               |\n| :--------- | :------------------------ | :------ | :----- | :------------------ |\n| **READ**   | List, Search, Signed URLs | 600 req | 60s    | High-volume access  |\n| **WRITE**  | Upload, Rename, Move      | 200 req | 60s    | Modification safety |\n| **DELETE** | Remove Files/Buckets      | 60 req  | 60s    | Destructive actions |\n\n**Note:** Rate limiting returns standard `429 Too Many Requests` headers and can be configured or disabled via `wrangler.toml`.\n\n### Response Headers\n\nWhen rate limited, responses include:\n\n- `Retry-After` - Seconds to wait before retrying\n- `X-RateLimit-Limit` - Maximum requests allowed in the period\n- `X-RateLimit-Period` - Time period in seconds\n- `X-RateLimit-Tier` - Which tier was exceeded (READ/WRITE/DELETE)\n\n### Configuration\n\nRate limits are defined in `wrangler.toml` using Cloudflare Workers Rate Limiting API bindings. To modify limits, edit the configuration and redeploy:\n\n```toml\n[[ratelimits]]\nname = \"RATE_LIMITER_READ\"\nnamespace_id = \"1001\"\nsimple = { limit = 600, period = 60 }\n```\n\n**Requirements:**\n\n- Wrangler CLI version 4.36.0 or later\n- Cloudflare Workers paid plan (rate limiting not available on free plan)\n\n**Note:** Rate limiting is optional. If not configured in `wrangler.toml`, the application will function normally without rate limiting protection.\n\n---\n\n## 🛠️ Local Development\n\n### Quick Start (Two Terminal Windows Required)\n\n**Terminal 1: Frontend dev server (Vite)**\n\n```bash\nnpm run dev\n```\n\n- Runs on: `http://localhost:5173`\n- Hot Module Replacement (HMR) enabled\n- Watches for file changes automatically\n\n**Terminal 2: Worker dev server (Wrangler)**\n\n```bash\nnpx wrangler dev --config wrangler.dev.toml --local\n```\n\n- Runs on: `http://localhost:8787`\n- Uses local bindings with mock data (no secrets required)\n- Automatically reloads on code changes\n- **Note:** Returns mock bucket data for testing UI without Cloudflare API access\n\n### Access the Application\n\nOpen your browser to `http://localhost:5173` - the frontend will automatically communicate with the Worker API on port 8787.\n\n**Note:** Authentication and rate limiting are disabled on localhost for easier development. No Cloudflare Access configuration needed for local dev.\n\n### Development Configuration Files\n\n- `.env.development` - **Auto-loaded by Vite in dev mode** (sets `VITE_WORKER_API=http://localhost:8787`)\n- `.env` - Base environment variables (optional overrides)\n- `wrangler.dev.toml` - Development-specific Worker config (skips frontend build, adds mock data support)\n- `wrangler.toml` - Production Worker config (includes build step)\n\n\u003e **Note:** The `.env.development` file is automatically loaded by Vite when running `npm run dev`. No manual switching between dev and production URLs required.\n\n### What's Different in Local Development\n\n- **Authentication:** Automatically disabled for localhost requests\n- **Rate Limiting:** Automatically bypassed for localhost requests\n- **CORS:** Configured to allow `http://localhost:5173` with credentials\n- **Mock Data:** Returns simulated responses (no real Cloudflare API calls)\n- **No Secrets Required:** Works without `ACCOUNT_ID`, `CF_EMAIL`, or `API_KEY`\n\n### Mock Operations in Local Development\n\nThe following operations return simulated success responses for UI testing:\n\n- ✅ List buckets (returns `dev-bucket`)\n- ✅ Create bucket\n- ✅ Rename bucket\n- ✅ List files (returns empty array)\n- ✅ Upload files (simulates success, files not stored)\n- ✅ Create folders\n\n**Note:** Files and folders are not actually stored. Local development is for UI/UX testing only. For full functionality, deploy to Cloudflare Workers.\n\n**📖 For more details, see the [Development Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Development-Guide).**\n\n---\n\n## 📋 Architecture\n\n### Technology Stack\n\n| Component  | Technology         | Version       |\n| ---------- | ------------------ | ------------- |\n| Frontend   | React              | 19.2.4        |\n| Build Tool | Vite               | 7.3.1         |\n| Language   | TypeScript         | 5.9.3         |\n| Backend    | Cloudflare Workers | Runtime API   |\n| Storage    | Cloudflare R2      | S3-compatible |\n| Auth       | Cloudflare Access  | Zero Trust    |\n\n### File Organization\n\n```\n├── src/                      # Frontend source code\n│   ├── app.tsx              # Main UI component\n│   ├── filegrid.tsx         # File browser with grid/list views\n│   └── services/            # API client and auth utilities\n├── worker/\n│   ├── index.ts             # Worker runtime \u0026 API endpoints\n│   ├── routes/              # API route handlers\n│   └── utils/               # Helper utilities\n├── wrangler.toml.example    # Wrangler configuration template\n└── .env.example             # Environment variables template\n```\n\n**📖 For complete API documentation, see the [API Reference](https://github.com/neverinfamous/R2-Manager-Worker/wiki/API-Reference).**\n\n### API Endpoints\n\n#### Bucket Operations\n\n- `GET /api/buckets` - List all buckets\n- `POST /api/buckets` - Create a new bucket\n- `DELETE /api/buckets/:bucketName` - Delete a bucket (with optional `?force=true`)\n- `PATCH /api/buckets/:bucketName` - Rename a bucket\n\n#### File Operations\n\n- `GET /api/files/:bucketName` - List files in a bucket (supports `?cursor`, `?limit`, `?prefix`, `?skipCache`)\n- `POST /api/files/:bucketName/upload` - Upload a file (supports chunked uploads)\n- `GET /api/files/:bucketName/signed-url/:fileName` - Generate a signed download URL\n- `POST /api/files/:bucketName/download-zip` - Download multiple files as ZIP\n- `DELETE /api/files/:bucketName/delete/:fileName` - Delete a file\n- `POST /api/files/:bucketName/:fileName/copy` - Copy a file to another bucket or folder (supports `destinationPath`)\n- `POST /api/files/:bucketName/:fileName/move` - Move a file to another bucket or folder (supports `destinationPath`)\n- `PATCH /api/files/:bucketName/:fileName/rename` - Rename a file within the same bucket\n\n#### Folder Operations\n\n- `POST /api/folders/:bucketName/create` - Create a new folder\n- `PATCH /api/folders/:bucketName/rename` - Rename a folder (batch operation)\n- `POST /api/folders/:bucketName/:folderPath/copy` - Copy a folder to another bucket or folder (supports `destinationPath`)\n- `POST /api/folders/:bucketName/:folderPath/move` - Move a folder to another bucket or folder (supports `destinationPath`)\n- `DELETE /api/folders/:bucketName/:folderPath` - Delete a folder and its contents (with optional `?force=true`)\n\n#### AI Search Operations\n\n- `GET /api/ai-search/compatibility/:bucketName` - Analyze bucket files for AI Search indexability\n- `GET /api/ai-search/instances` - List AI Search instances\n- `POST /api/ai-search/instances` - Create an AI Search instance\n- `DELETE /api/ai-search/instances/:name` - Delete an AI Search instance\n- `POST /api/ai-search/instances/:name/sync` - Trigger instance re-indexing\n- `POST /api/ai-search/:instanceName/search` - Semantic search (retrieval only)\n- `POST /api/ai-search/:instanceName/ai-search` - AI-powered search with generated response\n\n#### Job History \u0026 Audit Operations\n\n- `GET /api/jobs` - List jobs with filtering (supports `?status`, `?operation_type`, `?bucket_name`, `?start_date`, `?end_date`, `?job_id`, `?min_errors`, `?limit`, `?offset`, `?sort_by`, `?sort_order`)\n- `GET /api/jobs/:jobId` - Get job status and details\n- `GET /api/jobs/:jobId/events` - Get job event timeline\n- `GET /api/audit` - List audit log entries with filtering (supports `?operation_type`, `?bucket_name`, `?status`, `?start_date`, `?end_date`, `?user_email`, `?limit`, `?offset`, `?sort_by`, `?sort_order`)\n- `GET /api/audit/summary` - Get operation counts grouped by type\n\n---\n\n## 🔐 Security\n\n- ✅ **Zero Trust Architecture** - All requests authenticated by Cloudflare Access\n- ✅ **JWT Validation** - Tokens verified on every API call\n- ✅ **Rate Limiting** - Tiered API rate limits prevent abuse and ensure fair usage\n- ✅ **HTTPS Only** - All traffic encrypted via Cloudflare's edge network\n- ✅ **Signed URLs** - Download operations use HMAC-SHA256 signatures\n- ✅ **No Stored Credentials** - No user passwords stored anywhere\n\n**📖 Learn more in the [Authentication \u0026 Security Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Authentication-\u0026-Security).**\n\n## 🙈 Hiding Buckets from the UI\n\nYou can configure R2 Bucket Manager to hide specific buckets from the UI (e.g., system buckets, internal buckets, or buckets managed by other applications).\n\n### How to Hide Buckets\n\n1. **Edit `worker/index.ts`:**\n   - Locate the `systemBuckets` array (around line 373)\n   - Add your bucket name(s) to the array\n\n```typescript\nconst systemBuckets = [\n  \"r2-bucket\",\n  \"sqlite-mcp-server-wiki\",\n  \"your-bucket-name\",\n];\n```\n\n2. **Deploy the changes:**\n   ```bash\n   npx wrangler deploy\n   ```\n\n### Example\n\nTo hide buckets named `blog-wiki` and `internal-data`:\n\n```typescript\nconst systemBuckets = [\n  \"r2-bucket\",\n  \"sqlite-mcp-server-wiki\",\n  \"blog-wiki\",\n  \"internal-data\",\n];\n```\n\n**Note:** Hidden buckets are completely filtered from the API response and won't appear in the bucket list or be accessible through the UI.\n\n**📖 See the [Configuration Reference](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Configuration-Reference#hiding-buckets) for more details.**\n\n---\n\n## 📝 Extending File Type Support\n\nTo add support for new file extensions:\n\n1. **Update `src/services/api.ts`:**\n   - Add file type category to `FILE_TYPES` object\n   - Map extensions in `getConfigByExtension()`\n\n2. **Update `src/filegrid.tsx`:**\n   - Add custom icon rendering for new extensions\n\n3. **Update `src/app.tsx`:**\n   - Add file type to upload instructions\n\n**📖 See the [Development Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Development-Guide#adding-file-type-support) for complete instructions.**\n\n---\n\n## 🐛 Troubleshooting\n\nCommon issues and solutions:\n\n- **Authentication errors:** Verify `TEAM_DOMAIN` and `POLICY_AUD` secrets\n- **Bucket not found:** Check `wrangler.toml` bucket name matches exactly\n- **Upload failures:** Verify your Cloudflare plan's upload size limits\n- **Deployment issues:** Re-authenticate with `npx wrangler login`\n\n**📖 For detailed solutions, see the [Troubleshooting Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Troubleshooting).**\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n**📖 See the [Development Guide](https://github.com/neverinfamous/R2-Manager-Worker/wiki/Development-Guide) for setup instructions.**\n\n---\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 📞 Support\n\n- 🐛 **Bug Reports:** [GitHub Issues](https://github.com/neverinfamous/R2-Manager-Worker/issues)\n- 💡 **Feature Requests:** [GitHub Discussions](https://github.com/neverinfamous/R2-Manager-Worker/discussions)\n- 📖 **Documentation:** [GitHub Wiki](https://github.com/neverinfamous/R2-Manager-Worker/wiki)\n- ❓ **Questions:** [FAQ](https://github.com/neverinfamous/R2-Manager-Worker/wiki/FAQ)\n\n---\n\n## 📚 Additional Resources\n\n- [Cloudflare Workers Documentation](https://developers.cloudflare.com/workers/)\n- [Cloudflare R2 Storage Documentation](https://developers.cloudflare.com/r2/)\n- [Cloudflare Access (Zero Trust) Documentation](https://developers.cloudflare.com/cloudflare-one/policies/access/)\n- [React 19 Documentation](https://react.dev/)\n- [Vite Documentation](https://vite.dev/)\n\n---\n\n**Made with ❤️ for the Cloudflare community**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneverinfamous%2Fr2-manager-worker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneverinfamous%2Fr2-manager-worker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneverinfamous%2Fr2-manager-worker/lists"}