docs: rebuild README, ROADMAP, CONTRIBUTING, banner as blueprint manual

Aligns the repo's docs with the new website aesthetic (cream + blueprint,
print-manual tone) without breaking site/build.js, which parses README +
ROADMAP + glossary into site/data.js.

assets/banner.svg
  Replaces the dark gradient + coral coral banner with a cream + blueprint
  reference-manual banner: VT323 wordmark, dotted-paper background, FIG_000
  caption, isometric stack diagram of the 20-phase curriculum, ASCII rule
  band along the bottom edge.

README.md (-640 lines)
  Drops the marketing intro: hype quote, "Why This Course?" comparison
  table, "AI-Native Learning" prose, "Built-in Skills" table, "Every
  Lesson Ships Something" four-card row, the colorful 20-phase pill nav,
  decorative emojis throughout headings, the per-lesson Type shield image
  (![Build](shields.io...) → plain "Build" / "Learn"), and the per-lesson
  Lang emoji flags (🐍 🟦 🦀 🟣 ⚛️ → plain "Python, TypeScript, Rust" — both
  forms are parser-equivalent in build.js).

  Adds a manual-style preface, terse "How each lesson is built" structural
  doc, monochrome blueprint-themed shields.io badges (license, lessons,
  phases, stars, web), and a contents anchor.

  Phase 0 heading switches from the shield-image form to the plain
  ### Phase 0: Setup & Tooling `12 lessons` form (build.js supports both).
  Phase 1-19 <details> headers drop their decorative emoji prefix
  (🟣 🔵 🟢 🟠 …) — build.js's <summary> regex makes the prefix optional.

  Verified: node site/build.js diff before/after shows identical phase
  count (20), lesson count (416), glossary terms (83), and identical
  PHASES content modulo Phase 0's description (emoji + asterisks dropped
  on purpose). All 416 lesson rows preserved with correct types/langs.

ROADMAP.md
  Lighter touch: keeps the  🚧 ⬚ status glyphs (parser-critical), adds
  a one-line note that build.js parses these glyphs and they must not
  change shape, slight cleanup of the legend separator.

CONTRIBUTING.md
  Adds a load-bearing section for new contributors: explains that README
  and ROADMAP feed site/build.js, lists the parser-critical patterns
  (phase header forms, lesson table column shape, status glyphs), and
  gives the validation command (run node site/build.js, git diff
  site/data.js should be timestamp-only). Replaces the "Thank you for
  wanting to make AI education better for everyone" opener with a more
  direct intro and adds a Style section that matches the manual's voice.

site/data.js
  Auto-regenerated by node site/build.js. Only field that changes is
  PHASES[0].desc (Phase 0 description, which we intentionally rewrote
  to drop the emoji + italics).
This commit is contained in:
Rohit Ghumare
2026-05-09 14:25:49 +01:00
parent be61ade843
commit 190d2823ab
5 changed files with 803 additions and 1043 deletions
+30 -2
View File
@@ -1,6 +1,26 @@
# Contributing to AI Engineering from Scratch
# Contributing
Thank you for wanting to make AI education better for everyone.
Lessons, translations, fixes, outputs — all welcome. One contribution per pull
request keeps reviews fast and lets contributor counts and credit work
correctly.
## Important: the README and ROADMAP feed the website
`site/build.js` parses `README.md`, `ROADMAP.md`, and `glossary/terms.md` to
generate `site/data.js`. Two patterns must stay intact in any pull request that
touches those files:
- Phase headers in either `### Phase N: Name \`X lessons\`` form or
`<details><summary><b>Phase N — Name</b> ... <code>X lessons</code> ... <em>Description</em></summary>` form.
- Lesson tables with the column shape `| # | Lesson | Type | Lang |` (or
`| # | Project | Combines | Lang |` for capstone tables). The `Lang` column
accepts plain text (`Python, TypeScript`) or the legacy emoji flags
(`🐍 🟦 🦀 🟣 ⚛️`); both are parser-equivalent.
- ROADMAP status glyphs (`✅`, `🚧`, `⬚`) on phase headers and lesson rows.
Do not replace them with text — the parser keys off the exact characters.
Run `node site/build.js` after editing those files; `git diff site/data.js`
should show only the timestamp change if your edit was structural-safe.
## Ways to Contribute
@@ -133,3 +153,11 @@ More exercises and projects are always welcome, especially ones that connect mul
## Code of Conduct
See [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md). Be kind, be helpful, be constructive.
## Style
- Direct prose. Cut filler. Match the manual's tone, not marketing copy.
- No decorative emojis in headings. Lang column emoji flags are the one
exception and only because the parser maps them.
- Code runs as-is with the dependencies listed in the lesson.
- Build from scratch first, framework second.
+675 -917
View File
File diff suppressed because it is too large Load Diff
+5 -3
View File
@@ -1,10 +1,12 @@
# Roadmap
Progress tracking for every phase and lesson.
Status tracker for every phase and lesson. The status glyphs in this file feed
the website (`site/build.js` parses them into `site/data.js`); do not change
their shape.
**Total estimated time: ~304 hours (at your own pace)**
Total estimated time: ~304 hours, at your own pace.
**Legend:** ✅ Complete | 🚧 In Progress | ⬚ Planned
**Legend:** ✅ Complete &nbsp;·&nbsp; 🚧 In Progress &nbsp;·&nbsp; ⬚ Planned
## Phase 0: Setup & Tooling — ✅ (~14 hours)
+91 -119
View File
@@ -1,132 +1,104 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="340" viewBox="0 0 1200 340">
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="360" viewBox="0 0 1200 360" role="img" aria-label="AI Engineering from Scratch — reference manual banner">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#191A23;stop-opacity:1" />
<stop offset="40%" style="stop-color:#1E1F2A;stop-opacity:1" />
<stop offset="100%" style="stop-color:#191A23;stop-opacity:1" />
</linearGradient>
<linearGradient id="coral" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#D97757;stop-opacity:1" />
<stop offset="100%" style="stop-color:#E08B6D;stop-opacity:1" />
</linearGradient>
<linearGradient id="coralFade" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#D97757;stop-opacity:0.15" />
<stop offset="100%" style="stop-color:#D97757;stop-opacity:0" />
</linearGradient>
<linearGradient id="nodeGlow" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#D97757;stop-opacity:0.6" />
<stop offset="100%" style="stop-color:#D97757;stop-opacity:0" />
</linearGradient>
<filter id="glow">
<feGaussianBlur stdDeviation="3" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<filter id="softGlow">
<feGaussianBlur stdDeviation="8" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<pattern id="paper" x="0" y="0" width="16" height="16" patternUnits="userSpaceOnUse">
<circle cx="0" cy="0" r="1" fill="#1a1a1a" fill-opacity="0.08"/>
</pattern>
<pattern id="paperRule" x="0" y="0" width="100" height="6" patternUnits="userSpaceOnUse">
<rect width="4" height="3" fill="#3553ff"/>
<rect x="8" y="3" width="6" height="3" fill="#3553ff" fill-opacity="0.35"/>
</pattern>
<style>
.face { fill: rgba(53, 83, 255, 0.06); }
.face-strong { fill: rgba(53, 83, 255, 0.18); }
.stroke-bp { stroke: #3553ff; fill: none; stroke-linejoin: miter; stroke-linecap: square; }
.mono { font-family: 'JetBrains Mono', ui-monospace, Consolas, monospace; }
.display { font-family: 'VT323', ui-monospace, monospace; font-weight: 400; }
.serif { font-family: 'Source Serif 4', Georgia, serif; }
</style>
</defs>
<rect width="1200" height="340" fill="url(#bg)"/>
<rect width="1200" height="360" fill="#fafaf5"/>
<rect width="1200" height="360" fill="url(#paper)"/>
<rect x="0" y="0" width="1200" height="340" fill="url(#coralFade)" opacity="0.3"/>
<g opacity="0.12">
<line x1="0" y1="68" x2="1200" y2="68" stroke="#32333F" stroke-width="0.5"/>
<line x1="0" y1="136" x2="1200" y2="136" stroke="#32333F" stroke-width="0.5"/>
<line x1="0" y1="204" x2="1200" y2="204" stroke="#32333F" stroke-width="0.5"/>
<line x1="0" y1="272" x2="1200" y2="272" stroke="#32333F" stroke-width="0.5"/>
<line x1="240" y1="0" x2="240" y2="340" stroke="#32333F" stroke-width="0.5"/>
<line x1="480" y1="0" x2="480" y2="340" stroke="#32333F" stroke-width="0.5"/>
<line x1="720" y1="0" x2="720" y2="340" stroke="#32333F" stroke-width="0.5"/>
<line x1="960" y1="0" x2="960" y2="340" stroke="#32333F" stroke-width="0.5"/>
<g class="mono" font-size="11" letter-spacing="2.4" fill="#3553ff">
<text x="48" y="44">FIG_000 — REFERENCE MANUAL V1.0</text>
</g>
<g class="mono" font-size="11" letter-spacing="2.4" fill="#7a7a78" text-anchor="end">
<text x="1152" y="44">© 2026 · OPEN SOURCE · MIT LICENSE</text>
</g>
<g opacity="0.25" filter="url(#softGlow)">
<line x1="60" y1="220" x2="140" y2="180" stroke="#D97757" stroke-width="1.2"/>
<line x1="140" y1="180" x2="200" y2="200" stroke="#D97757" stroke-width="1.2"/>
<line x1="200" y1="200" x2="260" y2="160" stroke="#D97757" stroke-width="1.2"/>
<line x1="260" y1="160" x2="340" y2="190" stroke="#D97757" stroke-width="1.2"/>
<circle cx="60" cy="220" r="3.5" fill="#D97757"/>
<circle cx="140" cy="180" r="4.5" fill="#D97757"/>
<circle cx="200" cy="200" r="3" fill="#E08B6D"/>
<circle cx="260" cy="160" r="5" fill="#D97757"/>
<circle cx="340" cy="190" r="3.5" fill="#E08B6D"/>
<g transform="translate(48, 96)">
<text class="display" x="0" y="80" font-size="96" letter-spacing="2" fill="#3553ff">AI ENGINEERING</text>
<text class="display" x="0" y="172" font-size="96" letter-spacing="2" fill="#1a1a1a">FROM SCRATCH.</text>
</g>
<g opacity="0.25" filter="url(#softGlow)">
<line x1="860" y1="190" x2="920" y2="155" stroke="#D97757" stroke-width="1.2"/>
<line x1="920" y1="155" x2="980" y2="175" stroke="#D97757" stroke-width="1.2"/>
<line x1="980" y1="175" x2="1050" y2="145" stroke="#D97757" stroke-width="1.2"/>
<line x1="1050" y1="145" x2="1130" y2="170" stroke="#D97757" stroke-width="1.2"/>
<circle cx="860" cy="190" r="4" fill="#E08B6D"/>
<circle cx="920" cy="155" r="3.5" fill="#D97757"/>
<circle cx="980" cy="175" r="5" fill="#D97757"/>
<circle cx="1050" cy="145" r="3" fill="#E08B6D"/>
<circle cx="1130" cy="170" r="4" fill="#D97757"/>
<g class="serif" font-size="16" fill="#1a1a1a">
<text x="48" y="296">A reference manual for people who want to design and build AI systems from first principles.</text>
</g>
<g class="mono" font-size="11" letter-spacing="2" fill="#7a7a78">
<text x="48" y="320">20 PHASES · 280+ LESSONS · PYTHON · TYPESCRIPT · RUST · JULIA</text>
</g>
<g opacity="0.15">
<line x1="140" y1="180" x2="920" y2="155" stroke="#D97757" stroke-width="0.5" stroke-dasharray="4,8"/>
<line x1="260" y1="160" x2="1050" y2="145" stroke="#D97757" stroke-width="0.5" stroke-dasharray="4,8"/>
<g transform="translate(820, 100)">
<g class="mono" font-size="9" letter-spacing="2" fill="#3553ff">
<text x="0" y="-8">FIG_000.A — CURRICULUM STACK</text>
</g>
<g transform="translate(56, 168)">
<polygon class="face-strong" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">AGENTS · SWARMS · PRODUCTION</text>
</g>
<g transform="translate(48, 142)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">LLMS · TRANSFORMERS · MULTIMODAL</text>
</g>
<g transform="translate(40, 116)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">VISION · SPEECH · NLP</text>
</g>
<g transform="translate(32, 90)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">DEEP LEARNING · RL</text>
</g>
<g transform="translate(24, 64)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">ML FUNDAMENTALS</text>
</g>
<g transform="translate(16, 38)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">MATH FOUNDATIONS</text>
</g>
<g transform="translate(8, 12)">
<polygon class="face" points="0,0 160,-46 280,-22 120,24"/>
<polygon class="stroke-bp" stroke-width="1.4" points="0,0 160,-46 280,-22 120,24"/>
<text class="mono" x="20" y="14" font-size="9" letter-spacing="1.6" fill="#3553ff">SETUP &amp; TOOLING</text>
</g>
<g class="stroke-bp" stroke-width="0.8" stroke-dasharray="3 3">
<line x1="312" y1="-12" x2="372" y2="-12"/>
<line x1="304" y1="14" x2="372" y2="14"/>
<line x1="296" y1="40" x2="372" y2="40"/>
<line x1="288" y1="66" x2="372" y2="66"/>
<line x1="280" y1="92" x2="372" y2="92"/>
<line x1="272" y1="118" x2="372" y2="118"/>
<line x1="264" y1="144" x2="372" y2="144"/>
</g>
<g class="mono" font-size="9" letter-spacing="2" fill="#7a7a78">
<text x="382" y="-9">PHASE 00</text>
<text x="382" y="17">PHASE 01</text>
<text x="382" y="43">PHASE 02 · 03 · 09</text>
<text x="382" y="69">PHASE 04 · 05 · 06</text>
<text x="382" y="95">PHASE 07 · 08 · 12</text>
<text x="382" y="121">PHASE 10 · 11 · 13</text>
<text x="382" y="147">PHASE 1419</text>
</g>
</g>
<g opacity="0.3">
<circle cx="90" cy="40" r="1.5" fill="#D97757"/>
<circle cx="250" cy="55" r="1" fill="#E08B6D"/>
<circle cx="420" cy="35" r="1.5" fill="#D97757"/>
<circle cx="580" cy="50" r="1" fill="#E08B6D"/>
<circle cx="780" cy="38" r="1.5" fill="#D97757"/>
<circle cx="950" cy="55" r="1" fill="#E08B6D"/>
<circle cx="1100" cy="42" r="1.5" fill="#D97757"/>
<circle cx="170" cy="305" r="1" fill="#E08B6D"/>
<circle cx="450" cy="315" r="1.5" fill="#D97757"/>
<circle cx="750" cy="308" r="1" fill="#E08B6D"/>
<circle cx="1020" cy="320" r="1.5" fill="#D97757"/>
</g>
<text x="600" y="95" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" font-size="52" font-weight="800" fill="#E8E6E3" text-anchor="middle" letter-spacing="-1.5">
AI Engineering
</text>
<text x="600" y="138" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" font-size="28" font-weight="300" fill="#908F8B" text-anchor="middle" letter-spacing="8">
FROM SCRATCH
</text>
<rect x="400" y="152" width="400" height="2.5" rx="1.25" fill="url(#coral)" opacity="0.7"/>
<text x="600" y="190" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" font-size="15" fill="#908F8B" text-anchor="middle" letter-spacing="1">
Learn it. Build it. Ship it for others.
</text>
<g>
<text x="600" y="228" font-family="'SF Mono', 'Fira Code', 'Cascadia Code', monospace" font-size="13" fill="#555460" text-anchor="middle" letter-spacing="0.5">
260+ lessons &#183; 20 phases &#183; 60 complete &#183; Math to Agent Swarms
</text>
</g>
<g transform="translate(365, 252)">
<rect x="0" y="0" width="82" height="28" rx="14" fill="rgba(217,119,87,0.1)" stroke="#D97757" stroke-width="1"/>
<text x="41" y="18" font-family="'SF Mono', 'Fira Code', monospace" font-size="11" fill="#D97757" text-anchor="middle">Python</text>
<rect x="96" y="0" width="106" height="28" rx="14" fill="rgba(217,119,87,0.06)" stroke="#908F8B" stroke-width="0.8"/>
<text x="149" y="18" font-family="'SF Mono', 'Fira Code', monospace" font-size="11" fill="#908F8B" text-anchor="middle">TypeScript</text>
<rect x="216" y="0" width="68" height="28" rx="14" fill="rgba(217,119,87,0.06)" stroke="#908F8B" stroke-width="0.8"/>
<text x="250" y="18" font-family="'SF Mono', 'Fira Code', monospace" font-size="11" fill="#908F8B" text-anchor="middle">Rust</text>
<rect x="298" y="0" width="68" height="28" rx="14" fill="rgba(217,119,87,0.06)" stroke="#908F8B" stroke-width="0.8"/>
<text x="332" y="18" font-family="'SF Mono', 'Fira Code', monospace" font-size="11" fill="#908F8B" text-anchor="middle">Julia</text>
</g>
<g opacity="0.08">
<text x="600" y="330" font-family="system-ui, sans-serif" font-size="10" fill="#E8E6E3" text-anchor="middle" letter-spacing="2">
OPEN SOURCE &#183; MIT LICENSE &#183; ROHITG00
</text>
</g>
<rect x="0" y="354" width="1200" height="6" fill="url(#paperRule)"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

+2 -2
View File
@@ -1,12 +1,12 @@
// Auto-generated by build.js — do not edit manually.
// Last built: 2026-05-08T11:17:38.687Z
// Last built: 2026-05-09T12:32:56.925Z
const PHASES = [
{
"id": 0,
"name": "Setup & Tooling",
"status": "complete",
"desc": "🛠️ *Get your environment ready for everything that follows.*",
"desc": "Get your environment ready for everything that follows.",
"lessons": [
{
"name": "Dev Environment",