Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

Commit

Prettier leaves generated files alone and writes no trailing commas in .jsonc

Generated files that tests compare against their generator (reference/cli.md, data/openapi.json, worker-configuration.d.ts) go back to what generates them and into .prettierignore. Prettier 3's trailing commas in wrangler.jsonc broke the readers that strip comments and JSON.parse it (services/runner machines.test.ts), so .jsonc keeps trailingComma none.

G1t-Session:
ses_01m57b7r6jew3aqgyfmhw6yah6
syntaqxcommitted Parentd543c87Browse files
35 files+679−6690/35 viewed
+4−0
1313 *_fixtures.json
1414 # Prettier's MDX printer changes this page again on every run.
1515 apps/docs/src/content/docs/guides/self-hosted-runners.mdx
16+# Generated, and checked against their generator by tests.
17+apps/docs/src/content/docs/reference/cli.md
18+apps/docs/src/data/openapi.json
19+**/worker-configuration.d.ts
+9−1
11 {
2− "printWidth": 160
2+ "printWidth": 160,
3+ "overrides": [
4+ {
5+ "files": "*.jsonc",
6+ "options": {
7+ "trailingComma": "none"
8+ }
9+ }
10+ ]
311 }
+4−4
1111 // adapters over the same operations.
1212 "routes": [
1313 { "pattern": "api.g1t.sh", "custom_domain": true },
14− { "pattern": "mcp.g1t.sh", "custom_domain": true },
14+ { "pattern": "mcp.g1t.sh", "custom_domain": true }
1515 ],
1616 "services": [
1717 { "binding": "IDENTITY", "service": "g1t-identity" },
3636 // Packages: list_packages, their settings, deleting and restoring them.
3737 { "binding": "PACKAGES", "service": "g1t-packages" },
3838 // Artifacts (folios): the artifact tool and /workspaces/{ws}/artifacts.
39− { "binding": "ARTIFACTS", "service": "g1t-artifacts" },
39+ { "binding": "ARTIFACTS", "service": "g1t-artifacts" }
4040 ],
4141 // GitHub Actions artifacts older runners kept, in chunks, with KV's own
4242 // expiry, read until it passes (and cache
4949 // without one. Ids and limits: RATE_LIMITS in packages/contracts.
5050 "ratelimits": [
5151 { "name": "API_ANONYMOUS_LIMIT", "namespace_id": "4401", "simple": { "limit": 60, "period": 60 } },
52− { "name": "API_TOKEN_LIMIT", "namespace_id": "4402", "simple": { "limit": 1000, "period": 60 } },
52+ { "name": "API_TOKEN_LIMIT", "namespace_id": "4402", "simple": { "limit": 1000, "period": 60 } }
5353 ],
5454 // Logs of a tenth of requests: agents call it constantly.
55− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
55+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
5656 }
+480−480
A large diff (1,482 lines) is not shown until you ask for it.
+0−0

Binary or large file; its contents are not shown.

+2−2
66 // A static site: Astro builds it to ./dist and Workers serves the files.
77 "assets": {
88 "directory": "./dist",
9− "not_found_handling": "404-page",
9+ "not_found_handling": "404-page"
1010 },
1111 "routes": [{ "pattern": "docs.g1t.sh", "custom_domain": true }],
1212 // Logs of a tenth of requests: files only, nothing to debug in each.
13− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
13+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
1414 }
+6−6
2121 "binding": "DB",
2222 "database_name": "g1t-status",
2323 "database_id": "dba85721-96dc-401d-9121-a6c587d614b2",
24− "migrations_dir": "migrations",
25− },
24+ "migrations_dir": "migrations"
25+ }
2626 ],
2727 // Billing has no public address: its price book is read through this.
2828 // Git storage (Cloudflare Artifacts) has none either: how it answered
3030 // is bound, so every other check goes over the internet.
3131 "services": [
3232 { "binding": "BILLING", "service": "g1t-billing" },
33− { "binding": "REPOS", "service": "g1t-repos" },
33+ { "binding": "REPOS", "service": "g1t-repos" }
3434 ],
3535 // Email to subscribers (confirmations, incident and maintenance
3636 // updates) and the staff alert for detected drafts, through Cloudflare
6666 // 45 minutes, then every 6 hours). Empty sends none.
6767 "STATUS_ALERT_EMAIL": "hey@flagon.io",
6868 "STATUS_FROM": "g1t status <noreply@g1t.sh>",
69− "OG_IMAGE": "https://og.g1t.sh/image?path=%2Fstatus&v=3",
69+ "OG_IMAGE": "https://og.g1t.sh/image?path=%2Fstatus&v=3"
7070 },
7171 // Asking for a subscription sends an email: limited per client address
7272 // and per email address (src/index.ts). Ids and limits: RATE_LIMITS in
7373 // packages/contracts.
7474 "ratelimits": [
7575 { "name": "STATUS_SUBSCRIBE_LIMIT", "namespace_id": "4601", "simple": { "limit": 3, "period": 60 } },
76− { "name": "STATUS_EMAIL_LIMIT", "namespace_id": "4602", "simple": { "limit": 2, "period": 60 } },
76+ { "name": "STATUS_EMAIL_LIMIT", "namespace_id": "4602", "simple": { "limit": 2, "period": 60 } }
7777 ],
7878 // Every log kept: few requests, and the checks' failures are what it is for.
79− "observability": { "enabled": true, "head_sampling_rate": 1 },
79+ "observability": { "enabled": true, "head_sampling_rate": 1 }
8080 }
+3−3
2929 // projects, and their telemetry ingest tokens.
3030 { "binding": "ACTIONS", "service": "g1t-actions" },
3131 { "binding": "PROJECTS", "service": "g1t-projects" },
32− { "binding": "TELEMETRY", "service": "g1t-telemetry" },
32+ { "binding": "TELEMETRY", "service": "g1t-telemetry" }
3333 ],
3434 "vars": {
3535 // The Zero Trust team domain, such as `g1t.cloudflareaccess.com`.
4242 // Access service tokens let in as staff: `<client id>=<name>`, comma
4343 // separated. Each acts, and is recorded, as `<name>@service.g1t.sh`.
4444 // The Access application needs a Service Auth policy including it.
45− "STAFF_SERVICE_TOKENS": "434297ede60761875e84742d0486cf27.access=claude",
45+ "STAFF_SERVICE_TOKENS": "434297ede60761875e84742d0486cf27.access=claude"
4646 },
4747 // Every log kept: staff only, few requests.
4848 "observability": { "enabled": true, "head_sampling_rate": 1 },
49− "upload_source_maps": true,
49+ "upload_source_maps": true
5050 }
+5−5
1515 // their own that never sees g1t.sh's cookies (workers/usercontent.ts).
1616 "routes": [
1717 { "pattern": "g1t.sh", "custom_domain": true },
18− { "pattern": "g1tusercontent.com", "custom_domain": true },
18+ { "pattern": "g1tusercontent.com", "custom_domain": true }
1919 ],
2020 // The site holds no data of its own; everything goes through services.
2121 // GitHub Actions artifacts, as the API keeps them, for download from a run.
2323 // only here: the identity service checks and writes them.
2424 "kv_namespaces": [
2525 { "binding": "BLOBS", "id": "16a4232cb746418db53782aa068be693" },
26− { "binding": "AVATARS", "id": "e627b571f07047e187c03e1fc2b3bbdd" },
26+ { "binding": "AVATARS", "id": "e627b571f07047e187c03e1fc2b3bbdd" }
2727 ],
2828 // The self-hosted runner's releases, served at /downloads/runner/
2929 // (routes/downloads-runner.ts); published by scripts/runner-release.mjs.
5252 // Observability: each project's requests, logs, traces, metrics and errors, and its live tail (services/telemetry).
5353 { "binding": "TELEMETRY", "service": "g1t-telemetry" },
5454 // Production screenshots for a project's overview (services/og).
55− { "binding": "SCREENSHOTS", "service": "g1t-og", "entrypoint": "Screenshots" },
55+ { "binding": "SCREENSHOTS", "service": "g1t-og", "entrypoint": "Screenshots" }
5656 ],
5757 // The front door's limits (app/lib/front-door-limits.ts). Every id and
5858 // limit is in RATE_LIMITS (packages/contracts/src/rate-limits.ts), which
6464 { "name": "WEB_ADDRESS_LIMIT", "namespace_id": "4204", "simple": { "limit": 3000, "period": 60 } },
6565 { "name": "GIT_ANONYMOUS_LIMIT", "namespace_id": "4205", "simple": { "limit": 120, "period": 60 } },
6666 { "name": "GIT_SIGNED_LIMIT", "namespace_id": "4206", "simple": { "limit": 1200, "period": 60 } },
67− { "name": "WEB_TOKEN_LIMIT", "namespace_id": "4207", "simple": { "limit": 1000, "period": 60 } },
67+ { "name": "WEB_TOKEN_LIMIT", "namespace_id": "4207", "simple": { "limit": 1000, "period": 60 } }
6868 ],
6969 // Logs of a tenth of requests: every page view is one, too many to keep all.
7070 // Cloudflare Turnstile on email sign-up (app/lib/turnstile.ts): the
7272 // secret. Either one empty turns it off.
7373 "vars": { "TURNSTILE_SITE_KEY": "0x4AAAAAAFWhRDwKfGS3CEvZ" },
7474 "observability": { "enabled": true, "head_sampling_rate": 0.1 },
75− "upload_source_maps": true,
75+ "upload_source_maps": true
7676 }
+39−39
2929 "16a4232cb746418db53782aa068be693": "g1t-actions-blobs",
3030 "e627b571f07047e187c03e1fc2b3bbdd": "g1t-avatars",
3131 "14bc5c233d4c46a5bbf23b5367cce5fd": "g1t-domains",
32− "be765052d0124c2a935b3db4dff99f1f": "g1t-repos-git-cache",
33− },
32+ "be765052d0124c2a935b3db4dff99f1f": "g1t-repos-git-cache"
33+ }
3434 },
3535
3636 // Each deployable unit, by short name (`--only events,web`).
6060 "stage": "core",
6161 "secrets": [],
6262 "setup": [
63− "The dead-letter queue every queue consumer sends what it gave up on to, before any unit that names it deploys: npx wrangler queues create g1t-events-dlq",
63+ "The dead-letter queue every queue consumer sends what it gave up on to, before any unit that names it deploys: npx wrangler queues create g1t-events-dlq"
6464 ],
65− "self_host": "run",
65+ "self_host": "run"
6666 },
6767 "identity": {
6868 "path": "services/identity",
7272 "stage": "core",
7373 "secrets": ["GITHUB_APP_CLIENT_SECRET", "IDENTITY_KEY"],
7474 "setup": ["Email Sending on g1t.sh (the EMAIL binding)"],
75− "self_host": "run",
75+ "self_host": "run"
7676 },
7777 "repos": {
7878 "path": "services/repos",
8787 "setup": [
8888 "The Artifacts namespace `g1t` (the ARTIFACTS binding)",
8989 "The R2 bucket `g1t-git-packs` (GIT_PACKS) with its lifecycle rule: `npx wrangler r2 bucket create g1t-git-packs`, then `npx wrangler r2 bucket lifecycle add g1t-git-packs expire-packs packs/ --expire-days 7 --abort-multipart-days 1`",
90− "The R2 bucket for nightly backups: npx wrangler r2 bucket create g1t-backups",
90+ "The R2 bucket for nightly backups: npx wrangler r2 bucket create g1t-backups"
9191 ],
92− "self_host": "run",
92+ "self_host": "run"
9393 },
9494 "work": {
9595 "path": "services/work",
9898 "d1": { "database": "g1t-work", "migrations": "migrations" },
9999 "stage": "core",
100100 "secrets": [],
101− "self_host": "run",
101+ "self_host": "run"
102102 },
103103 "search": {
104104 "path": "services/search",
107107 "d1": { "database": "g1t-search", "migrations": "migrations" },
108108 "stage": "core",
109109 "secrets": [],
110− "self_host": "run",
110+ "self_host": "run"
111111 },
112112 "projects": {
113113 "path": "services/projects",
116116 "d1": { "database": "g1t-projects", "migrations": "migrations" },
117117 "stage": "core",
118118 "secrets": [],
119− "self_host": "run",
119+ "self_host": "run"
120120 },
121121 "chat": {
122122 "path": "services/chat",
126126 "stage": "core",
127127 "secrets": [],
128128 "setup": ["The D1 database, before the first deploy: npx wrangler d1 create g1t-chat, then put its id in services/chat/wrangler.jsonc"],
129− "self_host": "run",
129+ "self_host": "run"
130130 },
131131 // Artifacts: docs (a doc is one kind of artifact), their spaces,
132132 // sharing and live rooms. It was g1t-docs-service (services/docs)
145145 "The R2 bucket for files in pages: npx wrangler r2 bucket create g1t-docs-files",
146146 "The queue the events service sends it merges and pushes on (pages whose cited code changed, projects' docs): npx wrangler queues create g1t-events-docs. The service also sends its own backfill jobs to it (JOBS)",
147147 "The Vectorize index Docs are searched by meaning from: npx wrangler vectorize create g1t-docs --dimensions=768 --metric=cosine, with string metadata indexes on workspace_id and space_id (npx wrangler vectorize create-metadata-index g1t-docs --property-name=<name> --type=string)",
148− "The Vectorize index for artifacts (folios), before the first deploy with FOLIO_VECTORS: npx wrangler vectorize create g1t-folios --dimensions=768 --metric=cosine, with string metadata indexes on workspace_id, scope and kind (npx wrangler vectorize create-metadata-index g1t-folios --property-name=<name> --type=string). Without it, artifacts are searched by words",
148+ "The Vectorize index for artifacts (folios), before the first deploy with FOLIO_VECTORS: npx wrangler vectorize create g1t-folios --dimensions=768 --metric=cosine, with string metadata indexes on workspace_id, scope and kind (npx wrangler vectorize create-metadata-index g1t-folios --property-name=<name> --type=string). Without it, artifacts are searched by words"
149149 ],
150− "self_host": "run",
150+ "self_host": "run"
151151 },
152152 "telemetry": {
153153 "path": "services/telemetry",
161161 // export of the apps), so it is not listed.
162162 "secrets": [],
163163 "setup": [
164− "Deployed once before the deployments service and the dispatcher, which name it (`node scripts/deploy.mjs deploy --only telemetry`): a binding or Tail Worker that names a Worker not yet there is refused",
164+ "Deployed once before the deployments service and the dispatcher, which name it (`node scripts/deploy.mjs deploy --only telemetry`): a binding or Tail Worker that names a Worker not yet there is refused"
165165 ],
166− "self_host": "run",
166+ "self_host": "run"
167167 },
168168 "notify": {
169169 "path": "services/notify",
179179 // is not listed.
180180 "secrets": ["VAPID_PRIVATE_KEY"],
181181 "setup": [
182− "The VAPID key pair for browser push: `node scripts/ops/vapid-keys.mjs` prints both halves and stores nothing. Put the public half in VAPID_PUBLIC_KEY in services/notify/wrangler.jsonc, and the private half with `npx wrangler secret put VAPID_PRIVATE_KEY` in services/notify",
182+ "The VAPID key pair for browser push: `node scripts/ops/vapid-keys.mjs` prints both halves and stores nothing. Put the public half in VAPID_PUBLIC_KEY in services/notify/wrangler.jsonc, and the private half with `npx wrangler secret put VAPID_PRIVATE_KEY` in services/notify"
183183 ],
184− "self_host": "run",
184+ "self_host": "run"
185185 },
186186 "billing": {
187187 "path": "services/billing",
190190 "d1": { "database": "g1t-billing", "migrations": "migrations" },
191191 "stage": "core",
192192 "secrets": ["STRIPE_SECRET_KEY", "STRIPE_WEBHOOK_SECRET", "CLOUDFLARE_USAGE_TOKEN", "BILLING_KEY"],
193− "self_host": "run",
193+ "self_host": "run"
194194 },
195195 "integrations": {
196196 "path": "services/integrations",
199199 "d1": { "database": "g1t-integrations", "migrations": "migrations" },
200200 "stage": "core",
201201 "secrets": ["INTEGRATIONS_KEY", "GITHUB_APP_PRIVATE_KEY", "GITHUB_APP_WEBHOOK_SECRET"],
202− "self_host": "run",
202+ "self_host": "run"
203203 },
204204 "webhooks": {
205205 "path": "services/webhooks",
208208 "d1": { "database": "g1t-webhooks", "migrations": "migrations" },
209209 "stage": "core",
210210 "secrets": ["WEBHOOKS_KEY"],
211− "self_host": "run",
211+ "self_host": "run"
212212 },
213213 "actions": {
214214 "path": "services/actions",
217217 "d1": { "database": "g1t-actions", "migrations": "migrations" },
218218 "stage": "core",
219219 "secrets": ["ACTIONS_KEY"],
220− "self_host": "run",
220+ "self_host": "run"
221221 },
222222 "packages": {
223223 "path": "services/packages",
230230 "The D1 database: npx wrangler d1 create g1t-packages, its id in services/packages/wrangler.jsonc",
231231 "The R2 bucket for packages' files: npx wrangler r2 bucket create g1t-packages",
232232 "The events queue: npx wrangler queues create g1t-events-packages",
233− "For signed downloads: an R2 API token with read access to g1t-packages, as R2_ACCESS_KEY_ID and R2_SECRET_ACCESS_KEY",
233+ "For signed downloads: an R2 API token with read access to g1t-packages, as R2_ACCESS_KEY_ID and R2_SECRET_ACCESS_KEY"
234234 ],
235− "self_host": "run",
235+ "self_host": "run"
236236 },
237237 "security": {
238238 "path": "services/security",
241241 "d1": { "database": "g1t-security", "migrations": "migrations" },
242242 "stage": "core",
243243 "secrets": [],
244− "self_host": "run",
244+ "self_host": "run"
245245 },
246246 "deployments": {
247247 "path": "services/deployments",
252252 "secrets": ["CLOUDFLARE_API_TOKEN"],
253253 "setup": [
254254 "Workers for Platforms, and the dispatch namespace: scripts/setup-deployments.sh",
255− "Custom domains (Cloudflare for SaaS on g1t.page): scripts/setup-custom-domains.sh",
255+ "Custom domains (Cloudflare for SaaS on g1t.page): scripts/setup-custom-domains.sh"
256256 ],
257− "self_host": "run",
257+ "self_host": "run"
258258 },
259259 "runner": {
260260 "path": "services/runner",
268268 // The binary the image adds to its base (scripts/build-runner.mjs).
269269 "crate": "g1t-runner",
270270 "base": { "context": "services/runner/base", "lock": "services/runner/base.json" },
271− "repository": "g1t-runner",
271+ "repository": "g1t-runner"
272272 },
273− "self_host": "off",
273+ "self_host": "off"
274274 },
275275 "og": {
276276 "path": "services/og",
281281 "setup": ["Browser Rendering on the account (the BROWSER binding)"],
282282 // The roadmap cards read the site's roadmap.
283283 "inputs": ["apps/web/app/lib/roadmap.ts"],
284− "self_host": "none",
284+ "self_host": "none"
285285 },
286286 "api": {
287287 "path": "apps/api",
295295 "secrets": ["ACTIONS_OIDC_KEY"],
296296 "setup": [
297297 "The OIDC signing key for workflow jobs: an RSA key made with `openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048`, stored with `npx wrangler secret put ACTIONS_OIDC_KEY` (docs.g1t.sh/guides/deploy-to-cloudflare/#oidc-tokens-for-workflow-jobs)",
298− "The actions cache bucket's lifecycle rule limited to `c/`, so artifacts under `a/` are kept their retention-days (docs.g1t.sh/guides/deploy-to-cloudflare/#a-first-deploy-to-a-new-account)",
298+ "The actions cache bucket's lifecycle rule limited to `c/`, so artifacts under `a/` are kept their retention-days (docs.g1t.sh/guides/deploy-to-cloudflare/#a-first-deploy-to-a-new-account)"
299299 ],
300− "self_host": "separate",
300+ "self_host": "separate"
301301 },
302302 "pages": {
303303 "path": "services/pages",
306306 "stage": "edge",
307307 "secrets": [],
308308 "setup": ["A proxied wildcard DNS record on g1t.page (`*`, AAAA 100::): scripts/setup-deployments.sh"],
309− "self_host": "none",
309+ "self_host": "none"
310310 },
311311 "status": {
312312 "path": "apps/status",
316316 "stage": "edge",
317317 "secrets": ["STATUS_SECRET"],
318318 "setup": ["Email Sending on g1t.sh (the EMAIL binding)"],
319− "self_host": "separate",
319+ "self_host": "separate"
320320 },
321321 "web": {
322322 "path": "apps/web",
330330 "setup": [
331331 "The R2 bucket g1t-downloads, for the releases of the self-hosted runner, the CLI and the desktop app: npx wrangler r2 bucket create g1t-downloads",
332332 "The zone g1tusercontent.com on the account; the Worker's custom domain on it is made by the deploy",
333− "The key for private files' addresses: `node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\" | npx wrangler secret put USERCONTENT_KEY` in apps/web",
333+ "The key for private files' addresses: `node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\" | npx wrangler secret put USERCONTENT_KEY` in apps/web"
334334 ],
335− "self_host": "run",
335+ "self_host": "run"
336336 },
337337 "sudo": {
338338 "path": "apps/sudo",
341341 "stage": "front",
342342 "secrets": [],
343343 "setup": ["A Cloudflare Access application on sudo.g1t.sh; its AUD tag is ACCESS_AUD"],
344− "self_host": "none",
344+ "self_host": "none"
345345 },
346346 "docs": {
347347 "path": "apps/docs",
349349 "worker": "g1t-docs",
350350 "stage": "front",
351351 "secrets": [],
352− "self_host": "none",
353− },
354− },
352+ "self_host": "none"
353+ }
354+ }
355355 }
+6−6
1414 "binding": "DB",
1515 "database_name": "g1t-actions",
1616 "database_id": "95ccaa88-8e15-4b90-81e2-0d02d8ce869d",
17− "migrations_dir": "migrations",
18− },
17+ "migrations_dir": "migrations"
18+ }
1919 ],
2020 // ACTIONS_KEY (secret): seals secrets at rest. Never regenerate it:
2121 // secrets saved under the old key could no longer be opened.
3232 // A job with an `environment:` makes its run's deployment there.
3333 { "binding": "DEPLOYMENTS", "service": "g1t-deployments" },
3434 // Pages open on a repository hear its runs' jobs start and finish.
35− { "binding": "NOTIFY", "service": "g1t-notify" },
35+ { "binding": "NOTIFY", "service": "g1t-notify" }
3636 ],
3737 // actions/cache entries and artifacts, which the API writes: deleted here when they
3838 // are evicted or expire.
3939 "r2_buckets": [{ "binding": "ACTIONS_CACHE", "bucket_name": "g1t-actions-cache" }],
4040 // Every event on the bus: what starts workflows, and pushes that change them.
4141 "queues": {
42− "consumers": [{ "queue": "g1t-events-actions", "max_batch_size": 10, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
42+ "consumers": [{ "queue": "g1t-events-actions", "max_batch_size": 10, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
4343 },
4444 // What g1t keeps and allows (src/limits.rs): days a finished job's log is
4545 // kept (0: for good); what a workspace without the plan may keep in
4848 "vars": {
4949 "LOG_RETENTION_DAYS": "90",
5050 "FREE_ACTIONS_STORAGE_BYTES": "2147483648",
51− "FREE_SELF_HOSTED_JOBS": "4",
51+ "FREE_SELF_HOSTED_JOBS": "4"
5252 },
5353 // Schedules, jobs waiting for room, and jobs whose runner went quiet.
5454 "triggers": { "crons": ["* * * * *"] },
5555 // Every log kept: few requests, and a failed job must be traceable.
56− "observability": { "enabled": true, "head_sampling_rate": 1 },
56+ "observability": { "enabled": true, "head_sampling_rate": 1 }
5757 }
+11−11
2222 // npx wrangler d1 create g1t-docs
2323 // npx wrangler d1 migrations apply g1t-docs --remote
2424 "database_id": "8f2193ed-fd2b-4322-b6cb-c79090e7603d",
25− "migrations_dir": "migrations",
26− },
25+ "migrations_dir": "migrations"
26+ }
2727 ],
2828 // Files people put in pages (images, attachments), served from the
2929 // usercontent origin at /docs-files/<key> (apps/web/workers/usercontent.ts).
5252 "ai": { "binding": "AI" },
5353 "vectorize": [
5454 { "binding": "VECTORS", "index_name": "g1t-docs" },
55− { "binding": "FOLIO_VECTORS", "index_name": "g1t-folios" },
55+ { "binding": "FOLIO_VECTORS", "index_name": "g1t-folios" }
5656 ],
5757 "services": [
5858 // Workspaces by slug, people's names and avatars, and teams.
6767 // doc.page.* events on the bus (src/events.ts).
6868 { "binding": "EVENTS", "service": "g1t-events" },
6969 // Whether a workspace has the plan, once its files pass the free cap (src/quota.ts).
70− { "binding": "BILLING", "service": "g1t-billing" },
70+ { "binding": "BILLING", "service": "g1t-billing" }
7171 ],
7272 // What a workspace without the plan may keep in files put in its pages
7373 // and artifacts, in bytes; past it, new uploads are refused (src/quota.ts).
8282 // src/indexer.ts): a workspace's pages and projects' docs indexed in
8383 // batches, and waiting out the hourly embedding cap.
8484 "producers": [{ "binding": "JOBS", "queue": "g1t-events-docs" }],
85− "consumers": [{ "queue": "g1t-events-docs", "max_batch_size": 20, "max_batch_timeout": 2, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
85+ "consumers": [{ "queue": "g1t-events-docs", "max_batch_size": 20, "max_batch_timeout": 2, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
8686 },
8787 // One room per page: it holds the page's Yjs document and open sockets,
8888 // hibernating while nobody types (src/room.ts). And one per folio
9191 "durable_objects": {
9292 "bindings": [
9393 { "name": "PAGES", "class_name": "PageRoom" },
94− { "name": "FOLIOS", "class_name": "FolioRoom" },
95− ],
94+ { "name": "FOLIOS", "class_name": "FolioRoom" }
95+ ]
9696 },
9797 // Both classes were made on g1t-docs-service (v1 PageRoom, v2 FolioRoom,
9898 // both SQLite). v3 transfers them, every room's storage with them, when
108108 "tag": "v3",
109109 "transferred_classes": [
110110 { "from": "PageRoom", "from_script": "g1t-docs-service", "to": "PageRoom" },
111− { "from": "FolioRoom", "from_script": "g1t-docs-service", "to": "FolioRoom" },
112− ],
113− },
111+ { "from": "FolioRoom", "from_script": "g1t-docs-service", "to": "FolioRoom" }
112+ ]
113+ }
114114 ],
115115 // Daily: folios in the trash for over 30 days are deleted for good. Every
116116 // quarter hour: each workspace's month of search embeddings is reported
117117 // to billing (src/embed-billing.ts; DAILY_CRON in src/index.ts).
118118 "triggers": { "crons": ["17 3 * * *", "*/15 * * * *"] },
119− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
119+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
120120 }
+6−6
1515 "binding": "DB",
1616 "database_name": "g1t-billing",
1717 "database_id": "695a6979-fd07-4850-bc97-904a6b4b7a04",
18− "migrations_dir": "migrations",
19− },
18+ "migrations_dir": "migrations"
19+ }
2020 ],
2121 // Identity emails owners as their workspace nears its usage limit.
2222 // Repos says which repositories are public (the open-source pool pays
2525 { "binding": "IDENTITY", "service": "g1t-identity" },
2626 { "binding": "REPOS", "service": "g1t-repos" },
2727 // What each workspace's packages hold, measured daily (src/storage.rs).
28− { "binding": "PACKAGES", "service": "g1t-packages" },
28+ { "binding": "PACKAGES", "service": "g1t-packages" }
2929 ],
3030 // Margin alerts to staff (src/margin.rs), through Cloudflare Email
3131 // Sending like identity's and the status page's mail.
3333 // Events from the bus: a workspace renamed moves its billing to the
3434 // new slug (src/rename.rs).
3535 "queues": {
36− "consumers": [{ "queue": "g1t-events-billing", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
36+ "consumers": [{ "queue": "g1t-events-billing", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
3737 },
3838 "vars": {
3939 // What is added to what g1t runs at cost, in percent: g1t's overhead
171171 "AUTO_PAUSE": "schedules,indexing",
172172 // Cloudflare's fixed subscriptions a month, for sudo's figures only:
173173 // Workers Paid ($5) and Workers for Platforms ($25).
174− "CLOUDFLARE_FIXED_MONTHLY_MICROS": "30000000",
174+ "CLOUDFLARE_FIXED_MONTHLY_MICROS": "30000000"
175175 },
176176 // The tick every 15 minutes (Stripe, autopay, closing months), which at
177177 // a quarter past each hour also runs the platform watch; checking costs
187187 // (src/provider_costs.rs). Without it none can be connected; changing it
188188 // means every provider has to be connected again.
189189 // Every log kept: money moves here, and every failure matters.
190− "observability": { "enabled": true, "head_sampling_rate": 1 },
190+ "observability": { "enabled": true, "head_sampling_rate": 1 }
191191 }
+5−5
1414 "binding": "DB",
1515 "database_name": "g1t-chat",
1616 "database_id": "e837affd-a435-4408-9345-14d55d520316",
17− "migrations_dir": "migrations",
18− },
17+ "migrations_dir": "migrations"
18+ }
1919 ],
2020 "services": [
2121 // Workspaces by slug, and people's names and avatars for members.
2424 { "binding": "NOTIFY", "service": "g1t-notify" },
2525 // Ask (services/integrations): @g1t's answers in a direct message with
2626 // it, from the workspace's own AI provider. The channel's room asks.
27− { "binding": "INTEGRATIONS", "service": "g1t-integrations" },
27+ { "binding": "INTEGRATIONS", "service": "g1t-integrations" }
2828 ],
2929 // One room per channel for live delivery: it holds the channel's open
3030 // sockets, hibernating while nobody says anything (src/room.ts).
3131 "durable_objects": {
32− "bindings": [{ "name": "ROOMS", "class_name": "ChannelRoom" }],
32+ "bindings": [{ "name": "ROOMS", "class_name": "ChannelRoom" }]
3333 },
3434 "migrations": [{ "tag": "v1", "new_sqlite_classes": ["ChannelRoom"] }],
3535 // Custom emoji images, kept by their hash under `emoji/` in the avatars
3636 // namespace and served from the usercontent origin at /emoji/<hash>
3737 // (apps/web/workers/usercontent.ts), never from the site.
3838 "kv_namespaces": [{ "binding": "AVATARS", "id": "e627b571f07047e187c03e1fc2b3bbdd" }],
39− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
39+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
4040 }
+6−6
1212 "binding": "DB",
1313 "database_name": "g1t-deployments",
1414 "database_id": "aa935a8f-845b-4132-8fa3-98f1afba1db5",
15− "migrations_dir": "migrations",
16− },
15+ "migrations_dir": "migrations"
16+ }
1717 ],
1818 "services": [
1919 { "binding": "REPOS", "service": "g1t-repos" },
3232 { "binding": "EVENTS", "service": "g1t-events" },
3333 // Observability: the token each project's apps send OpenTelemetry
3434 // with. Every app also names g1t-telemetry as its Tail Worker.
35− { "binding": "TELEMETRY", "service": "g1t-telemetry" },
35+ { "binding": "TELEMETRY", "service": "g1t-telemetry" }
3636 ],
3737 // Pull requests opened, pushed to, closed and merged; pushes to the
3838 // default branch.
3939 "queues": {
40− "consumers": [{ "queue": "g1t-events-deployments", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
40+ "consumers": [{ "queue": "g1t-events-deployments", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
4141 },
4242 // Builds that died, usage counts, idle previews, apps of ended plans,
4343 // and charging a month that is over.
6464 // D1 and other call), sent to this Workers Observability destination
6565 // on the account, which points at otel.g1t.sh/cloudflare/v1/traces
6666 // with the telemetry service's CLOUDFLARE_EXPORT_KEY. Empty: none.
67− "TRACES_DESTINATION": "g1t-traces",
67+ "TRACES_DESTINATION": "g1t-traces"
6868 },
6969 // Custom domains: hostname to app, written here and read by the
7070 // dispatcher (services/pages). Made by scripts/setup-custom-domains.sh.
7575 // Containers (edit), for applications and registry logins. Without it
7676 // nothing deploys.
7777 // Every log kept: few requests, and a failed deploy must be traceable.
78− "observability": { "enabled": true, "head_sampling_rate": 1 },
78+ "observability": { "enabled": true, "head_sampling_rate": 1 }
7979 }
+6−6
1414 "binding": "DB",
1515 "database_name": "g1t-events",
1616 "database_id": "dd889749-0d01-4c94-8b9b-d789dec1c0e4",
17− "migrations_dir": "migrations",
18− },
17+ "migrations_dir": "migrations"
18+ }
1919 ],
2020 "queues": {
2121 "producers": [
3838 // Pages that cite code a merge changed, and projects' docs folders
3939 // (services/artifacts/src/staleness.ts). Create it once:
4040 // npx wrangler queues create g1t-events-docs
41− { "binding": "SUBSCRIBER_DOCS", "queue": "g1t-events-docs" },
41+ { "binding": "SUBSCRIBER_DOCS", "queue": "g1t-events-docs" }
4242 ],
43− "consumers": [{ "queue": "g1t-events", "max_batch_size": 100, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
43+ "consumers": [{ "queue": "g1t-events", "max_batch_size": 100, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
4444 },
4545 // Each workspace's audit log keeps as many days as billing says (7 free,
4646 // 90 on the plan, or what staff set), asked for over this binding.
5454 { "binding": "IDENTITY", "service": "g1t-identity" },
5555 // Each new inbox item, told live in the person's tabs and pushed, and
5656 // what changed in each repository, for the pages open on it (services/notify).
57− { "binding": "NOTIFY", "service": "g1t-notify" },
57+ { "binding": "NOTIFY", "service": "g1t-notify" }
5858 ],
5959 // Once a day, audit entries older than AUDIT_MAX_DAYS are removed for
6060 // everyone (keep it at least billing's AUDIT_MAX_DAYS), then each
6565 "triggers": { "crons": ["41 3 * * *", "0 8 * * *"] },
6666 "vars": { "AUDIT_MAX_DAYS": "400", "AUDIT_MIN_DAYS": "7" },
6767 // Logs of a tenth of requests: every change in g1t is an event.
68− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
68+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
6969 }
+5−5
1818 "binding": "DB",
1919 "database_name": "g1t",
2020 "database_id": "b7d49c93-2666-4006-a3c3-073a01838dc9",
21− "migrations_dir": "migrations",
22− },
21+ "migrations_dir": "migrations"
22+ }
2323 ],
2424 "send_email": [{ "name": "EMAIL", "remote": true }],
2525 // Uploaded avatars, keyed by the SHA-256 of their bytes. Only this
3737 // audit log, which billing keeps (src/deletion.rs).
3838 { "binding": "REPOS", "service": "g1t-repos" },
3939 { "binding": "PROJECTS", "service": "g1t-projects" },
40− { "binding": "BILLING", "service": "g1t-billing" },
40+ { "binding": "BILLING", "service": "g1t-billing" }
4141 ],
4242 // Signing in with GitHub (src/github.rs), through g1t's GitHub App.
4343 // Its client ID is public. Secrets: GITHUB_APP_CLIENT_SECRET, the app's
6464 "PROTECTED_ACCOUNTS": "",
6565 "GITHUB_APP_CLIENT_ID": "Iv23liZS94alfjIUn1eW",
6666 "INVITE_TTL_DAYS": "30",
67− "INVITES_PER_USER": "20",
67+ "INVITES_PER_USER": "20"
6868 },
6969 // Every log kept: sign-ins and tokens, where every failure matters.
70− "observability": { "enabled": true, "head_sampling_rate": 1 },
70+ "observability": { "enabled": true, "head_sampling_rate": 1 }
7171 }
+6−8
1616 "binding": "DB",
1717 "database_name": "g1t-integrations",
1818 "database_id": "86c6c1a9-4192-42d8-8c59-8da8d4f99c5e",
19− "migrations_dir": "migrations",
20− },
19+ "migrations_dir": "migrations"
20+ }
2121 ],
2222 "services": [
2323 { "binding": "IDENTITY", "service": "g1t-identity" },
2525 // Where a transferred repository is now, for moving its links.
2626 { "binding": "REPOS", "service": "g1t-repos" },
2727 // An imported repository's project takes GitHub's description.
28− { "binding": "PROJECTS", "service": "g1t-projects" },
28+ { "binding": "PROJECTS", "service": "g1t-projects" }
2929 ],
3030 // Work starting on, and finishing, what an outside system is waiting on.
3131 // Every minute: sessions started on workspaces' Anthropic accounts are
3232 // followed until they end (src/agent_sessions.rs).
3333 "triggers": { "crons": ["* * * * *"] },
3434 "queues": {
35− "consumers": [
36− { "queue": "g1t-events-integrations", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" },
37− ],
35+ "consumers": [{ "queue": "g1t-events-integrations", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
3836 },
3937 "vars": {
4038 "API_URL": "https://api.g1t.sh",
5048 // GITHUB_APP_WEBHOOK_SECRET. Leave the slug empty to turn it off.
5149 "GITHUB_APP_ID": "5203641",
5250 "GITHUB_APP_SLUG": "g1t-sh",
53− "GITHUB_APP_CLIENT_ID": "Iv23liZS94alfjIUn1eW",
51+ "GITHUB_APP_CLIENT_ID": "Iv23liZS94alfjIUn1eW"
5452 },
5553 // Secret: INTEGRATIONS_KEY, 64 hex characters. Connections' secrets are
5654 // sealed with it; without it nothing can be connected.
5755 // Logs of a tenth of requests: every page and event asks it.
58− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
56+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
5957 }
+5−5
1111 "placement": { "mode": "off" },
1212 "services": [
1313 // Who a username is, for the inbox's notices (they name people by username).
14− { "binding": "IDENTITY", "service": "g1t-identity" },
14+ { "binding": "IDENTITY", "service": "g1t-identity" }
1515 ],
1616 // One feed per person: their tabs' sockets (hibernating), their latest
1717 // notifications, unread counts and push subscriptions, in the object's
2626 "bindings": [
2727 { "name": "FEEDS", "class_name": "Feed" },
2828 { "name": "ROOMS", "class_name": "Room" },
29− { "name": "TOPICS", "class_name": "Topic" },
30− ],
29+ { "name": "TOPICS", "class_name": "Topic" }
30+ ]
3131 },
3232 "migrations": [
3333 { "tag": "v1", "new_sqlite_classes": ["Feed"] },
3434 { "tag": "v2", "new_sqlite_classes": ["Room"] },
35− { "tag": "v3", "new_sqlite_classes": ["Topic"] },
35+ { "tag": "v3", "new_sqlite_classes": ["Topic"] }
3636 ],
3737 // Web Push (RFC 8292): the public half of the VAPID key pair browsers
3838 // subscribe with, and who the push services may contact. The private
4141 // through Expo and need nothing here; the secret EXPO_ACCESS_TOKEN is
4242 // needed only once the Expo project turns on enhanced push security.
4343 "vars": { "VAPID_PUBLIC_KEY": "BBAhBFy-jgfEKm4IDEWKNN_5Nft9SjHqahXtpuZf1Aohop03XduSZgyat-hhDKXAP2hdtMv8yPX7TfqWyR6vJTo", "VAPID_SUBJECT": "https://g1t.sh" },
44− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
44+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
4545 }
+2−2
3838 { "binding": "PROJECTS", "service": "g1t-projects" },
3939 // Whether rendering is paused across g1t (billing's platform_pause):
4040 // cards fall back to a static image while it is (src/paused.ts).
41− { "binding": "BILLING", "service": "g1t-billing" },
41+ { "binding": "BILLING", "service": "g1t-billing" }
4242 ],
4343 // Cards drawn for a cache miss, per address (src/index.ts). Past it,
4444 // the brand card. Id and limit: RATE_LIMITS in packages/contracts.
4545 "ratelimits": [{ "name": "OG_RENDER_LIMIT", "namespace_id": "4501", "simple": { "limit": 60, "period": 60 } }],
4646 // Logs of a tenth of requests: every link shared is one.
47− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
47+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
4848 }
+4−4
2424 // Low, so the 429 can be seen by hand: about 30 requests a minute.
2525 "ratelimits": [
2626 { "name": "ANONYMOUS_LIMIT", "namespace_id": "1", "simple": { "limit": 30, "period": 60 } },
27− { "name": "SIGNED_LIMIT", "namespace_id": "2", "simple": { "limit": 5000, "period": 60 } },
27+ { "name": "SIGNED_LIMIT", "namespace_id": "2", "simple": { "limit": 5000, "period": 60 } }
2828 ],
2929 "services": [
3030 { "binding": "IDENTITY", "service": "g1t-packages-stubs" },
3131 { "binding": "REPOS", "service": "g1t-packages-stubs" },
3232 { "binding": "EVENTS", "service": "g1t-packages-stubs" },
33− { "binding": "BILLING", "service": "g1t-packages-stubs" },
33+ { "binding": "BILLING", "service": "g1t-packages-stubs" }
3434 ],
3535 "vars": {
3636 "BLOB_STORE": "r2",
3737 "MAX_REQUEST_BYTES": "100000000",
3838 "REGISTRY_HOST": "localhost:8790",
3939 "STORAGE_LIMITS": "on",
40− "PACKAGES_TOKEN_SECRET": "a-local-secret-that-is-long-enough-to-sign",
40+ "PACKAGES_TOKEN_SECRET": "a-local-secret-that-is-long-enough-to-sign"
4141 },
42− "triggers": { "crons": ["37 * * * *"] },
42+ "triggers": { "crons": ["37 * * * *"] }
4343 }
+1−1
44 "main": "stubs.js",
55 "compatibility_date": "2026-09-26",
66 "compatibility_flags": ["nodejs_compat"],
7− "vars": { "DEV_TOKEN": "g1t_devtoken", "MEMBER_TOKEN": "g1t_member", "OUTSIDER_TOKEN": "g1t_outsider", "FREE_PRIVATE_BYTES": "50000000" },
7+ "vars": { "DEV_TOKEN": "g1t_devtoken", "MEMBER_TOKEN": "g1t_member", "OUTSIDER_TOKEN": "g1t_outsider", "FREE_PRIVATE_BYTES": "50000000" }
88 }
+7−7
1515 "binding": "DB",
1616 "database_name": "g1t-packages",
1717 "database_id": "e541c872-a2a8-47aa-bfe8-419d0d50fe3c",
18− "migrations_dir": "migrations",
19− },
18+ "migrations_dir": "migrations"
19+ }
2020 ],
2121 // Every package's files, by digest (src/store). Made by
2222 // `npx wrangler r2 bucket create g1t-packages`.
2626 // installations have neither binding, and no limit.
2727 "ratelimits": [
2828 { "name": "ANONYMOUS_LIMIT", "namespace_id": "4101", "simple": { "limit": 300, "period": 60 } },
29− { "name": "SIGNED_LIMIT", "namespace_id": "4102", "simple": { "limit": 5000, "period": 60 } },
29+ { "name": "SIGNED_LIMIT", "namespace_id": "4102", "simple": { "limit": 5000, "period": 60 } }
3030 ],
3131 "services": [
3232 // Who a token or password belongs to.
3737 { "binding": "EVENTS", "service": "g1t-events" },
3838 // Whether a workspace is on the plan, and its free package storage
3939 // (src/quota.rs); asked at most every five minutes per workspace.
40− { "binding": "BILLING", "service": "g1t-billing" },
40+ { "binding": "BILLING", "service": "g1t-billing" }
4141 ],
4242 // BLOB_STORE: r2 (the BLOBS binding) or s3 (S3_ENDPOINT, S3_BUCKET,
4343 // S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_REGION, and optionally
6262 "MAX_REQUEST_BYTES": "100000000",
6363 "REGISTRY_HOST": "g1t.sh",
6464 "STORAGE_LIMITS": "on",
65− "PROTECTED_WORKSPACES": "flagon-io",
65+ "PROTECTED_WORKSPACES": "flagon-io"
6666 },
6767 // Every hour, expired uploads are let go, and blobs no version has used
6868 // for a day are deleted.
7070 // Workspaces renamed or deleted, repositories that change visibility,
7171 // are renamed, move or are purged.
7272 "queues": {
73− "consumers": [{ "queue": "g1t-events-packages", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
73+ "consumers": [{ "queue": "g1t-events-packages", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
7474 },
7575 // Logs of a tenth of requests: every registry pull is one.
76− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
76+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
7777 }
+2−2
1818 { "pattern": "*.g1t.page/*", "zone_name": "g1t.page" },
1919 // Custom domains (Cloudflare for SaaS is on for the zone).
2020 { "pattern": "*/*", "zone_name": "g1t.page" },
21− { "pattern": "g1t.page", "custom_domain": true },
21+ { "pattern": "g1t.page", "custom_domain": true }
2222 ],
2323 // The apps, uploaded by the deployments service.
2424 "dispatch_namespaces": [{ "binding": "APPS", "namespace": "g1t-deployments" }],
2828 // project) goes to observability, which files it with the app's own.
2929 "tail_consumers": [{ "service": "g1t-telemetry" }],
3030 // Logs of a tenth of requests: every visit to a deployed site is one.
31− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
31+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
3232 }
+5−5
1212 "binding": "DB",
1313 "database_name": "g1t-projects",
1414 "database_id": "0af698be-2b60-4bd9-aa93-81e84828e991",
15− "migrations_dir": "migrations",
16− },
15+ "migrations_dir": "migrations"
16+ }
1717 ],
1818 "services": [
1919 { "binding": "REPOS", "service": "g1t-repos" },
2727 // address is set or changed and when a production deployment is
2828 // reported for it (src/index.ts).
2929 { "binding": "SCREENSHOTS", "service": "g1t-og", "entrypoint": "Screenshots" },
30− { "binding": "EVENTS", "service": "g1t-events" },
30+ { "binding": "EVENTS", "service": "g1t-events" }
3131 ],
3232 // Uploaded production images, under `production/<sha256>` in the same
3333 // namespace as avatars, which the usercontent origin serves
3636 // A repository created is given its own project; a production
3737 // deployment reported from elsewhere asks for its screenshot.
3838 "queues": {
39− "consumers": [{ "queue": "g1t-events-projects", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
39+ "consumers": [{ "queue": "g1t-events-projects", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
4040 },
4141 // Logs of a tenth of requests: every repository page asks it.
42− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
42+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
4343 }
+1−1
44 "name": "g1t-gitstore",
55 "main": "../../../deploy/self-host/workers/gitstore/index.js",
66 "compatibility_date": "2026-09-26",
7− "vars": { "GITSTORE_URL": "http://localhost:8799", "GITSTORE_SECRET": "dev-gitstore-secret-0123" },
7+ "vars": { "GITSTORE_URL": "http://localhost:8799", "GITSTORE_SECRET": "dev-gitstore-secret-0123" }
88 }
+3−3
2626 { "binding": "IDENTITY", "service": "g1t-repos-stubs" },
2727 { "binding": "EVENTS", "service": "g1t-repos-stubs" },
2828 { "binding": "SECURITY", "service": "g1t-repos-stubs" },
29− { "binding": "BILLING", "service": "g1t-repos-stubs" },
29+ { "binding": "BILLING", "service": "g1t-repos-stubs" }
3030 ],
3131 "vars": {
3232 "GIT_OPERATIONS_FREE_CAP": "50000",
3636 "LARGE_PUSHES": "unscanned",
3737 "FORK_RETENTION_DAYS": "1",
3838 "GITSTORE_NAMESPACES": "{\"GITSTORE\":\"g1t\"}",
39− "GITSTORE_NEW_REPOS": "",
40− },
39+ "GITSTORE_NEW_REPOS": ""
40+ }
4141 }
+1−1
22 {
33 "name": "g1t-repos-stubs",
44 "main": "stubs.js",
5− "compatibility_date": "2026-09-26",
5+ "compatibility_date": "2026-09-26"
66 }
+8−8
1414 "binding": "DB",
1515 "database_name": "g1t-repos",
1616 "database_id": "f9544c51-c3bf-4621-a96f-8a6d5cf24a97",
17− "migrations_dir": "migrations",
18− },
17+ "migrations_dir": "migrations"
18+ }
1919 ],
2020 // The git store: Cloudflare Artifacts, bound as GITSTORE (so "artifacts"
2121 // in code means g1t's own Artifacts; the namespaces keep their names).
4545 // `npx wrangler r2 bucket create g1t-backups`.
4646 "r2_buckets": [
4747 { "binding": "GIT_PACKS", "bucket_name": "g1t-git-packs" },
48− { "binding": "BACKUPS", "bucket_name": "g1t-backups" },
48+ { "binding": "BACKUPS", "bucket_name": "g1t-backups" }
4949 ],
5050 "services": [
5151 { "binding": "IDENTITY", "service": "g1t-identity" },
5757 { "binding": "BILLING", "service": "g1t-billing" },
5858 // Rulesets: which hold for a push or another change to a branch or
5959 // tag, and where how they judged it is kept (src/rules.rs).
60− { "binding": "WORK", "service": "g1t-work" },
60+ { "binding": "WORK", "service": "g1t-work" }
6161 ],
6262 // A free workspace past this many git operations in a month is slowed
6363 // to this many an hour, never charged (src/git_ops.rs). It is billing's
113113 "LARGE_PUSHES": "unscanned",
114114 "FORK_RETENTION_DAYS": "1",
115115 "GITSTORE_NAMESPACES": "{\"GITSTORE\":\"g1t\"}",
116− "GITSTORE_NEW_REPOS": "",
116+ "GITSTORE_NEW_REPOS": ""
117117 },
118118 // Every hour, deleted repositories whose 30 days to be restored have
119119 // passed are purged, their git data with them (src/lifecycle.rs), and
126126 // A workspace renamed moves its repositories to the new slug; one
127127 // deleted purges the repositories it left in Recently deleted.
128128 "queues": {
129− "consumers": [{ "queue": "g1t-events-repos", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
129+ "consumers": [{ "queue": "g1t-events-repos", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
130130 },
131131 // What an anonymous clone can cost a repository's owner (src/limits.rs):
132132 // packs written to GIT_PACKS, and anonymous fetches the git store
134134 // packages/contracts. Without them, nothing is limited.
135135 "ratelimits": [
136136 { "name": "PACK_FILL_LIMIT", "namespace_id": "4301", "simple": { "limit": 30, "period": 60 } },
137− { "name": "ANONYMOUS_FETCH_LIMIT", "namespace_id": "4302", "simple": { "limit": 120, "period": 60 } },
137+ { "name": "ANONYMOUS_FETCH_LIMIT", "namespace_id": "4302", "simple": { "limit": 120, "period": 60 } }
138138 ],
139139 // Logs of a quarter of requests: every git request and page is one, so
140140 // keeping every one costs more than it tells, and a quarter still
143143 // (src/lib.rs, SLOW_RPC_MS) and a slow or partial About run
144144 // `{"about_run", "took_ms"}` (src/about.rs), so in the quarter kept they
145145 // can be counted by method without reading request lines.
146− "observability": { "enabled": true, "head_sampling_rate": 0.25 },
146+ "observability": { "enabled": true, "head_sampling_rate": 0.25 }
147147 }
+11−11
3030 // --containers-rollout=immediate). Ones that are busy are given
3131 // this long, in seconds, to finish first, so shipping g1t does not
3232 // kill work in the middle.
33− "rollout_active_grace_period": 7200,
33+ "rollout_active_grace_period": 7200
3434 },
3535 {
3636 // Workflow jobs with `runs-on: g1t-2core`: the standard machine.
3838 "image": "./Dockerfile",
3939 "instance_type": "standard-3",
4040 "max_instances": 10,
41− "rollout_active_grace_period": 7200,
41+ "rollout_active_grace_period": 7200
4242 },
4343 {
4444 // Workflow jobs with `runs-on: g1t-4core`: 4 vCPU, 12 GiB, 20 GB.
4646 "image": "./Dockerfile",
4747 "instance_type": "standard-4",
4848 "max_instances": 10,
49− "rollout_active_grace_period": 7200,
50− },
49+ "rollout_active_grace_period": 7200
50+ }
5151 ],
5252 "durable_objects": {
5353 "bindings": [
5454 { "name": "SANDBOX", "class_name": "AttemptSandbox" },
5555 { "name": "SANDBOX_2CORE", "class_name": "Sandbox2Core" },
56− { "name": "SANDBOX_4CORE", "class_name": "Sandbox4Core" },
57− ],
56+ { "name": "SANDBOX_4CORE", "class_name": "Sandbox4Core" }
57+ ]
5858 },
5959 "migrations": [
6060 { "tag": "v1", "new_sqlite_classes": ["AttemptSandbox"] },
6161 { "tag": "v2", "new_sqlite_classes": ["Sandbox2Core", "Sandbox4Core"] },
6262 { "tag": "v3", "new_sqlite_classes": ["AgentComputer"] },
6363 // Workspace agents' computers are gone, and with them their objects.
64− { "tag": "v4", "deleted_classes": ["AgentComputer"] },
64+ { "tag": "v4", "deleted_classes": ["AgentComputer"] }
6565 ],
6666 "services": [
6767 { "binding": "IDENTITY", "service": "g1t-identity" },
7171 { "binding": "ACTIONS", "service": "g1t-actions" },
7272 { "binding": "DEPLOYMENTS", "service": "g1t-deployments" },
7373 // The event bus: abuse.flagged, when a sandbox looks like it is mining.
74− { "binding": "EVENTS", "service": "g1t-events" },
74+ { "binding": "EVENTS", "service": "g1t-events" }
7575 ],
7676 // A sweep for lifecycle steps whose trigger was missed or whose sandbox
7777 // died before reporting, which also starts queued nightly backups.
7979 // Events it reacts to: a pull request that may now merge by its
8080 // repository's settings, a merge check or the merge queue to start.
8181 "queues": {
82− "consumers": [{ "queue": "g1t-events-runner", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
82+ "consumers": [{ "queue": "g1t-events-runner", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
8383 },
8484 "vars": {
8585 "CLOUDFLARE_ACCOUNT_ID": "1e6f2cffa3f445920836e8ebe446bb58",
101101 // backups the repos service queued, with at most BACKUPS_RUNNING at
102102 // once. "0" starts none.
103103 "BACKUPS_PER_SWEEP": "4",
104− "BACKUPS_RUNNING": "6",
104+ "BACKUPS_RUNNING": "6"
105105 },
106106 // Every log kept: few requests, and a failed run must be traceable.
107− "observability": { "enabled": true, "head_sampling_rate": 1 },
107+ "observability": { "enabled": true, "head_sampling_rate": 1 }
108108 }
+6−6
1616 "database_name": "g1t-search",
1717 // Create with `wrangler d1 create g1t-search` and put its id here.
1818 "database_id": "9d04cbf3-cd02-4544-b3e3-2d78767e13bf",
19− "migrations_dir": "migrations",
20− },
19+ "migrations_dir": "migrations"
20+ }
2121 ],
2222 "services": [
2323 { "binding": "IDENTITY", "service": "g1t-identity" },
2525 { "binding": "WORK", "service": "g1t-work" },
2626 // Whether indexing is paused across g1t (billing's platform_pause):
2727 // backfills wait while it is. Read at most every 30 seconds.
28− { "binding": "BILLING", "service": "g1t-billing" },
28+ { "binding": "BILLING", "service": "g1t-billing" }
2929 ],
3030 "queues": {
3131 // Its own jobs: a push's files, a repository compared whole, a page
3434 "consumers": [
3535 // The events that change what is indexed, to keep it current.
3636 { "queue": "g1t-events-search", "max_batch_size": 20, "max_batch_timeout": 2, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" },
37− { "queue": "g1t-search-jobs", "max_batch_size": 1, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" },
38− ],
37+ { "queue": "g1t-search-jobs", "max_batch_size": 1, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }
38+ ]
3939 },
4040 // Logs of a tenth of requests: every search is one.
41− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
41+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
4242 }
+6−6
1616 "database_name": "g1t-security",
1717 // Create with `wrangler d1 create g1t-security` and put its id here.
1818 "database_id": "a7febbca-768a-4828-97b8-dd69b2636e1e",
19− "migrations_dir": "migrations",
20− },
19+ "migrations_dir": "migrations"
20+ }
2121 ],
2222 "services": [
2323 { "binding": "IDENTITY", "service": "g1t-identity" },
2828 // The secrets a dependency update file's private registries name.
2929 { "binding": "ACTIONS", "service": "g1t-actions" },
3030 // Security events (webhooks, the inbox) and audit entries.
31− { "binding": "EVENTS", "service": "g1t-events" },
31+ { "binding": "EVENTS", "service": "g1t-events" }
3232 ],
3333 // Pushes to a default branch (dependencies are read again), pushes too
3434 // large to scan first (scanned after they land), security updates'
3636 // failing checks (security updates move on), new repositories (their
3737 // history is scanned once) and renamed workspaces.
3838 "queues": {
39− "consumers": [{ "queue": "g1t-events-security", "max_batch_size": 10, "max_batch_timeout": 5, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
39+ "consumers": [{ "queue": "g1t-events-security", "max_batch_size": 10, "max_batch_timeout": 5, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
4040 },
4141 // Continues history scans a page at a time, and reads every
4242 // repository's dependencies again once a day (every 30 minutes); runs
4343 // version updates that are due and looks at their pull requests (every 5).
4444 "triggers": { "crons": ["*/30 * * * *", "*/5 * * * *"] },
4545 "vars": {
46− "SITE_URL": "https://g1t.sh",
46+ "SITE_URL": "https://g1t.sh"
4747 },
4848 // Logs of a tenth of requests: every push and page asks it.
49− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
49+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
5050 }
+4−4
1818 "durable_objects": {
1919 "bindings": [
2020 { "name": "STORES", "class_name": "TelemetryStore" },
21− { "name": "METERS", "class_name": "TelemetryMeter" },
22− ],
21+ { "name": "METERS", "class_name": "TelemetryMeter" }
22+ ]
2323 },
2424 "migrations": [
2525 { "tag": "v1", "new_sqlite_classes": ["TelemetryStore"] },
26− { "tag": "v2", "new_sqlite_classes": ["TelemetryMeter"] },
26+ { "tag": "v2", "new_sqlite_classes": ["TelemetryMeter"] }
2727 ],
2828 // What the deployments service notes under each app's hostname (its
2929 // project and deployment), read to file a request the dispatcher saw
4444 // packages/contracts.
4545 "ratelimits": [{ "name": "TELEMETRY_INGEST_LIMIT", "namespace_id": "4701", "simple": { "limit": 600, "period": 60 } }],
4646 // Its own logs: few, as every request to an app is a tail event here.
47− "observability": { "enabled": true, "head_sampling_rate": 0.05 },
47+ "observability": { "enabled": true, "head_sampling_rate": 0.05 }
4848 }
+5−5
1414 "binding": "DB",
1515 "database_name": "g1t-webhooks",
1616 "database_id": "7da97a7e-b4a7-40e3-a129-3b78d654e9bb",
17− "migrations_dir": "migrations",
18− },
17+ "migrations_dir": "migrations"
18+ }
1919 ],
2020 "services": [
2121 { "binding": "REPOS", "service": "g1t-repos" },
22− { "binding": "IDENTITY", "service": "g1t-identity" },
22+ { "binding": "IDENTITY", "service": "g1t-identity" }
2323 ],
2424 // Every event on the bus, to deliver to the webhooks that want it.
2525 "queues": {
26− "consumers": [{ "queue": "g1t-events-webhooks", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
26+ "consumers": [{ "queue": "g1t-events-webhooks", "max_batch_size": 20, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
2727 },
2828 // Every minute: retries. At 37 past each hour: deliveries older than a
2929 // fortnight forgotten (PURGE_CRON in src/lib.rs).
3131 // Secret: WEBHOOKS_KEY, 64 hex characters. Webhooks' signing secrets are
3232 // sealed with it; without it none can be made.
3333 // Logs of a tenth of requests: every event is a delivery to look up.
34− "observability": { "enabled": true, "head_sampling_rate": 0.1 },
34+ "observability": { "enabled": true, "head_sampling_rate": 0.1 }
3535 }
+5−5
1818 "binding": "DB",
1919 "database_name": "g1t-work",
2020 "database_id": "f35a9022-e36b-4547-b596-9ab9d5f1c47a",
21− "migrations_dir": "migrations",
22− },
21+ "migrations_dir": "migrations"
22+ }
2323 ],
2424 // Attachments' bytes (src/attachments.rs), in the namespace the
2525 // usercontent origin serves from (apps/web/workers/usercontent.ts),
3232 { "binding": "ACTIONS", "service": "g1t-actions" },
3333 // The workspace's AI provider, which names sessions from what they
3434 // did (src/coordination/titles.rs, integrations' `ai_brief`).
35− { "binding": "INTEGRATIONS", "service": "g1t-integrations" },
35+ { "binding": "INTEGRATIONS", "service": "g1t-integrations" }
3636 ],
3737 "queues": {
38− "consumers": [{ "queue": "g1t-events-work", "max_batch_size": 100, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }],
38+ "consumers": [{ "queue": "g1t-events-work", "max_batch_size": 100, "max_batch_timeout": 1, "max_retries": 3, "dead_letter_queue": "g1t-events-dlq" }]
3939 },
4040 // Logs of a quarter of requests: every work item and pull request page asks
4141 // it, so keeping every one costs more than it tells, and a quarter
4242 // still catches a rare error within hours. Repos, which it asks most,
4343 // logs its slow answers as fields (`answered_ms`, services/repos/src/lib.rs).
44− "observability": { "enabled": true, "head_sampling_rate": 0.25 },
44+ "observability": { "enabled": true, "head_sampling_rate": 0.25 }
4545 }

Comments

Sign in to comment.