스택

런타임
Cloudflare Workers (V8 isolate, edge)
언어
Rust 2024 → cdylib → wasm32-unknown-unknown
HTTP
workers-rs 0.8 (Router)
템플릿
maud 0.27 (컴파일타임 매크로, 자동 escape)
클라
HTMX 2.0.6 + ext-preload + idiomorph (CDN, ~16KB)
DB
D1 (edge SQLite, prepared statement, RETURNING, batch)
스타일
vanilla CSS — @layer, light-dark(), color-mix(), container queries, Open Props 토큰

패턴

렌더링
SSR (서버가 HTML 응답)
인터랙션
Hypermedia (HTML fragment 응답 → DOM swap)
상태 위치
서버 (D1) — 클라 store 없음
OOB swap
응답에 다중 fragment — 카운트 뱃지 동기 갱신
다크모드
color-scheme: light dark + light-dark()
페이지 이동
hx-boost + hover preload (인위 지연 0)
페이지네이션
keyset cursor (WHERE id < ?) + HTMX hx-trigger="revealed once" 무한 스크롤
edge cache
Cloudflare KV (overview/notes/tags/activity, TTL 60s, mutation invalidation)
에러 알림
htmx:responseError → toast (우하단 슬라이드)

보안 헤더

CSP
default-src 'self' + CDN 한정 허용
X-Frame
frame-ancestors 'none' (클릭재킹 방지)
nosniff
MIME sniffing 차단
입력 검증
길이 제한 + chars().count() 한글 정확 측정
XSS
maud 자동 escape
SQL injection
prepared statement (D1 binding)
SRI
unpkg CDN 자산에 sha384 integrity