Free YouTube Transcribe

Video transcript

How Senior Engineers Actually Build with AI in 2026 | Build a Full Stack Job Applications Platform

JavaScript Mastery · 29,691 words · 135 min read

Want to search this transcript, jump the video from any line, or download it as TXT, SRT, or VTT?

Open in the transcript tool

Full transcript

— Introduction

0:00Something changed this year. Every

0:02developer I know is quietly asking the

0:04same question. Do the skills I spent

0:07years building still matter? It's a fair

0:10question. AI writes better code every

0:13month. The gap between junior and senior

0:16is closing. And the more you delegate,

0:18the more the output starts to look the

0:21same. Generic and inconsistent. It's

0:24impressive for 5 minutes of glory on X,

0:27but becomes impossible to maintain by

0:30the third feature. But that's not the

0:32real story. AI doesn't make developers

0:35less valuable. It makes the gap between

0:38developers with a system and developers

0:40without one larger than it's ever been.

0:43Anyone can open up Clawude and get code

0:45out. That's easy. What almost no one

0:48figures out is how to give the agent

0:50enough context, structure, and direction

0:53to build something that holds together,

0:55something you can ship, maintain, and

0:58trust. That's the actual skill, and it's

1:02completely learnable. This is Job Pilot,

1:05a full stack AI agent that finds jobs,

1:09scores each role against your profile,

1:12and then sends real browsers across the

1:15open web to research the company behind

1:18every listing. It writes your cover

1:20letter and tailor your resume to match.

1:23This application would have taken a team

1:26of developers at least a month to build.

1:29Now, I built it on my own in a couple of

1:32days. without writing a single line by

1:35hand. And by the end of this video,

1:37you'll have built it, too. Same stack,

1:40same way I did. If you know basic

1:42JavaScript, you can follow along. But

1:45the app isn't why you're here. You're

1:48here for this. Five open-source agent

1:50skills: architect, remember, review,

1:54recover, and imprint. They'll give your

1:57agent memory, focus, and the ability to

2:00ship without drifting. You install them

2:02once and then use them on every project

2:04after today. They're free, open- source,

2:08and completely yours after this video.

2:10You can get them from a GitHub repo down

2:12below. And I also took the time to write

2:14a full guide covering exactly how to use

2:17each one of these skills in more detail.

2:19I'll put it in the description, too.

2:21Now, the stack next.js GS16, INSForge

2:25for the back end, browser base and stage

2:27hand for real browser automation, GPT40

2:31for intelligence, PostHog for analytics.

2:34By the end, you won't just have a

2:36working AI agent. You'll have a system

2:39for building anything. A system that

2:42doesn't get replaced by the next model,

2:44but instead gets stronger every time you

2:46use it. We are now at a time where one

2:49engineer with the right system has no

2:51ceiling on what gets shipped. So let's

2:55build.

— Crash Course

3:06Before we touch a single tool, give me 5

3:09minutes to tell you about the part that

3:12decides whether your build ships or

3:15falls apart halfway through. There's no

3:17quote in this section yet. It's the most

3:20important one in this entire video

3:22because this is the process of how I

3:24think before I write a single prompt.

3:27Without it, even the best model will

3:29drift. It'll start contradicting itself

3:32and just break your codebase. If you've

3:35felt that, you know what I mean. And if

3:37you haven't, first of all, you're crazy.

3:40Great job. But you [music] most likely

3:42will. The problem is that most

3:44developers using AI do the same thing.

3:48They open up the editor, describe what

3:50they want, the code appears, and they

3:53react to whatever comes out. Sometimes

3:55it's great, sometimes it's broken. Fix

3:58it, move on, and repeat. That's great

4:01for demo apps, but that workflow has a

4:05ceiling, and most devs hit it fast. The

4:08problem is that AI has no idea of what

4:11you're building. It knows what you said

4:13in the last message, maybe a few

4:15messages back, but it doesn't know the

4:18decisions you made 3 days ago, what you

4:21decided not to build, your conventions,

4:24your folder structure, or where your

4:26project stands today. So, it guesses and

4:30those guesses compound. 3 weeks in, your

4:33database is full of contradictions that

4:36nobody can fully explain. So, here's how

4:39to fix it. The first half of the fix is

4:43context. Not just telling the agent what

4:46to build, but giving it a complete

4:48picture of the system it's building

4:50inside of. For job pilot, I wrote nine

4:53context files before the agent touched

4:56the line. What the product is and who is

4:58it for? architecture, folder structure,

5:02code standards, UI rules, design tokens,

5:06library specific patterns, a build plan,

5:09and a living progress tracker that

5:11updates as we go. Nine files so that the

5:15agent never has to guess. It is some

5:18real time upfront, but you only have to

5:20write them once. And then these files

5:23travel with the project for its entire

5:25life. And if you keep watching, I'll

5:26show you how we can set them up together

5:28when we start the project. Now, the

5:31second half of the fix are agent skills.

5:34In my previous video, I used spec files.

5:37One spec per feature each build session.

5:41It worked, but it was pretty heavy as

5:44every feature needed a new document. But

5:47this time, I improved that workflow.

5:50What you're watching today is the latest

5:52workflow I'm working with after years of

5:55improving it. This time I replaced specs

5:58with something better. Five agent skills

6:02built from real production builds, real

6:04failures I've encountered, and real

6:06sessions where the agent drifted and I

6:09had to figure out why. Each skill came

6:11from a specific problem that I kept

6:13hitting until I refined the solution.

6:16And each one is just a command you run

6:19inside of your AI session. Here's what

6:21they do and what they prevent. First one

6:23on the list is architect, which you run

6:27before any complex feature. Without it,

6:30you start typing a prompt, the agent

6:33builds, and then halfway through you

6:35realize you never decided how O would

6:38work for this. Your agent just made a

6:40guess, and now you're refactoring with

6:43it. When you run architect, it reads

6:45your context files, asks focused

6:48questions one at a time, surfaces the

6:50decisions you haven't made yet, and

6:52produces a plan. That's the conversation

6:55you should be having before every

6:57serious feature. And now it happens

7:00automatically. The second skill is

7:02called remember. You use it at the end

7:05of every session. Without it, every new

7:08session starts from zero. You spend 10

7:11minutes reexplaining what was decided

7:13yesterday or you don't and the agent

7:16contradicts itself by lunch with it. You

7:19run remember when you wrap up it

7:22compresses what happened, decisions

7:24made, patterns established, progress

7:26completed into a memory file. Then the

7:28next session loads it on open which

7:31gives you continuity without

7:33reexplaining.

7:35Then there's review which you run after

7:38a feature is built. Without it, the

7:41agent finishes a feature 400 lines. You

7:44skim, you commit, and 3 days later you

7:47find a bug. With it, you run review. It

7:51checks if the implementation matched the

7:53plan, if it respects your architecture

7:55boundaries, and if it's production

7:57ready. It then returns issues by

8:00severity, critical, important, minor,

8:04and it never autofixes things, so you

8:06stay in control. I also came up with

8:09recover for when things break. Without

8:12it, something's wrong. You're 4 hours

8:15into a session. You don't know if it's a

8:18targeted bug, a polluted context, or a

8:21wrong assumption from earlier. So, the

8:24AI starts spiraling, and you spiral,

8:26too. With it, you run recover. It

8:30diagnoses which failure mode you're in

8:33and gives you the right correct

8:34response. That's one prompt instead of a

8:37very frustrated afternoon. And finally,

8:41there's imprint, which I use after

8:43building any UIs because without it,

8:47three sessions in your buttons all look

8:50different. spacing is a tiny bit off and

8:53your design system has mistakes that you

8:56didn't really notice with it. When you

8:59run imprint, it captures the new

9:01components patterns into your UI

9:03registry. So you run it across the

9:05codebase, it finds the inconsistencies

9:08and produces a fixed list. That way the

9:11design system stays coherent across

9:14every sessions. Five skills handles

9:18every serious failure mode developers

9:20hit when building with AI agents. Drift,

9:24inconsistency, broken sessions, UI

9:27chaos, and lost memory. One skill for

9:31each one of them. It took a lot of trial

9:33and error and frustration to come up

9:36with them, but here they are, and

9:38they're open source, not just locked to

9:41this project or this stack or this

9:43agent. You can install them once and use

9:46them anywhere. So, I'll leave the link

9:48in the description. And to make it even

9:51easier, I've also put together a guide

9:54covering exactly how to use each skill

9:57in more detail, when to run them, and

10:00how to set up your own context files for

10:02any project you build. I'll put it in

10:04the description, too. So, here's the

10:07full loop. Start every project by

10:10writing context files. nine documents

10:13that give the agent complete knowledge

10:15of what you're building. That's the

10:17foundation. And I just realized that I

10:19didn't go into too much depth about the

10:21nine files in this crash course, but I

10:24did write more about them within the

10:26guide that I just mentioned. So you can

10:28check it out there. But these files are

10:30the foundation. Then you build feature

10:33by feature. Before any complex feature,

10:36run architect. After you implement it,

10:39run imprint if it's UI. review if it's

10:43complex and at the end of the session

10:45remember and when something breaks call

10:48recover context makes sure the agent

10:52knows your system and the skills make

10:54sure that every session is focused every

10:57feature is reviewed and that nothing

10:59gets lost between conversations. That's

11:02the system and it is simple on paper,

11:06but what matters is using it on a real

11:08project under real pressure. And that's

11:11what the rest of this video is for. Here

11:14you just heard about some new skills and

11:16new concepts that you might end up

11:18using. But if you continue watching

11:20until the end, I'll show you how you can

11:23actually use them to build job pilot.

11:26every feature, every session, same

11:28workflow and to also be able to use them

11:31across all of your future projects. And

11:34if you want to go deeper, the Agentic

11:37Dev course teaches all of this from the

11:40ground up, the fundamentals, the

11:42architecture thinking, and the patterns

11:44that made me come up with these five

11:47skills in the first place. So, within

11:49the course, I'll take these skills apart

11:51and show you how you can make yours.

11:54Those are the patterns that make AI work

11:56on serious projects. So, I'll leave the

11:59weight list link in the description so

12:01you can know when the course is out. So,

12:04now that you understand the workflow,

12:06let's learn it and practice it in

12:08action. Time to build.

— Project Intro

12:13That's the system and the product you

12:15build with it is almost beside the

12:17point. If you swap job pilot for

12:20anything else, the workflow won't

12:22change, but you still need a stack to

12:24build on. So here's what we are using

12:27for this build and why each piece earns

12:30its spot in an app like this. For the

12:32entire back end, we'll use ins. Job

12:36pilot needs three things on day one. O,

12:40a database and file storage. Almost

12:43every single app needs this. Google and

12:46GitHub login, tables for profiles and

12:49jobs, and a bucket to hold resume PDFs.

12:52Ins gives you all of this in one

12:55platform. And the part that matters for

12:57this is the MCP server because your

13:00agent connects straight to your backend,

13:02reads the live schema, and wires things

13:05all on its own instead of guessing

13:07against an API it half remembers. And

13:10the free tier covers everything that we

13:12built today. So, while we're here, let's

13:14immediately create an account. Click the

13:16Ins link down in the description, sign

13:19up, and you'll be redirected to your

13:21dashboard so that later on we can

13:23immediately start using it. For browser

13:25automation, you'll use browserbase along

13:28with their AI browser SDK, Stage Hand. A

13:32big chunk of Job Pilot runs in a real

13:34browser, reading any job URL you paste

13:38in and sending an agent across the web

13:41to research a company before you apply.

13:43You don't want that running on a

13:45headless browser on your own machine

13:47because it crashes and some companies

13:49can detect it as a bot. Browserbase

13:51instead gives you a real managed browser

13:54in the cloud with session recording and

13:57a live view. You can drop straight into

13:59the app so users watch the agent work.

14:02Stage hand sits on top of that and lets

14:05the agent read and pull data from any

14:07page in plain language instead of using

14:10the brittle CSS selectors. Once again,

14:13it's free to start and everything we'll

14:15do will fall under that free plan. Click

14:18the special link down in the description

14:20so you can follow along and see exactly

14:22what I'm seeing later on when we set it

14:24up. For now, just creating an account is

14:27enough. And for analytics, you'll use

14:30Post Hog. Once people are searching,

14:32researching companies, and tailoring

14:34resumes, you want to see what's actually

14:36happening, which actions get used, what

14:39lands, and where people drop off.

14:42Posthog roles analytics, session

14:45replays, and feature flags into one

14:47tool. And it's super quick to wire up

14:49thanks to their Post Hog wizard. It'll

14:51power your full analytics and help you

14:53use this new workflow that I'm teaching

14:55in this video with so much more

14:57potential because you'll make educated

14:59decisions on what you want to build now

15:01that you can actually build super fast,

15:04allowing you to build the features that

15:05your users actually want. Once again,

15:08their free tier is super generous and

15:11I'll leave the link down in the

15:12description so you can create an account

15:14and later on we can just one-click

15:16install it with a wizard. So, if you

15:18haven't, pause the video and create

15:20accounts as we'll be using them within

15:22the first couple of lessons. If you've

15:24done that, perfect. Now we are ready to

15:27build job pilot feature by feature while

15:30following this workflow that I taught

15:32you in the crash course but that we'll

15:34now together explore throughout the full

15:37build. So let's go.

— Project Setup

15:42Okay, I hope you're ready to get started

15:44developing our application in this new

15:47agentic workflow that I want to teach

15:49you. We'll start straight from the

15:52beginning by creating a new empty folder

15:54on our desktop. And you can go ahead and

15:57call it something like job pilot, which

15:59is going to be the name of our

16:01application. And then simply drag and

16:03drop it into your VS code or cursor or

16:06any other text editor or IDE that you

16:09use nowadays. I mean, even the concept

16:11of what a text editor is is changing

16:14nowadays. Cursor and Codeex for some

16:17time have been using this view where on

16:19the left side you have a list of

16:20conversations you have with your agents.

16:22In the middle you have the actual

16:24conversation contents and then on the

16:26right you can have either code or a

16:28preview of the browser. Recently VS Code

16:30came up with that option as well. You

16:32just need to search for the agents

16:34window or click the button in the top

16:36right and it'll open up something that

16:38looks like this where no longer you have

16:40the files on the left side and then the

16:42code in the middle and that's it. where

16:44you have a list of sessions on the left

16:45side and then the actual conversation in

16:48the middle. Love it or hate it, what it

16:50means to be a developer or an engineer

16:52is changing. And that's exactly the goal

16:55of this video to guide you through that

16:57transition smoothly and to help you stay

16:59on top of it. So now that we have an

17:01empty project, go ahead and open up your

17:03integrated terminal while that still

17:05exists. Jokes aside, I think there's

17:08always going to be place for a terminal

17:10and create a new Nex.js application. You

17:13can do that by running mpx create next

17:16app at latest and then just dot to

17:18create it within the current directory.

17:20It'll ask you whether you want to

17:21install the create next app installer.

17:24So just go ahead and say why yes. And

17:26it'll ask you some questions such as

17:28would you like to use the nextgs

17:29defaults. In this case, we're going to

17:31proceed with that as it's going to turn

17:33on TypeScript, ESLint, no React

17:36compiler, T1 CSS, no source directory,

17:39app router, and the default agents.mmd

17:42file. So, let's go with the recommended

17:45options. Give it a minute to set

17:46everything up. Once that's done, you

17:48can, of course, go ahead and run mpm

17:50rundev to spin up the project on

17:53localhost 3000 and then open it up

17:55within your browser. This is new. I

17:57commandcllicked it expecting that it's

17:59going to open it up in my default

18:00browser like it used to do for years,

18:03but instead it actually opened up the

18:05app as a tab in my VS Code window. This

18:07is pretty cool. It's an integrated

18:09browser within which local host links

18:11automatically open up. Pretty cool. You

18:13can use it just as a regular browser or

18:16you can also turn on the inspect element

18:19so you can select specific elements and

18:21then it automatically puts them within

18:24your agentic chat session. I love this.

18:28So far, you had to use a third party app

18:30or a browser extension in order to be

18:32able to do that, but now it's integrated

18:35directly within your VS Code. This is

18:38amazing. So, it knows that this is

18:40referring to your app, that is referring

18:42to an H1, and it even passes a

18:44screenshot to the part that you're

18:46trying to fix. So, now you can just say

18:48modify this, and it'll immediately do

18:50it. Love it. We'll definitely use this

18:53later on. You can also add element to

18:56chat, add screenshot to chat, or add

18:58console logs to chat. Pretty cool stuff.

19:01And there's a full browser console and

19:03elements tab right here. Love it. Now,

19:06let's go ahead and modify some of the

19:08default files right here by heading over

19:10into the app and then page. We can clean

19:13this page up by just running rafc. If

19:16that isn't working for you, you can head

19:18over to extensions and install React

19:22snippets. There's a couple of different

19:24packages. Uh there's the simple React

19:26snippets that I have right now within

19:28which you can simply say sfc to create a

19:31stateless functional component, but

19:32there's also this ES7 react redux react

19:35native snippets that allows you to use

19:37the RAFCE keyword. So you can either use

19:41that or you can use the sfc from the

19:44other one. Either way works for me.

19:47Let's call this page home. And then

19:49within the home, we can simply return an

19:51H1 that says job pilot. And I think I'm

19:55zoomed in a bit too much. So I'll zoom

19:58out a bit. And you can hopefully still

19:59see everything on the screen. Now let's

20:02head over into the globals.css

20:04where we have the default styling. Right

20:07now we want to remove all of that

20:09default styling, but just keep the

20:11import to tailwind CSS so we can use all

20:14of its utilities. Later on, we will fill

20:16in this root as well as the theme in

20:20line as well as some media where it

20:23prefers the color scheme set to dark.

20:26So, we can specify the dark mode of our

20:29application where we'll be able to

20:31modify some root classes and then of

20:33course there is the body uh in case we

20:36want to do some resets. Later on, I'll

20:38provide you with the styling so that we

20:40can focus on what matters and that is

20:42learning about this agentic workflow.

20:44Let's also head over into our public and

20:47remove everything from it. The only

20:49thing we'll keep is the empty public

20:51folder because later on we'll fill it in

20:53with additional assets. So now that we

20:55have an empty slate of our application

20:57like it's completely empty, there's

20:59nothing there. We want to set up our

21:01agentic skills and context files that

21:03we'll use in all of the upcoming lessons

21:05of this video, but also in every

21:08upcoming project that you work on.

— Context Files & Design Assets

21:12To start setting up our agentic

21:14workflow, we'll need some context files.

21:17And just so you don't have to create one

21:19by one by hand, down in the description,

21:21I'll leave a video kit link which is

21:24going to look something like this. Here

21:25you have different useful links such as

21:27the link to the open source codebase of

21:29this project, the deployment, the

21:31assets, and some guides, Discord

21:33channels, and so on. And on the right

21:35side, you have some snippets that I'll

21:36refer to throughout this video. So, I've

21:39put all that neatly in one place so that

21:41you can refer to it as we go through the

21:43build. Let's start off with the assets

21:45part. So, click on this. It'll lead you

21:48to this Google Drive where you can

21:50download the public folder zip as well

21:52as the context zip. Once you get them,

21:55you can unzip them, remove this public

21:57folder, and then simply drag and drop

22:00both of these folders right here at the

22:03root of your application. And you can

22:05say copy folders.

22:07public is going to be simple. Here we

22:09have our job pilot logo as well as the

22:12images we'll be using later on for our

22:14agents dashboard and so on. And then the

22:17context is where the magic happens. But

22:20before I go through each one of these

22:22individually and explain them in this

22:25video, I'll teach you how to take your

22:26agentic development workflow even

22:28further by using custom skills. I've

22:31been writing code using AI for many

22:34years now, but especially throughout the

22:36last 6 to 12 months, I doubled down on

22:38it. Ever since Claude Opus 46 came out,

22:41and since then, I've been improving my

22:43workflows, but I didn't feel like

22:45rewriting all my rules for every single

22:48project. So, skills made a lot of sense.

22:51I created a series of skills that

22:54combine all of my workflows and

22:56learnings and struggles of years of

22:58working with agents into a set of skills

23:00that you can install into any project.

23:02And installing them is super simple. You

23:04just have to run MPX skills at latest

23:07add JavaScript Mastery Pro skills or you

23:10can install them individually. Below you

23:12can find some info on each one of these

23:14skills. But don't worry as that's

23:16exactly the point of this video to teach

23:18you how to use these skills. If you want

23:20to know how I created these skills in

23:22the first place, how I came up with the

23:24ideas, and why I thought these specific

23:26workflows need to be turned into skills,

23:28you'll likely be interested in the

23:30agentic development course that I'm

23:32working on. That's going to be a

23:33collection of all of my learnings over

23:35the years of trying to tell AI to write

23:38code. Now, it actually can, and I'm

23:41ready to compile it into a single

23:43course. So, for now, you can only join

23:45the wait list, but it's going to be out

23:47soon. Now with that in mind, you can

23:49head back over into a terminal and you

23:51can open up a second window and within

23:54it run MPX skills add latest add

23:57JavaScript Mastery Pro skills. It'll ask

24:00you whether you want to install the

24:01skills installer. So you can say Y.

24:03Proceed. And then it'll ask you which

24:05skills you want to install. In this

24:07case, you can select all of them.

24:09There's just five. It'll ask you for

24:11which agents you want to install those

24:13skills. You can select the one you're

24:15using. You have a lot of options right

24:17here. Um, we can use clot code or we can

24:20use something like codeex or gemini.

24:24That's going to be completely up to you.

24:26Of course, there's also cursor, but you

24:28can see for it that's universal and it

24:30works right out of the box. So, press

24:32enter. Install it either on the project

24:34or globally through sim link and proceed

24:38with installation. Now, after now, after

24:41you install it, if you would be so kind,

24:43you can also give this repo a star. So,

24:46as more of us use these skills, we'll

24:48get more issues and pull requests to

24:50improve them even further and make them

24:53better. Once installed, you'll see these

24:56skills appear directly within your

24:57project right within agents. And here

25:00they are. In the crash course, you

25:02already learned about when and how we'll

25:04be using these skills. And very soon,

25:07we'll start putting that to practice.

25:09Now, before we start using our context

25:11files, which are going to work together

25:13with our skills, I want you to think

25:16about something. Imagine you're a

25:18developer and a client comes to you and

25:20says, "Build me a website." With no

25:23brief, no requirements, no design, just

25:27that. What do you do? I mean, you make

25:29guesses, right? Assumptions. You build

25:31something that made sense to you, but

25:33not necessarily what they wanted. That's

25:36exactly what happens when you open up a

25:38chat window like I do right here and

25:41then you tell it something like build me

25:43a SAS app. The model, whichever one

25:46you're using nowadays, isn't stupid. It

25:48just has no idea what you actually want.

25:50So, it fills the gaps with its best

25:52guesses. And three sessions in, those

25:54guesses compound into something that,

25:57well, nobody asked for. So, before we

26:00write a single prompt, we want to give

26:02our agent everything it needs to know.

26:04And that's coming in form of these nine

26:07files. Each one of which gives the agent

26:10a specific layer of knowledge that it

26:12would otherwise have to guess. It starts

26:14with the big picture, which is the

26:17project overview. Here we tell the agent

26:20what job pilot or whatever project

26:22you're working on. Actually, it's a full

26:25stack AI powered job hunting assistant.

26:27The user sets up their profile once,

26:30uploads their resume, and the agent

26:31automatically discovers relevant jobs

26:34from LinkedIn, scoring each one against

26:36the user's profile using GPD40 or later

26:39on we can switch this. So, we tell it

26:42what it is and what problem it solves,

26:44and we tell it about the problem it

26:47solves. Job hunting is one of the most

26:49repetitive and timeconuming tasks a

26:51developer faces.

26:53So, the goal here is to eliminate all of

26:56that. Now, why are we telling it that?

26:59Well, the more context it has, the

27:01better decisions it'll be able to make

27:03with the limited context that we give it

27:05through the prompts. Then, we also give

27:08it every single page and the full user

27:11flow, how the user moves from page to

27:13page and exactly what happens. We also

27:16give it some more information about the

27:18specific functionalities of the app,

27:20which in this case is finding actual

27:23jobs and provide more info. Then a bit

27:26below we talk about what's in scope but

27:29also at the same time and this is

27:31important what's out of scope for this

27:34application. The agent reads this file

27:36once and knows exactly what we're

27:39building and more importantly what we're

27:42not. That way there's no scope creep.

27:45It's simple for it to understand our

27:47success criteria. So once it knows what

27:50we're building, it also needs to know

27:52how it's built. And for that there's

27:55another context file called

27:57architecture.mmd.

28:00You can also open it up in markdown.

28:03It's going to look something like this.

28:04And this file is all about the stack as

28:08well as the folder structure of the

28:09application. The system boundaries and

28:12data flow as well as database schemas

28:15and a set of rules that our AI agent

28:18must never violate. For example, API

28:21routes contain no UI logic. Components

28:24contain no DB logic. Agent code in agent

28:28never imports from components or

28:30actions. Server actions never call

28:32agents. And you you get the idea. That's

28:35the architecture. That was the

28:37architecture. But now it needs to know

28:40what to build and in what order. And

28:43that's what the build plan is for.

28:46Within the build plan, we tell it how we

28:48want to split this build into phases.

28:51For example, we're going to have 25

28:54total features across five phases with

28:57every feature being defined, scoped, and

29:00sequenced correctly. So that way, the

29:03agent never has to decide what comes

29:05next because it already knows it. This

29:07is the road map that we follow for the

29:10entire build. And if you're wondering,

29:12but hey, how do I actually come up with

29:14all of this? or do I have to prompt my

29:17AI agent to create this before we even

29:20begin? The answer is yes. That's

29:23something that we'll dive much deeper

29:24within in the agentic development

29:26course.

29:28But yeah, through the conversation with

29:30AI before you even begin with the build,

29:32you come up with these rules and

29:34different things that you want to build.

29:36It can easily split it into different

29:38features one by one for you and then

29:40that's the plan that we can follow. Of

29:42course, we can choose to deviate from

29:44it, but more or less we're going to

29:46stick with it. So once we know what to

29:48build, then it needs to know how to

29:51write the code. And that's what the code

29:53standards file is for. Here we tell it a

29:57bit about the TypeScript rules. For

29:59example, the naming conventions or NexJS

30:0316 conventions, the file and folder

30:05naming, the component structure, how we

30:08handle specific errors or server

30:11actions.

30:12Basically, every single convention that

30:14you follow that you can think of, write

30:17it down once. And this is what keeps the

30:20agent consistent across every session

30:23instead of simply drifting away into its

30:25own style by week two. And it also needs

30:28to know how to use the tools. So for

30:31that, we have the library docs.md.

30:35This file is not just generic

30:37documentation.

30:38It's on exactly how we use each library

30:42in a specific project like job pilot in

30:45this case. So before using any library

30:48check if an MCP server is configured for

30:50that library read that file and only

30:54then act. In this case we'll be using

30:56ins. So we tell it how we can use it and

30:59some rules that it can follow. Same

31:01thing for o dbqueries and browser base

31:04which we'll be using later on to

31:06actually scrape the data. check for the

31:08MCP of this library that we want to use

31:11and some examples of how we can use it.

31:13Of course, I was super detailed right

31:15here, but these context files are

31:17something that you can build along the

31:19way as you're building the application,

31:21but of course, the more you prepare at

31:23the start, the better. Now, for the UI

31:26layer, there's three files, each

31:28handling a different part. Let's start

31:31with UI tokens. Here we define every

31:34single color, spacing value, border

31:37radius or typography scale and we pull

31:40it directly from the design defined as

31:42CSS variables. The agent will use these

31:46exact values with no hard-coded hex

31:49values or no inconsistency between the

31:51pages. So once it knows the primitives,

31:54we can head over into the UI rules.mmd.

31:58Here we tell it how the UI behaves. uh

32:02things like the font, the layout and how

32:05cards should look like, the button

32:08styles too, the badges and everything.

32:11And this is what keeps every page

32:13feeling like it belongs to the same

32:15product. You know that if you're

32:16building with AI, very often the AI will

32:19start deviating from the general design.

32:22But with this in place, you can

32:23essentially consider it your entire

32:25design system. write the visual rules

32:28here once and then the agent will follow

32:30them across every page. And if you

32:32already have a Figma design, you can use

32:34a Figma MCP or just feed it over into AI

32:38and it'll generate this for you.

32:40Finally, there's the UI registry. This

32:43is a living document, so we're

32:45essentially starting it empty. Later on,

32:47I'll teach you how to use the import

32:49scale, which fills it automatically as

32:51we build components. So, as soon as you

32:53create some of the components, it'll

32:56check if a similar component exists. If

32:58yes, it'll match its exact classes. If

33:01no, it'll build it following the UI

33:03rules and UI tokens and then add it

33:05here. This is super powerful if you're

33:08building without a design, and it's what

33:10keeps your components consistent across

33:12the entire codebase. There's also

33:14another file called progress tracker,

33:16which also begins kind of empty. None of

33:19the check boxes have been checked, but

33:21it'll be automatically updated after we

33:24complete every new feature. So, at the

33:26start of any new session, the agent

33:28knows exactly where we left off with no

33:31reexlaining needed. That's it. These are

33:34the nine files that give the agent the

33:36full picture of what we're building, how

33:39the system works, what to build next,

33:41how to write the code, how to use the

33:44tools, and how the UI should look and

33:46behave. In this case, I was super

33:49detailed. When you're building these for

33:51your projects, you can start slow and

33:53then keep adding things as you go. And

33:56you'll most likely keep adding things as

33:58you switch it from a project to another

34:00project because you'll figure out what

34:02works and you'll want to stick with it,

34:04but then modify just slightly to suit

34:06that new project. In this case, I took

34:09the time and I made it very detailed for

34:11two reasons. First of all, you can

34:14browse these files and try to understand

34:16the process that I follow while writing

34:18them. Again, within the agentic

34:20development course, I'll give you the

34:22full uncut version of me actually

34:24generating these files with AI. And the

34:27second reason is that since we're

34:28building this application together, I

34:30want both of our agents to give us more

34:32or less the same output. The less

34:34specific you are, the less similar and

34:37less perfect output you're going to get.

34:39But with this detailed context files, we

34:42should be getting almost the same output

34:44so that you can easily follow along

34:46until the end of this course. So how do

34:48we tie all of this together? Well, it

34:51has to do with the agents.mmd file,

34:53which right now is completely empty. If

34:56you head back over to your video kit,

34:58you'll see a final agents.md file right

35:01here, which you can copy and simply

35:04paste it right here. It's simple. It

35:06just ties everything together. Here

35:08we're speaking directly to the agent. We

35:10tell it to read in this exact order

35:13before any implementation.

35:15Read all of these nine files. And if you

35:18think that making it read these files is

35:21going to consume a lot of tokens, trust

35:23me, it's going to consume significantly

35:25less tokens than it would take it to

35:28generate some stuff that you'll end up

35:29scrapping and never using and going back

35:32and forth and fixing it. This workflow

35:35is made for the highest speed of

35:37development, but also the lowest token

35:39cost. Trust me on that, and you'll see

35:42for yourself as you continue following

35:44along. There's also some rules that

35:46never change, like no hard-coded hex

35:48values, update the progress tracker

35:50after every feature, load the skill

35:53before touching any third party

35:54libraries, and it lists all the skills

35:57and exactly when to use them. Think of

36:00it like this. The context files are the

36:03knowledge

36:05and the agents. MD file is the

36:07instruction manual that tells the agent

36:10how to use that knowledge. Without it,

36:12the agent might skip a file, read them

36:15in the wrong order, or miss a rule. With

36:18it, every session starts exactly the

36:21same way, consistent, focused, and fully

36:24loaded. If you're using Claude, you'll

36:26need a claw.md file, which in this case

36:29should automatically point to the

36:31agents.mmd file. So, this should be good

36:34no matter which agent you're using.

36:35You'll also notice that under context,

36:38there's this designs folder. This is to

36:40make sure that every page has a visual

36:42reference so that when the agent builds

36:44UI, it's not inventing. It's simply

36:47trying to match what's already there.

36:49That's how you get consistent and

36:51polished UI without correcting it every

36:54session. And if you're finding all this

36:55overwhelming, just follow along with

36:58this video, build it with me, and I

37:00think you're going to get a pretty good

37:02idea of how you can use this workflow

37:04for your own projects. Of course, if you

37:06want to dive deeper and learn how to

37:08create these files from scratch, you can

37:10join the weight list for the full Aente

37:12course. But while that's not out, I

37:15actually already prepared the full AI

37:18development starter kit, including these

37:21context files, workflows, and the skills

37:24that we talked about, all within a

37:26single reference book that you can

37:27always go back to and look at when

37:30you're crafting these for your own

37:31projects. So, now that the context is

37:33ready and our agents MD file is here,

37:36we're officially ready to start

37:38developing our application.

— Setup Global.css

37:41Now, just before we run our first

37:44prompt, I want to tell you about the

37:46workflow that we'll be using. So, no

37:48matter which agent you go with, the

37:50interface is more or less the same. You

37:53can open it up by pressing command

37:55shiftp and then search for chat. At

37:57least that's how it's called in VS Code.

38:00Here you'll see that you have the

38:01regular chat belonging to VS Code,

38:04Microsoft, and Copilot. There's also

38:07claude code and Codex. And these right

38:09here are just extensions. So if you head

38:12over to extensions and search for Codex,

38:15you can see it right here. It has almost

38:1710 million downloads. And as soon as you

38:20install it, it'll appear right here.

38:22Same situation is happening with Claude

38:24or any other agent you decide to use.

38:26You install them and they appear right

38:29here. So this video is completely

38:32agnostic when it comes to the tool

38:33you're using. The thinking and the specs

38:36are what actually matters. the tool is

38:39your call.

38:41That said, here's what I'd recommend.

38:43Claude Code is amazing and you can

38:45totally use it on the sonnet model which

38:48is cost effective and that's what I've

38:50done for the past two videos. In this

38:52one, I'll be using Codex. Lately, I was

38:55able to achieve a lot with very little

38:58token spent and that's what most people

39:00are running these days. It's also the

39:02most budget option available as they

39:04have the go plan for only about eight

39:07bucks per month, a plus plan, and

39:09they're usually giving away a month for

39:11free depending on your region. In my

39:13case, I'll go with plus. Either way,

39:15I'll make sure you don't burn through a

39:17ton of tokens regardless of what you

39:19pick. And sure, you can also use a Codex

39:23app or cursor or whatever you want or

39:25this agent window in VS Code. everything

39:28works. The context and the workflow that

39:31we're going to go through and use

39:33together throughout this video is

39:35agnostic to whichever tools you or your

39:38team are using. So, go ahead and open up

39:40your agent of choice. You can do that by

39:42pressing commandshift I, which

39:44automatically opens up the chat window,

39:47and you can just select the agent you

39:48want to use. So, let's start with

39:51setting up our design foundation.

39:54Everything we defined within UI tokens,

39:57we also need to put within our

39:59globals.css before the agent touches a

40:02single component. We want to do this

40:04first and then every page we build after

40:07will be consistent from the start. If

40:09you skip it, the agent will just start

40:11guessing. So, open up CEX or your agent

40:13of choice. Moving forward, when I say

40:15codex, you can think of that as your own

40:17agent. And let's tell it something like

40:20this. Read the agents.mmd file

40:26and follow the reading order specified.

40:30Confirm once you've read all context

40:33files and are ready to build. With this

40:37prompt, the agent will read everything,

40:40confirm it's loaded, and then we build.

40:42So let's run it once to see what it has

40:44to say. And here you'll also be able to

40:47watch it do its things like read the

40:50agents MD and then finally moving

40:53through the files that we gave it UI

40:55token UI rules UI registry and so on.

40:59Now, we want to make sure that the agent

41:01uses Tailwind CSS V4, not V3. And for

41:06these types of situations, there's a

41:08package called context 7, which has

41:10up-to-date docs for LLMs and AI code

41:13editors.

41:15For example, the NexJS docs was changed

41:1754 minutes ago, better raw 20 hours ago,

41:21and here's Tailwind CSS changed 20 hours

41:24ago. You want to click on it and then we

41:26want to give this info over to our agent

41:29so that it has the latest data

41:30available. We can do that right here

41:32within our terminal by running mpx ctx7

41:36context 7 skills search tailwind CSS.

41:41It'll ask us whether you want to install

41:42the context and then you can select some

41:45of the skills. There's going to be many,

41:47but you can go with Tailwind CSS,

41:50Tailwind CSS patterns, Tailwind CSS

41:54utility components, I think, is going to

41:56be another one that we want to use. Yep,

41:59utility classes right here. And finally,

42:01the best practices. So, that's going to

42:03look something like this. And then press

42:06enter. You can install them right here.

42:08And now the agent will have both our

42:10project tokens and up-to-date Tailwind

42:13CSS v4 knowledge which means that we are

42:15ready to write the globals.css prompt.

42:19In this case we don't have to use the

42:21architect skill because there's no

42:23logic. It's just straightforward setup.

42:26So I'll tell it to read the UI tokens.m

42:30MD file and use Tailwind installed

42:35skills to check the correct Tailwind v4

42:39setup and then set up the globals.css

42:44file. This fairly detailed context and

42:47skill setup allows us to write very

42:49short and quick prompts. So you'll see

42:52now that the setup is done how we can

42:54very quickly progress through the

42:55application given that the right context

42:58has already been put into place. Give it

43:00some time to think about it. And you

43:03might want to pause this video for a

43:05couple of minutes until the agent does

43:06this on your end. For me, it took about

43:083 minutes. It first checked the Tailwind

43:11skills, verified the Nex.js docs, and

43:14only once it understood which

43:16technologies it's working with, it made

43:19sure that the CSS matches the token

43:21specification cleanly. Then it made sure

43:23that the build is running, that the

43:26fonts are being set up properly, and

43:28that's it. It set up Tailm for globals

43:31in app.globals globals using the token

43:33pattern from the context UI tokens a

43:36full theme and it also aligned the

43:39layout with the project font rule by

43:41switching it to enter. Great. So now if

43:43you want to check out the

43:44app.globals.css,

43:46it's going to look something like this.

43:48We get all of these new styles that now

43:50we can use within our application. So,

43:52back within the homepage, if you head

43:54over here and give it a class name of

43:58something like let's head over into our

44:00globals to see which fonts can we use,

44:03there's going to be the font text color

44:07info dark for example. So, you can give

44:09it a class name of something like bg

44:12info dark and also text dash white as

44:17well as text dash 3xl.

44:21And then if you head back, you can see

44:22that all of these styles got applied.

44:24This means that our globals.css

44:27had been set up properly, at least for

44:29the initial primitive colors that we can

44:30use across our application to have

44:33consistent styling. So now that the

44:34globals file has been set up,

44:36immediately in the next lesson, let's

44:38build the homepage.

— Homepage

44:42Now that our design tokens are in place,

44:44we're ready to build the first page. And

44:47this is where everything we set up

44:48starts to pay off. Since we're going to

44:51start a new session, so you can head

44:53over into codeex and exit the current

44:56session, want to start a new context for

44:58every new feature we're building. Start

45:00with a new chat. And whenever you do so,

45:03I always like to tell it to read the

45:05agents.md file and follow the specified

45:07reading order and then confirm once it's

45:10actually read out. You can think of this

45:12as a pre-step that I always like to do

45:14before I start working on more complex

45:16features. And then while it's doing its

45:18thing, we can already start prompting it

45:20to build a feature. So I'll tell it to

45:23build the complete homepage exactly as

45:27shown in and then here we can utilize

45:30our design images under context

45:34landing page.png.

45:36I want to provide it with an image of

45:38the design that you can either find

45:40online or design it using Figma or some

45:44other design tools. So as shown in and

45:47this is going to be the landing page.png

45:50file and want to say use images from the

45:55public folder when needed

45:59and run it just at the right time when

46:02it finished reading the agents MD file

46:04and all the other context files. And

46:06notice just how short that prompt is. No

46:10stack explanation, no folder structure,

46:13no UI rules because the agent already

46:16has all of that from the context files.

46:18We just tell it what to build and where

46:21the visual references. That's it. And

46:23this is where the magic happens. Codex

46:26immediately started treating this as

46:28phase 1 feature 01 homepage. So it's

46:32loading the relevant build skills, the

46:34current homepage layout files, the

46:36Nex.js local docs and available assets.

46:39So we can match the design cleanly

46:41before touching the code. The app is

46:44still very small which is good for

46:46matching the design precisely. It got

46:48the design loaded. It's going to also

46:50take a look at some images. It dissected

46:52it and it's loading the front-end design

46:55guidance. It's using the architect skill

46:58for the homepage structure and the

47:00imprint after implementation so we can

47:02keep this first feature deliberate and

47:05consistent with the project rules. And

47:07all of this is happening from a single

47:10short prompt that we gave it. We're

47:12building a fully designed marketing

47:14homepage that matches the landing page

47:17design with a topnap bar, hero, and

47:20everything else. The language that it's

47:22locking in exactly as shown. Use images

47:25from public complete homepage decisions

47:28that it's making. It made a decision to

47:31split the code into components to stay

47:34within the existing project token system

47:37and to make sure that it works on

47:38desktop but also mobile. It made some

47:41assumptions which is good and then it

47:43created a stepbystep list of how it can

47:46start doing it. Finally, after all of

47:49that, it's moving into implementation

47:52and it'll keep the component shapes

47:54close to the architecture docs.

47:57Now it's editing creating one component

47:59after another. The homepage structure is

48:02done and then it'll even lint it to

48:05check for any TypeScript or app router

48:07issues before it does the required

48:10registry or progress updates in the

48:12visual cleanup. There we go. Lint is

48:15clean. It's going to do another compile

48:18level check to catch any server errors

48:20or next images issues by running mpm run

48:23build. Looks like the production build

48:25failed, which is amazing that we ran it.

48:27So, we're able to notice this issue. And

48:29that's because Next Font couldn't reach

48:31Google Fonts from the sandbox. So, it's

48:33going to rerun that build with network

48:35approval so we can verify the homepage

48:37compiles end to end. The build is

48:41passing. It's doing the final repo

48:43required bookkeeping next, such as

48:46marking the phase one feature homepage

48:4801 complete in the tracker and

48:51imprinting that homepage patterns into

48:53the UI registry so future pages stay

48:56visually consistent. It's updating the

48:59two live docs right now, both the

49:02feature completion and the exact

49:04homepage class patterns we established.

49:07This is great. And I think even at this

49:09point, while we haven't yet checked out

49:11the output, you can see why that initial

49:15grunt work that we needed to do to set

49:17everything up is paying off

49:19significantly. While it's finishing, you

49:22can review the modified files starting

49:25from the globals where it added some new

49:27component specific styles to the layout

49:30where it updated the title and the

49:32description, which is amazing. We didn't

49:35even ask it to do that, but it did it.

49:37Here is the homepage and check just how

49:40clean that is. There's a navbar, there's

49:43a hero, there's a how it works, there's

49:45the features, success stories, call to

49:48action session exactly as I would have

49:50coded it. So to people who say that the

49:53AI generated code isn't clean and

49:56readable and scalable, simply share them

49:58this part of the video. So after the

50:00homepage, there are the individual

50:02components like the call to action

50:04section which is also super clean. the

50:07features section where it even extracted

50:09the data before the actual output. The

50:13hero section, how it works, success

50:15stories, footer, logo, all of these are

50:18just some representational components.

50:20And on top of changing these, it also

50:22updated the progress tracker.md. So we

50:26can go ahead and preview it. It simply

50:28marked the homepage as complete as well

50:32as the UI registry where now it added

50:34some new files like the landing footer

50:38so that if it needs to be reused later

50:40on, it knows exactly how a footer should

50:43look like within our application or

50:45maybe a call to action banner or maybe a

50:48testimonial section. All of these are

50:50likely to appear on other pages. And

50:53now, believe it or not, our agent

50:56documented these features for us. And

50:59thanks to the context system we have put

51:01in place, it'll simply refer to this UI

51:04registry whenever it needs to do

51:06something similar in the future. So, I

51:09guess this is the moment of truth. We

51:12have to run our application and see how

51:15does this homepage look like. I'll open

51:17it up right here in the preview. Zoom it

51:20to a proper size. And check this out.

51:23Besides these buttons, which are fully

51:25dark, which we're going to fix, and I'm

51:27super happy that there's something this

51:29obviously wrong, we're going to fix it.

51:31Don't worry. Take a look at the rest of

51:34the application. I mean, you can hover

51:36over these buttons and they move. The

51:38hero section and the font size and

51:40colors are done incredibly well. The

51:42subheading as well. It used this image

51:45from the assets and displayed it nicely.

51:48There's a second section right here.

51:50Manage your job search with ease.

51:52Another section apply with more

51:54confidence where it used another image.

51:57A full page success stories using Tom

52:00Wilson and its image from the public

52:02folder as well as a little ending part

52:05and then the footer. It did about a 99%

52:09match on the first try with no back and

52:12forth, no corrections, and no

52:14reexplaining the design system. The

52:17context files did the work up front, so

52:20we don't have to do it here. But I

52:22definitely want to fix the buttons. And

52:24thanks to our design system, we only

52:26have to fix it once. This is actually a

52:29situation where I'm going to use this

52:30new VS code add element to chat feature

52:34where I'm going to select a button and

52:36add a corrective prompt

52:39saying that all the buttons on the

52:41screen right now appear fully black

52:44background and dark text which is not

52:47visible on the dark background. Make

52:49them match the actual design and updated

52:52within the registry and the globals. So,

52:55all the buttons on the screen look

52:57great. And you can see that now we're

52:58passing it all the info and the

53:00screenshot. In the screenshot, I can

53:02actually see the text right here, which

53:04is too dark. But, as I said, the

53:06contrast just isn't good. So, we have to

53:09fix it. It's going to trace where button

53:11colors and tokens are defined.

53:14Collect all the project rules. Confirm

53:16the token intent for the button. And all

53:19of this is happening super quickly right

53:21now. It's basically doing it in real

53:22time as I'm speaking. It identified the

53:25button class usage. It found a

53:28conflicting token definitions in the

53:29repo. So, it's going to inspect it

53:31further by allowing it access to the

53:34browser. It'll now take a look at the

53:36application and see why it hasn't been

53:38done properly. It pinpointed the root

53:41cause. The text accent foreground

53:44utility is not taking effect on those

53:46dark CTAs, so they inherit dark text.

53:50It'll simply fix the globals.css, CSS,

53:52which is now super simple, modify it

53:55across all the buttons and update the UI

53:58registry so that mistake doesn't happen

54:00again. But after some time, it found

54:04that the approach wasn't being emitted

54:05into compiled CSS properly. So it tried

54:08switching back to a more reliable

54:10approach, but then at the end of the day

54:12just brought it back to dark buttons.

54:16And it told me that Copilot has been

54:18working for a while and that it can

54:20continue to iterate, but maybe we need

54:22to refine the prompt. And then I figured

54:25that in this case it did it using

54:27Copilot because when we added this

54:30inspect element, it only works with VS

54:34Code's native chat application. But

54:36instead, we can copy this prompt and

54:38paste it as a corrective prompt directly

54:41into the codeex agent or whichever agent

54:43you used because this one already has

54:46all the info from our context and it

54:48should be able to fix it without

54:49necessarily pointing to it. It knows

54:51what the buttons are. So, this was

54:54actually a good experiment. Let's see

54:56how much more powerful this agent is

54:59considering that it has the context from

55:01before when we gave it the task to

55:03actually create this landing page. Oh,

55:06wait. It actually did it super quickly.

55:08It found that the homepage was styling

55:11CTA's ad hoc and it replaced that with

55:14the landing button primary and landing

55:16button secondary classes in globals.

55:19Updated it and now it looks great on the

55:22navbar as well as on the hero section

55:25and everywhere else where the buttons

55:27are being used. I think that's right

55:29here in the footer. So you can see that

55:31one corrective prompt, even without

55:34pointing to it with our finger, was able

55:36to immediately make a huge difference to

55:39our landing page. And that's it. The

55:42homepage is now done. The only thing

55:44that you need to do if you want to stay

55:46consistent with my workflow is to save

55:49the session before we move on. So open

55:52up your chat and simply run forward

55:54slash remember. What this does is it'll

55:57save only the most important parts of

55:59the session so that the agent can refer

56:01to them later on. For example, about the

56:04buttons not being correct. And how can

56:06you know exactly what got saved? Well,

56:09it's simple. You can just head over into

56:11the memory.md file which it now created.

56:14If we preview it in markdown, you can

56:17see right here that the current state is

56:20that the homepage is fully implemented

56:22and matches the design and it knows that

56:24the next session should start with the

56:27second feature of the phase one which is

56:30the authentication. Perfect. So in the

56:33next lesson, let's implement the O.

— InsForge & Auth

56:37Now, just before we start adding

56:39authentication to our project, let me

56:41introduce you to the tool that's going

56:43to be powering the entire back end of

56:45this project, including the O. It's

56:48called Ins. And if you haven't heard of

56:50it, pay attention because it changes how

56:53you build backends with AI. Ins gives

56:57your agent a complete backend in one

56:59platform that includes authentication,

57:03database, storage, edge functions, model

57:06gateways, real-time functionalities, and

57:08the vector search and embeddings. And

57:10all of it working directly with your

57:12coding agents, which makes it the

57:14perfect fit for this video and the

57:16workflow that I want to teach you. It's

57:18not retrofitted for AI workflows, but

57:21rather built for them from the ground

57:23up. What that means in practice is

57:25instead of your agent guessing how to

57:27wire up authentication for example or

57:30writing database queries against an API

57:32that it half knows ins ships with an MCP

57:36server. Your agent then connects

57:38directly to your backend reads live

57:40schemas manages tables and configures

57:42authentication based on all of these

57:45tools and knowledge that it has. That's

57:47the difference between a copilot and an

57:49agent that actually builds things for

57:51you from the ground up. And for our job

57:54pilot project, InsForge is going to

57:56handle everything behind the scenes,

57:57including the O, the entire database,

58:00resume storage, and all of it. It's a

58:03single platform, one connection, and no

58:05configuration that we have to manage

58:07ourselves. To start hooking it up, open

58:09up your agents, start a new chat, and

58:12run the remember command. This is the

58:15first time we're using it. Specifically,

58:17we want to say restore what it

58:19remembered before. This is only going to

58:21pull up the most important history so

58:23that it can use that data to do better

58:25work in the future. Now, before we go

58:27ahead and set up ins, go ahead and copy

58:30your entire agents.m MD file as it is

58:34and save it somewhere safe. That's

58:36because when ins

58:38writes its own instructions into agents

58:40and sometimes it may overwrite your

58:42custom content and we need that content

58:44back after the setup. So, make sure to

58:46copy everything that is in here. Then

58:48head back over to InsForge. I'll leave

58:50the link down in the description that

58:52you can click on to follow along and see

58:55exactly what I'm seeing and start

58:57building today. You can log in through

58:59either GitHub or Google. And when you're

59:01in, you can create your project. You can

59:03start with JSM

59:06call it something like job pilot or

59:09maybe your own name and choose the

59:10region that is closest to you. Once you

59:12create it, it's going to load the

59:14interface and you can either install it

59:16through the CLI or you can install it in

59:19agent mode. You can proceed with the CLI

59:21or select any of the agents here. I'll

59:23go ahead and click install on the codeex

59:26part since that's what we're using.

59:28It'll give you the option of the CLI.

59:30So, you can simply copy and paste this

59:32or an MCP, which is what I want to teach

59:34you how to implement. Simply copy the

59:36installation prompt. Open up a new Codex

59:39chat and simply paste what you copied.

59:42I'm using InsForge as my backend

59:44platform. Please run this command to

59:46install the Ins MCP server. And I

59:48believe for this the medium reasoning

59:50model is going to be fine. And I'll be

59:52using GPT 5.5. This should do the trick.

59:54It'll now install the Ins MCP server

59:57with the exact command we provided. Now

59:59it said that the install command failed

1:00:01in sandbox because network access to mpm

1:00:04is blocked. So we can either run it

1:00:06manually or we can approve the

1:00:09permissions. So I'll say approve and

1:00:12it'll try it once again with these added

1:00:15permissions. Either way is totally fine.

1:00:17The next step is to restart the coding

1:00:19agent to check whether it has been

1:00:21installed properly. So to verify the

1:00:24connection we can simply start a new

1:00:26session and tell it something like I'm

1:00:29using ins as my backend platform call

1:00:32ins MCP's fetch docs to learn about ins

1:00:36and now we can see whether it'll

1:00:38actually call the ins mcp and confirm

1:00:41the connection. You can see that right

1:00:44here fetch docs. There we go. And it has

1:00:47the full info. Now open up the

1:00:48agents.mmd file. You can see that ins

1:00:51added its own contents into the

1:00:53agents.mmd file. Thankfully, I told you

1:00:56to copy your previous agents.mmd. So, we

1:00:59can still bring it back. So, right on

1:01:01top of the insk documentation, you can

1:01:03bring back what was previously within

1:01:05your agents.mmd. These instructions are

1:01:08important because they tell the agent

1:01:10how to use the backend. Your custom

1:01:12instructions tell it how to build this

1:01:14specific project, but both need to be

1:01:16here. Neither replaces one another. So

1:01:18now with ins set up we are ready to

1:01:21implement authentication. Go ahead and

1:01:24open up your agent by heading over to

1:01:26codex and within a new chat we can tell

1:01:29it something like check the progress

1:01:32tracker and also the build plan right

1:01:36because there we listed everything we

1:01:38want to do. then use the INSF forge MCP

1:01:43to fetch the latest ins

1:01:47documentation before we start

1:01:50implementing O. So again, you'll see me

1:01:53ask it to pull all the data together

1:01:56before it starts implementing things so

1:01:58that we know it's going to do it in the

1:02:00proper way. It'll read the progress

1:02:01tracker to figure out where we are right

1:02:04now in the process of developing the

1:02:05project. Then it'll check out the build

1:02:08plan to know what it needs to build next

1:02:11and finally fetch the ins docs via the

1:02:14MCP. So notice what's happening here.

1:02:17The agent is checking where we are in

1:02:19the build, what the O requires, and then

1:02:22pulling live ins documentation through

1:02:25an MCP, not some outdated data. So now

1:02:28it's going to confirm the build plan.

1:02:30The next feature is O covering UI,

1:02:33Google GitHub, OOTH, callback handling,

1:02:35and so on. It has the latest ins docs

1:02:37and the only thing you have to do now is

1:02:39to say something like start or go ahead

1:02:42given all the context we have that's

1:02:44enough to spin it up and give it the

1:02:46permission to start developing the

1:02:48feature O2 in this case O since this one

1:02:52touches routing middleware client server

1:02:55boundaries and the login UI it's going

1:02:57to use the architect skill to form the

1:03:00blueprint it knows that it has to be a

1:03:02custom ins flow and it pulled the latest

1:03:04nextGS6 16 docs where it noticed that

1:03:07middleware was replaced with proxy.

1:03:09Since most of the codebase online has

1:03:12been written with older versions of

1:03:13Nex.js, if we didn't have these very

1:03:16detailed instructions on pulling the

1:03:17latest docs and using them, it is highly

1:03:19likely that the agent would have used

1:03:22the older version of the middleware and

1:03:24placed it at the wrong spot, therefore

1:03:26breaking the app. But since we have all

1:03:28of this setup done, it did it properly.

1:03:31So, let's give it some time and see the

1:03:33implementation. Feel free to pause the

1:03:35video um as this actually took 8 minutes

1:03:38for me on medium reasoning. But yeah,

1:03:41after 8 minutes or so, it implemented

1:03:43the full O feature includes the insk O

1:03:48setup, the OOTH start routes with Google

1:03:51and GitHub, server routes for OOTH

1:03:54callback exchange, refresh and logout

1:03:56routes, Nex.js 16 route protection via

1:03:59proxy. So definitely make sure that you

1:04:01have a proxy right here in the root of

1:04:03the application and not a middleware

1:04:05file because this changed in next.js

1:04:08version 16 and our agent caught it.

1:04:11Added login UI which we'll check out

1:04:13soon. Minimal protected placeholders and

1:04:16it updated the progress tracker and UI

1:04:18registry. We also have to add thev file

1:04:21to our application because currently

1:04:23doesn't exist. And in there we have to

1:04:25add the next public ins URL and ins add

1:04:28an add-on key. So, let's do that right

1:04:30away. We don't want the agent to handle

1:04:33our environment variables. We're going

1:04:34to do it ourselves by creating a

1:04:37new.env.local.

1:04:38Heading back over to our ins dashboard

1:04:42under install at the bottom there's

1:04:44going to be API keys. It's always great

1:04:46to fetch them in case we need to use

1:04:48them later on. So, I'll look at the

1:04:50project URL. That's going to be ins

1:04:54project URL. And after that we'll have

1:04:57the next public ins URL as well as the

1:05:00next public inson key. So prep both of

1:05:04them and then simply paste the keys you

1:05:07can get directly from the dashboard. We

1:05:09can revisit this later on in case we

1:05:11need to update them. But yeah, let's go

1:05:13ahead and check it out. If you head over

1:05:15to your localhost 3000, either open it

1:05:17locally or you can open it up in your

1:05:19browser. Click get started and it'll

1:05:22redirect you to this beautifully

1:05:24designed authentication page. And now

1:05:27one thing that I want to point out here

1:05:29is that we never actually gave it a

1:05:32design for the o page itself. Keep that

1:05:35in mind. We did give it a design for the

1:05:38landing page and that included some

1:05:40primitives, some assets that it can use

1:05:42and the general idea of where we want to

1:05:44take the design of this application. But

1:05:47off page we didn't give it a design for.

1:05:50And take a look at just how polished and

1:05:53on brand this looks like. But now the

1:05:55big question is can we actually log in?

1:05:57I'll go ahead and proceed with Google.

1:05:59And it says we could not start that

1:06:01signin method. Please try again. And I'm

1:06:04actually super glad this happened

1:06:06because I get a chance to show you

1:06:08another one of the skills that I created

1:06:10and that'll become a huge part of your

1:06:12workflow. It's called recover. So go

1:06:15ahead and open up the chat that you were

1:06:18within and in the same window use the

1:06:21recover skill. So when something goes

1:06:24wrong during build, it's going to

1:06:26diagnose the problem and fix it properly

1:06:29and not just lose its way around it. So

1:06:31in most cases, it's going to be just

1:06:33enough for you to pass the error message

1:06:35that you're seeing. But you can also add

1:06:37some additional context like

1:06:38authentication is not working properly.

1:06:41Press enter and just watch how it'll

1:06:43recover itself.

1:06:45figure out exactly what the issue is,

1:06:47diagnose the problem, and then make only

1:06:50one targeted change once the root cause

1:06:53is clear. Looks like failure mode one, a

1:06:55specific thing is broken. And it was

1:06:57able to find it within a second. Root

1:07:00cause next public ins for URL is set to

1:07:02an IK key value, not the ins backend

1:07:05URL. So, we have to make the next public

1:07:07ins for URL this one right here. So

1:07:10simply head over into ourv and make sure

1:07:12that the next public infford URL is set

1:07:14to an actual URL and not a key that I

1:07:17had right here. This was on me, but

1:07:20again I'm glad to show you just how

1:07:22powerful the recover skill is. So once

1:07:24you fix the envitize

1:07:29and you'll be redirected back to your

1:07:31profile.

1:07:33Currently there is nothing there but

1:07:35just the fact that we are logged in is

1:07:37perfect.

1:07:39You can go ahead and log out if you want

1:07:41to. That's working as well. Now, if you

1:07:44go to the profile, it's going to bring

1:07:45you back to the O. And once again, you

1:07:48can just log in. And that's it. We're

1:07:51in. So, now that we know that the

1:07:53feature has been implemented properly,

1:07:55we can make use of another skill called

1:07:57review. So, after building a feature, we

1:08:00want to verify that it matches what was

1:08:02planned, respecting the system

1:08:04architecture and design standards, and

1:08:07is ready to proceed. The skill is super

1:08:09quick, less than a minute. It gives us

1:08:11back the findings. The critical one that

1:08:13oath wasn't able to start without the

1:08:16proper env. That's on me. Uh that the O

1:08:19route handlers do not follow the

1:08:21required error handling. Okay. Do not

1:08:24wrap the route logic in try catch as

1:08:26project standards require every route

1:08:28handler to catch log errors and return

1:08:30human safe responses. The ooth buttons

1:08:33use a link to sideffecting API routes.

1:08:37In production link behavior can include

1:08:39pre-fetching, navigation optimizations,

1:08:41side effects and so on. So that's

1:08:43something that we can fix. So it found

1:08:45the issues. The plan pieces are mostly

1:08:47present. Login UI, Google GitHub oath

1:08:50routes and so on. Some issues that we've

1:08:52seen. So now before we move on to

1:08:54implementing the next feature and you

1:08:56can see it already knows what it is

1:08:57because of our context files, we can

1:08:59tell it to fix it. It quickly noticed

1:09:02that we fixed the env issue oursel and

1:09:05then it also fixed the following review

1:09:07issues and updated the UI registry for

1:09:09the button and the pattern. So that's

1:09:11great. We'll need to restart the Nex.js

1:09:14server to pick up the corrected env. But

1:09:17yeah, now that everything is done, I

1:09:19also want to run the imprint skill. So

1:09:21after building any UI components, we

1:09:23want to extract the visual patterns that

1:09:25matter for consistency and save them to

1:09:28the UI registry. In this case, it looks

1:09:30like it already updated the UI registry,

1:09:32but just in case it missed some stuff

1:09:34while doing the review, I'll run this

1:09:36skill manually. And in about 10 seconds,

1:09:38it imprinted the login card. So, the

1:09:41final thing we need to do is run the

1:09:43remember skill to save what matters at

1:09:45the end of the session because this was

1:09:47a good one. And you can also run save.

1:09:50And finally, it saved it all in the

1:09:52memory. So that in the next session, we

1:09:54can simply run remember restore to pick

1:09:56it up from here. Let's keep building.

— PostHog Analytics

1:10:00Now that we have the landing page, the

1:10:03auth

1:10:04page, I think this is the right point to

1:10:07start tracking what's happening within

1:10:10your application. Because that's the

1:10:12question that most developers never ask

1:10:14until it's too late. How do you know

1:10:16that your app is actually working the

1:10:18way you think it is? Not does it

1:10:20compile, but are users actually finding

1:10:23the jobs within the platform? Are they

1:10:25generating the cover letters or creating

1:10:27their accounts and profiles? Without

1:10:30that data, you're just guessing. And

1:10:32guessing on a product you just shipped

1:10:34is how you end up optimizing the wrong

1:10:36things. That's why I want to introduce

1:10:38Post Hog in this stack. It's open-

1:10:41source, built for engineers, not

1:10:43marketers. And it includes event

1:10:46tracking, funnels, session replays,

1:10:48feature flags, all within one platform.

1:10:51As we continue developing Job Pilot,

1:10:53you'll see exactly what it does, but

1:10:55basically it tracks every meaningful

1:10:57user action and it powers the three

1:11:00analytics charts that we'll show on the

1:11:02dashboard. Every job search, every cover

1:11:04letter generated, and every resume that

1:11:07we created for our users, and Posthog

1:11:10will capture it. So, let's set it up.

1:11:13Click the Post Hog link down in the

1:11:14description and create your free account

1:11:16if you don't have one already. You can

1:11:18choose your region and sign in with any

1:11:21platform that you prefer. If you're

1:11:22creating it for the first time, you need

1:11:24to create a new organization. You can

1:11:26call it something like JSM_. And then

1:11:28enter either your name or the name of

1:11:31your organization. And then also select

1:11:33your role. Most likely it's going to be

1:11:35an engineering. And if you have a second

1:11:38also you can say JavaScript mastery

1:11:40right here in where did you hear about

1:11:42us? So let's create the organization.

1:11:45and it's going to ask you what do you

1:11:47want to do with Post Hog. In this case,

1:11:50we want to understand how our users

1:11:52behave. That's the closest match to what

1:11:54we're building. We can turn on the

1:11:56product analytics, the session replay,

1:11:58the web analytics, and later on we'll be

1:12:00able to add all of this additional stuff

1:12:02as well. So, let's go. I'll say it out

1:12:05loud. Post Hog has the best iname setup

1:12:09wizard. You just used one single command

1:12:11and no matter which framework you use,

1:12:14it'll install and set up Post Hog and

1:12:17also add the initial event tracking

1:12:20specifically tailored to the application

1:12:22that you're building. So back within the

1:12:24application, you can open up a new

1:12:25terminal and run MPX-Y

1:12:28add post hog wizard at latest and you

1:12:30can also add the region. I'll expand

1:12:32this so we can see what's happening.

1:12:34It'll likely ask you whether you want to

1:12:36install the post hog wizard installer.

1:12:39And as it says, let's do 2 hours of work

1:12:41in 8 minutes. Directory recognized.

1:12:45Framework is here. And we want to do the

1:12:47post hog integration. So continue.

1:12:50It's going to ask us to authenticate

1:12:52within our browser. That was quick. And

1:12:55now on the left side, it'll keep telling

1:12:57us some stuff about the agent and how it

1:13:00works, like some helpful tips in a game

1:13:02while it's loading the next level. Here,

1:13:05it's not loading the next level, but

1:13:06rather analyzing our project and setting

1:13:09up its own tasks. First, it needs to

1:13:12plan which event it's going to track.

1:13:14Then, it needs to install Post Hog,

1:13:16initialize the Post Hog client, capture

1:13:18the events, identify users, and finally

1:13:22create the Post Hog dashboard. This is

1:13:24going to take a couple of minutes. So,

1:13:26go grab some coffee and pause the video

1:13:29and I'll be right back. And after the

1:13:32setup is done, it'll detect all of the

1:13:34agents we have. And it's asking us

1:13:36whether we want to install the Post Hog

1:13:38MCP server and plugin as well. I'll

1:13:40proceed with doing that and I'll do it

1:13:42for Visual Studio Code and Cloud Code.

1:13:44And we'll give it access to everything.

1:13:47Now, what this does is it allows you to

1:13:49just ask your agent plain text questions

1:13:52about some of the funnels or features

1:13:54within your application and then it can

1:13:56access all of the data from your Post

1:13:59Hog dashboard and make more intelligent

1:14:01decisions on implementing some things

1:14:03within the codebase. For example, you

1:14:05can ask it what are the top five errors

1:14:07in my project this week. is going to

1:14:09return it and then you can continue

1:14:11speaking with your agent to fix them or

1:14:13show me a full stack trace for the most

1:14:15recent crash and then propose a fix. You

1:14:18can go deeper across many different use

1:14:20cases, but yeah, definitely go ahead and

1:14:22install it. So now that Post Hog has

1:14:24been initialized, I'll head back over to

1:14:26our agent. We'll start a new codec

1:14:29session. We can tell it to use Post Hog

1:14:32to track some events within our current

1:14:36application.

1:14:38Even though we don't have a lot

1:14:39happening right now, it should be able

1:14:41to use the MCP and our current codebase

1:14:44and figure out a couple of things it can

1:14:46track already just so we can verify

1:14:48everything is working. The agent nicely

1:14:51understands that the current UI is still

1:14:53in the O foundation phase. So most of

1:14:56the approved business events don't have

1:14:57live workflows yet. It's going to add it

1:15:00just for initialization, user identify

1:15:02and reset, and a typed server tracking

1:15:05helper for the approved event names for

1:15:07the profile job flows later on. That's

1:15:11all that I need for now. And there we

1:15:12go. It added a couple of events that

1:15:14allow us to identify our users on logout

1:15:18or when they visit the dashboard and so

1:15:20on. So, let's quickly test it out by

1:15:22heading back over here. I'll sign out.

1:15:25I'll continue with GitHub one more time

1:15:27to log in.

1:15:29visit the homepage, the profile, the

1:15:31find jobs, and the dashboard. And back

1:15:34within the onboarding, you should be

1:15:35able to see installation complete. If

1:15:38for you, for some reason, it still says

1:15:40that it's waiting for some events to

1:15:42happen, what you can do is click need to

1:15:44set up manually, choose Nex.js, and then

1:15:48right here under the second step, you

1:15:50can manually copy the env.local.

1:15:54then restart the application, log out

1:15:57and log in one more time and switch a

1:15:59couple of pages. And at that time, it

1:16:01should say that it auto captured

1:16:03something new. Either way, you can click

1:16:05skip or next to continue setting up our

1:16:08configuration. I'll leave all of these

1:16:10three options turned on, such as auto

1:16:12capturing front-end interactions so that

1:16:14we automatically track clicks, submits,

1:16:17and more. I mean, a couple of years ago,

1:16:19I wouldn't know what to do with that

1:16:20data. But now that we have the AI, it

1:16:23can make sense of it. So, you're

1:16:25immediately getting so much more

1:16:26valuable info. Heat maps are useful if

1:16:29you can capture generally where people

1:16:31are clicking, moving their mouse, and

1:16:33scrolling to. And then also web vitals,

1:16:36super useful info to have. While we're

1:16:38here, you can also enable session

1:16:40replays because sometimes it might not

1:16:42be clear what's happening just from the

1:16:44clicks. If a user stops scrolling and

1:16:46just stares at one portion of the

1:16:48screen, you want to get in their shoes

1:16:50and see what they're seeing. That's what

1:16:52the session replays are for. So, I'll

1:16:54enable them, too. And finally, you can

1:16:56choose between one of the two free

1:16:58plans, either pay as you go, starting

1:17:00completely for free, giving you up to 1

1:17:02million events, 5,000 session

1:17:05recordings, and 1 million feature flag

1:17:07experiments, or for now, you can just

1:17:09start completely for free. That'll bring

1:17:11you directly into your Post Hog

1:17:13dashboard. There's a quick start that

1:17:15you can start off with, but also under

1:17:17browse, you can head over into activity

1:17:19and check out exactly what is happening

1:17:21within your application. You can see

1:17:23that we're trying to identify some

1:17:25users. Those users are clicking the form

1:17:28and moving across our application. This

1:17:31is just the start. We've started

1:17:33collecting the data. But later on, as we

1:17:35implement some actual features of our

1:17:37app, we'll start making sense of the

1:17:39data. And the biggest help for that is

1:17:41going to be Post Hog AI. So stay with

1:17:44me. Let's implement a couple features

1:17:45together and then we'll come back to

1:17:47Posthog to show you how to truly

1:17:49understand what your users are actually

1:17:51using your app for and how you can

1:17:54improve it based off of the data that

1:17:56we're now tracking.

1:17:58Great work. Once that is done, you can

1:18:00get back to one of your agent chats and

1:18:03tell it that I've initialized PostHog

1:18:05using the Post Hog wizard. So review it

1:18:09by using the review skill

1:18:12and remember

1:18:14save what we did. That way we'll update

1:18:17our context and we'll be able to move

1:18:19directly to the next feature. And this

1:18:22is also a cool little tip that shows you

1:18:24that you can use multiple skills in the

1:18:26same prompt. This took less than a

1:18:28minute. It provided us with a review.

1:18:31Everything passed and it saved it to

1:18:33memory. So in the next lesson, let's

1:18:35focus on maybe the most important part

1:18:37of the app, and that is the database

1:18:39schema.

— Database Schema

1:18:42The database schema is the foundation

1:18:45everything else sits on top of. If you

1:18:47get this wrong, you'll be tracing bugs

1:18:49all the way to bad column decisions you

1:18:52made at this point. So this is exactly

1:18:54the moment to use our architect skill

1:18:56before touching anything. So go ahead

1:18:58and open up your agent. And in this

1:19:00case, I actually want to switch over to

1:19:02cloud code to show you that these

1:19:04context files and the workflow that I'm

1:19:07teaching you is completely agent

1:19:09agnostic. I'll use something like sonnet

1:19:11on a high effort within it. You also

1:19:14want to make sure that you have access

1:19:15to the skills. So if you run something

1:19:17like remember, it needs to be there. If

1:19:19it's not, you can open up the terminal

1:19:22in a new window and run MPX skills add

1:19:25latest add JavaScript mastery pro

1:19:28skills. Add all five skills and make

1:19:31sure to add them for cloud code. Once

1:19:33that is done, you can run remember like

1:19:36this and say restore to restore the

1:19:38previous session. It'll automatically

1:19:41figure out what we want to do. Reading

1:19:43the memory file and project context to

1:19:45restore the session state.

1:19:47Perfect. Post hog got implemented wired

1:19:50up. And now we have to do the database

1:19:52schema. Now we can use the architect

1:19:55skill to tell it to architect the

1:19:58feature number four. It'll read all the

1:20:02relevant context files before it talks

1:20:04to us and produce a full implementation

1:20:07plan for the database schema, tables,

1:20:10columns, types, relationships,

1:20:12absolutely everything. And it'll give us

1:20:14that plan so that we can actually review

1:20:17it and tell it whether it's a go or a

1:20:19nogo. And pretty quickly, actually in 30

1:20:22seconds, the agent came back to me and

1:20:25it looks like it wants to have a

1:20:26conversation. First, it's making sure

1:20:28that we're speaking the same language.

1:20:31Rowle security policy. I understand this

1:20:33as posgress RLS rule attached to the

1:20:36table that automatically filters every

1:20:38query to only the current user's rows

1:20:41using o ID. Users can never read or

1:20:44write another user's data even if they

1:20:47craft a direct API call. Is that right?

1:20:50Yeah, that is right. Authenticated

1:20:52access only. Yep, that is pretty clear.

1:20:55And then schema creation. Yep, this is

1:20:57exactly what we want to do against the

1:21:00ins posgress database not generating

1:21:02migration files. I think the reason why

1:21:04it's asking me all of these decisions is

1:21:06because I had not the plan mode, but I

1:21:09think I had the thinking turned on. It

1:21:12might not even be necessary. So for now,

1:21:13I'll simply tell it to proceed with

1:21:16suggested decisions and then it'll get

1:21:19the implementation plan and start

1:21:21working on it. There we go. This is a

1:21:23pretty hefty plan, 12 steps. Confirm and

1:21:26I'll start building. And I'm super glad

1:21:28it asked me to confirm because we

1:21:31installed the Ins MCP for Codeex. But to

1:21:34make it truly agnostic, you also have to

1:21:36install it for the other agent you're

1:21:38using. So back within InsForge, you can

1:21:40click install. Go ahead and choose cloud

1:21:42code which is the first version and you

1:21:44can do it either through CLI or MCP.

1:21:47Either way works. Let's do CLI this

1:21:49time. I'll just tell it I confirm. But

1:21:52before do the following

1:21:56and then paste what we have. So that way

1:21:58it'll get all the information about ins

1:22:01and it'll know how to set up our Ins

1:22:03database properly. The ins cli is now

1:22:06installed and linked and now it'll load

1:22:08the ins skills before proceeding. That's

1:22:10exactly what I meant when I said that

1:22:12Ins was built agentic from the ground

1:22:15up. So agents can work with it so

1:22:18naturally and build entire backend

1:22:20systems with o databases and more. There

1:22:23we go. Clean slate, no tables, no

1:22:26migrations. Let's proceed with the full

1:22:28implementation. I'm assuming this one

1:22:30will take a bit longer. So pause the

1:22:33video and I'll be right back. And after

1:22:36doing some thinking and implementing and

1:22:38then thinking and reading and writing it

1:22:42finalized the feature updated the

1:22:44progress tracker in the UI registry. So

1:22:46phase one with features from 0 to 4 for

1:22:50being the database schema are now

1:22:52completed. It updated the progress

1:22:54tracker and it applied the migrations.

1:22:57The backend through ins is now built.

1:23:01Four tables applied via CLI migrations.

1:23:04There is tables for profiles, agent

1:23:06runs, jobs, and agent logs. All of which

1:23:09are going to start making sense very

1:23:10soon as soon as we start adding the

1:23:12features. Only the authenticated users

1:23:14can perform operations and the rest of

1:23:16the stuff has been completed. Now, if

1:23:18you head back over to InsForge,

1:23:21specifically under database, you'll see

1:23:23four different tables, which means that

1:23:25all of them have been successfully

1:23:27created. The agent didn't write a

1:23:29migration file or configure a connection

1:23:32string. It created all four tables

1:23:35directly through the INSForge MCP. And

1:23:38that's what agent native infrastructure

1:23:40looks like in practice. Agent logs is

1:23:43going to be the agents paper trail. Like

1:23:46every step that it takes during a run

1:23:48will get written right here with info,

1:23:50success, warnings, errors. So if

1:23:52something goes wrong during a job

1:23:54search, this is where you find out

1:23:56exactly what happened and why. But

1:23:59again, that's going to start making more

1:24:00sense soon. agent runs. Every LinkedIn

1:24:04search the agent performs gets logged

1:24:06right here. Job title, searched,

1:24:08location, how many jobs were found, when

1:24:11it started and completed. This is how

1:24:13the dashboard knows what searches

1:24:15happened. Finally, the jobs, every job

1:24:18discovered or imported, match score,

1:24:21cover letter, specifically made for each

1:24:24user. That's the entire job hunting

1:24:26history in one table. And then there are

1:24:29the profiles. Every user's career data

1:24:32will live right here. Name, skills,

1:24:34experience, resume, LinkedIn contact ID.

1:24:38This is what the agent reads when it

1:24:40scores a job against you. And if you

1:24:42open up storage here, you'll see just

1:24:45empty résumés. Every ré operation in

1:24:48this app will read and write to this

1:24:51bucket. And since we can already see the

1:24:53four database tables and the storage

1:24:55bucket, that tells us that everything

1:24:57has been implemented properly. So you

1:25:00can run forward sl remember

1:25:03to use the remember skill and say save.

1:25:06It'll figure out that we wanted to use

1:25:08the remember skill and update the

1:25:11memory. So if you check it out, you'll

1:25:14see that the phase one foundation is

1:25:15100% complete, features one to four,

1:25:18live ins backend has all four tables, 20

1:25:21RLS policies, two triggers, and one

1:25:24private storage bucket types exists.

1:25:28No app level code touches the DB yet.

1:25:31That's going to start soon in phase two.

1:25:33And it says that these open questions

1:25:34from previous sessions haven't been

1:25:36resolved. I didn't consider them that

1:25:37important, but it's good that it's

1:25:39keeping track. So from the next lesson

1:25:41onward, we'll start focusing on the

1:25:43profile page UI. And considering that

1:25:46the phase one is now done, I think it's

1:25:48due time to actually push this code over

1:25:50to GitHub. So head over to

1:25:53github.com/new

1:25:55and create a new repo which you can call

1:25:58job pilot or whichever name you prefer.

1:26:01Then just create it. And you can push

1:26:04over to it

1:26:06by opening the terminal. And we can do

1:26:09this manually. And even though you don't

1:26:10have to do this manually, you can just

1:26:12copy and paste all that into your agent.

1:26:14Old habits die hard. So I'll say get

1:26:16init

1:26:18add dot get commit-m

1:26:21implement everything up to phase one get

1:26:26branch

1:26:28dash m main get remote add origin and

1:26:33finally get push u origin main.

1:26:38Perfect.

1:26:39Now, if you go back and reload, you'll

1:26:42be able to see your code appear right

1:26:43here. And I always like to clean it up a

1:26:46bit. So, you can hide the releases,

1:26:47deployments, and packages. Give it some

1:26:49topics such as agentic workflows because

1:26:52that's what we're working on right here.

1:26:55Later on, we'll be able to add the

1:26:57deployed version or deployed link of our

1:26:59application. And for now, we can give a

1:27:02quick description of the app. I believe

1:27:04our agent or the wrote that for us right

1:27:07here in the root of the application

1:27:11AI powered job search assistance for

1:27:14matching roles, tailored resumes and

1:27:16faster applications. You never know

1:27:18who's looking at your profile and it's

1:27:20always good to tidy it up a bit and to

1:27:22stay consistent. So now that the latest

1:27:25changes have been pushed, we are ready

1:27:27to start focusing on phase two of the

1:27:29application. Great job coming this far.

— Profile Page UI

1:27:35And let's dive right into the phase two.

1:27:38If you head over into the build plan,

1:27:40you'll see that our database schema is

1:27:42done and we are ready to begin phase

1:27:44two, which is the profile page. Starting

1:27:46with the UI, you always want to separate

1:27:49the concerns. Do the UI first and then

1:27:52the logic second. So in this case, we'll

1:27:54first build a complete profile page with

1:27:56UI with mock data without save logic.

1:28:00Within the UI, the profile will need the

1:28:02attention banner at the top, completion

1:28:04percentage ring, missing field tags

1:28:06highlighted, and so on, connected

1:28:08account section, resume section, profile

1:28:11information form with clearly labeled

1:28:13sections, and then save profile button

1:28:15at the bottom. So, let's simply open up

1:28:17a new window. I'll head over to clot

1:28:20code, and I'll tell it to remember, but

1:28:23specifically restore what we remembered

1:28:25before. It'll read the memory file and

1:28:28restore our session.

1:28:30There we go. Now it knows exactly what

1:28:32we focused on.

1:28:34So the next thing we have to do is

1:28:35simply tell it to build a profile UI.

1:28:38And just so it stops asking these open

1:28:39questions, I'll say you can close the

1:28:43open questions. And then we can tell it

1:28:45to build the complete profile exactly as

1:28:49shown in the profile.png.

1:28:53That's going to be within context

1:28:55designs profile. And run it. Let's give

1:28:58it some time to implement it and then

1:29:00we'll go over it together. After getting

1:29:02the full context, it's going to start

1:29:03building the profile page components.

1:29:05It'll start by writing some to-dos for

1:29:07itself. Looking at the design, it needs

1:29:09to build these components, the profile

1:29:11attention banner, the connected

1:29:13accounts, resume section, profile form,

1:29:15and then update the page to compose

1:29:17everything. Then it formed that into a

1:29:19list of to-dos, and it'll proceed

1:29:22working on them one by one. And after a

1:29:24couple of minutes after it implemented

1:29:26it, it also updated both context files

1:29:29in parallel. The progress tracker where

1:29:32it now says that it implemented the

1:29:34profile page UI as well as it marked it

1:29:37as complete right here. It also modified

1:29:40the UI registry to add the components

1:29:42that now it knows how to build and it

1:29:44gave us a quick rundown of everything

1:29:46that was implemented. So what do you say

1:29:48that we go ahead and check it out? Back

1:29:49within the application, if you head over

1:29:51to the profile page, you should be able

1:29:53to see something that looks like this.

1:29:55Oh, and before, as I was building the

1:29:57application, I first experienced an

1:29:59issue with the redirect to the profile

1:30:01page. This specifically happens when you

1:30:03sign out and then try to sign back in.

1:30:06If that happens to you, you can very

1:30:07easily fix it by telling the agent

1:30:10what's happening. Run the review, fix

1:30:12the homepage button, and make sure that

1:30:14the profile page is accessible after

1:30:16login. So take a look at how well this

1:30:18matches the design of our application.

1:30:20Even without comparing it to the

1:30:22original, it's looking amazing. But if

1:30:24there's something that is off, you can

1:30:26simply take a screenshot from here and

1:30:28also take a screenshot from the final

1:30:30design and tell it to fix it. So profile

1:30:33is 70% done. We need to insert some more

1:30:36information for better matches. We'll

1:30:38soon need to connect our LinkedIn

1:30:40account. Then here we'll be able to

1:30:42upload our resume, enter our profile

1:30:44information, and with all of that info,

1:30:47soon enough, this application will

1:30:49simplify our job application process

1:30:51significantly. In this case, it already

1:30:54updated the UI registry. But in case you

1:30:58want to be sure, you can just run

1:30:59imprint manually, and then it'll check

1:31:01whether it added some new components

1:31:03that we might want to reuse later on. It

1:31:05says this was already done during the

1:31:07build session, so that's amazing. With

1:31:09that in mind, you can simply run

1:31:10remember save to save what we did in

1:31:13this session. That'll save it to our

1:31:15memory, which means that immediately in

1:31:17the next lesson, we can start working on

1:31:19the profile save logic. So, let's do

1:31:23that next.

— Profile Save Logic

1:31:25Now that the UI is done, let's wire it

1:31:28up. The profile form looks good, but it

1:31:31doesn't do anything yet. No saves, no

1:31:34database rights, and no file uploads. So

1:31:37let's change that. First we want to open

1:31:40up the chat and we want to restore the

1:31:43latest session or in this case since

1:31:45we're working just on the profile the UI

1:31:47first and now the logic we can keep it

1:31:49within the same page. What we want to do

1:31:51in this lesson has some real logic

1:31:53behind it through server actions file

1:31:56uploads through ins for storage

1:31:58completion tracking and path

1:32:00revalidation. So before the agent

1:32:02touches any of it we need to plan it. So

1:32:05switch over to the plan mode. You can do

1:32:08that right here from edit to plan mode

1:32:11and then use the architect skill that we

1:32:15have and tell it to architect the

1:32:17feature 06

1:32:20and press enter. Feature 06 is obviously

1:32:23coming from the build plan. So if you

1:32:25take a look at right here, you'll see

1:32:27that we need to wire up the profile form

1:32:30to insb

1:32:31through server actions. Resume uploaded

1:32:34to ins storage. Resume PDF saved to

1:32:37profiles is complete set to true.

1:32:40Completion percentage and missing fields

1:32:42calculated form prefilleds with existing

1:32:44data and revalidate on save. So let's

1:32:49see how well it's going to plan the

1:32:50feature and then we can actually start

1:32:52executing it. and it thought through all

1:32:55the key decisions and wrote the plan.

1:32:57The plan is thorough and aligns with the

1:33:00project architecture. So, it's just

1:33:01going to verify in sport storage SDK

1:33:04types and any existing usage and then it

1:33:07has everything it needs. It created its

1:33:09plan right here under feature 06 profile

1:33:12save logic. You can even review it. This

1:33:15is the full plan and we can open it and

1:33:18preview it in markdown. So, think of

1:33:20this as a more detailed version of our

1:33:23build plan right here. Using the

1:33:25architect skill in plan mode makes it

1:33:27super powerful and I think it started

1:33:29building it out on its own. So, after

1:33:31you review the plan, you can switch back

1:33:34to the editing mode. Again, sonnet with

1:33:37medium or high thinking is going to be

1:33:38enough because it doesn't have to do the

1:33:40thinking. It has to just write code

1:33:43which has become a commodity nowadays.

1:33:45It's all about the thinking. So now we

1:33:47can simply say to implement the feature

1:33:5006. So picking exactly where we left

1:33:52off, it'll start implementing the full

1:33:55logic. Couple of minutes after the

1:33:57feature 06 is now complete. And here's

1:34:00what was built. It added the actions

1:34:02file. Under actions, it added a

1:34:04profile.ts action file with two actions.

1:34:08Save profile and upload resume. And then

1:34:11under profile util it added a calculate

1:34:14completion shared between page and

1:34:16server action. It also modified five

1:34:19additional files. So now we want to test

1:34:21the form by saving some real info and

1:34:23then reload the page to check whether

1:34:25it's working properly. Make sure your

1:34:27application is running on localhost

1:34:293000. You can see that now we're at 0%.

1:34:34And we can start filling in some info.

1:34:36I'm Adrian at JSMy. For some reason, I

1:34:40cannot enter my email most likely

1:34:42because it should be picked from my

1:34:44account, but okay, we're going to look

1:34:45into this later. Here, you can enter the

1:34:48phone number. For now, I'll enter some

1:34:50random numbers. Location, let's go with

1:34:53New York, maybe one day. Then you can

1:34:57enter your LinkedIn URL as well as your

1:34:59GitHub one. For work, you can choose

1:35:02your work authorization, some

1:35:03professional info, experience level,

1:35:05years of experience, technologies you're

1:35:08proficient in. Notice how nicely it adds

1:35:11these chips as you type, industries

1:35:13worked in, and then you can add work

1:35:15experience. I mean, this is a pretty

1:35:17hefty form and it would take a lot of

1:35:19time to design and develop it, but here

1:35:22it just feels so natural. We can do JS

1:35:25mastery. Of course, here you would

1:35:28actually be entering the data for

1:35:29yourself. I don't remember when we

1:35:31started it, but it's going to be about

1:35:3210 years now. Oh, and there's no end

1:35:35date in sight. Key responsibilities,

1:35:37I guess, everything. Of course, you can

1:35:40be a bit more detailed, so you give your

1:35:41AI a bit more info to work with. You can

1:35:43go ahead and fill in your education,

1:35:46which year you graduated, institution

1:35:48name, and so on. And which position are

1:35:50you seeking, whether you want it to be

1:35:52remote or on site, and then an optional

1:35:55salary expectation.

1:35:57Cover letter, we can make it concise,

1:36:00and prefer locations if you have any. Go

1:36:03ahead and save the profile.

1:36:05It says profile saved successfully,

1:36:07which is great. So now if you reload,

1:36:10oops, it looks like it didn't save what

1:36:13we just wrote. I guess I should have

1:36:14tested it by filling it just a couple of

1:36:16spots and not everything. But that's

1:36:18fine because this is the perfect place

1:36:20to use the review skill. I'll simply

1:36:22turn on the review and tell it form

1:36:26saving doesn't

1:36:28work. And now it'll review the type of

1:36:30bug we're experiencing, figure out

1:36:32exactly where it's coming from, and

1:36:35figure out a way to fix it. So, let's

1:36:37give it a minute. Very quickly, it came

1:36:39back with a full review. Developer

1:36:41reports form saving doesn't work. It

1:36:43figured out there's a couple of

1:36:44mismatches.

1:36:46Server actions are called directly from

1:36:48client components. They require being

1:36:50imported and called as functions, which

1:36:52is what the code does. So, this part

1:36:54should work. Server actions inside start

1:36:57transition in XJS must be called

1:36:59differently. Okay, I'm pretty sure this

1:37:01is going to be the fix. So, it posed

1:37:03some other issues that it found. a

1:37:05couple of critical ones, a couple of

1:37:06important ones, and then a minor one.

1:37:08Resolve issues one, two, and three

1:37:10before moving on. So, I'll simply say

1:37:13resolve

1:37:16and then we'll retest it. And very

1:37:18quickly, it applied all three fixes. So,

1:37:21now if I try changing my name right here

1:37:24to something like Adrian and then click

1:37:26save profile, it's going to say save

1:37:29profile successfully. the name is going

1:37:31to remain there, but then when I reload,

1:37:33it's actually gone. So, it still didn't

1:37:36fix it. I'll add review one more time

1:37:40and tell it that even though we get

1:37:44profile saved successfully after

1:37:46clicking the button, after reloading,

1:37:50the data is still

1:37:53not being saved. Let's give it a second

1:37:55chance. This is the first time it

1:37:58actually didn't fix it right after the

1:37:59first one. And about 2 minutes after

1:38:01it's back with another solution. The

1:38:04proxy.ts file exists with the correct

1:38:07route protection logic, but it is not

1:38:09wired as a Nex.js middleware. Next

1:38:12middleware must be in a file named

1:38:14exactly middleware.ts

1:38:16at the project root. Proxy is therefore

1:38:20never executed. But I'm not sure whether

1:38:22this is correct because if you take a

1:38:24look at the latest page of the docs

1:38:26directly in Nex.js, it's now called a

1:38:28proxy. Starting with NexJS16, middleware

1:38:31is now called a proxy. The functionality

1:38:34remains the same. So the way it works,

1:38:36you create a proxy file instead of a

1:38:38middleware file. And if you go ahead and

1:38:40search for middleware, rewrites you to

1:38:43proxy. So in this case, I think the AI

1:38:45made a mistake. So what we can do next

1:38:47is tell it once again to review its

1:38:49implementation by checking the

1:38:51documentation page that we found and

1:38:53then verifying his claim about the issue

1:38:56number one that it specified. Sometimes

1:38:59you still have to take the wheel and

1:39:01immediately in a matter of seconds it

1:39:04retracted what it thought was wrong

1:39:06about the code. So third times the

1:39:08charm. Let's see if it can actually fix

1:39:10it now or will I have to teach you some

1:39:12other way to fix these types of issues

1:39:14where AI really loses its mind. Either

1:39:17way works for me and that's because

1:39:19these videos are unscripted as it's the

1:39:21only way you can really learn a lot from

1:39:23them. Okay, so now it came back with two

1:39:26fixes. backfill the missing profile row.

1:39:29So, it's going to insert some of the

1:39:31info that was missing from before and

1:39:33then detect the zero rows updated in

1:39:35save profile. Okay, sure. That's a very

1:39:38simple fix. So, let's see whether that's

1:39:40going to make a big change. Very

1:39:42quickly, both fixes got applied. So, if

1:39:45we head back over here, you'll see that

1:39:48now our email is getting prefilled from

1:39:50our authentication info, which is great.

1:39:52And if I enter my name and click save

1:39:55profile, it actually jumped up to 22%

1:39:58and my name is filled in. And it's there

1:40:01even after I reload. So, let me go ahead

1:40:03and fill out some more fields. For

1:40:04example, the full personal info part and

1:40:07click save. It's still here. And we're

1:40:09now at 44%. So, just so you don't have

1:40:12to watch me refill everything I've done

1:40:14before, I'll go ahead and pause the

1:40:16recording and then you can do the same

1:40:17thing on your end and we can continue

1:40:19then. And finally, we are at 100.

1:40:22Potentially, after we upload the resume,

1:40:24it's going to say that the profile

1:40:26doesn't need any more attention. But

1:40:27right now, it says 100%. So, it is a bit

1:40:30misleading. I'll simply take a

1:40:32screenshot, go back to the code, and

1:40:34hold shift to be able to drag and drop

1:40:37files into it. And then I'll tell it

1:40:40when at 100%. It shouldn't say profile

1:40:46needs attention. Fix it. This is just a

1:40:49very simple corrective fix. There we go.

1:40:52It is done. So now when you're at 100,

1:40:54that banner will simply disappear. So

1:40:57let's update the progress tracker and

1:41:01run remember

1:41:03save to save all of it to the memory.

1:41:06After that is done, the profile now

1:41:08saves. And if I'm not mistaken, the résé

1:41:11form should allow us to upload them

1:41:13already. So I'll simply Google for a

1:41:16fake ré.pdf. PDF and I'll download it as

1:41:19a PDF and then you can simply drag and

1:41:22drop it. Notice how nice this looks

1:41:24like. It'll upload it.

1:41:27Resume uploaded successfully. And if you

1:41:29reload, we'll also be able to view the

1:41:31current resume if we had the permissions

1:41:33to do so. That's a little fix that we

1:41:35can make. When we click on that button,

1:41:37we can't actually see it. So, I'll copy

1:41:40this error and say review. When clicking

1:41:45on view current resume, it leads to and

1:41:50then you can paste the URL that it leads

1:41:52to and then say what it shows. It'll

1:41:55analyze it, figure out what the issue is

1:41:58and allow us to preview the resume that

1:42:00we just uploaded. The diagnosis is

1:42:02thankfully very straightforward as it

1:42:04says right here. The issue is that the

1:42:06get public URL was used on a private

1:42:09bucket which was architecturally wrong.

1:42:12as the build plan states to create

1:42:13résumés storage bucket with

1:42:15authenticated access only and feature 04

1:42:19explicitly created it as private. So we

1:42:21should instead use the download via

1:42:23server route handler instead. So let's

1:42:25just say resolve. There we go. The

1:42:28changes got applied. So now if we view

1:42:30the current resume, it'll simply

1:42:32downloaded and displayed in the browser.

1:42:34Wonderful. Profile saved, résumé

1:42:37uploaded, URL written back to the

1:42:40database. And there was zero

1:42:42infrastructure that we had to manage.

1:42:44Ins handled the storage, the database,

1:42:47write, the RLS policies, and we just

1:42:50told the app what to save. Most back-end

1:42:52platforms were built for humans clicking

1:42:55through dashboards. Ins was built from

1:42:58the ground up for the agents. The MCP

1:43:01gives codecs or cloud code direct access

1:43:04to your schema, migrations, o and

1:43:07storage, all without leaving the

1:43:09session. They just relaunched as the

1:43:11open-source AWS for coding agents and

1:43:15shipped backend branching, git style

1:43:17branching for your entire backend. So

1:43:19your agent can experiment safely without

1:43:22touching production. It's open- source Y

1:43:25Combinatorbacked and again I'll leave

1:43:28the link down in the description to

1:43:29check it out. But yeah, this is great.

1:43:31With that, the full profile page is

1:43:34done. So in the next step we have to

1:43:36make AI extract the additional profile

1:43:38data from the resume. So let's do that

1:43:41next.

— AI Profile Extraction

1:43:44The profile form now works. So let's

1:43:47make it smart. Right now users have to

1:43:50fill in all of this information

1:43:52manually. And let's be honest nowadays

1:43:54people have troubles filling in just

1:43:56their first, last name, and maybe the

1:43:58age, let alone this many fields. So

1:44:01instead, with the feature that we're

1:44:03going to implement right now, they will

1:44:05upload their resume, hit one button, and

1:44:08an AI will read that PDF and fill every

1:44:11field that it can automatically find.

1:44:13Name, skills, work experience,

1:44:16education, all populated within a couple

1:44:18of seconds. The user just has to review

1:44:20it, edit it if needed, and save it. So,

1:44:24let's dive right in. Let's open up one

1:44:27of our chats that we had right before.

1:44:30start a new one. And we're going to use

1:44:33the remember restore skill to load up

1:44:36the memory. Now, for this feature, I

1:44:39chose gp40 to extract all of this info,

1:44:42which means that we'll need an API key.

1:44:44So, head over to platform.openai.com

1:44:48and sign in. Once you're in, you can

1:44:50create your API key, call it something

1:44:53like job pilot,

1:44:56and create it. Then, copy it. And back

1:44:59within our application under env.local,

1:45:03you can write open AAI

1:45:05API_key

1:45:07and paste the key you just copied. Make

1:45:09sure that you have at least some kind of

1:45:10a subscription over an open AI or

1:45:13whichever other AI API key you decide to

1:45:16use. I'm sure you'll find one somewhere

1:45:18because nowadays it's always useful to

1:45:20have your AI API key on top of the

1:45:23agents that we chat with such as chat

1:45:25GPT or that we code with such as Claw

1:45:27Code. Again, you can use any model from

1:45:29Enthropic, Gemini, or whatever you're

1:45:31comfortable with. It's the same pattern.

1:45:33Just grab the key. Once you have it,

1:45:35let's go back to our chat and tell it

1:45:37that the OpenAI API key is already

1:45:40inv.local.

1:45:42And we simply want it to architect the

1:45:45feature 7. You can see that it even has

1:45:47that in mind. It says run architect for

1:45:49feature 7 AI profile extraction from

1:45:52resume flow button download PDF from ins

1:45:56then PDF parse extracts text then GPT40

1:46:00returns structure JSON form fields

1:46:02populate and user reviews and saves it

1:46:04manually. So this is exactly correct.

1:46:08I'll say correct. Open AAI is there.

1:46:11Architect feature 07. Again, you can run

1:46:14this in plan mode so that it gives you

1:46:16back the plan, but it doesn't touch the

1:46:18codebase yet until you verify how it

1:46:20looks like. So that once it actually

1:46:22comes back with a plan, we can say

1:46:24implement feature07

1:46:26and we can turn it to edit automatically

1:46:29mode. But again, let's see what it comes

1:46:32back with. And it came back with a

1:46:34complete plan. I thought switching it

1:46:36from plan to edit mode midprompt, it's

1:46:39not going to switch it immediately, but

1:46:41it looks like it did. So, it already

1:46:42started implementing that plan. If

1:46:44that's the case, that's okay with me.

1:46:46I'll just occasionally give it

1:46:47additional permissions. If it didn't

1:46:49automatically start working for you on

1:46:51the feature, instead, if it gave you a

1:46:53plan, then you can simply tell it to

1:46:55implement feature 07. And then it'll

1:46:57proceed going through the steps. And in

1:46:59about 2 minutes, feature 7 is now

1:47:01complete. It added only one new file,

1:47:04the profile page client, which is a thin

1:47:07client wrapper that owns the ref

1:47:09bridging the resume section and the

1:47:11profile form. And then it went ahead and

1:47:14modified a couple of file such as the

1:47:16profile actions file inside of which it

1:47:19added the extract profile server action

1:47:22which takes it from ins storage,

1:47:24extracts it, sends it over to GPT40 and

1:47:28then returns the extracted profile. And

1:47:30then in the resume section, there's now

1:47:32an extract profile button. So, let's go

1:47:35ahead and test it by heading back to

1:47:37your application. Uploading your resume.

1:47:40Looks like here I uploaded a fake

1:47:42profile, but it might be better to

1:47:44upload your real developer profile. I

1:47:47found something like this. This is John

1:47:49Doe. So, I've downloaded it in PDF and

1:47:52uploaded it right here. So, now click

1:47:54extract profile. And it'll tell you

1:47:56failed to extract profile from resume.

1:47:58Back within the application, it looks

1:48:00like we get an error, which is great.

1:48:02Setting up fake worker failed with a

1:48:05reason message. So, what we can do is

1:48:08open up the chat and tell it to use the

1:48:12review feature and say when clicking

1:48:15extract profile, I get this message. And

1:48:18in the console, and now we can copy and

1:48:21paste what it says right here. I get

1:48:23this. And now based on the review skill

1:48:27and the additional info that we pass it,

1:48:29it should be able to figure out what

1:48:30went wrong and fix it. So let's give it

1:48:33some time. And very quickly, the fix is

1:48:36in. Here's what changed. PDF parse v2 is

1:48:39built on PDFJS disc and always spawns a

1:48:43web worker. When the server action runs

1:48:46inside of the Nex.js bundle, Webpack

1:48:48can't resolve their worker file path

1:48:50because it only exists at a browser

1:48:52relative URL, not in server chunks. So,

1:48:55what it needed to do is remove the PDF

1:48:58bars from the actions and replace it

1:49:00with the direct usage. Set the global

1:49:04worker, add the server external

1:49:06packages, and we should now be able to

1:49:08extract the profile properly. Let's

1:49:09check if it's uploaded, and then click

1:49:11extract profile. Once again, it says

1:49:14fail to extract. And if we open up the

1:49:16terminal, the issue seems to be more or

1:49:19less the same. Before it happened right

1:49:22here under actions profile, but now it's

1:49:25happening right here under API resume

1:49:27download and then the error happens. So

1:49:30I'll once again provide all of that info

1:49:32to it and tell it review. Still the same

1:49:36issue. And I'll paste it in. And let's

1:49:39see what it says now. And very quickly,

1:49:41it says that resolves the correct

1:49:43absolute path. Restart your dev server

1:49:46for the changes to take effect. So stop

1:49:49it from running and rerun mpm rundev.

1:49:52Then head back and reload the page. If

1:49:55needed, re-upload the resume and then

1:49:58click extract profile. Once again, it

1:50:00fails. Now with the reason of invalid

1:50:03URL. So I'll copy it one more time and

1:50:06tell it to review it and paste the

1:50:08error. Two things are still wrong. So,

1:50:11it'll try to fix them. And in about half

1:50:13a minute, we have another try. Uh, once

1:50:16again, we'll stop the server from

1:50:18running and then rerun it on localhost

1:50:203000 and try to extract it again. This

1:50:24time, we're hit with an even nastier

1:50:26error, a full page one. But thankfully,

1:50:28it is just as easy to copy it and pass

1:50:31it over to our review skill. Hopefully,

1:50:34this time it gets it right. And in about

1:50:375 seconds it says clean. Restart the dev

1:50:40server and try again. The profile page

1:50:42will now load without error and extract

1:50:45profile will call GPT40 and populate the

1:50:48form. Okay, it is very confident that

1:50:51this is going to work. So let me try to

1:50:53rerun it. Go back on the page. Just for

1:50:58good measure, I will re-upload the

1:51:01resume by heading over into job pilot

1:51:03and uploading it here.

1:51:05I think it's going to get uploaded

1:51:07successfully. And now let's extract the

1:51:09profile. First of all, we don't get an

1:51:12error. Rather, there's a loading segment

1:51:14right here where it says extracting. And

1:51:17check it out. It extracted it. Profile

1:51:19fields filled in. Review and save below.

1:51:23Yep, here is our John Doe with the phone

1:51:27number, location set to Certino,

1:51:29California. LinkedIn URL. The portfolio

1:51:33URL is also picked up correctly, but

1:51:35this was a dummy resume, so that's why

1:51:36it says your website.com. For you, it's

1:51:39going to be correct. We are a midlevel

1:51:41software engineer with 19 years of

1:51:44experience. And take a look at how tap

1:51:46on all of these different skills,

1:51:48industries worked in, as well as the

1:51:51work experience, including the company

1:51:53name, job title, start date, and end

1:51:56date, as well as the key

1:51:58responsibilities. This is going to be

1:52:00super useful when matching it to job

1:52:03postings. So, it'll be able to take your

1:52:06previous work experience and then match

1:52:08it against your potential new jobs to

1:52:10tell your employers just why you would

1:52:12be the perfect fit. We also worked at

1:52:14Microsoft, high school, computer

1:52:16science. Yep, all of this is great. And

1:52:20some of the stuff also got filled in.

1:52:22So, I'll go ahead and click save

1:52:23profile. And this is it. That's the

1:52:26feature that we wanted to implement. So,

1:52:28we can simply tell it it's working now

1:52:31and then it can update the progress

1:52:33tracker and run remember save to save

1:52:38the session. With that, now that our

1:52:41resume uploads, GBT40 or whichever AI

1:52:44you chose extracts it, the forms fill

1:52:47automatically and you can verify it and

1:52:50save it. In the next lesson, we'll build

1:52:52the resume generation feature from the

1:52:55profile info. So you can also do it the

1:52:58other way around. This is going to be a

1:53:00full job application platform. So I

1:53:03wanted to make it feature-packed to help

1:53:05you with your job search. There we go.

1:53:07The memory updated. Feature 7 is

1:53:10working. So in the next lesson, let's

1:53:12focus on getting it to generate the

1:53:14résumés.

— Resume PDF Generation

1:53:17Now we're going to implement the ré

1:53:20generation feature. So, quickly head

1:53:23over into the build plan, preview it in

1:53:26markdown, and then head over to 08 ré

1:53:31generation from profile. Since I didn't

1:53:34write these nine detailed technical

1:53:36documents by hand, I worked with AI to

1:53:39define them based on the project

1:53:40requirements, which means that

1:53:42occasionally something gets missed as

1:53:44you build. And this is one of those

1:53:46moments. If you take a look at the logic

1:53:49for feature08,

1:53:51it says React Renderer right here.

1:53:54Technically correct, but something

1:53:56critical is missing. A resume isn't just

1:54:00a formatted list of data. It needs a

1:54:02professional summary, polished work

1:54:04experience, bullet points, coherent

1:54:07language throughout, right? So if we

1:54:09implement this as written without AI,

1:54:12the agent will just dump all the raw

1:54:14data into a PDF layout. Name here,

1:54:17skills here, bullet points here, all of

1:54:20it is technically correct but completely

1:54:22useless as an actual resume. So before

1:54:25we implement it, we need to fix the

1:54:27build plan to include GPT4.0.

1:54:32So you can tell it something like let's

1:54:35go to the edit mode. Generate a clean

1:54:38professional PDF resume from current

1:54:40profile data using GPT40.

1:54:43Below the read point, you can say GPT40

1:54:47generates professional resume context, a

1:54:50summary paragraph, polished work

1:54:52experience, and clean professional

1:54:54language throughout. That's the fix. And

1:54:56you can update these context files

1:54:58during the implementation or whenever

1:55:00you're adding a new feature. That way

1:55:02you can maintain the codebase and

1:55:04continuously build new features using AI

1:55:07in an existing codebase. So once we're

1:55:10done with the current features, you can

1:55:11always go down and simply add phase 5

1:55:16feature 26. Now go ahead and open up a

1:55:19new session. I'll proceed with claude

1:55:22code and simply tell it to restore what

1:55:25we previously worked on. This feature

1:55:27will have some real logic and AI work

1:55:30involved. GPT40 content generation, PDF

1:55:33rendering, and so on. So, we need to

1:55:35plan before we build, tell it to

1:55:38architect the feature 08 in plan mode.

1:55:41And let's give it some time for it to

1:55:43actually plan it out. And in a couple of

1:55:45minutes, the full plan is right here.

1:55:48And I just noticed this. You can

1:55:50actually review it, select text, and add

1:55:53comments directly on the plan. Pretty

1:55:55cool. But yeah, the idea is to add the

1:55:58resume PDF generation from profile. Here

1:56:00it defines the language, what it means

1:56:02to generate, download and so on. The

1:56:05decisions that it's going to take, the

1:56:07files which you want to change, and then

1:56:08the implementation steps. You can go

1:56:11through it, review it all in detail,

1:56:13leave some comments if you want to, and

1:56:15then that's it. Thankfully, it also

1:56:18provides a list of things that it'll

1:56:20verify before it calls it finished. So,

1:56:23if you open up your chat right here,

1:56:26it'll say the plan is now done, which

1:56:28means that you can just either tell it

1:56:30to implement it or it'll have already

1:56:32started implementing it on its own. And

1:56:34there we go. In about a minute, the

1:56:37feature 8 is now complete. It built the

1:56:40API route to generate it post handler

1:56:43and a serveron PDF component with the

1:56:47header, summary, skills, work

1:56:48experience, and so on. as well as it

1:56:51modified the résé section to add a

1:56:53generate resume from profile button. So

1:56:56if you go back to your profile and click

1:56:58generate résé from profile. Now it'll do

1:57:01it the other way around. It'll take this

1:57:03data and generate a nice looking resume.

1:57:06And check this out. John Doe, software

1:57:11engineer, Certino, California.

1:57:13Professional experience right here.

1:57:16Skills, work experience, and the

1:57:19education. This is amazing. And if you

1:57:21think that you should have some kind of

1:57:22dots, lines, colors, no, no, and no,

1:57:27this concise, simple, black and white

1:57:30textonly document is what professional

1:57:32developers use to get hired. And now you

1:57:35can do that, too. Of course, as you fill

1:57:37it in with more work experience,

1:57:39education, and some other information,

1:57:41it'll perfectly fit on a single page,

1:57:44which is what you want. So, that's

1:57:45amazing. This feature has been completed

1:57:47properly. Now, if this didn't work for

1:57:49you for whatever reason, AI is

1:57:52unpredictable, you can always use the

1:57:54review skill and tell it that there's no

1:57:56download button for the generator

1:57:58resume. Or if something else is not

1:58:00working, you can just tell it to recover

1:58:02the feature 08, ask it to read the

1:58:04context build plan, and then implement

1:58:06it properly. Sometimes some back and

1:58:09forth will be needed, but as you saw,

1:58:11for me, it worked perfectly on the first

1:58:13try. So don't forget to just update the

1:58:17context progress tracker and the UI

1:58:19registry if needed. And in the same

1:58:21command, you can also run remember save.

1:58:24With that in mind, the ré generation is

1:58:27now done. GPT40 writes the content.

1:58:30React PDF renderer renders it and ins

1:58:34storage holds it. So if you go back to

1:58:36your Ins dashboard, you'll be able to

1:58:38find your resume right here and either

1:58:41preview it or just download it. Great

1:58:43stuff. And that's phase two done. The

1:58:47whole profile side is built from the

1:58:50form, the resume upload, AI extraction,

1:58:54and resume generation. Job Pilot now

1:58:57knows who the user is and what they're

1:59:00looking for. Phase three is where the

1:59:03app starts earning its name, actually

1:59:05finding jobs. But one small cleanup

1:59:08first. When I built a profile page, I

1:59:11dropped in a connected accounts

1:59:13placeholder. This thing right here. But

1:59:15I decided not to use it for this build.

1:59:18That's because scraping LinkedIn jobs is

1:59:20actually against their terms of service.

1:59:22So, not to get your account banned, I

1:59:25decided to switch it up a bit. And

1:59:27that's the whole point of this workflow,

1:59:28to show you how we can pivot the app

1:59:30idea while we're building it. Because

1:59:32you'll never be able to know exactly

1:59:34where you want to take this app as

1:59:35you're building it. So, a simple cleanup

1:59:37is going to look something like this.

1:59:39You can open up a clawed window and then

1:59:42tell it to remove the connected account

1:59:44section from the top of the profile

1:59:46page. Leave the LinkedIn URL field in

1:59:48personal info. Don't touch anything

1:59:50else. We essentially want to get rid of

1:59:53this connected accounts part and only

1:59:55focus on the resume and the profile

1:59:57information. This change should be

1:59:59pretty simple because it just removes a

2:00:02single piece of UI. You can see it it

2:00:04removed it as I was speaking and then

2:00:06reloaded the page to show without it

2:00:08which allows us to move to phase three

2:00:11of our application. So let me tell you a

2:00:14bit more about that in the next lesson

— Find Jobs UI

2:00:18and welcome to phase three of our

2:00:21application. The goal is to develop a

2:00:24find jobs page first starting with a

2:00:27full UI and then in the next lesson

2:00:29we'll hook it up with the functionality.

2:00:31So the goal is to build a full find jobs

2:00:34page UI with mock data. No logic yet.

2:00:37Again, that's coming in the next lesson.

2:00:39And wanted to have search controls card

2:00:41at the top with a job title label plus

2:00:44location label and then find jobs button

2:00:46with a search icon. And then we want to

2:00:48list the section allowing people to

2:00:51filter them. Show the jobs within a

2:00:53table that says company ro match score

2:00:56based on your resume. And then allow the

2:00:58users to pageionate it. So that's going

2:01:00to be pretty simple. We can go ahead and

2:01:03open up a new session within it. Run

2:01:06remember restore so it knows what we

2:01:08last worked on. And once it remembers,

2:01:11we can now tell it to build feature09

2:01:14exactly as shown in. And now we're

2:01:17passing a design. So if you head over to

2:01:19designs and we're looking at the find

2:01:21jobs page, we want it to look something

2:01:23like this. So there's a search card at

2:01:26the top and then there's a table where

2:01:28we can see all the jobs that we can

2:01:30find. First starting as I said with mock

2:01:33data and then immediately in the next

2:01:35lesson we'll make it fully functional by

2:01:37using an API.

2:01:39So let's give it some time to read

2:01:41through it and then get it implemented.

2:01:43And in about 2 minutes, it collected

2:01:45everything it needs, gave itself a list

2:01:48of reduces to implement, and slowly but

2:01:51surely in the next minute or so, it

2:01:54built the full UI. It also updated the

2:01:58progress tracker as well as the UI

2:02:00registry. And with that, feature 09 is

2:02:03now complete. Let's go ahead and check

2:02:05it out. Back within our application,

2:02:06there's now a second page we can check

2:02:08out, the find jobs page. And would you

2:02:11look at that? The design is looking

2:02:14perfect. I would actually say this is a

2:02:16real application that we can now check

2:02:18out. And if I search by job title, maybe

2:02:21filter it by versel. Eight jobs and four

2:02:24strong matches. But of course, this is

2:02:27not yet fully functional. So if I search

2:02:29for design as in design engineer, it's

2:02:32not going to filter it yet properly. But

2:02:34as soon as we implement the

2:02:35functionality in the next lesson, it'll

2:02:37work just fine. What's working now is

2:02:40the sort oldest and newest or by the

2:02:43match score. As you can see right here,

2:02:45this is going to be a pretty useful

2:02:46application. As soon as the jobs are

2:02:47here and they don't lead to a 40 or

2:02:50four. So with that, the UI is now done.

2:02:53Search controls, the jobs table,

2:02:55filters, pagionation, all of it sitting

2:02:57on mock data. Next, we need to make it

2:03:00real so that the agent goes out and

2:03:03actually finds jobs for the user search.

2:03:06Don't forget to run remember save so it

2:03:09knows what we just did. And let's

2:03:11implement the job discovery

2:03:13functionality as that's where the real

2:03:15work starts.

— Adzuna Job Discovery

2:03:18The find jobs page looks the part with

2:03:21the profile and rest of the app, but

2:03:24it's empty. So, it's time to fill it

2:03:26with real jobs. And we'll use the Azuna

2:03:30jobs API to pull the listings from all

2:03:32across the web. You know, an API is good

2:03:35when there's like four different paid

2:03:37ads competing directly for your name.

2:03:39But yeah, we definitely want to go with

2:03:41the original one. What it does is it

2:03:44searches through thousands of job sites

2:03:46so that you don't have to. You can go on

2:03:48it, zoom in to verify that you are a

2:03:51human and uh I guess you have to select

2:03:54a couple of different buckets. You just

2:03:56have to give it a title and a location

2:03:58and it'll give you back real jobs. Then

2:04:01we'll use GPT40 to score each one of

2:04:03these jobs against your profile. It's

2:04:06clean, simple, and has no scraping. So

2:04:09wait, is this thing that we are building

2:04:12basically just an API wrapper? Well, not

2:04:15at all. Aduna will handle the discovery,

2:04:18but once a user finds a job they like,

2:04:20they still need to research the company.

2:04:23What do they actually build? What's

2:04:24their engineering culture like? And is

2:04:26this even a place worth applying to? And

2:04:28that's exactly what BrowserBase is built

2:04:30for. Browserbase is a cloud browser. It

2:04:33opens up a real browser session in the

2:04:35background, visits the company's

2:04:37websites, and then pulls back everything

2:04:39worth knowing. We'll use it to build a

2:04:41full company research feature right on

2:04:43the job details page. So before the user

2:04:46clicks apply, they already know exactly

2:04:48who they're applying to. More on that

2:04:50soon, but for now, create a free account

2:04:53on developer.adzuna.com.

2:04:55So that's not this website, it's their

2:04:57developer version that looks something

2:05:00like this. Outdated, I know, but this is

2:05:03typically how all the API websites look

2:05:05like. You can head over to registration

2:05:06page and fill in your info, such as the

2:05:10username, the email right here, the

2:05:13password, and some additional details.

2:05:16For the organization, you can enter JS

2:05:18Mastery. It's going to be for personal

2:05:21research, and I think we're not going to

2:05:23have a lot of monthly visitors. So, go

2:05:25ahead and sign up. Or at least you'll be

2:05:28able to sign up after you enter a

2:05:30password that is more than 15 characters

2:05:32long. At least they think about

2:05:33security.

2:05:36And then when you sign up, you'll have

2:05:38to verify it via email. And then you'll

2:05:40be able to log in with your email and

2:05:42password. Then head over to dashboard.

2:05:45Go to API access details and here you

2:05:48can find your application ID and the

2:05:50key. Go ahead and copy both. Starting

2:05:53with the application ID, we'll paste it

2:05:55here under our enenv.local

2:05:58right here by saying atuna app id. And

2:06:03then after that, we're going to have the

2:06:05atuna app key.

2:06:09So let's also copy the key and paste it

2:06:13here. That's the entire setup. No SDK to

2:06:17install, no package to add. Aduna is

2:06:19just a plain REST API, just a fetch

2:06:22call. So don't forget to restore a

2:06:24session because now we're going to

2:06:26actually use that API and build on top

2:06:28of it. So run remember

2:06:32and then restore.

2:06:34And since this is going to be a logic

2:06:36heavy feature at Zuna API call then

2:06:39GPT40 to score per job DB writes post

2:06:44hog events we need to plan before we

2:06:46build. So switch over to plan mode right

2:06:50here and then tell it to check the

2:06:53library docs for the Adzuna API patterns

2:06:57and then architect the feature number

2:06:5910. This is going to take some time

2:07:01until it comes up with a plan. Then

2:07:03we'll be able to check it out and

2:07:05provide some feedback or just tell it to

2:07:07implement it. And in about a minute the

2:07:10plan is in. I like how Claude auto opens

2:07:13the full plan, allows us to add comments

2:07:16or just auto accept it right here. So

2:07:18the goal right here is now that the find

2:07:20jobs page is complete with UI and mog

2:07:23data to implement feature 10 which wires

2:07:26it to Aduna's job discovery API. It'll

2:07:29go and edit a couple of files, then use

2:07:32GPD40 to match it against our current

2:07:34resume or the details that we have left

2:07:36in. So let's go ahead and auto accept

2:07:39the updates and give it another minute

2:07:41to implement them. And after a while,

2:07:43feature 10 is now complete. And here's

2:07:46what was built. Aduna lib file. This is

2:07:49a single file that simply searches for

2:07:52jobs. Just a very simple API call. Then

2:07:55it created a post handler that matches

2:07:58and scores the jobs and also adds that

2:08:01as a post hook event and finally

2:08:03displays it all on the page.

2:08:05So, what do you say that we test it out?

2:08:07Back on local host 3000, if you reload,

2:08:10there's going to be no jobs found yet.

2:08:12So, let's test it. Let's search for a

2:08:15back-end developer job in the US. Find

2:08:18jobs and internal server error with a

2:08:23green background. Okay, not something we

2:08:25want to see, but hopefully we get more

2:08:27information back right here in the

2:08:29terminal. It looks like we got a 401.

2:08:32Okay, auna API error. Maybe if I reload

2:08:35the application so that it gets the

2:08:37proper env keys. That might be a good

2:08:40start. And I'll try it one more time,

2:08:43which is going to give me unfortunately

2:08:44the same error. We're going to take this

2:08:49and simply paste it over to our agent

2:08:51using the recover skill. Looks like it

2:08:54went without the additional info. So

2:08:56I'll pass the info and let's see what it

2:08:58says. This is failure mode one. root

2:09:01cause 401 unauthorized.

2:09:04Oh, it's a Zuna app Lee instead of a

2:09:07key. That's a mistake on my end. Or no,

2:09:10wait, it's not. Why did it actually

2:09:13refer to it as a rename Aduna app Lee?

2:09:17Oh, maybe while I was viewing that file

2:09:19that it created, this one right here, I

2:09:22might have accidentally switched it or

2:09:25maybe it actually misspelled it. Either

2:09:27way, it should be good now. So, we need

2:09:30to restart our developer server.

2:09:33Head back over here, search for a

2:09:35backend developer position in the US,

2:09:39and click find jobs.

2:09:42This time it's loading for a bit of a

2:09:44longer duration, and hopefully we'll see

2:09:46some real jobs start appearing in the

2:09:49table. It was loading for some time, but

2:09:52we actually got back the response. These

2:09:54are real jobs appearing in a table with

2:09:57company names, roles, most importantly

2:10:00the match score which matches against

2:10:03our actual profile data, the source and

2:10:05the date found as well as a salary

2:10:08estimate. You can also search for one.

2:10:10For example, I see vantor right here.

2:10:12You can see there's two. Or maybe I can

2:10:15search for the Java keyword right here,

2:10:18which it picks up from the RO. So with

2:10:20that in mind, the find jobs page is now

2:10:23alive with real jobs and real scores

2:10:26pulled from Aduna and matched against

2:10:28the user's profile by GPT4.

2:10:31Every job at Zuna return got scored and

2:10:34saved to ins.

2:10:37But I went ahead and queried it three

2:10:39times. So that's 30 jobs, 30 database

2:10:43rights, and all scoped to the current

2:10:46user. RLS policies make sure that users

2:10:49can only see their own data and we

2:10:52define that once in the schema but ins

2:10:55will now enforce it across every query

2:10:57automatically. Next, we need to wire up

2:11:00the filters sort and pagionation so the

2:11:03job list actually becomes useful. Don't

2:11:05forget to run remember and then save so

2:11:09that we can focus on pagionation

2:11:11filtering and sorting. Next,

— Filter, Sort, Pagination

2:11:15now that the jobs are loading, let's

2:11:17make the list actually useful. Right

2:11:19now, everything shows in one flat list

2:11:21with very little way to filter it, sort

2:11:24it, or pageionate it. This feature will

2:11:27wire all of that to real ins data. So

2:11:31let's go ahead and open up a new chat

2:11:34window and let's restore the previous

2:11:37session by telling it remember restore.

2:11:41This one is straightforward pure DB

2:11:44queries already fully defined in the

2:11:46build plan. So if you want to check it

2:11:47out, you can open up the build plan and

2:11:50check out the phase number three

2:11:54specifically the filtering pagionation

2:11:56and sorting feature. We simply need to

2:11:58wire the filter tabs. sort dropdown text

2:12:01search and pagionation to real ins data.

2:12:05Let's do it. You can just tell it to

2:12:07implement the feature 11 and let's give

2:12:10it a second. In about 2 minutes, feature

2:12:12now is now complete um with the get

2:12:15handler that queries inforge data.

2:12:19So if you head back over here, you'll

2:12:21now see that we have 10 posts still.

2:12:23Let's go ahead and search for something

2:12:25like front-end developer in the US

2:12:28again. and it found some jobs and it

2:12:31added them right here to the list. So

2:12:32now we have one out of 20. I think the

2:12:35pagionation is actually set to 20. So

2:12:37that's why it says that we don't have

2:12:38more pages. But we can still sort it by

2:12:41low match. You can see right here as

2:12:44well as a high match.

2:12:47So those are the 70s and above. That's

2:12:49the filtering story. And then if we show

2:12:51all matches, we can also sort it by

2:12:54match score or sort it from newest to

2:12:58oldest as well. And you can also search

2:13:00for a specific title. So if we go with

2:13:03Java, you can see here it is. Or maybe

2:13:06we go with something like React, you can

2:13:08see we have two React opportunities, but

2:13:11unfortunately zero that are a high

2:13:13match. So now that that is done, you can

2:13:15also run remember save to save it. And

2:13:18in the next lesson, we'll implement the

2:13:20page that opens up when you click on a

2:13:23specific job because right now it goes

2:13:26to a 40 or4. So let's do that next.

— Job Detail Page UI

2:13:31In this lesson, we're building the page

2:13:33where everything comes together, the

2:13:35full job description, how well it

2:13:37matches the user's profile, and which

2:13:39skills they have and which they're

2:13:41missing, as well as the company research

2:13:43section. That's going to be the star of

2:13:45the build. For now, if you click on a

2:13:47job, you'll get to a four or four. So,

2:13:50let's build a page that'll show right

2:13:51here. You can open up a new chat. Feel

2:13:54free to use codeex or cloud code or

2:13:56whatever. I'll randomly switch back to

2:13:58codec just to show you that this

2:13:59workflow is fully agnostic. I'll tell it

2:14:01to build the feature 12 exactly

2:14:06as shown in job details. This is

2:14:10actually going to be coming from designs

2:14:12job details right here. So, we want to

2:14:14build a page that looks something like

2:14:16this. We want to know why it's matching

2:14:18as well as fetch all the additional data

2:14:20about that. And then this company

2:14:22research part is going to be the star of

2:14:24the show. We'll do that with browser

2:14:26base, but more on that soon. So, let's

2:14:29tell AI to build the feature number 12.

2:14:31And after researching it all, in about 2

2:14:34minutes, it figured out what it needs to

2:14:36do and it's applying the edits. And even

2:14:40though in about two minutes it was

2:14:42already more or less done, it took

2:14:44another four to verify that it did

2:14:46everything correctly. I guess that's the

2:14:48difference between claude and CEX if you

2:14:50want to compare them. Codex always tries

2:14:52to be a bit too sure and then it checks

2:14:55everything and make sure that it is

2:14:56done. If you want to stay on the safe

2:14:58side, well that's good. And I also like

2:15:01how it gives me the progress tracker

2:15:03update as well as the UI registry

2:15:04tracker updates right here and then all

2:15:07the edited files below. So you can

2:15:08quickly check out what it did. So what

2:15:10do you say that we go ahead and test it

2:15:12out? Oh, this is actually looking uh

2:15:15amazing. The 404 that I was on

2:15:17immediately transitioned over to a

2:15:19fullon page. Uh this is a back-end

2:15:22developer job at Trioptus LLC. 75% match

2:15:26score. A pretty hefty salary. And I

2:15:28noticed that most of these backend

2:15:30developer jobs have above 100k salary

2:15:34which I guess makes the ultimate backend

2:15:36course uh one of the best courses to

2:15:38take. I'll finalize it and prepare some

2:15:40lessons as soon as I finish the agentic

2:15:43development course. So both of these

2:15:45courses are currently in progress. The

2:15:48weight list is going to be down in the

2:15:49description. The AI course is coming

2:15:51soon as that's the most needed skill

2:15:54right now. And then once you master

2:15:56that, getting better at foundations of

2:15:58backend is going to be the next thing

2:16:00that's going to significantly increase

2:16:01your salary. So that's the next thing to

2:16:03focus on. Now here we can see the AI

2:16:06match reasoning where the candidates

2:16:08Java and SQL skills are a good match for

2:16:11this position. Requires Java 11 and

2:16:13database experience also requires cloud

2:16:16and microservices which are not

2:16:18explicitly stated in the candidates

2:16:19profile. So that's something that we can

2:16:21continue working on. you have these

2:16:23skills and these are the gap. There's a

2:16:26job description right here that you can

2:16:27check out. We can make it so that you

2:16:29can expand the job description to check

2:16:31it out in more details. And I think

2:16:33that's a quick review that we can give

2:16:35it by quickly heading back and telling

2:16:37it review and then say job description

2:16:41is being cut off mids sentence. If it's

2:16:44longer than what the preview allows,

2:16:48find a way to display it. And then I'll

2:16:52provide an example right here of how it

2:16:54gets cut. This should be pretty simple

2:16:56for it to fix. So I'll just go here and

2:16:58wait for the website to update. And

2:17:00there we go. The reason why we actually

2:17:02cut it is because I believe the API

2:17:05provides it cut. So there's this view

2:17:08full job post which takes us to the full

2:17:11job where we can actually open up the

2:17:13description and then apply to that job.

2:17:15And if we check out some other jobs, you

2:17:17can see how they look like too. With

2:17:19that in mind, here we definitely created

2:17:21some new components. So we can run

2:17:23imprint to update our UI registry if

2:17:26that hasn't happened already. And then

2:17:29once that is done, we can save the

2:17:30session by running remember and then

2:17:34save.

2:17:36I like how on codeex it actually figures

2:17:38out that this is an active skill so you

2:17:40know what you're calling. Again, it's

2:17:41pretty cool to be able to use these

2:17:43different tools and then notice the

2:17:45differences. But once you figure out how

2:17:47the workflow works, you'll be able to

2:17:49optimize it no matter the agent that you

2:17:51use.

— Browserbase

2:17:54This lesson and the feature we'll

2:17:56implement within it is the part that I'm

2:17:58most excited about. Instead of you

2:18:00opening 10 tabs to figure out what a

2:18:03company actually does, like Rayomine

2:18:06Software Solutions LLC, let's create an

2:18:08agent that when you click this research

2:18:10company button, opens a real browser,

2:18:13visits the company's website, reads what

2:18:16it finds, and pulls all of it into a

2:18:19clean research file. What they do, their

2:18:22tech stack, their culture, and any

2:18:24talking points for your interview, all

2:18:27before you ever click apply. By doing

2:18:28that research, comparing it against the

2:18:31job description that you then compare

2:18:33against your profile is what's going to

2:18:35give you the upper hand when applying

2:18:37for jobs. And this is exactly where

2:18:39browser base and stage hand do the heavy

2:18:42lifting. Browserbase gives us a real

2:18:45managed browser running in the cloud,

2:18:48not a headless scraper, an actual

2:18:50browser session just like you'd open

2:18:52Chrome. And then if you head over to

2:18:54docs and search for stage hand, you'll

2:18:57see that it sits on top of it and lets

2:18:59the agent interact with and extract the

2:19:02content from any page using plain

2:19:04English instructions instead of brittle

2:19:07CSS selectors. And together they'll

2:19:09handle the part of job hunting that's

2:19:12genuinely timeconuming researching who

2:19:15you're actually applying to. And

2:19:17honestly, that's just scratching the

2:19:19surface of what browser base can do. On

2:19:22the paid plan, you get something called

2:19:24a stealth mode that bypasses bot

2:19:27detection on sites like LinkedIn. You

2:19:30also get parallel browsing sessions for

2:19:32running multiple agents at once and

2:19:35session persistence that keeps your

2:19:37login state across runs. that opens up

2:19:39the possibilities which allows you to

2:19:41add additional features to this

2:19:43application such as the ability to auto

2:19:46apply for jobs by automating form

2:19:48submissions. Again, the free plan is

2:19:51more than enough to follow along with

2:19:52this build, but if you want to take it a

2:19:54step further later on, you can give it a

2:19:57shot. So, to follow along and see

2:19:59exactly what I'm seeing, click the

2:20:01browserbased link down in the

2:20:02description and then create your free

2:20:04account. Then, when you're in, you'll be

2:20:06able to see something that looks like

2:20:08this. So you can head over to your

2:20:09project dashboard under overview or you

2:20:13can immediately head over to settings

2:20:15and grab your project ID and API key.

2:20:19Head back within your env.local.

2:20:22Create a new browserbase

2:20:25API key and browser base project ID. I

2:20:32believe that's the first one we copied.

2:20:34And the second one is going to be the

2:20:36API key starting with letters BB as in

2:20:39browser base. So once you have the keys,

2:20:42we can restore the session by heading

2:20:45over to our agent. Again, feel free to

2:20:48use whichever one you like. Start a new

2:20:49session on it to clear the context,

2:20:52but still make it remember what it saved

2:20:55before by running remember restore. And

2:20:58it knows that the next feature is

2:21:00feature 13. So, if you head back over to

2:21:03our context under build plan and you

2:21:06check out 13, you'll be able to see that

2:21:09this one is a bit longer.

2:21:12Here, the agent researches the company

2:21:15using their public website and builds a

2:21:17structured research report using a

2:21:19single browserbased session. Three data

2:21:22sources fused together. The company

2:21:24website content, the job description

2:21:26from DB, and the user profile from DB.

2:21:29Here we do the logic and then what I

2:21:31actually took some more time on is

2:21:34telling stage hand what it needs to do.

2:21:36It needs to capture what the company

2:21:38actually does and any concrete signals

2:21:41like funding, customers, scale, mission,

2:21:44recent launches and then find the

2:21:46internal links most worth visiting to

2:21:49research them as an employer. What does

2:21:52the company do? What do they build or

2:21:54sell and who is it for? Funding notable

2:21:56customers. I mean just imagine if you

2:21:59did all this research and you came to

2:22:01the meeting prepared. Then it'll extract

2:22:03the subpages that helps a candidate

2:22:06understand the company before applying.

2:22:08Finally, we give it a prompt as a sharp

2:22:10career strategist to prepare a candidate

2:22:13for a specific role. We will give the

2:22:16research, the job posting, and the

2:22:18profile. And then it'll tell the user

2:22:20everything it needs to maximize their

2:22:22chances. And this is actually the most

2:22:24complex feature in the entire build

2:22:26where we have real browser sessions

2:22:28through browser base company page

2:22:30navigation, GPD40 synthesis and database

2:22:34rights through insch. So the goal is to

2:22:36plan before we touch anything. So switch

2:22:39over to the plan mode once again. You

2:22:41can see we were using plan mode on cloud

2:22:44code, but on codeex it's just in a

2:22:46different spot, but you can still turn

2:22:48it on. And you can tell it to check the

2:22:50browser

2:22:52as well as the fetch skills and use the

2:22:56library docs context

2:22:58and then architect the feature 13. Let's

2:23:02give it a shot and see what it does.

2:23:06Once it comes back with a plan, we'll be

2:23:08able to implement it. It already made a

2:23:10useful discovery by reading the library

2:23:13docs as it has a newer stage hand

2:23:15initialization shape rather than the

2:23:17older architecture snippet for feature

2:23:1913. The plan should follow the model

2:23:22structure. It's going to check the

2:23:24actual code. Currently everything is

2:23:26empty. Then it's going to look into the

2:23:28Nex.js docs as well as stage hand and

2:23:31browser base. Then it's going to check

2:23:33the insort skill to confirm the SDK

2:23:36pattern. It's actually doing a ton of

2:23:38work behind the scenes on making all

2:23:40this happen. And this is the difference

2:23:43between vibe coding and agentic

2:23:46development. So if what you're seeing

2:23:48right here is impressive, definitely

2:23:50check out the agentic development weight

2:23:52list as the full course is coming soon.

2:23:55But yeah, very quickly it went through

2:23:58it and it asked us a couple of questions

2:24:01to make sure that it planned it

2:24:02properly. It's asking whether the

2:24:04company research means a one-time

2:24:07doseier generated for one save job

2:24:09stored on jobs.co company research not a

2:24:13reusable company profile. Yep, that

2:24:15works. And doier means the updated nine

2:24:18field JSON shape from contextu plan with

2:24:21overview text stack culture. Yep, that's

2:24:23exactly what it means. The browser

2:24:25research means browser base plus stage

2:24:28hand visiting the company's own public

2:24:30website profile. fallback synthesis to

2:24:3240 and research company buttons. That's

2:24:35the interaction on the client side. Yep,

2:24:37that's exactly what all of these mean.

2:24:39So, we can just say go ahead and

2:24:41proceed. Then it came back with the

2:24:43follow-up. Should feature 13 resolve the

2:24:46company homepage before opening stage

2:24:48hand. And in this case, I'll go with the

2:24:50browserbased fetch API as it includes

2:24:53the redirects which will allow us to

2:24:55handle tougher sites than the regular

2:24:57fetch API. And then the second question

2:24:59is what should happen when a job already

2:25:01has a company research saved. In this

2:25:04case, we can go with the recommended

2:25:05approach which is to just render it.

2:25:08Show the saved one and hide the generate

2:25:11action to avoid duplicate paid runs.

2:25:15Perfect. With this in mind, it should be

2:25:17able to build it out. And the plan is

2:25:20officially here. Build feature 13 as a

2:25:23user triggered research flow on the job

2:25:25details page. A clientside research

2:25:28company action calls the post API agent

2:25:31research which authenticates the user

2:25:34loads the user scope job and profile

2:25:36from ins resolves the likely company

2:25:39homepage with browserbased fetch API

2:25:41visits the company's site with one

2:25:43browserbase or stage hand session and

2:25:45then synthesizes a candidate specific

2:25:48dosier with GPT40 saves it to jobs

2:25:52company research tracks the company's

2:25:54researched and then refreshes the job

2:25:57details page. This is amazing and you

2:26:00can go over all of the details on how

2:26:02it's going to do it. Now, in this case,

2:26:04it looks like I'm out of Codex messages.

2:26:06So, that's why it's super useful to have

2:26:08two subscriptions active, like one from

2:26:11Claude and Codex. And then using this

2:26:13workflow, you can always switch between

2:26:16the two. That's another pro tip because

2:26:18two subscriptions of $20 are still

2:26:21cheaper than a single Mac subscription

2:26:23that's about 100 bucks. So, let's see if

2:26:26it can actually proceed with

2:26:27implementing this plan. If not, we'll

2:26:30just copy this MDX and paste it over

2:26:33into another coding agent. It looks like

2:26:35it doesn't want us to do that. So, it'll

2:26:37listen to us and try to implement the

2:26:39plan. Let's give it some time. And in

2:26:42about 7 minutes, it's done. Implemented

2:26:44feature 13 and to end. Build a company

2:26:48research agent flow across agent

2:26:50research route files company research

2:26:52and research company button which now

2:26:54resolves the URLs via browserbased fetch

2:26:57runs stage hand extraction synthesizes

2:27:00this nine field GPT dosier saves it logs

2:27:03progress and refreshes the details. So

2:27:06what do you say that we give it a shot?

2:27:08Back on localhost 3000, I'll go ahead

2:27:11and choose a back-end developer job that

2:27:14is maybe not the best fit, but that I

2:27:16really much like this front-end

2:27:18developer with Cloudflare with a huge

2:27:21salary. Let's go with Optino. The role

2:27:24requires JavaScript, which the candidate

2:27:26has also has specific Cloudflare

2:27:28services. So here we have some job

2:27:31description but below we can do full

2:27:33company research but I don't see a

2:27:36research company button even though it

2:27:38says that it implemented it. Research

2:27:40company button. Let's see where does

2:27:42this button actually appear. Research

2:27:45company button. It looks like it appears

2:27:49right here.

2:27:51If there's no research, it should appear

2:27:54under the company research card. So

2:27:56maybe it thinks that this company was

2:27:58already researched. Let me see if I

2:28:00manually remove this check right here.

2:28:03The button is here. So for some reason,

2:28:06it thinks that the company has been

2:28:07researched beforehand. Let's go ahead

2:28:09and run a review

2:28:12and tell it that the research company

2:28:16button is not

2:28:19visible. But unfortunately for now, we

2:28:22are really out of credits. So I'll copy

2:28:24this message. And this is going to be a

2:28:27real proof that this workflow is fully

2:28:29agent agnostic even within working on

2:28:31specific features. And I'll tell it that

2:28:34the research company button is not

2:28:37visible. And I'll tell it to review it.

2:28:40Even though Claude wasn't the one who

2:28:42worked on this feature, it's actually

2:28:44checking out its competitors Codex's

2:28:46code. It immediately was able to find a

2:28:48button visibility bug where the button

2:28:51visibility specifically has research is

2:28:54broken. So the fix is pretty

2:28:56straightforward. Let's go ahead and tell

2:28:58it to apply the fix.

2:29:01And there we go. In about a second, the

2:29:03research company button is now rendered

2:29:05inside the empty state panel directly

2:29:08below the candidate specific briefing.

2:29:11So if we come back, there's a big

2:29:12research company button. So let's give

2:29:15it a shot. It says researching, but

2:29:17since this is the biggest feature in the

2:29:19entire application, I assume that it's

2:29:21not going to work on the first try. It

2:29:23says fail to load job. And if we open up

2:29:26the terminal, we get a bit more info. So

2:29:29I'll copy it and tell it to review it.

2:29:32Specifically, when I click research

2:29:35company, this is what I get. And we can

2:29:39also provide this failed to load job

2:29:41message. The more context you provided,

2:29:44the better. Thankfully, the error is

2:29:46super clear. The company research column

2:29:49doesn't exist in the database. So, it's

2:29:51going to check the migration files to

2:29:53understand what actually happened. That

2:29:55column was never added to the migration

2:29:57file. So, it'll likely ask us to just

2:30:01run it via the InsForge CLI, which

2:30:04thankfully makes it super simple. And

2:30:06the way that InsForge interacts with

2:30:08agents is just so seamless and makes it

2:30:11the best way to develop a backend for

2:30:13any kind of application that I'm

2:30:15building with AI. So, let's give it a

2:30:17moment. There we go. The migration

2:30:19applied successfully. The column now

2:30:22exists. So the research company button

2:30:24should now work end to end. Well, let's

2:30:26see whether that's really the case. I'll

2:30:28once again click research company. It'll

2:30:31load and say researching. And since this

2:30:34is a long process, another update that

2:30:36we can do is make some kind of a loading

2:30:38card with a multi-step process to give

2:30:41the user a bit of an idea of what is

2:30:44currently happening. Actually, that's a

2:30:47feature that's not a part of the initial

2:30:49build plan, but a perfect one for you to

2:30:51test how this workflow works when you

2:30:53want to add some new features. So, very

2:30:55soon we'll be done with the build. Just

2:30:57a few more features to go. Go ahead and

2:30:59implement that full modal multi-step

2:31:02loading system. It'll be a nice quality

2:31:05of life change for the users so that

2:31:06they don't have to stare at the screen

2:31:08and think whether something went wrong.

2:31:10But with that in mind, in about 20

2:31:12seconds or so, we got a full company

2:31:15research. It includes the tech stack

2:31:17that the company works with, the

2:31:19culture, certified women's business

2:31:22enterprise. Okay, that's good. So, if

2:31:24you're a woman, you might have an edge

2:31:26here. uh your edge specifically is

2:31:28extensive experience in software

2:31:30engineering particularly JavaScript

2:31:32which aligns well with the core

2:31:34requirements of the role. The history of

2:31:36optimizing performance and implementing

2:31:38prediction algorithms at Apple

2:31:40demonstrates your capability to handle

2:31:42CDN optimization gaps to address while

2:31:45you lack direct experience with

2:31:46Cloudflare. Emphasize your quick

2:31:48learning ability and past experience

2:31:50with similar technologies and leverage

2:31:52your JavaScript expertise to bridge the

2:31:54gap in Typescript.

2:31:56Smart questions. How does Optinino's

2:31:59integrate Cloudflare edge computing

2:32:00capabilities? And then it gives you some

2:32:02smart questions that you can ask as well

2:32:04as some points for your interview

2:32:06preparation. And then it gives you some

2:32:08info on why this role is a good fit for

2:32:10you. So now you can very easily click

2:32:12this button and apply through the direct

2:32:15site. If you experienced any issues on

2:32:17implementing this feature, just use the

2:32:19recover functionality and tell it what

2:32:21went wrong. Don't forget to update the

2:32:23progress tracker if it hasn't been

2:32:25updated yet to tell it that this feature

2:32:28was completed. This means that the agent

2:32:31just researched a company for you

2:32:33through a real browser getting real data

2:32:36and creating a real research report. And

2:32:39now to be implemented what I believe is

2:32:41one of the most important

2:32:42functionalities of the app. We want to

2:32:44make sure that our users actually use

2:32:46it. So it's time to head back over to

2:32:49your Post Hog dashboard. Under browse

2:32:52activity, you'll be able to see a lot of

2:32:55different events that were fired such as

2:32:57web vitals, company researched, page

2:33:00views, page leaves, research company,

2:33:02and so on. If you click on this company

2:33:04researched, you'll also be able to get

2:33:06more data on exactly what company that

2:33:09was. So if you open up Posthog AI from

2:33:11the right side, instead of getting lost

2:33:13in all of these events, you can simply

2:33:16ask it a question like which companies

2:33:18have been researched so far and it'll

2:33:20look for the company related data in the

2:33:22project. It figured out that we're

2:33:24looking for a company researched event.

2:33:27So, it's going to pull all the

2:33:28properties and sample values to find

2:33:31which companies have been researched.

2:33:33For now, there's only one value. It

2:33:35switch the agent to the SQL mode to

2:33:37extract it from our database and it gave

2:33:40us back the table. Optino was the only

2:33:43company that was researched. Of course,

2:33:45right now we're the only user that has

2:33:46been using the app and this is the only

2:33:48company that we researched, but with

2:33:50time I'm sure that you can see how

2:33:52useful this is going to become. So, this

2:33:54is just the start of what POS can do. In

2:33:57production, you'd use this to understand

2:33:59how users are actually behaving, which

2:34:02jobs did they research, where they drop

2:34:04off, and which match scores lead to

2:34:06applications. There's also other things

2:34:08like feature flags, web analytics,

2:34:11session replays, where you can see

2:34:13exactly how users are using your app,

2:34:15which is great if just looking at the

2:34:17data is unclear. So here you can filter

2:34:20by specific events for example web

2:34:23vitals clicking different buttons or you

2:34:26can also use AI to summarize what

2:34:28happened in this session. So it's

2:34:30actually going to render the video

2:34:32upload it for analysis analyze the

2:34:34segments and tell you what the user is

2:34:36doing on the page. And while it's doing

2:34:39that I'm just also noticing this

2:34:41notification here saying that Posthog is

2:34:43now available in Slack. And this is what

2:34:46I've been waiting for for a long time.

2:34:49The ability to ask Post Hog questions

2:34:52about your product data, debug issues,

2:34:54and generate PRs directly within Slack

2:34:57is something that my team will find

2:34:59super useful. So, let's click on this.

2:35:01And you know what? Since this is the

2:35:03first time that I'm seeing this, let me

2:35:05actually go ahead and hook it up to our

2:35:08real company Slack channel because I'm

2:35:10certain that this is something that both

2:35:11our engineers, designers, and marketers

2:35:14are going to abuse. So, let's click

2:35:16connect Slack right here. I'll select my

2:35:18workspace and give it permissions. And

2:35:22is that it? I just opened up the JS

2:35:24Mastery official Slack on marketing.

2:35:27Sundus here is asking some questions

2:35:29about pulling some specific data. And

2:35:31this is no joke. This happened

2:35:32yesterday. Frank said that we should

2:35:35keep everything up to date. And now I'm

2:35:37just testing Post Hog here. It tells me

2:35:39that it can answer any data questions or

2:35:42help with code. What should it dig into?

2:35:44Well, let me ask it right here. Hey,

2:35:47Post Hog, can you tell me how many users

2:35:51we have on jsmastery.com?

2:35:56Let's see if it can answer that. Okay, I

2:35:58guess this means that it's starting to

2:36:00work on it. Immediately, I get a

2:36:02response saying working on a task stage

2:36:05in progress. And in about a minute, it

2:36:08came back with a response. It's looking

2:36:10at our jsmastery.pro project, which now

2:36:12that I'm looking at, we should have

2:36:14changed the name to jsmastery.com

2:36:16because that's the real domain, which we

2:36:18finally have. But yeah, it's taking a

2:36:20look at the number of users based on the

2:36:22page view events that exist on the page.

2:36:25And it looks like there were almost a

2:36:28million of you visiting jsmastery.com

2:36:32recently.

2:36:34This goes back to late February 2025.

2:36:36And I'm super grateful for so many of

2:36:39you visiting the site. Now, of course,

2:36:41it can further break that down by a

2:36:43monthly trend, by country, or just

2:36:46active users over the last 30 days. But

2:36:48let me instead ask it another question.

2:36:51Let's ask it which is the best course on

2:36:54JSMy.pro.

2:36:57Obviously, best is subjective, but I

2:36:59want to see how it'll approach it. We

2:37:01can maybe tell it just give me the

2:37:03ranking 1 2 3 without listing the

2:37:06specific sale numbers, but you can do it

2:37:08by page visits instead. And let's not

2:37:11forget to tag the hog at the start.

2:37:14Funny enough, this time it actually put

2:37:16the eyes emoji instead of the seed. So,

2:37:20I'm guessing that it is working on it.

2:37:23While it is working on it, we can head

2:37:25back to session replays where it

2:37:27successfully analyzed the video session

2:37:30that we had. And I'm not sure if you

2:37:31heard that. I just got a Slack

2:37:33notification. And it said, I'll rank the

2:37:36courses by page visits based on the

2:37:38total page visits across jsmastery.com.

2:37:41Here's the top three. Ultimate NextJS15

2:37:44course, then the GEP animations course,

2:37:47and then the Ultimate Next.js course.

2:37:49I'm guessing this is the older version

2:37:50when we had versions 13 and 14 which we

2:37:53later updated to 15 and then later on

2:37:5616. And then the GUP course is following

2:37:58along nicely. And of course the next

2:38:00goal is to completely change this list

2:38:03to make the agent coursees the number

2:38:05one and then the backend course that

2:38:07we're working on follow closely on the

2:38:09second spot. But yeah, this is super

2:38:12useful. I think you can already see how

2:38:15if you're working within a team or if

2:38:16you just use a Slack for yourself or

2:38:18your partners, it's super useful to be

2:38:21able to speak with it and it's going to

2:38:23come back with useful data directly from

2:38:25your app. So, finally, let's take a look

2:38:27at what it researched. The user

2:38:29successfully browsed job listings,

2:38:32generated company research for a

2:38:33specific role despite initial errors,

2:38:36review the research, and then proceeded

2:38:38to apply. This is super useful data. So

2:38:42it was able to figure out what we were

2:38:44clicking and that the user actually

2:38:46proceeded to apply after getting the

2:38:48company research and then also how long

2:38:51they were staying at each part of the

2:38:53journey and how many issues they

2:38:55experienced. This info is incredibly

2:38:58valuable and as a developer working on

2:39:01your product, especially if you're doing

2:39:02it solo or as a part of a small team

2:39:05where you can have a full marketing

2:39:07department, the amount of decisions that

2:39:08you can make based on the data that Post

2:39:11Hog gives you is just astounding. So

2:39:13yeah, what do you say that we go ahead

2:39:15and build out a few more features and

2:39:17then we come back to Post Hog one last

2:39:20time once the full features have been

2:39:22implemented. Oh, and I just finished

2:39:24recording the last lesson and a couple

2:39:26of minutes ago, Sundus, our marketing

2:39:29person, just replied, "Crazy amazing how

2:39:32we can just do that easily now." And

2:39:34then proceeded to tag Post Hog and asked

2:39:38how many signups JSM comm has. So, the

2:39:42fact that she was able to figure out

2:39:44that the only thing she needs to do is

2:39:45just tag this Slack app and ask it a

2:39:48question is great. It then proceeded to

2:39:51find the signup events, measured all of

2:39:54them together, and told her that JSM has

2:39:57about 160K total signups. I think this

2:40:00is the best and most honest showcase of

2:40:03how I'm personally using Posthog for

2:40:05jsmastery.com.

2:40:07But yeah, with that in mind, let's

2:40:09proceed with the build.

— Dashboard UI

2:40:12We're getting very close to finalizing

2:40:14the application. The landing page is

2:40:16here. Profile page is done. finding jobs

2:40:19page is done as well. So, what's

2:40:22remaining is the dashboard. That's

2:40:24because finding jobs doesn't take just

2:40:26an hour. You're done and you'll be out

2:40:28of the app. No, you'll likely apply to a

2:40:31couple of different companies, compare

2:40:33the salaries and the match scores, track

2:40:36when interviews are happening and so on.

2:40:38So, we can do all of that within the

2:40:40dashboard. Thankfully, within the

2:40:42designs, we have a very simple dashboard

2:40:45design. total jobs found, average match

2:40:48rate, companies researched, jobs this

2:40:51week, as well as the recent activity,

2:40:54and a couple of different graphs. So,

2:40:56opening up one of our chats, I'll switch

2:40:58back to Claude code. Open up a new chat

2:41:02and say remember restore to restore the

2:41:06latest session. And then we can tell it

2:41:09to build feature 14 exactly as shown in

2:41:13the context designs dashboard.png image.

2:41:17In this case, since this is just the UI,

2:41:19we don't have to run the architect

2:41:21feature. We can just build the UI. So

2:41:24let's tell it to build it. And let's see

2:41:26what it comes back with. To do it, it'll

2:41:28first install Recharts, which it'll use

2:41:31to create some charts, and then create

2:41:34separate components for the stats bar,

2:41:36recent activity, analytics, charts, and

2:41:38finally wire it all up within the same

2:41:41page. So, let's see how well it does it,

2:41:44and most importantly, how well will it

2:41:46follow the rest of the design language.

2:41:49And would you take a look at this? I

2:41:53mean before this would be a video on its

2:41:55own. Just creating this UI would take a

2:41:58couple of hours to teach it properly

2:42:00with charts and displaying it and

2:42:02hovering over the charts. This recent

2:42:05activity section, the cards with the

2:42:07badges and the numbers right here. I

2:42:10mean, this is just out of this world.

2:42:13But in the next lesson, let's see if we

2:42:16can actually make this data dynamic

2:42:19coming from the ins backend and the

2:42:21database.

— Final Steps

2:42:24In the previous lesson, we just created

2:42:27these mock components. And since this

2:42:29one contained a lot of components, I can

2:42:32see that it is still adding them as

2:42:34parts of the UI registry. So in the

2:42:36future, it immediately knows how these

2:42:39kind of dashboard cards and charts look

2:42:41like. But now it's time to wire them up

2:42:44to real data. The goal here is to wire

2:42:47up the four stat cards to real ins

2:42:50database for current user. This one

2:42:53doesn't actually require the architect

2:42:55mode. So I think it's even safe to do it

2:42:58in the previous session right here where

2:43:00we did the UI. I'll simply tell it

2:43:02implement feature 15.

2:43:07it'll figure out that it has to wire up

2:43:09the four stats card. Yep, there we go.

2:43:13To real database. So, it'll query

2:43:15insorgge directly and update them. Let's

2:43:18give it a second to do that. And in

2:43:20about half a minute, it is done and it's

2:43:22already updating the progress tracker.

2:43:24So, if we come back, total jobs found is

2:43:27now set to 20. Average match rate is 43.

2:43:31We definitely got to bump those numbers

2:43:32up. Company's research this is done

2:43:35using browser base is set to one and

2:43:38then jobs this week is set to 20. What

2:43:41do you say that we implement the recent

2:43:43activity next so we can see what the

2:43:45user is doing? Since this is just two DB

2:43:48queries through Ins and thankfully our

2:43:51agent knows everything that is happening

2:43:53with Ins and backend and database

2:43:56systems because it's built from the

2:43:57ground up to work with it. We can simply

2:44:00tell it to implement feature 16 and

2:44:02it'll know what it needs to do. The goal

2:44:05here is to run agent runs plus jobs with

2:44:09company research. Merge them and then

2:44:12say what happened and then give it some

2:44:13kind of time frame like 10 minutes ago,

2:44:15an hour ago or yesterday. It figured out

2:44:18that we already have a format date. It's

2:44:21going to update the dashboard page to

2:44:23fetch those agent runs plus research

2:44:26jobs and build the activity list. Of

2:44:29course, we have some errors while it

2:44:30actually fetches it. And believe it or

2:44:32not, and I was doing this real time as I

2:44:35was speaking, it was able to build a

2:44:37real recent activity list where it found

2:44:4110 jobs for back-end developer job. Then

2:44:43we researched the Optino company and

2:44:46then it gave us 10 more jobs. We can

2:44:48verify that this data is real by heading

2:44:51over here, searching for some front-end

2:44:53jobs in New York, for example. And in

2:44:57this case, it looks like we found 10

2:44:59jobs, one matching almost perfectly. So

2:45:03what I'll do is I will sort it by only

2:45:05high matches. Looking for a front-end

2:45:09position. Oh no, looks like all of our

2:45:11front-end positions are very low match

2:45:13score because the developer info that we

2:45:16filled in for this currently logged in

2:45:18developer matches that of a back-end

2:45:21engineer. Let's say that we wanted to

2:45:22make a switch to a front-end engineering

2:45:25position. What would we have to learn

2:45:27about to make it in this company? I will

2:45:30click research company. Commencing the

2:45:33browser base which will start the

2:45:35browserbased browser behind the scenes

2:45:37doing all the research for us opening

2:45:40many different pages. And if I'm not

2:45:42mistaken, there's even an option to show

2:45:44you what is happening. So you can look

2:45:47into that and implement that as an

2:45:49additional feature to the app so the

2:45:51user knows what's happening behind the

2:45:53scenes. But again kind of the point of

2:45:55this is so that you can go away do

2:45:57something else and then very soon the

2:46:00agent comes back and gives you the full

2:46:02research like this. This is a

2:46:04venture-backed company focusing on

2:46:06building operational infrastructure for

2:46:08sensitive technologies. It seems that I

2:46:11lack direct experience with AI and

2:46:13modern front-end frameworks,

2:46:16but we should emphasize our strong

2:46:18problem solving and adaptability. And of

2:46:21course, since we're not focused on

2:46:22React, we should practice our modern

2:46:25front-end frameworks and prepare

2:46:27examples that we worked on in the past.

2:46:30Perfect. So now, if you head back under

2:46:33our dashboard, you can see total jobs

2:46:35found 30, found 10 jobs for front end,

2:46:38and researched Linero. So finally if we

2:46:42go back the last feature we need to

2:46:44implement for now is going to be feature

2:46:4717 analytics charts and post hog data.

2:46:51So now the goal is to wire three

2:46:53dashboard charts to real post hog event

2:46:56data for the current user. Since this

2:46:59one is using post hog I actually want to

2:47:01plan it properly. So I will run remember

2:47:04save right here and then open up a new

2:47:08chat window and tell it to check the

2:47:11post hog MCP and the library docs and

2:47:15then architect the feature 17 in plan

2:47:18mode. And what's cool about claude code

2:47:21is that it does these things in

2:47:23parallel. So one agent is exploring the

2:47:26project context files for feature 17

2:47:28while the other is exploring the

2:47:30existing codebase structure. Let's give

2:47:32it a second to come back with a plan and

2:47:34then we'll see whether it's ready to be

2:47:36implemented. And very quickly, feature

2:47:3917 is in. The dashboard already renders

2:47:42three chart components, but all three

2:47:45components use hardcoded mock data.

2:47:48Feature 17 replaces that mock data with

2:47:51real per user event data fetched server

2:47:54side from Post Hog's query API using

2:47:58Post Hog node. Posog MCP is installed

2:48:02but requires OATH. We don't need it for

2:48:05implementation since post node SDK

2:48:08already has what we need and the

2:48:10projects lib post hook server is

2:48:13established. So we want to track four

2:48:15different events. Job search started,

2:48:17job found, profile completed, company

2:48:20researched. So let's go ahead and accept

2:48:23it

2:48:24and see how it does. As soon as it

2:48:26implements it, this will have concluded

2:48:29our fivephase build where we started

2:48:32with foundations, moved over into the

2:48:34profile, then find jobs functionalities

2:48:37with browser base, job details and

2:48:40company research and finally the

2:48:42dashboard. So, this is actually an

2:48:44interesting way of using PostHog because

2:48:46we're directly using the events that are

2:48:50typically used on the backend side where

2:48:51you track what your users are doing, but

2:48:54now we're going to use them to display

2:48:56them to our users as well, which is the

2:48:58first time that I'm using Posthog in

2:49:00that way, but I guess it makes sense

2:49:03with dashboard style applications. In

2:49:05any other kind of application, you would

2:49:07just go to your Post Hog dashboard and

2:49:09take a look at all the events right here

2:49:11and then create some kind of dashboards

2:49:13either manually or with Post Hog AI or

2:49:16just ask it questions through Slack like

2:49:19what I've just showed you. But there's

2:49:20also a possibility of using its data to

2:49:23display it within your own application.

2:49:26So, let's see how it does. And the build

2:49:29comes back cleanly. Here's a summary of

2:49:31what was done. The three hard-coded mock

2:49:35data arrays were removed and now it's

2:49:38pulling the data from Posthog to display

2:49:41real data. Interestingly, it decided not

2:49:44to use Posthog query API because the

2:49:46Post Hog node V5 SDK doesn't expose the

2:49:50query and the query API requires a

2:49:52personal API key. So, what we could have

2:49:55done is provided it the personal API key

2:49:58and that would be good. but instead it

2:50:00said you can take a look at that data

2:50:02within your post dashboard or give me

2:50:05your personal key if you want to. But

2:50:08hey, I already have all of that data

2:50:10through the ins jobs table and that is

2:50:13the authoritative source anyway because

2:50:15post hook events are derived from it. So

2:50:18querying the DB directly is more

2:50:20reliable and cheaper. So that's what it

2:50:23did. Take a look at this company

2:50:25research activity. Today is Friday. We

2:50:28get two new companies, jobs found over

2:50:31time. Today we did 30, but you can of

2:50:33course research more over time. And now

2:50:36that I'm looking at this graph, maybe

2:50:38it'll be useful if we were hitting some

2:50:40limits. So if you wanted to implement

2:50:43billing to the users, you can let them

2:50:45know that maybe their limit is 30 per

2:50:47day, so they can come back tomorrow or

2:50:50they can upgrade to another plan to use

2:50:53this SAS. Because if you think about it,

2:50:56what you just developed is a job

2:50:58searching SAS platform. So with a few

2:51:01more additions, I'm sure you'll be able

2:51:03to charge some money for it. And

2:51:04finally, there's the match score

2:51:06distribution, and it looks like we are a

2:51:09great fit for a lot of jobs, but for

2:51:12none, we're perfect. So maybe we still

2:51:14have to do some search and find the jobs

2:51:16that we are really the perfect match

2:51:18for, and definitely not apply for jobs

2:51:21like these. And yeah, talking about

2:51:23Posthog, let's see what it can actually

2:51:26tell us about how the app is being used.

2:51:28In this case, I prefer using the AI

2:51:31chat. So, let's ask it, what's the

2:51:33average match score of jobs found this

2:51:36week? Again, this is a pretty vague

2:51:39search term, especially since we're not

2:51:41mentioning any specific event names, but

2:51:45it did found the job found event, and

2:51:48it's going to check some properties to

2:51:49see whether it includes the match score.

2:51:52There we go. Match score is a numeric

2:51:55property on job found. So, that's all it

2:51:57needs to create an insight. And there we

2:51:59go. Here it is. The average match score

2:52:02is 40. So after a couple of days, if the

2:52:05user keeps improving their score, then

2:52:08it might be better tomorrow and the day

2:52:10after. Now what you can do is open this

2:52:12up as a new insight and then even save

2:52:15it to your dashboard. So now when you go

2:52:17back to the insight list, you can see

2:52:19this is a new insight which you can then

2:52:22add to one of your dashboards. But okay,

2:52:25what else can we ask it? Maybe like

2:52:28what's the gap between finding a job and

2:52:30researching the company? A pretty vague

2:52:33question and also very specific to the

2:52:36business logic of this specific app. Oh,

2:52:39and while it's running that, another

2:52:41interesting question might be what

2:52:43percentage of found jobs get company

2:52:46research run on them? Okay, here it

2:52:50created a funnel of jobs found and then

2:52:52the companies researched. But I want to

2:52:54run this question because it'll tell us

2:52:57exactly how engaged our users are. Out

2:53:00of every job the agent finds, how many

2:53:03actually gets researched? This is the

2:53:05kind of behavioral insight that would

2:53:07normally take hours to set up in a

2:53:10traditional analytics tool. Here we get

2:53:12it in one question. So it looks like it

2:53:15is about 6.7%.

2:53:18So in practice only one out of 15 found

2:53:21jobs get company research run on it.

2:53:24That's a significant drop off and likely

2:53:26a big opportunity. So we have to answer

2:53:29a couple of questions. Is the company

2:53:31research hard to find or access or is

2:53:34this event firing correctly or are there

2:53:37certain types of users more likely to

2:53:39research? And then you can dig further

2:53:41into some of these angles with Post Hog.

2:53:44What would be cool is some kind of a

2:53:46coding agent that understands these post

2:53:49hog insights as well as our code that

2:53:52would then be able to develop the

2:53:54features to improve upon what this

2:53:57insight is saying is not ideal. Maybe in

2:54:00the future. But yeah, this was pushog in

2:54:03production. Not just tracking something

2:54:06that happened, but understanding what it

2:54:08means. Oh, and this Slack thing which

2:54:11looks like Sundus is having a field trip

2:54:14with asking it even more questions and

2:54:17it's giving back very useful insights.

2:54:19So yeah, that's Job Pilot, a full stack

2:54:23AI agent that finds jobs, scores them

2:54:27based on your resume or profile data,

2:54:30and gives your users a genuine edge

2:54:32before they click apply. It's built in a

2:54:34couple of days, not months, by directing

2:54:37an AI agent instead of fighting one. And

2:54:40what helped significantly is the fact

2:54:43that we used insch because it's built

2:54:46from the ground up to communicate with

2:54:48the agent and allow it to build a full

2:54:51back-end system including o databases,

2:54:55storage, functions, and more directly

2:54:57from within your agent chat. So, it was

2:55:00the key part of our entire Agentic

2:55:02workflow in this video. And if you want

2:55:04to go deeper on all of this, there's an

2:55:07Aentic development course coming soon.

2:55:09I'll leave the weight list link down in

2:55:11the description. It'll cover everything

2:55:14from the ground up. How to research and

2:55:16plan a project with AI before you write

2:55:19a single line of code. How to build

2:55:21context files for any project. How to

2:55:23create your own custom skills like the

2:55:26ones we had here. how to use AI in a way

2:55:28that actually holds together across

2:55:31features and across entire production

2:55:33databases, not just for one impressive

2:55:36demo. Once again, the weight list is now

2:55:38open and you can join it by clicking the

2:55:40link in the description. If this video

2:55:42helped,

2:55:44leave a like, comment, and subscribe and

2:55:47share it with other developers who are

2:55:49still fighting their AI agent instead of

2:55:51directing it. Or maybe don't. Maybe keep

2:55:54it just for yourself. Either way, I'll

2:55:56see you in the next one. Thank you for

2:55:58watching and have a wonderful day.

This transcript was generated from the captions YouTube publishes for this video. Get the transcript of any YouTube video atfreeyoutubetranscribe.com: free, unlimited, no sign-up.