Case StudyJune 2026 · 12 min read

How First Break AI Turned a Static Site Into a Fully Agentic AI Course

Most “AI-powered” courses bolt a chatbot onto a platform rewrite. First Break AI took the opposite path: keep the site static, add a logic layer on top. The cohort is a free, open program built with Quarto and Cloudflare Pages — with AI agents that answer from the syllabus, check homework, and track progress. This case study covers how FBA built it and what survived production.

What First Break AI needed — and how they got it

Each row maps to a requirement from §1.

What was neededHow FBA solved it
Met: Keep the course site static and fastQuarto + Cloudflare Pages — no LMS or app rewrite
Met: Answer questions from the syllabusAsk Anything widget on every lesson page
Met: Check homework with real pass/failAutomated rubrics in the CLI and server — not chat guesses
Met: Remember the learner everywhereDiscord login syncs browser, terminal, and IDE

1. The constraint: static content, dynamic learning

The checklist above is the short version; below is the full constraint breakdown.

When First Break AI started, the requirements were clear:

  • Real course site: lessons, blog, roadmap, office hours, docs
  • Fast pages, clean URLs, forkable in Git
  • No traditional LMS, no Next.js curriculum rewrite, no server rendering on every request

Quarto was the obvious choice. Write .qmd files, run quarto render, deploy static HTML to Cloudflare Pages. Learners get speed, SEO-friendly text, and a repo they can clone.

Static sites have a gap, though. They do not remember who you are. They cannot check homework. They cannot tell you what to do next. A generic chatbot answers from the open web — not from yoursyllabus, and not with tools that validate a learner's repo or sync progress across browser, terminal, and IDE.

The question First Break AI asked: what if the site stayed static, and AI agents became the dynamic layer?

That is how First Break AI became a fully agentic cohort — agents answer in context, validate against rubrics, track progress, and show up inside the IDE. The HTML is still plain Quarto output. The learning experience is not.

ConcernStatic layer (Quarto)Agentic layer (FetchLens + Worker)
Lesson deliveryPre-rendered HTML
Q&A grounded in syllabusask tool + widget
Step validationCLI rubrics + validate tool
Progress trackingD1 + Discord OAuth
IDE integrationRemote + local MCP
SEO / crawlabilityFull HTML, JSON-LDDeferred widget script

2. Two-layer architecture

Think of two layers that share a brain but not a codebase.

Content layer (boring on purpose). Quarto builds the site. Cloudflare Pages serves it. Opening the roadmap or a lesson serves pre-rendered HTML. No JavaScript required to read a lesson. Google gets real text. Forks get real files.

Agentic layer (beside the content, not inside it). A Cloudflare Worker hosts the MCP server. FetchLens.ai powers the on-site “Ask Anything” widget and observability. The npm package @aiedx/firstbreakai provides CLI commands and a local MCP server. Discord OAuth ties identity together — one learner record across site, terminal, and widget.

Nothing in the agentic layer replaces Quarto. First Break AI added connective tissue: HTTP endpoints, scripts, and tools so static pages could talk to agents that do things.

┌──────────────────────────────────────────────────────────────┐
│  LEARNER SURFACES                                            │
│  Browser (Quarto pages)  │  Terminal (CLI)  │  IDE (MCP)     │
└────────────┬─────────────┴────────┬─────────┴────────┬───────┘
             │                      │                  │
             ▼                      ▼                  ▼
┌──────────────────────────────────────────────────────────────┐
│  AGENTIC LAYER — Cloudflare Worker + FetchLens               │
│  MCP: ask · do · find · validate · next · profile            │
│  Widget endpoint · Discord OAuth · D1 progress               │
└────────────┬─────────────────────────────────────────────────┘
             │ ingests / syncs
             ▼
┌──────────────────────────────────────────────────────────────┐
│  CONTENT LAYER — Quarto → docs/ → Cloudflare Pages           │
│  cohort.bubblnet.com (static HTML, JSON-LD, sitemap)         │
└──────────────────────────────────────────────────────────────┘

Learner flow

  1. Read a lesson — static HTML, fast.
  2. Ask a question — FetchLens widget → Worker → answer from cohort knowledge.
  3. Finish an exercise — firstbreakai validate 1 runs local rubric checks; results sync if logged in.
  4. Work in Cursor — remote MCP URL exposes the same tools as the widget and CLI.

Same brain, many surfaces. The site stays static. The agents are shared infrastructure.

3. The logic layer: what First Break AI built

In FetchLens MCP lifecycle research, the analysis shows that 52% of MCP servers die because they ship protocol plumbing without a logic layer. First Break AI is the production proof: infrastructure was ~40% of effort; the logic layer was ~60% and 100% of what makes the cohort usable.

Build scale (for MCP builders): the full agentic stack — Cloudflare Worker, cohort site integration, CLI, and content corpus — took about ~6 weeks full-time and ~6,800 lines across those layers (not logic-layer-only). Most effort went to content curation, tool orchestration, and validation rubrics — not MCP protocol plumbing.

Commoditized (solved by Cloudflare, Discord, npm)

MCP protocol / JSON-RPC transportWorker hosting + D1 databaseOAuth (Discord)Static deploy (Pages)npm package distribution

Logic layer (what FBA built — orchestration, rubrics, content)

Content ingestion + sync from Quarto siteTool orchestration (6 intent-shaped tools sharing state)Validation rubrics (deterministic CLI + server-side checks)Progressive state machine (next after validate)LLM prompt templates grounded in syllabusSide-effect wiring (progress, profile, session)Usage analytics via FetchLensEmbeddable widget surface
ComponentWhat it doesWhy it is logic, not plumbing
Content curationScrape/structure cohort pages for LLM consumptionDozens of iteration cycles on chunking and freshness
ask / findIntent-shaped Q&A and lesson discoveryPrompt templates + retrieval tied to syllabus
validateRubric pass/fail per roadmap stepDeterministic checks + LLM judge at temperature 0
nextDrive cohort flow after do or validateState machine across tools and D1
profileLearner context when authenticatedSession merge across widget, CLI, IDE
WidgetDeferred script on every Quarto pageZero impact on static delivery; async agent load
CLI (@aiedx/firstbreakai)Local env checks + offline validationSame MCP tools without network dependency

This case study expands section 5 of Why 52% of MCP Servers Die Within 90 Days.

Is your static site ready for AI agents?

FetchLens scans your origin for AI readability — broken redirects, JS-only content, schema gaps — before you wire an MCP server on top.

4. Surfaces: widget, MCP, CLI

Ask Anything on every page

The lightest entry point is the widget. After Quarto renders, a deferred script mounts a floating “Ask Anything” button:

<script src="/public/scripts/fba-lens-widget.js" defer
  data-endpoint="https://fba-mcp.throbbing-thunder-4d33.workers.dev/widget/mcp"
  data-button-label="Ask Anything"></script>

Static delivery unchanged. Agent loads asynchronously. If the script fails, the lesson still works.

MCP in the IDE

The Worker exposes a public MCP server over HTTP. One URL in Cursor, Claude Desktop, Claude Code, or Codex — cohort tools available where learners already work. See the Model Context Protocol for the transport standard:

{
  "mcpServers": {
    "fba-cohort": {
      "url": "https://fba-mcp.throbbing-thunder-4d33.workers.dev/mcp"
    }
  }
}

Remote MCP: https://fba-mcp.throbbing-thunder-4d33.workers.dev/mcp
Local MCP (via npm): npx @aiedx/firstbreakai mcp

CLI that validates for real

Some checks should not be left to LLM judgment. Step 1 asks learners to ship a Quarto blog on GitHub. Did they create _quarto.yml? Is there a .qmd? Is the Git remote GitHub? Those are filesystem facts — encoded in rubrics:

npm install -g @aiedx/firstbreakai
firstbreakai doctor       # Git, Python, Quarto, HuggingFace CLI
firstbreakai validate 1   # rubric checks for Step 1
firstbreakai status       # roadmap position
firstbreakai mcp          # local MCP for IDE

AI agents handle open-ended Q&A. Rubrics handle pass/fail. That split keeps validation honest.

MCP tools exposed everywhere

ToolIntent
askAnswer from cohort knowledge
doPerform a cohort action
findLocate lessons and resources
validateCheck work against rubric
nextSuggest next step in flow
profileLearner context (authenticated)

Always call next after do or validate to drive the cohort flow.

5. Identity without an app server

Static sites do not have sessions. First Break AI did not add a Node backend for login. Discord OAuth runs on the Worker: navbar “Log in” → authenticate → token in localStorage → widget and CLI share identity. Progress lives in D1 behind the Worker.

The Quarto repo builds the same HTML for everyone. Auth is an overlay. Curriculum stays open and forkable; personalization is optional, not a paywall.

6. What First Break AI deliberately avoided

  • No React/Next rewrite of the cohort — Quarto stays the content machine
  • No generic ChatGPT iframe labeled “AI-powered”
  • No login wall on lessons — materials are public; Discord is for community and progress
  • No “smart static site” — First Break AI made agents smart and pointed them at static content

This mirrors the anti-patterns that kill MCP servers: shipping a transport layer and calling it a product.

7. Production results

What held up

DimensionOutcome
PerformanceAgents load after content; LCP unaffected
SEOCrawlers get full HTML + Course/FAQ JSON-LD on cohort site
CostPages (static) + Worker + D1 — no always-on app server for lessons
Scale modelNew lesson = new .qmd; new capability = new tool or rubric
SurfacesWebsite widget, CLI, remote MCP, local MCP — one logic layer

Live links

Quarto is the content machine. AI agents are the learning machine. Together they behave more like a teaching assistant that scales than a video platform with a comment section. If you are building MCP infrastructure, the lesson is simple: keep your content layer boring, invest in the logic layer, and expose the same tools everywhere learners show up.

Building an MCP server that stays alive?

Track tool calls, content freshness, and error patterns with FetchLens — the lifecycle layer the 52% never built.

Free AI readiness scan

8. Frequently asked questions

Can you add AI agents to a static site without rebuilding it?

Yes. Serve content as static HTML (Quarto, Hugo, Jekyll, etc.) and add an agentic layer beside it — MCP server, widget script, CLI — that ingests content and exposes intent-shaped tools. First Break AI never converted .qmd files into React components.

What is a “fully agentic” course?

A course where AI agents — not just static pages — answer questions in syllabus context, validate work against rubrics, track progress, and run inside the learner's IDE via MCP. The cohort site stays static; agents are shared infrastructure.

How long did the logic layer take to build?

About ~6 weeks full-time for the full agentic stack (worker, CLI, site integration, and content). Roughly ~6,800 lines across those layers. Infrastructure (protocol, auth, database, deploy) was ~40% of effort; content curation, tool orchestration, and validation rubrics were ~60%. See §3 for the breakdown.

What MCP tools does First Break AI expose?

Six intent-shaped tools: ask, do, find, validate, next, and profile. They are available via the FetchLens widget, the remote Worker MCP URL, the @aiedx/firstbreakai CLI, and a local MCP server from the same npm package.

Why use CLI rubrics instead of asking the LLM “did I pass?”

Filesystem facts (config files, git remotes, directory structure) need deterministic checks. LLMs hallucinate pass/fail. Rubrics keep validation honest; agents handle ambiguity between steps.

How does FetchLens fit in?

FetchLens provides the widget surface, MCP observability, and the agentic backbone — tracking tool calls, content gaps, and usage patterns so the logic layer stays alive instead of becoming a dead endpoint. See the FetchLens docs and run a free AI readiness scan on your own site.

About this case study

This client case study documents the production deployment of FetchLens agentic infrastructure on First Break AI, built by AIEDX Private Limited. Headline stats reflect cohort requirements validated in production (Cohort 01, May–July 2026). Build estimates (~6 weeks, ~6,800 lines across worker + CLI + site + content) are internal engineering figures, not audited LOC. For ecosystem-wide MCP abandonment data, see Why 52% of MCP Servers Die Within 90 Days.