fix(tiles): configure R2 CDN base URL build argument and CORS rules #121

Merged
yuris merged 1 commit from feat/r2-cdn-cors-tiles into main 2026-10-15 06:27:36 +00:00
Owner

Executed playbook: skill://poteto-mode/playbooks/feature.md

Principles applied

  • principle-model-the-domain: Modeled Cloudflare R2 bucket CORS specifications (R2_CORS_RULES) and Anycast CDN routing rules explicitly within typed S3 SDK invocation scripts and configuration documentation.
  • principle-boundary-discipline: Sanitized environment variable configuration and protocol prefixes at the edge of src/lib/gis/tile-url.ts, ensuring robust fallback in production environments when env vars are missing while preserving local offline pmtiles:///tiles/... paths.
  • principle-subtract-before-you-add: Reused existing @aws-sdk/client-s3 dependency without pulling in additional heavy tooling or complex multi-bucket orchestrators.
  • principle-prove-it-works: Verified edge URL resolution under production, development, custom base URL, and CDN_URL scenarios with 12 unit tests in src/lib/gis/__tests__/tile-url.test.ts.
  • principle-test-behavior-not-implementation: Asserted exact observable output URLs for multiple vector tile archives (indonesia, khg, peat_soil, concessions) across offline and remote modes.

Impact

For the consumer: Resolves production 404 tile errors by injecting NEXT_PUBLIC_TILES_BASE_URL at container build time and providing production fallback to https://tiles.gambut.nokopia.com/tiles.
For the maintainer: Clear operational documentation (docs/CDN_CONFIGURATION.md) and automated script (scripts/set-r2-cors.mjs) for applying CORS and byte-range caching rules.

Verification

  • pnpm test: 33 test files, 251 passing tests (tile-url.test.ts passed 12/12).
  • pnpm exec tsc --noEmit: 0 TypeScript compiler errors.
  • pnpm exec vp check: 0 formatting or linting errors across 290 files.

Closes #120
Closes #38

Executed playbook: `skill://poteto-mode/playbooks/feature.md` ### Principles applied - principle-model-the-domain: Modeled Cloudflare R2 bucket CORS specifications (`R2_CORS_RULES`) and Anycast CDN routing rules explicitly within typed S3 SDK invocation scripts and configuration documentation. - principle-boundary-discipline: Sanitized environment variable configuration and protocol prefixes at the edge of `src/lib/gis/tile-url.ts`, ensuring robust fallback in production environments when env vars are missing while preserving local offline `pmtiles:///tiles/...` paths. - principle-subtract-before-you-add: Reused existing `@aws-sdk/client-s3` dependency without pulling in additional heavy tooling or complex multi-bucket orchestrators. - principle-prove-it-works: Verified edge URL resolution under production, development, custom base URL, and CDN_URL scenarios with 12 unit tests in `src/lib/gis/__tests__/tile-url.test.ts`. - principle-test-behavior-not-implementation: Asserted exact observable output URLs for multiple vector tile archives (`indonesia`, `khg`, `peat_soil`, `concessions`) across offline and remote modes. ### Impact For the consumer: Resolves production 404 tile errors by injecting `NEXT_PUBLIC_TILES_BASE_URL` at container build time and providing production fallback to `https://tiles.gambut.nokopia.com/tiles`. For the maintainer: Clear operational documentation (`docs/CDN_CONFIGURATION.md`) and automated script (`scripts/set-r2-cors.mjs`) for applying CORS and byte-range caching rules. ### Verification - `pnpm test`: 33 test files, 251 passing tests (`tile-url.test.ts` passed 12/12). - `pnpm exec tsc --noEmit`: 0 TypeScript compiler errors. - `pnpm exec vp check`: 0 formatting or linting errors across 290 files. Closes #120 Closes #38
fix(tiles): configure R2 CDN base URL build argument and CORS rules
All checks were successful
CI / Verify Quality & Build (pull_request) Successful in 1m50s
a7496601df
yuris-bot approved these changes 2026-10-15 06:27:22 +00:00
yuris-bot left a comment

Code Review & Ponytail Audit Summary: Configure R2 CDN Base URL Build Argument and CORS Rules

1. Mechanical Verification Gate (scripts/verify-pr.mjs)

  • Passed all checks: title conventional commit format (fix(tiles): configure R2 CDN base URL build argument and CORS rules), mandatory principles citations, impact framing, and anti-overengineering file path filters.

2. Ponytail Audit (Zero Bespoke Bloat)

  • Pipeline & CDN Architecture: Simple, minimal injection of NEXT_PUBLIC_TILES_BASE_URL into Dockerfile build stage and Forgejo Actions deploy workflow. Clean production fallback in src/lib/gis/tile-url.ts to prevent 404s when loading gitignored large vector tiles.
  • CORS Config: Self-contained operational script scripts/set-r2-cors.mjs reusing existing @aws-sdk/client-s3 dependency without introducing wrapper abstractions.
  • Audit verdict: Lean already. Ship.

3. Subsystem Boundary & Discipline

  • Confined to backend GIS routing, deployment workflows, and container configurations (.forgejo/workflows/deploy.yml, Dockerfile, docs/CDN_CONFIGURATION.md, scripts/set-r2-cors.mjs, src/lib/gis/tile-url.ts). Zero frontend UI component modifications.

4. Verification & Test Proofs

  • vp check: Passed 100% (290 files formatted, 0 warnings/lint errors in 126 files).
  • pnpm test: All 251 tests passed across 33 test suites (12/12 in tile-url.test.ts).
  • next build: Next.js Turbopack production build succeeded cleanly.
  • Forgejo CI: CI / Verify Quality & Build (pull_request) passed.

5. Acceptance Criteria

  • Verified and checked off all acceptance criteria checkboxes on linked Issue #120 and Issue #38.

Decision: APPROVED for squash merge into main.

### Code Review & Ponytail Audit Summary: Configure R2 CDN Base URL Build Argument and CORS Rules #### 1. Mechanical Verification Gate (`scripts/verify-pr.mjs`) - Passed all checks: title conventional commit format (`fix(tiles): configure R2 CDN base URL build argument and CORS rules`), mandatory principles citations, impact framing, and anti-overengineering file path filters. #### 2. Ponytail Audit (Zero Bespoke Bloat) - **Pipeline & CDN Architecture**: Simple, minimal injection of `NEXT_PUBLIC_TILES_BASE_URL` into Dockerfile build stage and Forgejo Actions deploy workflow. Clean production fallback in `src/lib/gis/tile-url.ts` to prevent 404s when loading gitignored large vector tiles. - **CORS Config**: Self-contained operational script `scripts/set-r2-cors.mjs` reusing existing `@aws-sdk/client-s3` dependency without introducing wrapper abstractions. - **Audit verdict**: `Lean already. Ship.` #### 3. Subsystem Boundary & Discipline - Confined to backend GIS routing, deployment workflows, and container configurations (`.forgejo/workflows/deploy.yml`, `Dockerfile`, `docs/CDN_CONFIGURATION.md`, `scripts/set-r2-cors.mjs`, `src/lib/gis/tile-url.ts`). Zero frontend UI component modifications. #### 4. Verification & Test Proofs - `vp check`: Passed 100% (290 files formatted, 0 warnings/lint errors in 126 files). - `pnpm test`: All 251 tests passed across 33 test suites (12/12 in `tile-url.test.ts`). - `next build`: Next.js Turbopack production build succeeded cleanly. - Forgejo CI: `CI / Verify Quality & Build (pull_request)` passed. #### 5. Acceptance Criteria - Verified and checked off all acceptance criteria checkboxes on linked Issue #120 and Issue #38. **Decision**: APPROVED for squash merge into `main`.
yuris merged commit a236281527 into main 2026-10-15 06:27:36 +00:00
yuris deleted branch feat/r2-cdn-cors-tiles 2026-10-15 06:27:36 +00:00
Sign in to join this conversation.
No reviewers
No labels
backend
frontend
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
yuris/titik-gambut-next!121
No description provided.