Daeseon Yoo
Back to project
·Snapshot·3 min

Architecture overview — daseon.ai (this blog) as of 2026-05-31

Next.js 15 App Router site that reads MDX from GitHub Raw at runtime so commits go live in ~3-5s without waiting for the Vercel rebuild.

System shape

Author commits MDX
  → GitHub repo (source of truth: content/{posts,projects,logs,knowledge,notes,now}/**.mdx)
  → Two parallel paths:
 
  (a) Vercel webhook → next build → new deployment (~30-90s, background)
 
  (b) Live reader hits daseon.ai/<route>
      → Next.js Serverless Function (App Router page.tsx)
      → lib/source.ts: if GITHUB_TOKEN+GITHUB_REPO set,
        fetch raw.githubusercontent.com/<owner>/<repo>/<branch>/<path>
        with { next: { revalidate: 30 } }   ← ISR cache, 30s
      → lib/mdx.ts + lib/serialize-mdx.ts: gray-matter + next-mdx-remote
      → rendered HTML
 
Admin (auth-gated /admin/*):
  Browser → middleware.ts (jose-verified session cookie)
          → app/(admin)/admin/**: posts / projects / logs / site / analytics / distribution
          → app/api/admin/**: writes via Octokit → GitHub Contents API
          → revalidatePath() invalidates the relevant ISR key
          → next reader request sees fresh content in ~3-5s

Key libs / modules

Why these choices

Boundaries

State of completion

Public read path (posts, projects, logs, wiki, notes, now, bilingual EN/KO, RSS) is shipped and live on daseon.ai. Admin CRUD covers posts, projects, log companions, and site config; auth and middleware are wired. Log-system v1 (Revisions A/B/C/D) is mid-rollout — the spec, hook, and propagation scripts exist; the architecture-overview fan-out (this entry is part of it) and kind: decision/discussion/learning-gap writer flows are still being filled in.