Matt Pocock (AI hero) – Build Deep Search in TypeScript
About Course
This is a cohort-based course and the lessons will start unlocking on July 14th, 2025.
Building AI applications that are genuinely useful involves more than just hitting an LLM API and getting back stock chat responses.
The difference between a proof-of-concept and a production application lies in the details.
Generic chat responses might work for demos, but professional applications need appropriate outputs that align with specific requirements.
In a professional environment code is (ideally) tested, metrics are collected, analytics are displayed somewhere.
AI development can follow these established patterns.
You will hit roadblocks when trying to:
- Implement essential backend infrastructure (databases, caching, auth) specifically for AI-driven applications.
- Debug and understand the “black box” of AI agent decisions, especially when multiple tools are involved.
- Ensure chat persistence, reliable routing, and real-time UI updates for a seamless user experience.
- Objectively measure AI performance moving beyond subjective “vibe checks” for improvements.
- Manage complex agent logic without creating brittle, monolithic prompts that are hard to maintain and optimize.
In this course you will build out a “DeepSearch” AI application from the ground up to help you understand and implement these patterns and ensure a production-ready product.
What Will I Learn?
-
Understand the key differences between proof-of-concept AI apps and production-ready AI applications.
-
Implement backend infrastructure tailored for AI-driven apps, including databases, caching, and authentication.
-
Debug and interpret AI agent decision-making, even when using multiple tools.
-
Build reliable chat persistence, routing, and real-time UI updates for a smooth user experience.
-
Measure AI performance with objective metrics instead of relying on subjective impressions.
-
Manage complex AI agent logic without creating brittle, hard-to-maintain prompts.
-
Develop a fully functional “DeepSearch” AI application from scratch, following professional development patterns.
Target Audience
-
Developers who want to move from AI prototypes to scalable, production-ready applications.
-
Engineers and tech leads looking to integrate AI into real-world products with reliability and performance tracking.
-
Backend and frontend developers who want to understand AI-specific infrastructure needs.
-
Product managers or technical founders aiming to create polished AI tools beyond generic chatbots.
Requirements / Instructions
-
Basic programming skills (JavaScript, Python, or similar).
-
Understanding of web application development fundamentals.
-
Willingness to work with both frontend and backend technologies.
-
Interest in debugging and improving AI systems beyond surface-level outputs.
-
Commitment to follow the course schedule as lessons unlock starting July 14th, 2025.
Course Content
Topic 1: Matt Pocock AIhero – Build DeepSearch in TypeScript
-
Lesson 1: What Are We Building
02:10 -
Lesson 2: Installation Instructions Dont Skip This
03:19 -
Lesson 3: Cursor Tips
00:23 -
Lesson 4: Explore The Repo Problem
02:00 -
Lesson 5: Explore The Repo Solution
02:59 -
Lesson 6: Setting Up Postgres
02:01 -
Lesson 7: Using Drizzle And Drizzle Studio
02:00 -
Lesson 8: Setting Up Redis
02:00 -
Lesson 9: Faqs
02:00 -
Lesson 10: Introduction
02:00 -
Lesson 11: Choose An Llm Problem
02:00 -
Lesson 12: Choose An Llm Solution
02:00 -
Lesson 13: Our First Model Call Problem
02:00 -
Lesson 14: Our First Model Call Solution
02:00 -
Lesson 15: Set Up Discord Authentication Problem
02:00 -
Lesson 16: Set Up Discord Authentication Solution
02:00 -
Lesson 17: Create A Naive Agent With Serper Problem
02:12 -
Lesson 18: Create A Naive Agent With Serper Solution
02:00 -
Lesson 19: Showing Tool Calls In The Frontend Problem
02:29 -
Lesson 20: Showing Tool Calls In The Frontend Solution
02:00 -
Lesson 21: Search Grounding Optional Problem
02:00 -
Lesson 22: Search Grounding Optional Solution
02:01 -
Lesson 23: Rate Limiting Optional Problem
02:00 -
Lesson 24: Rate Limiting Optional Solution
02:00 -
Lesson 25: Connecting Our App To Mcp Servers Optional
02:00 -
Lesson 26: Create Database Resources For Persisting Messages Problem
02:03 -
Lesson 27: Create Database Resources For Persisting Messages Solution
02:00 -
Lesson 28: Persist Chats To The Database Problem
02:20 -
Lesson 29: Persist Chats To The Database Solution
02:00 -
Lesson 30: Creating New Chats In The Frontend Problem
02:00 -
Lesson 31: Creating New Chats In The Frontend Solution
02:00 -
Lesson 32: Showing The Saved Chats In The Frontend Problem
02:00 -
Lesson 33: Showing The Saved Chats In The Frontend Solution
02:00 -
Lesson 34: Fixing The New Chat Button Optional Problem
02:00 -
Lesson 35: Fixing The New Chat Button Optional Solution
02:00 -
Lesson 36: Adding Use Scroll To Bottom Optional Problem
02:00 -
Lesson 37: Adding Use Scroll To Bottom Optional Solution
02:00 -
Lesson 38: Choosing An Observability Platform
02:26 -
Lesson 39: Integrating Langfuse Problem
02:00 -
Lesson 40: Integrating Langfuse Solution
02:00 -
Lesson 41: Passing Extra Metadata To Langfuse Problem
02:00 -
Lesson 42: Passing Extra Metadata To Langfuse Solution
02:00 -
Lesson 43: Adding A Scraper Problem
02:23 -
Lesson 44: Adding A Scraper Solution
02:06 -
Lesson 45: Making The Llm Date Aware Optional Problem
02:00 -
Lesson 46: Making The Llm Date Aware Optional Solution
02:00 -
Lesson 47: Improving Our Crawler Optional
02:44 -
Lesson 48: Reporting Db Calls To Langfuse Optional Problem
02:00 -
Lesson 49: Reporting Db Calls To Langfuse Optional Solution
02:00 -
Lesson 50: Initializing Evalite Problem
02:04 -
Lesson 51: Initializing Evalite Solution
02:00 -
Lesson 52: Choosing Our Success Criteria
04:09 -
Lesson 53: Making Our System Testable Problem
02:00 -
Lesson 54: Making Our System Testable Solution
02:00 -
Lesson 55: Our First Deterministic Eval Problem
02:00 -
Lesson 56: Our First Deterministic Eval Solution
02:00 -
Lesson 57: Adding A Global Rate Limiter Optional Problem
02:00 -
Lesson 58: Adding A Global Rate Limiter Optional Solution
02:09 -
Lesson 59: The Data Flywheel
02:42 -
Lesson 60: Our First Llm As A Judge Eval Problem
02:59 -
Lesson 61: Our First Llm As A Judge Eval Solution
02:00 -
Lesson 62: Create A Simple Dataset Problem
03:20 -
Lesson 63: Create A Simple Dataset Solution
04:08 -
Lesson 64: Organizing Our Dataset Into Dev Ci And Regression Optional Problem
02:00 -
Lesson 65: Organizing Our Dataset Into Dev Ci And Regression Optional Solution
02:00 -
Lesson 66: Assessing Answer Relevancy Optional Problem
02:00 -
Lesson 67: Assessing Answer Relevancy Optional Solution
02:00 -
Lesson 68: Extracting The Parameters Of Our System Optional Problem
02:00 -
Lesson 69: Extracting The Parameters Of Our System Optional Solution
02:00 -
Lesson 70: What S Wrong With Our Current Approach
02:00 -
Lesson 71: Designing Our New System Prompt Problem
02:00 -
Lesson 72: 1 Designing Our New System Prompt Problem
02:00 -
Lesson 73: Designing Our New System Prompt Solution
02:00 -
Lesson 74: Creating A Next Action Picker Problem
02:00 -
Lesson 75: Creating A Next Action Picker Solution
02:00 -
Lesson 76: Implementing The Loop Solution
02:00 -
Lesson 77: Connecting Our Loop To The Frontend Problem
02:00 -
Lesson 78: Connecting Our Loop To The Frontend Solution
02:00 -
Lesson 79: Smoothing Our Streaming Optional Problem
02:00 -
Lesson 80: Smoothing Our Streaming Optional Solution
02:00 -
Lesson 81: Showing The Steps Taken In The Frontend Problem
02:30 -
Lesson 82: Showing The Steps Taken In The Frontend Solution
02:00 -
Lesson 83: Fixing Telemetry Problem
02:00 -
Lesson 84: Fixing Telemetry Solution
02:00 -
Lesson 85: Passing The Message History Problem
02:00 -
Lesson 86: Passing The Message History Solution
02:00 -
Lesson 87: Persisting Our New Setup To The Backend Problem
02:00 -
Lesson 88: Persisting Our New Setup To The Backend Solution
02:38 -
Lesson 89: Generating Chat Titles Optional Problem
02:00 -
Lesson 90: Generating Chat Titles Optional Solution
02:00 -
Lesson 91: Adding Geolocation Info To The System Prompt Optional Problem
02:00 -
Lesson 92: Adding Geolocation Info To The System Prompt Optional Solution
02:00 -
Lesson 93: Agents Vs Workflows
02:38 -
Lesson 94: Collapse Search And Crawl Into One Tool Problem
02:00 -
Lesson 95: Collapse Search And Crawl Into One Tool Solution
02:00 -
Lesson 96: Search Scrape Summarize Problem
02:00 -
Lesson 97: Search Scrape Summarize Solution
03:19 -
Lesson 98: Making A Query Rewriter Problem
03:10 -
Lesson 99: Making A Query Rewriter Solution
02:38 -
Lesson 100: Use A Combined Search Scrape Api Instead Optional Problem
02:00 -
Lesson 101: Use A Combined Search Scrape Api Instead Optional Solution
02:00 -
Lesson 102: Resumable Streams Optional
03:59 -
Lesson 103: Building An Evaluator Problem
02:15 -
Lesson 104: Building An Evaluator Solution
02:05 -
Lesson 105: Showing Sources In The Frontend Problem
02:00 -
Lesson 106: Showing Sources In The Frontend Solution
02:00 -
Lesson 107: Implementing Guardrails Optional Problem
02:14 -
Lesson 108: Implementing Guardrails Optional Solution
02:00 -
Lesson 109: Implement An Ask Clarifying Questions Step Optional Problem
02:00 -
Lesson 110: Implement An Ask Clarifying Questions Step Optional Solution
02:00 -
Lesson 111: Showing Usage In The Frontend Optional Problem
02:00 -
Lesson 112: Showing Usage In The Frontend Optional Solution
02:00 -
Lesson 113: Migrating To Ai Sdk V 5 Optional
07:40