Appearance
Tech Stack
Package Manager
- pnpm dengan workspace protocol (
workspace:*untuk internal packages). - pnpm workspace catalogs untuk shared dependency versions across packages.
Frontend (apps/web)
- SvelteKit 2.59.1 (latest) + Svelte 5.55.5 (latest) + Vite 6
- @sveltejs/adapter-cloudflare 7.2.8 (latest) — deploys to Cloudflare Workers/Pages hybrid
- Tailwind CSS 4 + shadcn-svelte
- TanStack Query 5 untuk Svelte (
@tanstack/svelte-query) untuk server state - SvelteKit routing untuk SPA routing
- oRPC Client (
@orpc/client+@orpc/openapi-client/fetch) untuk API calls
Backend (apps/api)
- oRPC 1.14.2 (latest stable) — type-safe RPC framework dengan OpenAPI generation
@orpc/server— server-side procedures dan middleware@orpc/contract— contract-first route definitions (zero server deps)@orpc/openapi— OpenAPI spec generation@orpc/openapi/fetch— fetch adapter untuk Cloudflare Workers@orpc/client+@orpc/openapi-client— typed client untuk frontend
- better-auth 1.6.9 (latest stable) — auth dengan Drizzle adapter
- Zod 4 — schema validation (v4, latest stable). Request/response schemas di-export dari route handler dan di-consume via
@apps/api/schemas. Date fields selalu pakaiz.coerce.date()untuk handle serialization wire. - Drizzle ORM — database access via
@packages/db - Pure Cloudflare Workers
fetchhandler (tidak pakai Hono atau HTTP framework tambahan)
Database
- Cloudflare D1 — SQLite-compatible edge database
- Drizzle ORM 0.45.2 (latest stable) + drizzle-kit 0.31.10 (latest stable) untuk schema dan migrations
Auth
- better-auth 1.6.9 plugins:
- Google OAuth
- Email / Password (dengan worker-friendly hasher)
- Magic Link / Email OTP
- Bearer —
Authorization: Bearer <token>header auth untuk non-browser clients - JWT —
/api/auth/tokendan/api/auth/jwksendpoints untuk JWT generation dan verification
- Password hashing: scrypt via
node:crypto.scrypt(dengannodejs_compatflag). Verified working di Workers — tidak perlu fallback. - Jangan pakai native bcrypt atau
@node-rs/argon2— requires native bindings yang gagal di Workers. - Role system:
student,teacher,admin,owner(stored dibetter-authuser table viaadditionalFields).
Email
- Resend untuk transactional emails (magic codes, notifications)
Storage
- Cloudflare R2 untuk photo evidence dan payment proof uploads
@packages/storagemenyediakan upload helpers dengan file type dan size validation
Telemetry
- @tigorhutasuhut/telemetry-js — OpenTelemetry SDK abstraction untuk tracing, metrics, dan structured logging.
- API (
apps/api): pakai subpath/cloudflaredenganinstrument()wrapper di entrypoint +@traced()decorator di service mixins +withQueryName()untuk DB query spans. - Web server (
apps/web): pakaitraceHandler()dihooks.server.tsuntuk trace tiap request SvelteKit. - Web browser: eager
instrumentFetch()dihooks.client.ts(patchglobalThis.fetchsebelum module lain capture reference) + lazyinitSDK()via dynamic import. - Logger:
getLogger()dari telemetry-js — structured logging dengan auto-attachmenttrace_iddanspan_id. Jangan pakaiconsole.log/console.errordi production code. - Semua runtime error pakai
AppErrordari@tigorhutasuhut/telemetry-js/error— menggantikanServiceErrorcustom.
Deployment
- Cloudflare Workers (apps/api, apps/web)
- Cloudflare Pages (apps/docs)
- wrangler CLI untuk local dev dan deploy
worker-configuration.d.tsgenerated bywrangler types(gitignored)
Code Quality
- Biome — single formatter dan linter untuk semua code
- lefthook — pre-commit hooks running
biome check --writeon staged files - turbo — monorepo task orchestration
Constraints
- NO native dependencies (no Rust, no node-gyp).
- Semua packages harus bisa run di Cloudflare Workers runtime (V8 isolates).
- Prefer Web APIs over Node.js APIs.
- Semua env vars diakses melalui
Envbinding atauenvdi Worker fetch context. - Workers (
apps/api,apps/web) support fullenvkeys diwrangler.jsonc; Pages (apps/docs) TIDAK supportenvkeys — env vars dashboard-managed.