ภาพรวมสถาปัตยกรรม · Architecture overview
NVX Stack Builder เป็นแอป Next.js 16.4 (App Router, React 19.3, TypeScript, Tailwind v4) ที่ เกือบทั้งหมดทำงานฝั่ง client มี endpoint ฝั่งเซิร์ฟเวอร์เพียงตัวเดียวคือ /api/plan และ deploy เป็น Cloudflare Worker ผ่าน OpenNext adapter (@opennextjs/cloudflare) ตั้งแต่ v0.3.0
หลักการออกแบบ#
- Data-driven เทมเพลตเป็นข้อมูล การประกอบคำสั่งเป็นฟังก์ชันบริสุทธิ์ (pure function) ทดสอบได้โดยไม่ต้องมีเบราว์เซอร์
- Client-first, stateless server การประกอบคำสั่ง สร้างสคริปต์ zip และลิงก์แชร์ทำในเบราว์เซอร์ เซิร์ฟเวอร์ไม่มีฐานข้อมูล ไม่มี session ไม่มีบัญชีผู้ใช้
- Text-only commands ไม่มีการรันคำสั่งที่ใดเลย (ดู safety-model)
- Graceful degradation AI ล้มเหลวเมื่อไร ใช้ rule-based planner แทนเสมอ; rate-limit binding ใช้ไม่ได้ ใช้ in-memory แทน
- Prerendered pages ทุกหน้า prerender ตอน build (
cacheComponents: true) Worker จึงเสิร์ฟ static assets เป็นหลัก
แผนภาพระบบ#
Mermaid source
flowchart LR
subgraph Browser["เบราว์เซอร์ (client)"]
UI["Pages & components<br/>src/app, src/components"]
Builder["Builder state<br/>BuilderConfig + BuilderEdits"]
Composer["composer.ts<br/>placeholders.ts"]
Scripts["scripts.ts / download.ts<br/>setup.sh, setup.ps1, zip"]
Share["share.ts<br/>#s= token"]
LS[("localStorage<br/>nvx-builder-state, nvx-lang, nvx-theme")]
end
subgraph Worker["Cloudflare Worker: nvx-stack-builder"]
Assets["ASSETS binding<br/>prerendered HTML/JS/CSS"]
API["/api/plan route.ts"]
RL["Rate limit bindings<br/>NVX_PLAN_LIMITER / NVX_PLAN_AI_LIMITER"]
Fallback["fallback.ts (rule-based)"]
end
OpenAI[("OpenAI Responses API")]
Data["src/data/templates<br/>(bundled into client + server)"]
UI --> Builder --> Composer --> Scripts
Builder <--> Share
Builder <--> LS
Data --> Composer
UI -- "GET pages" --> Assets
UI -- "POST /api/plan" --> API
API --> RL
API -- "Structured Outputs" --> OpenAI
API --> Fallback
Data --> API
Subsystems#
| Subsystem | ไฟล์หลัก | หน้าเอกสาร |
|---|---|---|
| Templates data | src/data/templates/*, src/data/*-steps.ts, src/data/template-ids.ts |
templates-and-composer.md |
| Composer + placeholders | src/lib/composer.ts, src/lib/placeholders.ts, src/lib/types.ts |
templates-and-composer.md |
| Script generators + downloads | src/lib/scripts.ts, src/lib/download.ts, scripts/export-template.ts |
scripts-and-share.md |
| Share encoding | src/lib/share.ts |
scripts-and-share.md |
| Sanitizer | src/lib/sanitize.ts |
safety-model |
| AI route + planner + validation | src/app/api/plan/route.ts, src/lib/ai/* |
ai-planner.md |
| Rate limiting, env, HTTP limits, security headers | src/lib/server/*, src/lib/rate-limit.ts, src/lib/security-headers.ts, next.config.ts, public/_headers |
api-hardening.md |
| UI framework | src/app/tokens.css, src/app/globals.css, src/components/ui/*, src/components/brand/* |
ui-framework.md |
| Cloudflare / OpenNext runtime | wrangler.jsonc, open-next.config.ts, scripts/patch-opennext.mjs, cloudflare-env.d.ts |
cloudflare-runtime.md |
| Chat data model (D1, schema only) | migrations/*.sql, binding DB |
chat-data-model.md |
เส้นทาง (routes)#
| Route | ประเภท | หมายเหตุ |
|---|---|---|
/ |
prerendered | หน้าแรก hero + how it works + เทมเพลต + features |
/templates |
prerendered | catalog (ค้นหา/กรองฝั่ง client) |
/templates/[id] |
prerendered ต่อ id | id ไม่รู้จัก → rewrite ไป /__nvx_not_found เพื่อ HTTP 404 จริง |
/builder |
shell prerendered, builder render ฝั่ง client | อ่าน URL hash + localStorage จึงต้องเป็น client-only (builder-loader.tsx) |
/design |
prerendered | style guide |
GET /api/plan |
dynamic | { serverKeyConfigured, model } |
POST /api/plan |
dynamic | สร้าง AgentPlan |
ดูเพิ่ม#
Source: docs/architecture/overview.md · /docs/architecture/overview.md