Full-Stack Basics
Building a web UI for AI tools. This week you'll learn to create interactive front-end interfaces for the AI models you've already built — turning Python scripts into real applications that users can interact with in a browser.
Daily Lessons
Five days of structured lessons that take you from zero web development knowledge to deploying a full-stack AI application.
HTML & CSS for AI Developers
Learning Objectives
- Understand the structure of an HTML document (DOCTYPE, head, body)
- Use semantic HTML tags (header, main, section, article, footer)
- Style layouts with CSS Flexbox and Grid
- Create responsive designs with media queries
- Build a static landing page for an AI education tool
Activities
- ▸Guided walkthrough: Build a 'Study Buddy' landing page from scratch
- ▸Pair exercise: Style a quiz results page with CSS Grid
- ▸Mini-challenge: Make your page fully responsive (mobile, tablet, desktop)
- ▸Reflection: How does UI design impact learning tool effectiveness?
JavaScript Essentials & DOM Manipulation
Learning Objectives
- Write JavaScript functions, variables, and control flow
- Manipulate the DOM to update page content dynamically
- Handle user events (click, submit, input)
- Use fetch() to call external APIs
- Understand async/await for handling API responses
Activities
- ▸Live coding: Build an interactive flashcard component
- ▸Exercise: Create a 'word of the day' feature that fetches from an API
- ▸Lab: Add form validation to the Study Buddy signup page
- ▸Discussion: How JavaScript interactivity enhances learning experiences
React Crash Course
Learning Objectives
- Understand component-based architecture
- Build functional components with JSX syntax
- Manage state with useState and side effects with useEffect
- Pass data between components via props
- Handle forms and user input in React
Activities
- ▸Workshop: Convert the static landing page into React components
- ▸Exercise: Build a reusable 'QuestionCard' component with props
- ▸Lab: Create a multi-step quiz form with React state management
- ▸Code review: Peer review each other's component architecture
Next.js & API Routes
Learning Objectives
- Set up a Next.js project with the App Router
- Create pages and navigate between them with file-based routing
- Build API routes to serve as a backend for your AI tools
- Connect your React frontend to your Python AI backend via API routes
- Use environment variables securely for API keys
Activities
- ▸Guided setup: Initialize a Next.js project and deploy structure
- ▸Lab: Build an API route that calls your AI quiz generator (from Week 8)
- ▸Exercise: Create a 'Chat with AI Tutor' page that streams responses
- ▸Workshop: Connecting Python APIs to Next.js using fetch and route handlers
Deployment & Full-Stack Integration
Learning Objectives
- Deploy a Next.js application to Vercel
- Configure environment variables in production
- Connect a database (PostgreSQL) for persistent storage
- Test your deployed application end-to-end
- Set up a custom domain and SSL
Activities
- ▸Deployment lab: Push your AI tool to Vercel and verify it works
- ▸Exercise: Add a PostgreSQL database to store quiz results
- ▸Demo day: Present your deployed full-stack AI tool to the cohort
- ▸Retrospective: What did you learn? What would you improve?
Week 9 Project: AI Tool Dashboard
Build a full-stack web dashboard that lets users interact with multiple AI education tools you've built throughout the bootcamp.
Project Brief
Create an "AI Education Toolkit" dashboard — a Next.js application that provides a unified web interface for at least two AI tools you've previously built. Users should be able to navigate between tools, submit prompts, see AI-generated results, and optionally save their session history to a database. The goal is to demonstrate your ability to build a full-stack application that connects a modern frontend to AI-powered backends.
Requirements
Grading Rubric
| Criteria | Excellent (A) | Good (B) | Needs Work (C) |
|---|---|---|---|
| UI/UX Design (25%) | Polished, responsive, intuitive navigation, consistent styling | Clean layout, mostly responsive, minor inconsistencies | Basic layout, not responsive, inconsistent styling |
| AI Integration (25%) | 2+ tools work seamlessly, streaming responses, smart error handling | 2 tools work, basic error handling, some UX friction | 1 tool works, no error handling, poor integration |
| Code Quality (25%) | Clean components, TypeScript, good naming, reusable patterns | Reasonable structure, some redundancy, mostly clear code | Messy code, large components, poor naming conventions |
| Deployment (25%) | Live on Vercel, env vars configured, DB connected, README complete | Deployed but minor issues, basic README | Not deployed or broken in production |
Stretch Goals
- ★Add user authentication (NextAuth.js) so users can save their sessions
- ★Implement dark/light mode toggle with system preference detection
- ★Add a 'History' page that stores and displays previous AI interactions
- ★Use streaming responses for a real-time chat-like experience
Key Concepts
Quick reference for the core concepts covered this week.
Component Architecture
Break your UI into small, reusable pieces. Each component should do one thing well. Pass data down via props, and manage local state with useState. Think of components like teaching units — self-contained but composable.
API Routes
Next.js API routes let you build a backend inside your frontend project. Create a file in app/api/ and export handler functions. Use these to securely call AI APIs without exposing keys to the browser.
Responsive Design
Use Tailwind's responsive prefixes (sm:, md:, lg:) to create layouts that adapt to any screen size. Start with mobile-first design, then add complexity for larger screens.
Environment Variables
Store sensitive data (API keys, database URLs) in .env.local files. Access them with process.env.KEY_NAME in server-side code. Prefix with NEXT_PUBLIC_ only for client-side access.
Code Snippets
import { NextRequest, NextResponse } from "next/server";
export async function POST(req: NextRequest) {
const { prompt, tool } = await req.json();
// Validate input
if (!prompt || !tool) {
return NextResponse.json(
{ error: "Missing prompt or tool selection" },
{ status: 400 }
);
}
// Call your AI backend
const response = await fetch(process.env.AI_API_URL!, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.AI_API_KEY}`,
},
body: JSON.stringify({ prompt, tool }),
});
const data = await response.json();
return NextResponse.json(data);
}"use client";
interface ToolCardProps {
title: string;
description: string;
icon: React.ReactNode;
href: string;
}
export default function ToolCard({
title, description, icon, href
}: ToolCardProps) {
return (
<a
href={href}
className="block p-6 rounded-xl border border-gray-200
hover:border-teal-400 hover:shadow-lg
transition-all duration-200 group"
>
<div className="w-10 h-10 rounded-lg bg-teal-50
flex items-center justify-center mb-4
group-hover:bg-teal-100 transition-colors">
{icon}
</div>
<h3 className="font-bold text-gray-900 mb-1">{title}</h3>
<p className="text-sm text-gray-500">{description}</p>
</a>
);
}