Skip to content

Rebuild cors.sh on Cloudflare Workers (standalone SaaS)#171

Merged
softmarshmallow merged 15 commits into
mainfrom
cf
Jun 25, 2026
Merged

Rebuild cors.sh on Cloudflare Workers (standalone SaaS)#171
softmarshmallow merged 15 commits into
mainfrom
cf

Conversation

@softmarshmallow

Copy link
Copy Markdown
Member

Summary

Reboots cors.sh from the frozen AWS Lambda + API Gateway stack onto Cloudflare Workers, as a standalone SaaS with its own accounts and billing. It's live in production — the full sign up → use → hit quota → pay → cancel loop is verified end-to-end against real Stripe.

The first commit removes the legacy AWS stack; the rest build the new service.

What's in it

Proxy data plane (workers/proxy)

  • Origin-pinned KV auth — the API key is public, the unforgeable Origin header is the real authenticator
  • CORS rewrite, streaming pass-through + byte metering, monthly quota
  • test_ key rate-cap via a Durable Object
  • Keyless anonymous tier (IP rate-limited) so legacy cors.sh/<url> callers keep working

Control plane folded into the Next app (web/, Next 16 via @opennextjs/cloudflare)

  • /api/v1/* route handlers with D1 + KV bindings; account = user
  • The KV KeyRecord is the single contract between the planes — one builder, reused by project CRUD and billing re-projection

Auth — Auth.js v5 email magic-link via Resend; gated console + /login

Billing — standalone Stripe (Checkout + Customer Portal + webhook). A subscription change flips users.tier and re-projects the user's KV keys, so the proxy immediately enforces the new quota. Idempotent webhook ledger + dunning.

Email@workspace/emails (react-email + Resend): magic-link, welcome, subscription lifecycle, dunning, quota warnings. Dry-run aware.

Tooling — pnpm + turbo monorepo, shadcn UI, oxfmt formatter, Node 22.

Tests & CI

  • Self-contained Playwright suite (web + proxy + mock + page started locally): CORS correctness, auth gating + login, dashboard full-loop, proxy enforcement, and the full Stripe subscription lifecycle via signed webhook events — plus an opt-in real-Stripe checkout test.
  • CI runs build + e2e; a manual workflow_dispatch deploys (D1 migrate → proxy → web).

Status

Live on cors.sh (app) + proxy.cors.sh (data plane). Verified with a real $4 purchase and cancellation: charge → checkout → webhook → tier:pro → KV re-projection → proxy enforces; then cancel → refund → tier:free → KV back to the free quota.

Remaining work is hardening, not features — see SPEC.md §8: observability/alerting, async metering off the hot-path D1 read, a restricted Stripe key, ToS/privacy, Billing Portal config, and cleanup.

Notes

  • Secrets are runtime-only (Cloudflare secret bindings / gitignored .dev.vars); none are committed.
  • SPEC.md is the source of truth for behavior; DEVELOPMENT.md for local setup; GRAVEYARD.md records what was removed.
  • The large diff is mostly the legacy removal (−69k) against the new service (+20k).

Delete the legacy AWS Lambda + API Gateway services, archived apps, and examples. The Cloudflare rebuild in the following commits replaces them.
Node 22 + wrangler; shadcn (Mira) UI components in @workspace/ui; new @workspace/emails package (react-email + Resend, dry-run aware) for transactional mail.
Origin-pinned KV auth (key public, Origin is the authenticator), CORS rewrite, streaming + byte metering, monthly quota, test_-key rate cap via a Durable Object, and a keyless anonymous tier (IP rate-limited) for legacy cors.sh/<url> callers. Pings the control plane for quota-notification emails.
…e billing, email

Next 16 via @opennextjs/cloudflare with D1+KV bindings. Folds the control plane into /api/v1/* route handlers (account=user). Auth.js (NextAuth v5) email magic-link via Resend; gated console + login. Standalone Stripe billing (Checkout/Portal/webhook) drives users.tier and re-projects KV keys. Quota-notification rollup endpoint. D1 migrations 0001-0005.
Self-contained Playwright stack (web+proxy+mock+page); CORS correctness, auth gating, dashboard loop, proxy enforcement, full Stripe subscription lifecycle (signed webhook events) + opt-in live-checkout test. CI (build+e2e) and a manual deploy workflow. SPEC.md as the source of truth; DEVELOPMENT.md; GRAVEYARD.md.
Replace Prettier with oxfmt (the Oxc formatter): add .oxfmtrc.json, point format/format:check at oxfmt, drop the now-unused prettier devDep (eslint-config-prettier stays — it only disables stylistic ESLint rules). Ran a full format pass across the repo — mechanical, no logic changes; build is green and `oxfmt --check` is clean.
@vercel

vercel Bot commented Jun 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cors Ready Ready Preview, Comment Jun 25, 2026 6:02pm
docs-cors-sh Blocked Blocked Jun 25, 2026 6:02pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 452 files, which is 302 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 72f05a39-780d-44f2-ac05-b6fbd9676b71

📥 Commits

Reviewing files that changed from the base of the PR and between 78f4896 and 44a41e4.

⛔ Files ignored due to path filters (34)
  • .archives/console/public/demo-of-initial-api-key-configuration.mp4 is excluded by !**/*.mp4
  • .archives/console/public/favicon.ico is excluded by !**/*.ico
  • .archives/console/public/vercel.svg is excluded by !**/*.svg
  • .archives/console/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • .archives/homepage/public/assets/scribble-pointer.png is excluded by !**/*.png
  • .archives/homepage/public/favicon.ico is excluded by !**/*.ico
  • .archives/homepage/public/grida-logo-128.png is excluded by !**/*.png
  • .archives/homepage/public/grida-logo-64.png is excluded by !**/*.png
  • .archives/homepage/public/grida-logo-white-128.png is excluded by !**/*.png
  • .archives/homepage/public/grida-logo-white-64.png is excluded by !**/*.png
  • .archives/homepage/public/logo.svg is excluded by !**/*.svg
  • .archives/homepage/public/logos-3p/github.png is excluded by !**/*.png
  • .archives/homepage/public/logos-3p/instagram.png is excluded by !**/*.png
  • .archives/homepage/public/logos-3p/instagram@2x.png is excluded by !**/*.png
  • .archives/homepage/public/logos-3p/tiktok.png is excluded by !**/*.png
  • .archives/homepage/public/logos-3p/twitter.png is excluded by !**/*.png
  • .archives/homepage/public/og:image.jpg is excluded by !**/*.jpg
  • cli/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg is excluded by !**/*.jpeg
  • docs/docs/tutorial-extras/img/docsVersionDropdown.png is excluded by !**/*.png
  • docs/docs/tutorial-extras/img/localeDropdown.png is excluded by !**/*.png
  • docs/static/img/docusaurus.png is excluded by !**/*.png
  • docs/static/img/favicon.ico is excluded by !**/*.ico
  • docs/static/img/logo.svg is excluded by !**/*.svg
  • docs/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • packages/api/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • services/auth.proxy.cors.sh/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • services/lagacy/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • services/proxy.cors.sh/docs/artwork_cors.sh.jpg is excluded by !**/*.jpg
  • services/proxy.cors.sh/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • services/services.cors.sh/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • web/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (452)
  • .archives/console/.gitignore
  • .archives/console/README.md
  • .archives/console/babel.config.js
  • .archives/console/logo/index.tsx
  • .archives/console/next-env.d.ts
  • .archives/console/next.config.js
  • .archives/console/package.json
  • .archives/console/pages/[id].tsx
  • .archives/console/pages/_app.tsx
  • .archives/console/pages/index.tsx
  • .archives/console/pages/new.tsx
  • .archives/console/styles/Home.module.css
  • .archives/console/styles/globals.css
  • .archives/console/tsconfig.json
  • .archives/homepage/.gitignore
  • .archives/homepage/README.md
  • .archives/homepage/babel.config.js
  • .archives/homepage/components/appbar/appbar-parent-site.tsx
  • .archives/homepage/components/appbar/appbar.tsx
  • .archives/homepage/components/appbar/index.ts
  • .archives/homepage/components/button/index.tsx
  • .archives/homepage/components/chatwood/index.jsx
  • .archives/homepage/components/collabsible-info-card/index.tsx
  • .archives/homepage/components/cta-footer/index.tsx
  • .archives/homepage/components/cta-onboarding/index.tsx
  • .archives/homepage/components/cta-test-it/index.tsx
  • .archives/homepage/components/demo-terminal/index.tsx
  • .archives/homepage/components/icons/check-filled.tsx
  • .archives/homepage/components/index.ts
  • .archives/homepage/components/logo/index.tsx
  • .archives/homepage/components/pricing/card.tsx
  • .archives/homepage/components/pricing/free-for-opensource.tsx
  • .archives/homepage/components/pricing/index.ts
  • .archives/homepage/grida.config.js
  • .archives/homepage/grida/.gitkeep
  • .archives/homepage/grida/AppbarGroup.tsx
  • .archives/homepage/grida/SectionCtaLast.tsx
  • .archives/homepage/grida/SectionDisclaimer.tsx
  • .archives/homepage/grida/SectionHero.tsx
  • .archives/homepage/grida/SectionPricing.tsx
  • .archives/homepage/grida/SectionUsage.tsx
  • .archives/homepage/k/examples.ts
  • .archives/homepage/k/external-links.ts
  • .archives/homepage/k/host.ts
  • .archives/homepage/k/index.ts
  • .archives/homepage/k/price.ts
  • .archives/homepage/layouts/payment-required-page.tsx
  • .archives/homepage/layouts/pricing-card-list.tsx
  • .archives/homepage/layouts/step-layout.tsx
  • .archives/homepage/next-env.d.ts
  • .archives/homepage/next.config.js
  • .archives/homepage/package.json
  • .archives/homepage/pages/_app.tsx
  • .archives/homepage/pages/_document.tsx
  • .archives/homepage/pages/disclaimer.tsx
  • .archives/homepage/pages/get-started/index.tsx
  • .archives/homepage/pages/index.tsx
  • .archives/homepage/pages/oauth/callback.tsx
  • .archives/homepage/pages/onboarding/[id].tsx
  • .archives/homepage/pages/onboarding/complete.tsx
  • .archives/homepage/pages/onboarding/index.tsx
  • .archives/homepage/pages/onboarding/payment-success-with-issue.tsx
  • .archives/homepage/pages/onboarding/payment-success.tsx
  • .archives/homepage/pages/too-many-requests.tsx
  • .archives/homepage/public/robots.txt
  • .archives/homepage/styles/globals.css
  • .archives/homepage/tsconfig.json
  • .eslintrc.js
  • .github/ISSUE_TEMPLATE/apply-for-oss-program.yml
  • .github/ISSUE_TEMPLATE/bug_report.md
  • .github/ISSUE_TEMPLATE/feature_request.md
  • .github/workflows/ci.yml
  • .github/workflows/deploy.yml
  • .gitignore
  • .gitmodules
  • .npmrc
  • .nvmrc
  • .oxfmtrc.json
  • .vscode/settings.json
  • AGENTS.md
  • CLAUDE.md
  • DEVELOPMENT.md
  • GRAVEYARD.md
  • README.md
  • SPEC.md
  • cli/bin.ts
  • cli/index.ts
  • cli/jes.config.js
  • cli/package.json
  • cli/readme.md
  • cli/tsconfig.json
  • cli/update/index.ts
  • cli/version/index.ts
  • design/readme.md
  • docs/.gitignore
  • docs/README.md
  • docs/babel.config.js
  • docs/blog/2019-05-28-first-blog-post.md
  • docs/blog/2019-05-29-long-blog-post.md
  • docs/blog/2021-08-01-mdx-blog-post.mdx
  • docs/blog/2021-08-26-welcome/index.md
  • docs/blog/authors.yml
  • docs/docs/guides/_category_.json
  • docs/docs/guides/api-instagram/index.md
  • docs/docs/guides/api-tiktok/index.md
  • docs/docs/guides/figma-plugin/index.md
  • docs/docs/guides/shopify-app/index.md
  • docs/docs/intro.md
  • docs/docs/migrate-from-cors.bridged.cc.md
  • docs/docs/tutorial-basics/_category_.json
  • docs/docs/tutorial-basics/congratulations.md
  • docs/docs/tutorial-basics/create-a-blog-post.md
  • docs/docs/tutorial-basics/create-a-document.md
  • docs/docs/tutorial-basics/create-a-page.md
  • docs/docs/tutorial-basics/deploy-your-site.md
  • docs/docs/tutorial-basics/markdown-features.mdx
  • docs/docs/tutorial-extras/_category_.json
  • docs/docs/tutorial-extras/manage-docs-versions.md
  • docs/docs/tutorial-extras/translate-your-site.md
  • docs/docs/what-is-cors.md
  • docs/docusaurus.config.js
  • docs/package.json
  • docs/sidebars.js
  • docs/src/css/custom.css
  • docs/static/index.html
  • examples/readme.md
  • package.json
  • packages/api/index.ts
  • packages/api/package.json
  • packages/app-ui/components/api-key-reveal.tsx
  • packages/app-ui/components/index.ts
  • packages/app-ui/components/underline-button.tsx
  • packages/app-ui/layouts/form-page-latout.ts
  • packages/app-ui/layouts/index.ts
  • packages/app-ui/layouts/page-close-button.tsx
  • packages/app-ui/package.json
  • packages/app-ui/tsconfig.json
  • packages/editor-ui
  • packages/emails/emails/_components/layout.tsx
  • packages/emails/emails/magic-link.tsx
  • packages/emails/emails/payment-failed.tsx
  • packages/emails/emails/quota-exceeded.tsx
  • packages/emails/emails/quota-warning.tsx
  • packages/emails/emails/subscription-canceled.tsx
  • packages/emails/emails/subscription-confirmed.tsx
  • packages/emails/emails/welcome.tsx
  • packages/emails/package.json
  • packages/emails/src/index.ts
  • packages/emails/src/send.ts
  • packages/emails/tsconfig.json
  • packages/eslint-config/README.md
  • packages/eslint-config/base.js
  • packages/eslint-config/next.js
  • packages/eslint-config/package.json
  • packages/eslint-config/react-internal.js
  • packages/typescript-config/README.md
  • packages/typescript-config/base.json
  • packages/typescript-config/nextjs.json
  • packages/typescript-config/package.json
  • packages/typescript-config/react-library.json
  • packages/ui/components.json
  • packages/ui/eslint.config.js
  • packages/ui/package.json
  • packages/ui/postcss.config.mjs
  • packages/ui/src/components/.gitkeep
  • packages/ui/src/components/accordion.tsx
  • packages/ui/src/components/alert-dialog.tsx
  • packages/ui/src/components/alert.tsx
  • packages/ui/src/components/avatar.tsx
  • packages/ui/src/components/badge.tsx
  • packages/ui/src/components/breadcrumb.tsx
  • packages/ui/src/components/button.tsx
  • packages/ui/src/components/card.tsx
  • packages/ui/src/components/dialog.tsx
  • packages/ui/src/components/dropdown-menu.tsx
  • packages/ui/src/components/form.tsx
  • packages/ui/src/components/input.tsx
  • packages/ui/src/components/label.tsx
  • packages/ui/src/components/scroll-area.tsx
  • packages/ui/src/components/select.tsx
  • packages/ui/src/components/separator.tsx
  • packages/ui/src/components/sheet.tsx
  • packages/ui/src/components/skeleton.tsx
  • packages/ui/src/components/sonner.tsx
  • packages/ui/src/components/switch.tsx
  • packages/ui/src/components/table.tsx
  • packages/ui/src/components/tabs.tsx
  • packages/ui/src/components/textarea.tsx
  • packages/ui/src/components/tooltip.tsx
  • packages/ui/src/hooks/.gitkeep
  • packages/ui/src/lib/utils.ts
  • packages/ui/src/styles/globals.css
  • packages/ui/tsconfig.json
  • packages/ui/tsconfig.lint.json
  • pnpm-workspace.yaml
  • scripts/e2e.sh
  • scripts/stack.sh
  • services/auth.proxy.cors.sh/.gitignore
  • services/auth.proxy.cors.sh/deploy/prod.sh
  • services/auth.proxy.cors.sh/deploy/staging.sh
  • services/auth.proxy.cors.sh/handler.ts
  • services/auth.proxy.cors.sh/package.json
  • services/auth.proxy.cors.sh/readme.md
  • services/auth.proxy.cors.sh/serverless.yml
  • services/lagacy/.gitignore
  • services/lagacy/README.md
  • services/lagacy/lib/cors.ts
  • services/lagacy/lib/utils.ts
  • services/lagacy/package.json
  • services/lagacy/serverless.yml
  • services/lagacy/src/_util/size.ts
  • services/lagacy/src/app.ts
  • services/lagacy/src/auth/_tmp_static_api_keys/.gitignore
  • services/lagacy/src/auth/_tmp_static_api_keys/README.md
  • services/lagacy/src/auth/_tmp_static_api_keys/index.js
  • services/lagacy/src/auth/index.ts
  • services/lagacy/src/auth/static-account-api-key-auth.ts
  • services/lagacy/src/index.ts
  • services/lagacy/src/limit/README.md
  • services/lagacy/src/limit/blacklist-origin.ts
  • services/lagacy/src/limit/index.ts
  • services/lagacy/src/limit/payload-limit.ts
  • services/lagacy/src/limit/unknown-host-limit.ts
  • services/lagacy/src/usage/README.md
  • services/lagacy/src/usage/index.ts
  • services/lagacy/src/usage/model.ts
  • services/lagacy/tsconfig.json
  • services/mail.cors.sh/onboarding.mjml
  • services/mail.cors.sh/onboarding_with_payment_success.mjml
  • services/mail.cors.sh/render/onboarding.subject
  • services/mail.cors.sh/render/onboarding.template.html
  • services/mail.cors.sh/render/onboarding_with_payment_success.subject
  • services/mail.cors.sh/render/onboarding_with_payment_success.template.html
  • services/proxy.cors.sh/.env.example
  • services/proxy.cors.sh/.gitignore
  • services/proxy.cors.sh/README.md
  • services/proxy.cors.sh/contributing.md
  • services/proxy.cors.sh/deploy/prod.sh
  • services/proxy.cors.sh/deploy/staging.sh
  • services/proxy.cors.sh/docs/README.md
  • services/proxy.cors.sh/lib/cors.ts
  • services/proxy.cors.sh/lib/utils.ts
  • services/proxy.cors.sh/package.json
  • services/proxy.cors.sh/serverless.yml
  • services/proxy.cors.sh/src/_util/size.ts
  • services/proxy.cors.sh/src/_util/x-header.ts
  • services/proxy.cors.sh/src/app.ts
  • services/proxy.cors.sh/src/auth/_tmp_static_api_keys/.gitignore
  • services/proxy.cors.sh/src/auth/_tmp_static_api_keys/README.md
  • services/proxy.cors.sh/src/auth/_tmp_static_api_keys/index.js
  • services/proxy.cors.sh/src/auth/index.ts
  • services/proxy.cors.sh/src/auth/keys-synced.ts
  • services/proxy.cors.sh/src/auth/keys-temp.ts
  • services/proxy.cors.sh/src/auth/keys.ts
  • services/proxy.cors.sh/src/auth/legacy/index.ts
  • services/proxy.cors.sh/src/auth/legacy/static-account-api-key-auth.ts
  • services/proxy.cors.sh/src/index.ts
  • services/proxy.cors.sh/src/k/index.ts
  • services/proxy.cors.sh/src/limit/README.md
  • services/proxy.cors.sh/src/limit/blacklist-origin.ts
  • services/proxy.cors.sh/src/limit/index.ts
  • services/proxy.cors.sh/src/limit/payload-limit.ts
  • services/proxy.cors.sh/src/limit/rate-limit.ts
  • services/proxy.cors.sh/src/usage/README.md
  • services/proxy.cors.sh/src/usage/dynamo/log.ts
  • services/proxy.cors.sh/src/usage/dynamo/model.ts
  • services/proxy.cors.sh/src/usage/dynamo/readme.md
  • services/proxy.cors.sh/src/usage/dynamo/table.yml
  • services/proxy.cors.sh/src/usage/index.ts
  • services/proxy.cors.sh/src/usage/type.ts
  • services/proxy.cors.sh/tsconfig.json
  • services/readme.md
  • services/services.cors.sh/.env.example
  • services/services.cors.sh/.gitignore
  • services/services.cors.sh/app.ts
  • services/services.cors.sh/auth/index.ts
  • services/services.cors.sh/auth/jwt.ts
  • services/services.cors.sh/auth/key.ts
  • services/services.cors.sh/auth/middleware.ts
  • services/services.cors.sh/auth/readme.md
  • services/services.cors.sh/clients/index.ts
  • services/services.cors.sh/clients/prisma.ts
  • services/services.cors.sh/clients/ses.ts
  • services/services.cors.sh/clients/slack.ts
  • services/services.cors.sh/clients/stripe.ts
  • services/services.cors.sh/controllers/_telemetry.ts
  • services/services.cors.sh/controllers/applications.ts
  • services/services.cors.sh/deploy/dev.sh
  • services/services.cors.sh/deploy/prod.sh
  • services/services.cors.sh/deploy/staging.sh
  • services/services.cors.sh/index.ts
  • services/services.cors.sh/jest.config.js
  • services/services.cors.sh/keygen/index.ts
  • services/services.cors.sh/package.json
  • services/services.cors.sh/prisma/schema.prisma
  • services/services.cors.sh/routes/applications/index.ts
  • services/services.cors.sh/routes/auth/index.ts
  • services/services.cors.sh/routes/index.ts
  • services/services.cors.sh/routes/onboarding/index.ts
  • services/services.cors.sh/routes/payments/index.ts
  • services/services.cors.sh/routes/payments/readme.md
  • services/services.cors.sh/routes/webhooks-stripe/index.ts
  • services/services.cors.sh/scripts/aes-256-cbc-creds.js
  • services/services.cors.sh/serverless.yml
  • services/services.cors.sh/ses-email-templates/index.js
  • services/services.cors.sh/sync/index.ts
  • services/services.cors.sh/sync/type.ts
  • services/services.cors.sh/test/config.env.test
  • services/services.cors.sh/test/setup-tests.ts
  • services/services.cors.sh/tsconfig.json
  • services/services.cors.sh/webpack.config.js
  • tests/e2e/auth.setup.ts
  • tests/e2e/auth.spec.ts
  • tests/e2e/billing-live.spec.ts
  • tests/e2e/billing.spec.ts
  • tests/e2e/cors.spec.ts
  • tests/e2e/dashboard.spec.ts
  • tests/e2e/helpers.ts
  • tests/e2e/package.json
  • tests/e2e/page-server.mjs
  • tests/e2e/playwright.config.ts
  • tests/e2e/proxy.spec.ts
  • tsconfig.json
  • turbo.json
  • web/.eslintrc.json
  • web/.gitignore
  • web/README.md
  • web/app/(console)/console/[id]/page.tsx
  • web/app/(console)/console/new/page.tsx
  • web/app/(console)/console/page.tsx
  • web/app/(console)/console/settings/page.tsx
  • web/app/(console)/layout.tsx
  • web/app/(home)/contact/page.tsx
  • web/app/(home)/docs/_components/docs-sidebar.tsx
  • web/app/(home)/docs/api-reference/page.mdx
  • web/app/(home)/docs/authentication/page.mdx
  • web/app/(home)/docs/errors/page.mdx
  • web/app/(home)/docs/layout.tsx
  • web/app/(home)/docs/limits/page.mdx
  • web/app/(home)/docs/nav.ts
  • web/app/(home)/docs/page.mdx
  • web/app/(home)/docs/quickstart/page.mdx
  • web/app/(home)/get-started/page.tsx
  • web/app/(home)/layout.tsx
  • web/app/(home)/login/page.tsx
  • web/app/(home)/onboarding/[id]/page.tsx
  • web/app/(home)/onboarding/page.tsx
  • web/app/(home)/page.tsx
  • web/app/(home)/pricing/page.tsx
  • web/app/(home)/too-many-requests/page.tsx
  • web/app/api/auth/[...nextauth]/route.ts
  • web/app/api/billing/checkout/route.ts
  • web/app/api/billing/portal/route.ts
  • web/app/api/internal/quota/route.ts
  • web/app/api/v1/account/route.ts
  • web/app/api/v1/projects/[id]/route.ts
  • web/app/api/v1/projects/route.ts
  • web/app/api/v1/usage/route.ts
  • web/app/api/webhooks/stripe/route.ts
  • web/app/globals.css
  • web/auth-types.d.ts
  • web/auth.ts
  • web/cloudflare-env.d.ts
  • web/components.json
  • web/components/api-key-field.tsx
  • web/components/billing-actions.tsx
  • web/components/chatwoot/index.jsx
  • web/components/code-block.tsx
  • web/components/collapsible-info-card.tsx
  • web/components/console-header.tsx
  • web/components/console/application-list.tsx
  • web/components/copy-button.tsx
  • web/components/faq/index.tsx
  • web/components/free-for-opensource/index.tsx
  • web/components/ga.tsx
  • web/components/header.tsx
  • web/components/home-background.tsx
  • web/components/home-demo-card.tsx
  • web/components/home-hover-card.tsx
  • web/components/icons.tsx
  • web/components/landing/send-me-an-api-key-form.tsx
  • web/components/logo-grida.tsx
  • web/components/logo.tsx
  • web/components/motions/electron/index.tsx
  • web/components/notify-toggle.tsx
  • web/components/pricing/index.tsx
  • web/components/pricing/mini.tsx
  • web/components/providers.tsx
  • web/components/site-footer.tsx
  • web/components/site-header.tsx
  • web/components/theme-toggle.tsx
  • web/components/usage-meter.tsx
  • web/eslint.config.js
  • web/hooks/.gitkeep
  • web/k/examples.ts
  • web/k/external-links.ts
  • web/k/faq.json
  • web/k/host.ts
  • web/k/index.ts
  • web/k/plans.json
  • web/k/plans.test.json
  • web/k/plans.ts
  • web/layouts/payment-required-page.tsx
  • web/lib/.gitkeep
  • web/lib/billing/entitlement.ts
  • web/lib/billing/plans.ts
  • web/lib/billing/reproject.ts
  • web/lib/billing/stripe.ts
  • web/lib/control.ts
  • web/lib/control/account.ts
  • web/lib/control/bindings.ts
  • web/lib/control/keygen.ts
  • web/lib/control/kv.ts
  • web/lib/control/queries.ts
  • web/lib/control/tiers.ts
  • web/lib/format.ts
  • web/mdx-components.tsx
  • web/migrations/0001_init.sql
  • web/migrations/0002_auth.sql
  • web/migrations/0003_accounts.sql
  • web/migrations/0004_billing.sql
  • web/migrations/0005_email_prefs.sql
  • web/next-env.d.ts
  • web/next.config.js
  • web/next.config.mjs
  • web/open-next.config.ts
  • web/package.json
  • web/pages/onboarding/complete.tsx
  • web/pages/onboarding/payment-success-with-issue.tsx
  • web/pages/onboarding/payment-success.tsx
  • web/postcss.config.js
  • web/postcss.config.mjs
  • web/tailwind.config.ts
  • web/tsconfig.json
  • web/utils/email-validation.ts
  • web/utils/validate-urls.ts
  • web/wrangler.jsonc
  • workers/mock/package.json
  • workers/mock/src/index.ts
  • workers/mock/wrangler.jsonc
  • workers/proxy/package.json
  • workers/proxy/src/auth.ts
  • workers/proxy/src/cors.ts
  • workers/proxy/src/headers.ts
  • workers/proxy/src/index.ts
  • workers/proxy/src/meter.ts
  • workers/proxy/src/notify.ts
  • workers/proxy/src/ratelimit.ts
  • workers/proxy/src/target.ts
  • workers/proxy/src/types.ts
  • workers/proxy/src/usage.ts
  • workers/proxy/wrangler.jsonc

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cf

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The docs-cors-sh / cors Vercel projects were legacy integrations auto-deploying this repo; both disconnected (we deploy to Cloudflare). Empty commit to refresh PR checks off the stale docs-cors-sh status.
New 'checks' job runs oxfmt --check, eslint, and tsc --noEmit in parallel with build/e2e. Standardize check-types scripts across web/ui/emails to match the existing turbo task (was a no-op). Drop deprecated baseUrl from web/ui tsconfigs (TS6 TS5101) so tsc --noEmit passes — paths are already relative. Add the missing eslint devDep to @workspace/ui so its lint script actually runs.
AGENTS.md: concise agent/contributor guide — two-plane architecture, stack invariants (Node 22, Cloudflare-only, oxfmt, secrets runtime-only), commands, pre-commit gates, and gotchas; points to SPEC.md / DEVELOPMENT.md / GRAVEYARD.md as sources of truth. CLAUDE.md is a symlink to it. README: replace stale submodule clone instructions (no submodules) with real dev steps + doc links.
@softmarshmallow softmarshmallow marked this pull request as ready for review June 25, 2026 19:25
@softmarshmallow softmarshmallow merged commit 8bc1333 into main Jun 25, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant