# IoT Standards Lab Landing Page — Final Project Analysis > Workspace: `/home/godopu16/PuKi/lab/landing_page/refer_landing_page` > Project: `iot-standards-lab-landing` v0.1.0 (private) > Produced as the synthesis deliverable for kanban task `t_d70b2c9e`. > Sources: `.kanban-inventory.json` (t_5662ba34), `.kanban-stack-profile.md` (t_239791d2), `.kanban-semantic-analysis.md` (t_a62d94ab). --- ## 1. What this project is This repo is a **reference prototype landing page** for the **경북대학교 컴퓨터학부 사물인터넷 표준 연구실 (KNU CS IoT Standards Lab)** — a small, self-contained marketing site (not a deployed product) intended to be cloned and filled in with the lab's real content. It is structured as a single-page-family academic portal: a hero/intro route, plus four content routes (lectures, members, publications, standardization), all wrapped in a hand-rolled editorial design system dubbed **"Issue 01"** — a magazine-spread aesthetic with serif/sans pairing, grain backgrounds, scroll-reveal motion, and running marquee tickers. All listed people, papers, and standards contributions are *placeholders* to be swapped for real data; the deliverable is the *layout, design system, and motion language*, not the content. Roughly **2,605 LOC across 25 source files**; small enough to read end-to-end in an afternoon. --- ## 2. Tech stack | Layer | Pin | Notes | |---|---|---| | Framework | `next@14.2.5` (exact) | App Router; `reactStrictMode: true`; no image domains / redirects / experimental flags | | Language | TypeScript 5.5 (installed 5.9.3) | `strict: true`, `moduleResolution: "bundler"`, path alias `@/*` | | UI runtime | `react@18.3.1` + `react-dom@18.3.1` | React 18, not 19 — locked to Next 14 line | | Styling | `tailwindcss@3.4.6` + `postcss@8.4` + `autoprefixer@10.4` | Custom theme in `tailwind.config.ts` (114 lines) | | Lint | `eslint@8.57` + `eslint-config-next@14.2.5` (exact, matches Next) | No `.eslintrc*`, no Prettier | | Fonts | `next/font` (Google Serif + Sans exposed as CSS vars) | No external font loader dep | | Package manager | npm 10.9.7, lockfile v3 | Single `package-lock.json` (215 KB); no pnpm/yarn/bun | | Runtime | Node 22.22.2 (host) | No `engines` field declared | **Scripts (4, the entire quality-gate surface):** `npm run dev` · `npm run build` · `npm start` · `npm run lint`. **Not present:** no Docker, no `.env`/env vars, no CI, no test runner, no formatter, no UI lib (no shadcn/Radix/MUI), no icon set, no analytics, no CMS client, no image CDN, no motion library (motion is hand-rolled via `IntersectionObserver` + CSS). **Security posture:** `npm audit` reports **8 advisories, 1 critical, 6 high, 1 moderate**. 21 of those resolve by a single-line patch — `npm install next@14.2.35` (same major, fixes cache poisoning, Server Components DoS, middleware SSRF, PostCSS XSS, etc.). Transitive `glob` and `minimatch` advisories are dev-time only and not runtime risks for this app. --- ## 3. Architecture and structure ### Tree (top-level) ``` /home/godopu16/PuKi/lab/landing_page/refer_landing_page ├── app/ ← Next.js App Router entrypoint │ ├── layout.tsx ← Root layout: Header + Footer + font vars │ ├── globals.css ← CSS vars, grain bg, reveal transitions │ ├── intro/ ← / (root landing) │ │ ├── page.tsx ← 287 lines, uses HeroComposition │ │ └── _components/ │ │ └── HeroComposition.tsx ← private inline-SVG cover graphic │ ├── lectures/page.tsx ← /lectures 102 lines │ ├── members/page.tsx ← /members 174 lines │ ├── publications/page.tsx ← /publications 168 lines │ └── standardization/page.tsx ← /standardization 169 lines ├── components/ ← 7 shared, reusable components │ ├── Header.tsx ← nav + mobile menu │ ├── Footer.tsx ← address/email + Marquee colophon │ ├── PageHeader.tsx ← dual-language route banner │ ├── SectionLabel.tsx ← "01 / 05" corner labels │ ├── Counter.tsx ← tick-up figure animation │ ├── Marquee.tsx ← endless running ticker │ └── Reveal.tsx ← IntersectionObserver scroll reveal ├── docs/DESIGN.md ← 332 lines — design system spec ├── PROMPT.md ← 249 lines — original generation brief ├── README.md ← 104 lines — project overview ├── package.json / package-lock.json (215 KB) ├── tsconfig.json (22) / next.config.js (6) / next-env.d.ts ├── tailwind.config.ts (114) ← canonical design tokens ├── postcss.config.js (6) ├── .gitignore (27) └── .kanban-*.{json,md} ← upstream task artifacts (not project content) ``` ### Routing map (Next.js App Router) | Path | File | Lines | Notes | |---|---|---|---| | `/` | `app/intro/page.tsx` | 287 | Embeds static `thrusts`, `figures`, `keywords`, `focusAreas` arrays | | `/lectures` | `app/lectures/page.tsx` | 102 | Course list | | `/members` | `app/members/page.tsx` | 174 | PI + PhD + MS + UG groupings | | `/publications` | `app/publications/page.tsx` | 168 | Journals + Conferences | | `/standardization` | `app/standardization/page.tsx` | 169 | oneM2M, W3C, IETF, OMA groups | ### Shared component fan-out | Component | Used in (routes / other components) | Public prop shape | |---|---|---| | `Header` | `app/layout.tsx` | `{}` | | `Footer` | `app/layout.tsx` | `{}` | | `Counter` | intro, members, publications, standardization | `{ value, duration?, prefix?, suffix?, className? }` | | `Marquee` | intro, publications, standardization, **Footer** | `{ items: string[], reverse?, className? }` | | `PageHeader` | lectures, members, publications, standardization | `{ ko, en, display?, description?, index }` | | `Reveal` | intro, lectures, members, publications, standardization, **PageHeader** | `{ children, variant?: 'up'\|'left'\|'right'\|'scale', delay?, as?, className? }` | | `SectionLabel` | intro, lectures, members, publications, standardization, **PageHeader** | `{ index, total?, label, className? }` | 5 of the 7 (71%) shared components carry JSDoc blocks; `Header` and `Footer` do not. ### Module responsibilities (one-line summary) - `app/` — routing, metadata, global shell; **page-level orchestration only**, no business logic. - `app/intro/_components/` — private assets scoped to one route (`HeroComposition` SVG). - `components/` — presentation primitives, prop-driven, zero business logic. - `docs/DESIGN.md` — canonical design-token spec (the "Issue 01" system). - `tailwind.config.ts` — machine-readable counterpart to `docs/DESIGN.md`; treat it as the source of truth at the build layer. --- ## 4. Strengths and risks ### Strengths 1. **Internally consistent stack.** Next 14.2.5, React 18.3, Tailwind 3.4, TS 5.5, ESLint 8 + `eslint-config-next` pinned to Next's exact version. No mixed majors, no version skew between `next` and `eslint-config-next`. The dep tree is the smallest viable Next 14 surface — `package-lock.json` is only 215 KB, no obvious bloat. 2. **Strict TypeScript hygiene.** Zero `any` types, zero non-null (`!`) assertions, correct `key` props on every loop. `tsconfig.json` is the canonical strict-mode setup (`strict`, `noEmit`, `incremental`, `isolatedModules`, `moduleResolution: "bundler"`). 3. **Design system is well-documented and decoupled from data.** `docs/DESIGN.md` (332 lines) + `tailwind.config.ts` (114 lines) are the canonical design sources; component JSDoc blocks (5/7) call out "CUSTOMIZATION HOOK — CONTENT/MOTION" seams. A non-developer touching content can find the right file via the README's customization hooks section. 4. **No external runtime dependencies beyond Next itself.** No motion lib, no icon set, no UI kit, no analytics, no CMS. Reveal motion uses a hand-rolled `IntersectionObserver`; counter uses `requestAnimationFrame` only. The runtime is small and inspectable. 5. **A11y-aware motion.** `Reveal` respects `prefers-reduced-motion`; semantic HTML throughout (no `