{"id":36954137,"url":"https://github.com/neverinfamous/do-manager","last_synced_at":"2026-03-07T10:02:29.024Z","repository":{"id":326672244,"uuid":"1105702433","full_name":"neverinfamous/do-manager","owner":"neverinfamous","description":"Self-hosted web app for Cloudflare DO. Manage namespaces, instances +  storage. Supports automatic namespace discovery, instance inspection, key/value editing, rich SQL Editor, SQL for SQLite-backed DOs, batch operations, alarms, R2 backups, analytics, global search, and job history, with Zero Trust + GitHub SSO.","archived":false,"fork":false,"pushed_at":"2026-02-23T18:37:47.000Z","size":2428,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-23T20:47:05.889Z","etag":null,"topics":["cloudflare","cloudflare-durable-objects","developer-tools","development-tools","react","shadcn-ui","typescript","vite"],"latest_commit_sha":null,"homepage":"https://adamic.tech/","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":"SECURITY.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":"2025-11-28T03:09:56.000Z","updated_at":"2026-02-23T18:37:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"17983b28-2a50-42ce-8121-c9ed30f2d4b8","html_url":"https://github.com/neverinfamous/do-manager","commit_stats":null,"previous_names":["neverinfamous/do-manager"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/neverinfamous/do-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2Fdo-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2Fdo-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2Fdo-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2Fdo-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neverinfamous","download_url":"https://codeload.github.com/neverinfamous/do-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverinfamous%2Fdo-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30212021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"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-durable-objects","developer-tools","development-tools","react","shadcn-ui","typescript","vite"],"created_at":"2026-01-13T12:58:54.774Z","updated_at":"2026-03-07T10:02:29.018Z","avatar_url":"https://github.com/neverinfamous.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloudflare Durable Object Manager\n\n**Last Updated March 7, 2026**\n\n[![GitHub](https://img.shields.io/badge/GitHub-neverinfamous/do--manager-blue?logo=github)](https://github.com/neverinfamous/do-manager)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n![Version](https://img.shields.io/badge/version-v1.3.3-green)\n![Status](https://img.shields.io/badge/status-Stable-brightgreen)\n[![Security](https://img.shields.io/badge/Security-Enhanced-green.svg)](https://github.com/neverinfamous/do-manager/blob/main/SECURITY.md)\n[![CodeQL](https://img.shields.io/badge/CodeQL-Passing-brightgreen.svg)](https://github.com/neverinfamous/do-manager/security/code-scanning)\n[![Type Safety](https://img.shields.io/badge/TypeScript-Strict-blue.svg)](https://github.com/neverinfamous/do-manager)\n\nCloudflare Durable Object Manager: Full-featured, self-hosted web app to manage Durable Object namespaces, instances, and storage. Supports automatic namespace discovery, instance inspection, key/value editing, Rich SQL Console,SQL for SQLite-backed DOs, batch operations, alarms, R2 backups, analytics, global search, and job history, with optional GitHub SSO.\n\n**[Live Demo](https://do.adamic.tech/)** • **[Wiki](https://github.com/neverinfamous/do-manager/wiki)** • **[Changelog](https://github.com/neverinfamous/do-manager/blob/main/CHANGELOG.md)** • **[Release Article](https://adamic.tech/articles/do-manager)**\n\n## Tech Stack\n\n**Frontend**: React | Vite | TypeScript | Tailwind CSS | shadcn/ui\n\n**Backend**: Cloudflare Workers + D1 + R2 + Zero Trust\n\n---\n\n## 🎯 Features\n\n### Namespace Management\n\n- **Auto-discover** DO namespaces from Cloudflare API\n- **Manual configuration** for custom setups\n- **List/Grid toggle** - Switch between compact List view (default) and card-based Grid view; preference saved to localStorage\n- **Clone namespace** - Configuration only (fast) or **Deep Clone** with all instances and storage (requires admin hooks)\n- **Download config** - Export namespace settings as JSON\n- **System namespace filtering** - Internal DOs (kv-manager, d1-manager, do-manager) are hidden to prevent accidental deletion\n- **Search \u0026 filter** - Real-time filtering by name, class name, or script name\n- Support for SQLite and KV storage backends\n\n### Instance Management\n\n- Track DO instances by name or hex ID\n- Create new instances with custom names\n- **List/Grid toggle** - Switch between compact List view (default) and card-based Grid view; preference saved to localStorage\n- **Rename instance** - Change the display name of tracked instances\n- **Clone instance** - Copy all storage data to a new instance\n- **Download instance** - Export instance storage as JSON\n- **Search \u0026 filter** - Real-time filtering by instance name or object ID\n- **Color tags** - Color-code instances for visual organization (9 preset colors)\n- **Instance diff** - Compare storage between two instances to see differences\n- **Instance migration** - Migrate instances between namespaces with 3 cutover modes (Copy Only, Copy + Freeze, Copy + Delete)\n- View storage contents (keys/values)\n\n### SQL Console (SQLite-backed DOs)\n\n- **Enhanced SQL Editor** with Prism.js syntax highlighting and line numbers\n- **Real-time validation** with inline error indicators\n- **Context-aware autocomplete** for SQL keywords, table names, and columns\n- **Hover documentation** for SQL keywords and functions\n- **Smart indentation** with bracket/quote auto-pairing\n- **Format button** for one-click SQL formatting\n- **Copy button** with clipboard feedback\n- **Word wrap toggle** and **suggestions toggle** (persisted to localStorage)\n- **Quick Queries** dropdown with grouped SQL templates (Information, Select Data, Modify Data, Table Management)\n- **Saved queries** - Store frequently used queries per namespace\n- **Query history** - Quick access to recent queries\n- Results displayed in sortable table format\n\n### Multi-Select \u0026 Batch Operations\n\n- **Always-visible checkboxes** - Select namespaces, instances, and storage keys directly from lists\n- **Batch download (namespaces)** - Export multiple namespace configs as a ZIP file with manifest\n- **Batch download (instances)** - Export multiple instance storage as a ZIP file with manifest\n- **Batch download (keys)** - Export selected storage keys as JSON with metadata\n- **Batch delete** - Delete multiple namespaces, instances, or storage keys with confirmation\n- **Batch backup** - Backup multiple instances to R2 with progress tracking\n- **Compare instances** - Select exactly 2 instances to compare storage differences\n- **Selection toolbar** - Floating toolbar with count, Select All, and Clear actions\n- **Job history integration** - All batch operations are tracked in job history\n\n### Storage Management\n\n- **Key search \u0026 filter** - Real-time filtering to find keys quickly\n- **Rename keys** - Edit key names directly in the Edit Key dialog\n- **Multi-select keys** - Select multiple keys with checkboxes for batch operations\n- **Batch export keys** - Export selected keys as JSON with instance/namespace metadata\n- **Batch delete keys** - Delete multiple keys at once with confirmation\n- **Import keys from JSON** - Upload JSON files or paste JSON directly to bulk import keys into instance storage\n- View/edit storage values with JSON support\n- Clickable key rows for easy editing\n\n### Admin Hook System\n\n- **NPM package** (`do-manager-admin-hooks`) for easy integration\n- Copy-paste template also available for custom setups\n- Support for both SQLite and KV backends\n\n### Alarms\n\n- View current alarm state\n- Set new alarms with date/time picker\n- Delete existing alarms\n\n### R2 Backup \u0026 Restore\n\n- Snapshot DO storage to R2\n- Browse backup history\n- Restore from any backup with auto-refresh\n\n### Metrics Dashboard\n\n- Request volume over time\n- Storage usage\n- CPU time metrics (average and total)\n\n### Global Search\n\n- **Cross-namespace key search** - Search for storage keys by name across all instances\n- **Value search** - Search within JSON values to find data across instances\n- **Namespace filtering** - Filter search to specific namespaces\n- **Result grouping** - Results grouped by namespace for easy navigation\n- **Match highlighting** - Search terms highlighted in results\n- **Value previews** - Shows matching portion of values for value searches\n- **Job tracking** - All search operations logged to job history\n\n### Job History\n\n- **Comprehensive tracking** - Records all operations including:\n  - Namespace: create, delete, clone, download (single \u0026 batch)\n  - Instance: create, delete, clone, download (single \u0026 batch)\n  - Storage keys: create/update/delete (single), batch delete, batch export, import\n  - Alarms: set, delete\n  - Backup/restore operations\n  - Batch operations: delete, backup, download (namespaces, instances, keys)\n  - **Search operations: key search, value search**\n- View status, progress, and timing\n- Error details for failed operations\n- Filter by status or namespace\n\n### Webhook Notifications\n\n- **Event-driven webhooks** - Send HTTP notifications on key events (13 event types)\n- **Configurable events**:\n  - Storage: `storage_create`, `storage_update`, `storage_delete`\n  - Instance: `instance_create`, `instance_delete`\n  - Backup/Restore: `backup_complete`, `restore_complete`\n  - Alarms: `alarm_set`, `alarm_deleted`\n  - Import/Export: `import_complete`, `export_complete`\n  - System: `job_failed`, `batch_complete`\n- **HMAC signatures** - Optional secret-based request signing for security\n- **Test webhooks** - Verify endpoint connectivity before going live\n\n### Centralized Error Logging\n\n- **Structured error payloads** - Consistent format with module, operation, context, and metadata\n- **Module-prefixed error codes** - e.g., `NS_CREATE_FAILED`, `INST_DELETE_FAILED`, `BKP_RESTORE_FAILED`\n- **Severity levels** - error, warning, info\n- **Webhook integration** - Automatic webhook triggers for job failures\n- **Stack trace capture** - Full stack traces logged for debugging\n\n### Health Dashboard\n\n- **System overview** - Total namespaces, instances, and alarms at a glance\n- **Stale instance detection** - Identify instances not accessed in 7+ days\n- **Storage quota alerts** - Warn when instances approach 10GB DO storage limit (80% warning, 90% critical)\n- **Active alarms list** - See all pending alarms with countdown timers\n- **Storage summary** - Aggregate storage usage across all instances\n- **Recent activity** - Timeline of operations in last 24h/7d\n\n### User Experience\n\n- Dark/Light/System themes\n- Responsive design\n- Enterprise auth via Cloudflare Access\n- **Accessible UI** - Proper form labels and ARIA attributes\n\n---\n\n## 📊 External Logging Integration\n\nDO Manager supports integration with external observability platforms via Cloudflare's native OpenTelemetry export. This allows you to send traces and logs to services like Grafana Cloud, Datadog, Honeycomb, Sentry, and Axiom.\n\n### Option 1: OpenTelemetry Export (Recommended)\n\nCloudflare Workers natively supports exporting OpenTelemetry-compliant traces and logs to any OTLP endpoint.\n\n**Step 1: Create a destination in Cloudflare Dashboard**\n\n1. Go to [Workers Observability](https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/pipelines)\n2. Click **Add destination**\n3. Configure your provider's OTLP endpoint and authentication headers\n\n**Common OTLP Endpoints:**\n\n| Provider      | Traces Endpoint                                              | Logs Endpoint                                              |\n| ------------- | ------------------------------------------------------------ | ---------------------------------------------------------- |\n| Grafana Cloud | `https://otlp-gateway-{region}.grafana.net/otlp/v1/traces`   | `https://otlp-gateway-{region}.grafana.net/otlp/v1/logs`   |\n| Honeycomb     | `https://api.honeycomb.io/v1/traces`                         | `https://api.honeycomb.io/v1/logs`                         |\n| Axiom         | `https://api.axiom.co/v1/traces`                             | `https://api.axiom.co/v1/logs`                             |\n| Sentry        | `https://{HOST}/api/{PROJECT_ID}/integration/otlp/v1/traces` | `https://{HOST}/api/{PROJECT_ID}/integration/otlp/v1/logs` |\n| Datadog       | Coming soon                                                  | `https://otlp.{SITE}.datadoghq.com/v1/logs`                |\n\n**Step 2: Update wrangler.toml**\n\n```toml\n[observability]\nenabled = true\n\n[observability.traces]\nenabled = true\ndestinations = [\"your-traces-destination\"]\n\n[observability.logs]\nenabled = true\ndestinations = [\"your-logs-destination\"]\n```\n\n### Option 2: Workers Analytics Engine\n\nFor custom metrics and usage-based analytics, use Workers Analytics Engine:\n\n**Step 1: Add binding to wrangler.toml**\n\n```toml\n[[analytics_engine_datasets]]\nbinding = \"DO_METRICS\"\ndataset = \"do_manager_metrics\"\n```\n\n**Step 2: Write data points from your Worker**\n\n```typescript\n// Example: Track backup operations\nenv.DO_METRICS.writeDataPoint({\n  blobs: [namespaceId, instanceId, \"backup\"],\n  doubles: [backupSizeBytes, durationMs],\n  indexes: [userId],\n});\n```\n\n**Step 3: Query via SQL API or Grafana**\n\n```sql\nSELECT\n  blob1 AS namespace_id,\n  SUM(double1) AS total_backup_bytes,\n  COUNT(*) AS backup_count\nFROM do_manager_metrics\nWHERE timestamp \u003e NOW() - INTERVAL '7' DAY\nGROUP BY blob1\n```\n\n### Option 3: Tail Workers\n\nFor real-time log processing, create a Tail Worker:\n\n```typescript\nexport default {\n  async tail(events: TraceItem[]) {\n    for (const event of events) {\n      // Forward to your logging service\n      await fetch(\"https://your-logging-service.com/ingest\", {\n        method: \"POST\",\n        body: JSON.stringify(event),\n      });\n    }\n  },\n};\n```\n\nConfigure in wrangler.toml:\n\n```toml\n[[tail_consumers]]\nservice = \"my-tail-worker\"\n```\n\n### Option 4: Logpush\n\nFor structured log export to storage destinations (R2, S3, etc.):\n\n1. Go to [Cloudflare Dashboard \u003e Analytics \u003e Logs](https://dash.cloudflare.com/?to=/:account/logs)\n2. Create a Logpush job for Workers Trace Events\n3. Select your destination (R2, S3, Azure, GCS, etc.)\n\n---\n\n## 🙈 Hidden System Namespaces\n\nDO Manager automatically hides internal system Durable Objects to prevent accidental deletion:\n\n| Pattern        | Description                                               |\n| -------------- | --------------------------------------------------------- |\n| `kv-manager_*` | KV Manager internal DOs (ImportExportDO, BulkOperationDO) |\n| `d1-manager_*` | D1 Manager internal DOs                                   |\n| `do-manager_*` | DO Manager internal DOs                                   |\n\nThese namespaces are filtered during auto-discovery. To modify the filter list, edit `worker/routes/namespaces.ts`:\n\n```typescript\nconst SYSTEM_DO_PATTERNS = [\n  \"kv-manager_ImportExportDO\",\n  \"kv-manager_BulkOperationDO\",\n  \"d1-manager_\",\n  \"do-manager_\",\n  // Add your own patterns here\n];\n```\n\n---\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) 24+ (LTS)\n- [Cloudflare account](https://dash.cloudflare.com/sign-up)\n\n### Local Development\n\nClone the repository:\n\n```bash\ngit clone https://github.com/neverinfamous/do-manager.git\ncd do-manager\n```\n\nInstall dependencies:\n\n```bash\nnpm install\n```\n\nInitialize local D1 database:\n\n```bash\nnpx wrangler d1 execute do-manager-metadata-dev --local --file=worker/schema.sql\n```\n\nStart both servers in separate terminals:\n\n**Terminal 1** — Frontend (Vite):\n\n```bash\nnpm run dev\n```\n\n**Terminal 2** — Worker (Wrangler):\n\n```bash\nnpx wrangler dev --config wrangler.dev.toml --local\n```\n\nOpen **http://localhost:5173** — no auth required, mock data included.\n\n---\n\n## 🔧 Production Deployment\n\n### 1. Authenticate with Cloudflare\n\n```bash\nnpx wrangler login\n```\n\n### 2. Create D1 Database\n\n```bash\nnpx wrangler d1 create do-manager-metadata\nnpx wrangler d1 execute do-manager-metadata --remote --file=worker/schema.sql\n```\n\n### 3. Create R2 Bucket (for backups)\n\n```bash\nnpx wrangler r2 bucket create do-manager-backups\n```\n\n### 4. Configure Wrangler\n\n```bash\ncp wrangler.toml.example wrangler.toml\n```\n\nEdit `wrangler.toml` with your `database_id` from step 2.\n\n### 5. Set Up Cloudflare Access\n\n1. Go to [Cloudflare Zero Trust](https://one.dash.cloudflare.com/)\n2. Configure authentication (GitHub OAuth, etc.)\n3. Create an Access Application for your domain\n4. Copy the **Application Audience (AUD) tag**\n\n### 6. Create API Token\n\n1. Go to [Cloudflare API Tokens](https://dash.cloudflare.com/profile/api-tokens)\n2. Create Custom Token with:\n   - **Account → Workers Scripts → Read**\n   - **Account → D1 → Edit** (if managing D1-backed DOs)\n\n**Note:** Both API Tokens (Bearer auth) and Global API Keys (X-Auth-Key auth) are supported.\n\n### 7. Set Secrets\n\n```bash\nnpx wrangler secret put ACCOUNT_ID\nnpx wrangler secret put API_KEY\nnpx wrangler secret put TEAM_DOMAIN\nnpx wrangler secret put POLICY_AUD\n```\n\n### 8. Deploy\n\n```bash\nnpm run build\nnpx wrangler deploy\n```\n\n---\n\n## 🔌 Admin Hook Setup\n\nTo manage a Durable Object's storage, you need to add admin hook methods to your DO class. There are two options:\n\n### Option A: NPM Package (Recommended)\n\nInstall the admin hooks package:\n\n```bash\nnpm install do-manager-admin-hooks\n```\n\nExtend your Durable Object class:\n\n```typescript\nimport { withAdminHooks } from \"do-manager-admin-hooks\";\n\nexport class MyDurableObject extends withAdminHooks() {\n  async fetch(request: Request): Promise\u003cResponse\u003e {\n    // Handle admin requests first (required for DO Manager)\n    const adminResponse = await this.handleAdminRequest(request);\n    if (adminResponse) return adminResponse;\n\n    // Your custom logic here\n    return new Response(\"Hello from my Durable Object!\");\n  }\n}\n```\n\nThat's it! The package handles all admin endpoints automatically.\n\n**Configuration options:**\n\n```typescript\nexport class SecureDO extends withAdminHooks({\n  basePath: \"/admin\", // Change admin endpoint path (default: '/admin')\n  requireAuth: true, // Require authentication\n  adminKey: \"secret-key\", // Admin key for auth\n}) {\n  // ...\n}\n```\n\n📦 **[NPM Package](https://www.npmjs.com/package/do-manager-admin-hooks)** • **[GitHub](https://github.com/neverinfamous/do-manager-admin-hooks)**\n\n### Option B: Manual Copy-Paste\n\nClick \"Get Admin Hook Code\" in the namespace view to generate copy-paste TypeScript code for your DO class.\n\n### Enable in DO Manager\n\n1. Deploy your Worker with admin hooks installed\n2. In DO Manager, add your namespace with the **Admin Hook Endpoint URL** (e.g., `https://my-worker.workers.dev`)\n3. Admin hooks are automatically enabled when you save with a URL\n4. The green \"Admin Hook Enabled\" badge confirms it's working\n\n**Tip:** You can set the endpoint URL when creating a namespace, or add it later via Settings.\n\n### Admin Endpoints\n\n| Endpoint           | Method         | Description                               |\n| ------------------ | -------------- | ----------------------------------------- |\n| `/admin/list`      | GET            | List storage keys (KV) or tables (SQLite) |\n| `/admin/get?key=X` | GET            | Get value for a key                       |\n| `/admin/put`       | POST           | Set key-value pair                        |\n| `/admin/delete`    | POST           | Delete a key                              |\n| `/admin/sql`       | POST           | Execute SQL (SQLite only)                 |\n| `/admin/alarm`     | GET/PUT/DELETE | Manage alarms                             |\n| `/admin/export`    | GET            | Export all storage                        |\n| `/admin/import`    | POST           | Import data                               |\n\n---\n\n## 📋 API Reference\n\n| Endpoint                             | Description                           |\n| ------------------------------------ | ------------------------------------- |\n| `GET /api/namespaces`                | List tracked namespaces               |\n| `GET /api/namespaces/discover`       | Auto-discover from Cloudflare API     |\n| `POST /api/namespaces`               | Add namespace manually                |\n| `POST /api/namespaces/:id/clone`     | Clone namespace with new name         |\n| `DELETE /api/namespaces/:id`         | Remove namespace                      |\n| `GET /api/namespaces/:id/instances`  | List instances                        |\n| `POST /api/namespaces/:id/instances` | Track new instance                    |\n| `GET /api/instances/:id/storage`     | Get storage contents                  |\n| `PUT /api/instances/:id/storage`     | Update storage                        |\n| `POST /api/instances/:id/import`     | Import keys from JSON                 |\n| `POST /api/instances/:id/sql`        | Execute SQL query                     |\n| `GET /api/instances/:id/export`      | Export instance storage as JSON       |\n| `POST /api/instances/:id/clone`      | Clone instance with new name          |\n| `GET /api/instances/:id/alarm`       | Get alarm state                       |\n| `PUT /api/instances/:id/alarm`       | Set alarm                             |\n| `DELETE /api/instances/:id/alarm`    | Delete alarm                          |\n| `GET /api/instances/:id/backups`     | List backups                          |\n| `POST /api/instances/:id/backups`    | Create backup                         |\n| `POST /api/instances/:id/restore`    | Restore from backup                   |\n| `GET /api/metrics`                   | Get account metrics                   |\n| `GET /api/jobs`                      | List job history                      |\n| `GET /api/namespaces/:id/export`     | Export namespace config as JSON       |\n| `POST /api/batch/namespaces/delete`  | Batch delete namespaces               |\n| `POST /api/batch/instances/delete`   | Batch delete instances                |\n| `POST /api/batch/instances/backup`   | Batch backup instances to R2          |\n| `POST /api/batch/keys/delete`        | Log batch delete keys job             |\n| `POST /api/batch/keys/export`        | Log batch export keys job             |\n| `POST /api/search/keys`              | Search for keys across all instances  |\n| `POST /api/search/values`            | Search within storage values          |\n| `GET /api/health`                    | Get system health summary             |\n| `GET /api/webhooks`                  | List configured webhooks              |\n| `POST /api/webhooks`                 | Create a new webhook                  |\n| `PUT /api/webhooks/:id`              | Update a webhook                      |\n| `DELETE /api/webhooks/:id`           | Delete a webhook                      |\n| `POST /api/webhooks/:id/test`        | Send a test webhook                   |\n| `PUT /api/instances/:id/color`       | Update instance color tag             |\n| `POST /api/instances/diff`           | Compare storage between two instances |\n| `GET /api/namespaces/:id/queries`    | List saved SQL queries for namespace  |\n| `POST /api/namespaces/:id/queries`   | Create a saved SQL query              |\n| `PUT /api/queries/:id`               | Update a saved SQL query              |\n| `DELETE /api/queries/:id`            | Delete a saved SQL query              |\n\n---\n\n## 📁 Project Structure\n\n```\ndo-manager/\n├── src/\n│   ├── components/\n│   │   ├── ui/           # shadcn components\n│   │   ├── layout/       # Header, navigation\n│   │   └── features/     # Feature components\n│   ├── contexts/         # React contexts (theme)\n│   ├── hooks/            # Custom hooks\n│   ├── services/         # API clients\n│   ├── types/            # TypeScript types\n│   └── App.tsx\n├── worker/\n│   ├── routes/           # API route handlers\n│   │   ├── namespaces.ts # Namespace discovery \u0026 management\n│   │   ├── instances.ts  # Instance tracking \u0026 cloning\n│   │   ├── storage.ts    # Storage operations\n│   │   ├── export.ts     # Instance export/download\n│   │   ├── alarms.ts     # Alarm management\n│   │   ├── backup.ts     # R2 backup/restore\n│   │   ├── batch.ts      # Batch operations\n│   │   ├── search.ts     # Cross-namespace search\n│   │   ├── metrics.ts    # GraphQL analytics\n│   │   ├── jobs.ts       # Job history\n│   │   ├── webhooks.ts   # Webhook management\n│   │   ├── health.ts     # Health dashboard API\n│   │   ├── queries.ts    # Saved SQL queries\n│   │   └── diff.ts       # Instance comparison\n│   ├── types/            # Worker types\n│   ├── utils/            # Utilities (CORS, auth, helpers, webhooks)\n│   ├── schema.sql        # D1 schema\n│   └── index.ts          # Worker entry\n└── ...config files\n```\n\n---\n\n## 🐞 Troubleshooting\n\n**\"Failed to fetch from Cloudflare API\"**\n\n- Verify `ACCOUNT_ID` is correct\n- Ensure API token has **Workers Scripts Read** permission\n- If using Global API Key, ensure email is correct in `worker/routes/namespaces.ts`\n\n**\"Admin hook not configured\"**\n\n- Add admin hook methods to your DO class\n- Set the endpoint URL in namespace settings\n- Ensure your Worker is deployed\n\n**\"No namespaces discovered\"**\n\n- You may not have any Durable Objects deployed\n- System namespaces are filtered by default (see Hidden System Namespaces section)\n\n**\"Clone instance creates empty instance\"**\n\n- Ensure your admin hooks use the correct export/import format\n- Export should return: `{ data: {...}, exportedAt: \"...\", keyCount: N }`\n- Import should accept: `{ data: {...} }`\n- The `do-manager-admin-hooks` NPM package handles this automatically\n\n**Authentication loop**\n\n- Check `TEAM_DOMAIN` includes `https://`\n- Verify `POLICY_AUD` matches your Access application's AUD tag\n\n---\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit changes (`git commit -m 'Add amazing feature'`)\n4. Push to branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n---\n\n## 📄 License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\n## 📞 Support\n\n- 🐛 **Bug Reports:** [GitHub Issues](https://github.com/neverinfamous/do-manager/issues)\n\n- 📧 **Email:** admin@adamic.tech\n\n---\n\n**Made with ❤️ for the Cloudflare community**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneverinfamous%2Fdo-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneverinfamous%2Fdo-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneverinfamous%2Fdo-manager/lists"}