diff --git a/.gitignore b/.gitignore
index d63d7aa..c993760 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,5 +15,6 @@ deploy/.env
# IDE·OS
.idea/
.vscode/
+.claude/
*.iml
.DS_Store
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 0000000..0b10158
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,113 @@
+# DESIGN.md — 디자인 재료 사용법
+
+> **매번 찾지 말고 여기서 고르세요.** 색·글자·여백·아이콘이 전부 저장소 안에 들어 있습니다.
+> 앱을 켜고 **`/design`** 을 열면 이 문서의 내용을 눈으로 보고 클릭해서 복사할 수 있습니다.
+> 아이콘 이름 대응표는 [ICONS.md](./ICONS.md)에 있습니다.
+
+---
+
+## 1. 세 가지 재료가 어디 있나
+
+| 재료 | 어디 | 매번 받아야 하나 |
+|---|---|---|
+| **아이콘** 1,993개 | `lucide-react` (node_modules) | ❌ `npm install` 한 번으로 끝. 오프라인 동작 |
+| **폰트** Pretendard | `frontend/public/fonts/` | ❌ 저장소에 들어 있음. CDN 의존 없음 |
+| **색·여백·글자 토큰** | `frontend/src/styles/global.css` 의 `:root` | ❌ 이미 정의돼 있음 |
+
+셋 다 **이미 받아 놨습니다.** 새로 검색하거나 다운로드할 일은 없습니다. 고르기만 하세요.
+
+---
+
+## 2. 폰트 — 이름을 부른다고 폰트가 오지 않는다
+
+⚠️ **실제로 있었던 문제입니다.** CSS에 이렇게 적혀 있었습니다.
+
+```css
+font-family: "Pretendard", "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif;
+```
+
+그런데 Pretendard 파일을 **어디서도 받아오지 않았습니다.** `@font-face`도, CDN 링크도 없었습니다. 그래서 그 폰트가 따로 깔린 사람 외에는 전원 **맑은 고딕**으로 보고 있었습니다. 앱과 학습 문서 19개 전부요.
+
+> 학습 포인트: `font-family`는 **"이 순서대로 시도해 봐"라는 희망 목록**일 뿐입니다. 브라우저는 목록의 이름을 (1) 내 컴퓨터에 깔린 폰트와 (2) `@font-face`로 알려 준 웹폰트에서만 찾습니다. 둘 다 없으면 조용히 다음 후보로 넘어갑니다. **에러가 안 나기 때문에** 몇 달 동안 아무도 모를 수 있습니다. "될 것 같은데 왜 안 되지?"의 절반은 이런 조용한 실패입니다.
+
+지금은 이렇게 고쳤습니다.
+
+```css
+@font-face {
+ font-family: "Pretendard";
+ src: url("/fonts/PretendardStdVariable.woff2") format("woff2-variations");
+ font-weight: 45 920; /* 파일 하나가 모든 굵기를 담는다 (variable font) */
+ font-display: swap; /* 받는 동안 기본 글씨로 먼저 보여 준다 */
+}
+```
+
+**왜 이 선택인가**
+
+- **self-host** (CDN 아님) — 외부 서비스가 죽어도, 인터넷이 없어도 글씨가 안 깨집니다. 사내 학습 앱엔 이쪽이 맞습니다.
+- **variable font** — 굵기별 파일 9개 대신 파일 1개. 요청 수와 용량이 함께 줄어듭니다.
+- **Std 판(285KB)** — 상용 한글 2,350자 판입니다. 전체 한글 11,172자 판은 2MB로 7배입니다.
+ 이 앱이 쓰는 한글 **1,276자가 Std에 100% 들어 있는지 실제로 측정해서 확인**했습니다(폴백된 글자 0개).
+- **font-display: swap** — 폰트를 받는 동안 글자를 숨기면 흰 화면이 됩니다(FOIT). 기본 글씨로 먼저 보여 주고 나중에 바꿔 끼웁니다.
+
+---
+
+## 3. 토큰 — 값 대신 이름을 쓴다
+
+`global.css`의 `:root`에 정의돼 있습니다. **값을 직접 적지 마세요.**
+
+```css
+/* ❌ 이렇게 쓰면 */
+padding: 10px; color: #46536A; font-size: 13.5px;
+
+/* ✅ 이렇게 쓰세요 */
+padding: var(--space-3); color: var(--muted); font-size: var(--text-sm);
+```
+
+| 종류 | 토큰 | 쓰는 곳 |
+|---|---|---|
+| 색 | `--bg` `--card` `--ink` `--muted` `--line` `--primary` `--teal` `--amber` `--rose` … | 전부 |
+| 여백 | `--space-1`(4px) ~ `--space-7`(48px) | padding·margin·gap |
+| 글자 크기 | `--text-xs`(12) `--text-sm`(13) `--text-md`(15, 본문) `--text-lg` `--text-xl` `--text-2xl` | font-size |
+| 굵기 | `--weight-regular` `--weight-medium` `--weight-bold` `--weight-black` | font-weight |
+| 모서리 | `--radius-sm` `--radius` `--radius-lg` `--radius-full` | border-radius |
+
+**왜 이름을 쓰나 — 이유 두 개**
+
+1. **다크 모드가 공짜로 따라옵니다.** `--ink`는 밝은 모드에서 거의 검정, 어두운 모드에서 거의 흰색입니다. `#101A28`이라고 직접 박으면 다크 모드에서 검은 배경에 검은 글씨가 됩니다.
+2. **어긋남이 사라집니다.** 여백을 그때그때 10px, 14px, 6px로 찍으면 화면이 미묘하게 틀어집니다. 사람 눈은 그 차이를 "다름"이 아니라 "실수"로 읽습니다. 4의 배수 사다리만 밟으면 저절로 맞습니다.
+
+---
+
+## 4. 아이콘
+
+규약과 132개 대응표는 [ICONS.md](./ICONS.md)에 있습니다. 요약하면:
+
+```jsx
+import { Rocket } from 'lucide-react'; // 개별 import (통째로 import 금지)
+
+
+```
+
+- 굵기는 **항상 `strokeWidth={1.5}`** — 섞이면 통일감이 깨집니다.
+- 아이콘은 장식이므로 `aria-hidden="true"`. 글자 없이 아이콘만 쓸 땐 부모에 `aria-label`.
+- ⚠️ `lucide-react`는 아이콘 하나를 이름 3개로 내보냅니다(`Rocket`, `RocketIcon`, `LucideRocket`). 전부 세면 5,981개지만 **실제 아이콘은 1,993개**입니다. `/design`은 별칭을 걸러서 보여 줍니다.
+
+이름은 `/design`에서 검색해 클릭하면 import 구문째로 복사됩니다.
+
+---
+
+## 5. 비용은 얼마나 드나 — 재 봤습니다
+
+| | 크기 | 언제 받나 |
+|---|---|---|
+| 폰트 | 285 KB | 첫 방문 1회, 이후 캐시 |
+| 아이콘 132개 (앱에서 실제 사용) | gzip +14 KB | 첫 화면 번들에 포함 |
+| `/design` 페이지 | gzip 164 KB | **그 페이지에 들어갈 때만** (lazy) |
+
+`/design`은 아이콘 1,993개를 전부 훑어야 해서 무겁습니다. 그래서 `App.jsx`에서 `lazy()`로 분리했습니다. 덕분에 이 페이지를 추가하고도 **첫 화면 번들은 1.9KB만 늘었습니다.**
+
+> 학습 포인트: "무거운 기능을 넣으면 앱이 느려진다"는 **꼭 그렇지 않습니다.** 그 기능을 필요한 순간에만 내려받게 하면 됩니다. 무엇이 첫 화면에 실려야 하고 무엇이 나중에 와도 되는지를 나누는 것이 프론트엔드 성능 설계의 핵심입니다.
+
+---
+
+AWESOMEDEV · 디자인 재료 v1
diff --git a/ICONS.md b/ICONS.md
new file mode 100644
index 0000000..9c550e6
--- /dev/null
+++ b/ICONS.md
@@ -0,0 +1,219 @@
+# ICONS.md — 아이콘 규약과 대응표
+
+> 이 앱의 아이콘은 **Lucide**(SVG) 하나로 통일합니다. 이모지는 UI에 쓰지 않습니다.
+> 아이콘을 새로 넣거나 바꿀 때 이 문서를 먼저 읽으세요.
+> 색·글자·여백 등 나머지 재료는 [DESIGN.md](./DESIGN.md)에, 실물은 앱의 **`/design`** 에 있습니다.
+
+---
+
+## 1. 왜 이모지를 걷어냈나
+
+원래 강좌 카드마다 이모지(📜 💻 🌐 …)가 붙어 있었습니다. 편하지만 세 가지가 발목을 잡습니다.
+
+**① 기기마다 다른 그림이 나온다.** 이모지는 글꼴입니다. 윈도우·맥·안드로이드가 각자 다른 그림을 그려서, 내 화면에서 예쁜 게 남의 화면에선 아닐 수 있습니다. **우리가 통제할 수 없는 디자인**이라는 게 핵심 문제입니다.
+
+**② 굵기·크기·색을 못 맞춘다.** 어떤 이모지는 선이 두껍고 어떤 건 알록달록합니다. 12개를 한 화면에 모으면 통일감이 안 생깁니다. SVG 아이콘은 `size`·`strokeWidth`·`color`를 코드로 지시할 수 있어 132개가 한 세트처럼 보입니다.
+
+**③ 스크린리더가 엉뚱하게 읽는다.** 👤 하나만 있는 링크를 리더는 "bust in silhouette 링크"라고 읽습니다. (이 문제는 `App.jsx` 헤더에서 실제로 겪었습니다.)
+
+> 학습 포인트: "그냥 취향 문제 아닌가?"로 보이는 UI 결정에도 **통제 가능성·일관성·접근성**이라는 기술적 근거가 있습니다. 디자인 논쟁은 근거를 대는 쪽이 이깁니다.
+
+---
+
+## 2. 쓰는 법
+
+카탈로그는 아이콘을 **문자가 아니라 컴포넌트**로 들고 있습니다.
+
+```jsx
+// courseCatalog.jsx — 데이터
+import { ScrollText } from 'lucide-react';
+
+{ slug: 'history', Icon: ScrollText, title: '컴퓨터의 역사', /* … */ }
+```
+
+```jsx
+// LearnHubPage.jsx — 화면
+
+```
+
+지켜야 할 규칙 네 가지:
+
+| 규칙 | 이유 |
+|---|---|
+| 필드 이름은 `Icon` (대문자 I) | JSX는 **대문자로 시작하는 이름만** 컴포넌트로 취급합니다. 소문자는 `
` 같은 HTML 태그로 봅니다. |
+| `strokeWidth={1.5}` 고정 | 굵기가 섞이면 통일감이 깨집니다. 이 값이 우리 앱의 기본 굵기입니다. |
+| `aria-hidden="true"` 필수 | 아이콘은 장식입니다. 의미는 옆의 글자가 전달합니다. |
+| 글자 없이 아이콘만 쓸 땐 `aria-label` | 예: 헤더의 내 정보·비밀번호 버튼. 안 그러면 스크린리더가 읽을 게 없습니다. |
+
+**개별 import만 씁니다.** `import * as Icons from 'lucide-react'`처럼 통째로 가져오면 안 쓰는 아이콘까지 전부 번들에 실립니다. 지금처럼 이름을 하나씩 적으면 번들러가 쓰는 것만 남깁니다(트리셰이킹).
+
+새 아이콘은 에서 고르고, 파일 상단 import 목록에 **알파벳 순서**로 끼워 넣으세요.
+
+---
+
+## 3. 비용
+
+아이콘 132종을 넣고 번들이 얼마나 커졌는지 실제로 재 봤습니다.
+
+| | 변경 전 | 변경 후 | 차이 |
+|---|---|---|---|
+| index 청크 | 518.36 kB | 575.57 kB | +57.2 kB |
+| gzip 전송 크기 | 171.96 kB | 186.01 kB | **+14.0 kB** |
+
+> 학습 포인트: "라이브러리 넣으면 무거워진다"는 말은 **숫자로 확인하기 전까진 추측**입니다. 실제로 재 보면 아이콘 132개에 gzip 14KB — 사진 한 장보다 작습니다. 빌드 결과를 읽는 습관이 이런 판단을 가능하게 합니다.
+
+Lucide를 고른 이유: 아이콘 약 1,600종으로 우리가 필요한 개념(CPU·네트워크·DB·보안·디자인·앱)을 전부 덮고, 굵기가 한 종류라 섞어 써도 통일감이 유지됩니다.
+
+⚠️ 브랜드 로고(Figma 등)는 Lucide v1에서 제거됐습니다. 그래서 「피그마와 디자인 툴」은 로고 대신 도구의 성격을 나타내는 `PenTool`을 씁니다.
+
+---
+
+## 4. 전체 대응표 (132개)
+
+
+
+### 수습 트랙(83강좌 + 설치 가이드) — `frontend/src/courseCatalog.jsx`
+
+| 강좌 | 이전(이모지) | 이후(Lucide) | 아이콘 |
+|---|:---:|---|---|
+| 컴퓨터의 역사 | 📜 | `ScrollText` | scroll-text |
+| 컴퓨터의 구성 | 💻 | `Computer` | computer |
+| 2진수와 데이터 표현 | 🔢 | `Binary` | binary |
+| CPU 깊이 보기 | 🧠 | `Cpu` | cpu |
+| 메모리와 저장장치 깊이 보기 | 💾 | `HardDrive` | hard-drive |
+| 그래픽카드와 GPU의 세계 | 🎮 | `MemoryStick` | memory-stick |
+| 메인보드와 파워 깊이 보기 | 🔋 | `CircuitBoard` | circuit-board |
+| 데스크탑 조립하기 | 🔧 | `Wrench` | wrench |
+| 운영체제의 이해 | 🪟 | `AppWindow` | app-window |
+| 파일과 폴더의 원리 | 📁 | `Folder` | folder |
+| 노트북과 주변기기 고르기 | 🖥️ | `Laptop` | laptop |
+| 컴퓨터 문제 해결 | 🩺 | `Stethoscope` | stethoscope |
+| 네트워크의 이해 | 🌐 | `Globe` | globe |
+| 네트워크 속도와 대역폭 | 🚗 | `Gauge` | gauge |
+| IP 주소 깊이 보기 | 🔍 | `MapPin` | map-pin |
+| 공유기와 홈 네트워크 실전 | 📡 | `Router` | router |
+| DNS 깊이 보기 | 📖 | `BookMarked` | book-marked |
+| TCP와 UDP | 🤝 | `Handshake` | handshake |
+| HTTP와 HTTPS | 📨 | `ArrowRightLeft` | arrow-right-left |
+| 네트워크 명령어 실전 | 🧰 | `SquareTerminal` | square-terminal |
+| 무선 네트워크와 보안 | 🔐 | `Wifi` | wifi |
+| VPN과 프록시 | 🚇 | `Route` | route |
+| 방화벽과 보안 기초 | 🛡️ | `BrickWall` | brick-wall |
+| 클라우드 네트워크 입문 | ☁️ | `Cloud` | cloud |
+| 서버란 무엇인가 | 🏗️ | `Server` | server |
+| 리눅스 / 터미널 기초 | 🐧 | `Terminal` | terminal |
+| 리눅스 심화 | ⚙️ | `Settings2` | settings-2 |
+| 도커 입문 | 🐳 | `Container` | container |
+| 클라우드와 AWS 입문 | 🌩️ | `CloudLightning` | cloud-lightning |
+| SQL 입문 | 🗄️ | `Database` | database |
+| SQL 중급 | 📊 | `ChartColumn` | chart-column |
+| 데이터 모델링 기초 | 🗂️ | `Table` | table |
+| 캐시와 NoSQL 맛보기 | ⚡ | `Zap` | zap |
+| API의 이해 | 🔌 | `Plug` | plug |
+| CI/CD와 배포 자동화 입문 | 🔁 | `RotateCw` | rotate-cw |
+| 운영과 장애 대응 기초 | 🚨 | `Siren` | siren |
+| 코딩 기초 | ⌨️ | `Keyboard` | keyboard |
+| HTML / CSS 기초 | 🧱 | `FileCode` | file-code |
+| 자바스크립트 기초 | ⚡ | `Braces` | braces |
+| 자료구조 맛보기 | 🧺 | `Boxes` | boxes |
+| React 입문 | ⚛️ | `Atom` | atom |
+| Java 기초 | ☕ | `Coffee` | coffee |
+| Spring Boot 입문 | 🍃 | `Leaf` | leaf |
+| Git 깊이 보기 | 🌳 | `GitBranch` | git-branch |
+| 디버깅과 에러 읽는 법 | 🐞 | `Bug` | bug |
+| 테스트 코드 입문 | 🧪 | `FlaskConical` | flask-conical |
+| 클린 코드와 코드리뷰 | ✨ | `Sparkles` | sparkles |
+| AI 도구와 함께 코딩하기 | 🤖 | `Bot` | bot |
+| UI/UX 기초 | 🎨 | `Palette` | palette |
+| 색 이론 기초 | 🌈 | `SwatchBook` | swatch-book |
+| 타이포그래피 | 🔤 | `Type` | type |
+| 레이아웃과 그리드 | 📐 | `LayoutGrid` | layout-grid |
+| 아이콘과 이미지 | 🖼️ | `Image` | image |
+| 와이어프레임 기초 | ✏️ | `PencilRuler` | pencil-ruler |
+| 피그마와 디자인 툴 | 🖌️ | `PenTool` | pen-tool |
+| 디자인 시스템 입문 | 🧩 | `Component` | component |
+| 모바일 디자인 | 📱 | `Smartphone` | smartphone |
+| 사용자 리서치 기초 | 🔬 | `Microscope` | microscope |
+| 레퍼런스와 무드보드 | 🗃️ | `Images` | images |
+| 포트폴리오 만들기 | 💼 | `Briefcase` | briefcase |
+| 개발 환경 설치 가이드 | 🛠️ | `Wrench` | wrench |
+| 윈도우 단축키 마스터 | ⌨️ | `Command` | command |
+| 윈도우 터미널과 PowerShell | 🖤 | `SquareChevronRight` | square-chevron-right |
+| VS Code 200% 활용 | 📝 | `Code` | code |
+| IntelliJ 꿀팁 모음 | 💡 | `Lightbulb` | lightbulb |
+| 크롬 개발자도구 | 🔎 | `Inspect` | inspect |
+| Gitea 200% 활용 | 🍵 | `GitFork` | git-fork |
+| Docker Desktop 사용법 | 🐳 | `Ship` | ship |
+| DBeaver로 DB 들여다보기 | 🦫 | `DatabaseZap` | database-zap |
+| Postman으로 API 테스트 | 🚀 | `Send` | send |
+| 캡처와 화면 녹화 | 📸 | `Camera` | camera |
+| 노션으로 기록하기 | 🗒️ | `NotebookPen` | notebook-pen |
+| 앱의 지형 | 📱 | `LayoutTemplate` | layout-template |
+| 안드로이드 앱의 구조 | 🤖 | `TabletSmartphone` | tablet-smartphone |
+| Kotlin 입문 | 🟣 | `Blocks` | blocks |
+| iOS 앱의 구조 | 🍎 | `SquareDashedBottomCode` | square-dashed-bottom-code |
+| Swift 입문 | 🐦 | `Bird` | bird |
+| React Native | ⚛️ | `Orbit` | orbit |
+| Flutter | 🦋 | `Feather` | feather |
+| 앱 화면과 이동 | 🧭 | `Compass` | compass |
+| 앱의 상태와 데이터 | 🗃️ | `Layers` | layers |
+| PWA — 웹앱을 앱처럼 | 🌐 | `MonitorSmartphone` | monitor-smartphone |
+| 앱 보안과 권한 | 🔐 | `ShieldCheck` | shield-check |
+| 스토어 배포 | 🚀 | `Rocket` | rocket |
+
+### 수준별 과정(초급~특급 48강좌) — `frontend/src/levelCatalog.jsx`
+
+| 강좌 | 이전(이모지) | 이후(Lucide) | 아이콘 |
+|---|:---:|---|---|
+| 프로그램이란 무엇일까? | 💡 | `Lightbulb` | lightbulb |
+| 컴퓨터처럼 생각하기: 컴퓨팅 사고 | 🧩 | `Puzzle` | puzzle |
+| 나의 첫 웹페이지: HTML 첫걸음 | 🌐 | `Globe` | globe |
+| 태그로 페이지에 살 붙이기 | 🏗️ | `Blocks` | blocks |
+| 브라우저는 내 코드를 어떻게 읽을까 | 🔍 | `Search` | search |
+| 나의 첫 JavaScript | ✨ | `Sparkles` | sparkles |
+| 변수와 자료형: 이름 붙인 상자 | 📦 | `Package` | package |
+| 조건문: 컴퓨터가 판단하게 하기 | 🚦 | `GitBranch` | git-branch |
+| 반복문: 지루한 일은 컴퓨터에게 | 🔁 | `Repeat` | repeat |
+| 함수: 나만의 명령어 만들기 | 🧰 | `SquareFunction` | square-function |
+| 에러와 친해지기: 빨간 글씨 해독법 | 🩹 | `Bandage` | bandage |
+| 첫 프로젝트: 숫자 맞히기 게임 만들기 | 🚀 | `Rocket` | rocket |
+| 비동기 JavaScript: fetch와 Promise 정복 | ⏳ | `Hourglass` | hourglass |
+| 배열 메서드로 데이터 요리하기 | 🔪 | `ChefHat` | chef-hat |
+| REST API 설계: 주소와 동사의 문법 | 📐 | `Ruler` | ruler |
+| Express로 CRUD API 만들기 | 🛠️ | `Hammer` | hammer |
+| DB 연동과 트랜잭션: 데이터가 사는 집 | 🗄️ | `Database` | database |
+| 로그인 구현: 세션과 비밀번호 해시 | 🔐 | `KeyRound` | key-round |
+| React 상태와 이펙트 실전 | ⚛️ | `Atom` | atom |
+| React Router로 멀티 페이지 SPA | 🧭 | `Compass` | compass |
+| 폼 검증: 사용자를 돕고 서버를 지키기 | ✅ | `CircleCheck` | circle-check |
+| 에러 처리 패턴: 무너지지 않는 서비스 | 🚨 | `TriangleAlert` | triangle-alert |
+| 테스트 작성 실전: 자신 있게 고치는 힘 | 🧪 | `FlaskConical` | flask-conical |
+| 미니 프로젝트: 설계부터 배포까지 | 🚀 | `Rocket` | rocket |
+| 레이어드 아키텍처와 관심사 분리 | 🏛️ | `Layers` | layers |
+| 디자인 패턴 실전 | 🧩 | `Puzzle` | puzzle |
+| DB 인덱스와 실행계획 읽기 | 🔍 | `ListTree` | list-tree |
+| 트랜잭션과 격리 수준 | 🔒 | `Lock` | lock |
+| N+1과 쿼리 최적화 | 🐢 | `Turtle` | turtle |
+| 캐싱 전략 — 로컬과 Redis | ⚡ | `Zap` | zap |
+| 성능 측정과 프로파일링 | 📈 | `TrendingUp` | trending-up |
+| 웹 보안 심화 — OWASP Top 10 | 🛡️ | `Shield` | shield |
+| 인증 아키텍처 — 세션 vs JWT vs OAuth | 🔑 | `Fingerprint` | fingerprint |
+| 로깅·모니터링·알림 설계 | 🔭 | `Telescope` | telescope |
+| 무중단 배포와 롤백 | 🚦 | `Milestone` | milestone |
+| 코드 리뷰와 리팩터링 전략 | 🧭 | `GitPullRequest` | git-pull-request |
+| 분산 시스템 첫걸음 — 왜 서버 한 대로는 안 될까 | 🌐 | `Network` | network |
+| 메시지 큐와 이벤트 드리븐 — 시스템을 느슨하게 잇는 법 | 📨 | `Inbox` | inbox |
+| 모놀리스 vs 마이크로서비스 — 쪼개는 것의 진짜 비용 | 🧩 | `Boxes` | boxes |
+| DB 레플리케이션과 샤딩 — 데이터베이스를 늘리는 두 가지 축 | 🗄️ | `DatabaseBackup` | database-backup |
+| 대용량 트래픽 설계 — 밀려오는 요청 앞에서 무너지지 않기 | 🚦 | `Gauge` | gauge |
+| 쿠버네티스와 클라우드 네이티브 — 선언하면 알아서 굴러가는 인프라 | ☸️ | `Hexagon` | hexagon |
+| 관측성 — 보이지 않으면 고칠 수 없다 | 🔭 | `Activity` | activity |
+| SRE와 장애 대응 — 무너져도 빨리 일어나는 팀 | 🚨 | `Siren` | siren |
+| 시스템 설계 훈련 1 — URL 단축기를 처음부터 끝까지 | 🔗 | `Link` | link |
+| 시스템 설계 훈련 2 — 실시간 채팅 시스템 | 💬 | `MessageSquare` | message-square |
+| 시스템 설계 훈련 3 — 뉴스피드와 타임라인 | 📰 | `Newspaper` | newspaper |
+| 기술 리더십과 ADR — 결정을 설계하고 기록하는 사람 | 🧭 | `Signpost` | signpost |
+
+---
+
+AWESOMEDEV · 아이콘 규약 v1 (Lucide 기준)
diff --git a/README.md b/README.md
index d327cc1..45c90b6 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@
> 미림마이스터고 수습생 4명이 직접 보고, 배우고, 고치는 학습용 웹 앱입니다.
> 처음에는 문서를 읽는 곳이지만, 5주차부터는 여러분이 직접 기능을 붙이고 버그를 고치는 실전 연습장이 됩니다.
> 코드를 읽는 법이 궁금하면 [STUDY.md](./STUDY.md)부터 열어 보세요.
+> 화면을 만들 일이 생기면 [DESIGN.md](./DESIGN.md)(색·글자·여백·폰트)와 [ICONS.md](./ICONS.md)(아이콘)를 먼저 보세요.
+> 앱에서 `/design`을 열면 재료를 눈으로 보고 클릭해서 복사할 수 있습니다.
## 무엇을 하는 앱인가?
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 214df58..9f07275 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.1.0",
"dependencies": {
"axios": "^1.7.9",
+ "lucide-react": "^1.25.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.1.0",
@@ -3405,6 +3406,15 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.25.0.tgz",
+ "integrity": "sha512-/mdJTRbiwcLOQ1NZZK1amZF9rIZyvO18D6r9TngE6TG1NmqHgFuT4eE7Xrkm9UsXMbBJD1NlfwHVltCDWHrOTw==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/lz-string": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 435fa48..d8486d4 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,6 +14,7 @@
},
"dependencies": {
"axios": "^1.7.9",
+ "lucide-react": "^1.25.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.1.0",
diff --git a/frontend/public/docs/capstone-demoday.html b/frontend/public/docs/capstone-demoday.html
index d1648e8..3e7ca90 100644
--- a/frontend/public/docs/capstone-demoday.html
+++ b/frontend/public/docs/capstone-demoday.html
@@ -5,6 +5,14 @@
캡스톤 & 데모데이 · AWESOMEDEV