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 Building02:10
- 
										Lesson 2: Installation Instructions Dont Skip This03:19
- 
										Lesson 3: Cursor Tips00:23
- 
										Lesson 4: Explore The Repo Problem02:00
- 
										Lesson 5: Explore The Repo Solution02:59
- 
										Lesson 6: Setting Up Postgres02:01
- 
										Lesson 7: Using Drizzle And Drizzle Studio02:00
- 
										Lesson 8: Setting Up Redis02:00
- 
										Lesson 9: Faqs02:00
- 
										Lesson 10: Introduction02:00
- 
										Lesson 11: Choose An Llm Problem02:00
- 
										Lesson 12: Choose An Llm Solution02:00
- 
										Lesson 13: Our First Model Call Problem02:00
- 
										Lesson 14: Our First Model Call Solution02:00
- 
										Lesson 15: Set Up Discord Authentication Problem02:00
- 
										Lesson 16: Set Up Discord Authentication Solution02:00
- 
										Lesson 17: Create A Naive Agent With Serper Problem02:12
- 
										Lesson 18: Create A Naive Agent With Serper Solution02:00
- 
										Lesson 19: Showing Tool Calls In The Frontend Problem02:29
- 
										Lesson 20: Showing Tool Calls In The Frontend Solution02:00
- 
										Lesson 21: Search Grounding Optional Problem02:00
- 
										Lesson 22: Search Grounding Optional Solution02:01
- 
										Lesson 23: Rate Limiting Optional Problem02:00
- 
										Lesson 24: Rate Limiting Optional Solution02:00
- 
										Lesson 25: Connecting Our App To Mcp Servers Optional02:00
- 
										Lesson 26: Create Database Resources For Persisting Messages Problem02:03
- 
										Lesson 27: Create Database Resources For Persisting Messages Solution02:00
- 
										Lesson 28: Persist Chats To The Database Problem02:20
- 
										Lesson 29: Persist Chats To The Database Solution02:00
- 
										Lesson 30: Creating New Chats In The Frontend Problem02:00
- 
										Lesson 31: Creating New Chats In The Frontend Solution02:00
- 
										Lesson 32: Showing The Saved Chats In The Frontend Problem02:00
- 
										Lesson 33: Showing The Saved Chats In The Frontend Solution02:00
- 
										Lesson 34: Fixing The New Chat Button Optional Problem02:00
- 
										Lesson 35: Fixing The New Chat Button Optional Solution02:00
- 
										Lesson 36: Adding Use Scroll To Bottom Optional Problem02:00
- 
										Lesson 37: Adding Use Scroll To Bottom Optional Solution02:00
- 
										Lesson 38: Choosing An Observability Platform02:26
- 
										Lesson 39: Integrating Langfuse Problem02:00
- 
										Lesson 40: Integrating Langfuse Solution02:00
- 
										Lesson 41: Passing Extra Metadata To Langfuse Problem02:00
- 
										Lesson 42: Passing Extra Metadata To Langfuse Solution02:00
- 
										Lesson 43: Adding A Scraper Problem02:23
- 
										Lesson 44: Adding A Scraper Solution02:06
- 
										Lesson 45: Making The Llm Date Aware Optional Problem02:00
- 
										Lesson 46: Making The Llm Date Aware Optional Solution02:00
- 
										Lesson 47: Improving Our Crawler Optional02:44
- 
										Lesson 48: Reporting Db Calls To Langfuse Optional Problem02:00
- 
										Lesson 49: Reporting Db Calls To Langfuse Optional Solution02:00
- 
										Lesson 50: Initializing Evalite Problem02:04
- 
										Lesson 51: Initializing Evalite Solution02:00
- 
										Lesson 52: Choosing Our Success Criteria04:09
- 
										Lesson 53: Making Our System Testable Problem02:00
- 
										Lesson 54: Making Our System Testable Solution02:00
- 
										Lesson 55: Our First Deterministic Eval Problem02:00
- 
										Lesson 56: Our First Deterministic Eval Solution02:00
- 
										Lesson 57: Adding A Global Rate Limiter Optional Problem02:00
- 
										Lesson 58: Adding A Global Rate Limiter Optional Solution02:09
- 
										Lesson 59: The Data Flywheel02:42
- 
										Lesson 60: Our First Llm As A Judge Eval Problem02:59
- 
										Lesson 61: Our First Llm As A Judge Eval Solution02:00
- 
										Lesson 62: Create A Simple Dataset Problem03:20
- 
										Lesson 63: Create A Simple Dataset Solution04:08
- 
										Lesson 64: Organizing Our Dataset Into Dev Ci And Regression Optional Problem02:00
- 
										Lesson 65: Organizing Our Dataset Into Dev Ci And Regression Optional Solution02:00
- 
										Lesson 66: Assessing Answer Relevancy Optional Problem02:00
- 
										Lesson 67: Assessing Answer Relevancy Optional Solution02:00
- 
										Lesson 68: Extracting The Parameters Of Our System Optional Problem02:00
- 
										Lesson 69: Extracting The Parameters Of Our System Optional Solution02:00
- 
										Lesson 70: What S Wrong With Our Current Approach02:00
- 
										Lesson 71: Designing Our New System Prompt Problem02:00
- 
										Lesson 72: 1 Designing Our New System Prompt Problem02:00
- 
										Lesson 73: Designing Our New System Prompt Solution02:00
- 
										Lesson 74: Creating A Next Action Picker Problem02:00
- 
										Lesson 75: Creating A Next Action Picker Solution02:00
- 
										Lesson 76: Implementing The Loop Solution02:00
- 
										Lesson 77: Connecting Our Loop To The Frontend Problem02:00
- 
										Lesson 78: Connecting Our Loop To The Frontend Solution02:00
- 
										Lesson 79: Smoothing Our Streaming Optional Problem02:00
- 
										Lesson 80: Smoothing Our Streaming Optional Solution02:00
- 
										Lesson 81: Showing The Steps Taken In The Frontend Problem02:30
- 
										Lesson 82: Showing The Steps Taken In The Frontend Solution02:00
- 
										Lesson 83: Fixing Telemetry Problem02:00
- 
										Lesson 84: Fixing Telemetry Solution02:00
- 
										Lesson 85: Passing The Message History Problem02:00
- 
										Lesson 86: Passing The Message History Solution02:00
- 
										Lesson 87: Persisting Our New Setup To The Backend Problem02:00
- 
										Lesson 88: Persisting Our New Setup To The Backend Solution02:38
- 
										Lesson 89: Generating Chat Titles Optional Problem02:00
- 
										Lesson 90: Generating Chat Titles Optional Solution02:00
- 
										Lesson 91: Adding Geolocation Info To The System Prompt Optional Problem02:00
- 
										Lesson 92: Adding Geolocation Info To The System Prompt Optional Solution02:00
- 
										Lesson 93: Agents Vs Workflows02:38
- 
										Lesson 94: Collapse Search And Crawl Into One Tool Problem02:00
- 
										Lesson 95: Collapse Search And Crawl Into One Tool Solution02:00
- 
										Lesson 96: Search Scrape Summarize Problem02:00
- 
										Lesson 97: Search Scrape Summarize Solution03:19
- 
										Lesson 98: Making A Query Rewriter Problem03:10
- 
										Lesson 99: Making A Query Rewriter Solution02:38
- 
										Lesson 100: Use A Combined Search Scrape Api Instead Optional Problem02:00
- 
										Lesson 101: Use A Combined Search Scrape Api Instead Optional Solution02:00
- 
										Lesson 102: Resumable Streams Optional03:59
- 
										Lesson 103: Building An Evaluator Problem02:15
- 
										Lesson 104: Building An Evaluator Solution02:05
- 
										Lesson 105: Showing Sources In The Frontend Problem02:00
- 
										Lesson 106: Showing Sources In The Frontend Solution02:00
- 
										Lesson 107: Implementing Guardrails Optional Problem02:14
- 
										Lesson 108: Implementing Guardrails Optional Solution02:00
- 
										Lesson 109: Implement An Ask Clarifying Questions Step Optional Problem02:00
- 
										Lesson 110: Implement An Ask Clarifying Questions Step Optional Solution02:00
- 
										Lesson 111: Showing Usage In The Frontend Optional Problem02:00
- 
										Lesson 112: Showing Usage In The Frontend Optional Solution02:00
- 
										Lesson 113: Migrating To Ai Sdk V 5 Optional07:40