實際影片長度:2:39:15.000。原文、繁中、雙語可點擊句子跳轉影片。
0:00.000–0:03.567
In this video, we're going to do a comprehensive Codex tutorial.
0:03.567–0:10.693
I want to show you not just what Codex is, but how to actually use it as a serious app building agent.
0:10.693–0:28.277
We'll start with the foundations, how Codex works, how the Mac app and the CLI fit together, how to choose models and thinking modes, how threads and contexts work, and how to use tools like the browser, terminal, files, and external systems.
0:28.277–0:31.885
Then, we'll turn that foundation into a real workflow.
0:31.885–0:42.020
We'll use Codex to plan, architect, design, implement, debug, and ultimately deploy a production-ready app from scratch.
0:42.020–0:53.676
By the end, you should understand the full Codex workflow well enough to take your app idea, break it into manageable steps, and use Codex to build it with much more confidence.
0:53.676–0:59.407
Now, when you Google for Codex, you're going to land on this website here.
0:59.407–1:04.331
And here, you can learn more about Codex, and you can also download the app.
1:04.331–1:07.205
Now, as you can see, it says here download for macOS.
1:07.205–1:09.548
That is because I have macOS.
1:09.548–1:14.920
If you're running Windows, you're going to have a button that says download for Windows.
1:14.920–1:17.442
So, it does support macOS and Windows.
1:17.442–1:29.190
And when you scroll down, you can see the main screenshot that kind of gives you a general overview, general idea of what this app looks like, okay?
1:29.200–1:32.393
And you can kind of scroll down, you can learn more about it.
1:32.393–1:37.127
Or we can jump into my Codex instance here, and I can give you a quick overview.
1:37.127–1:44.114
So, on the left-hand side, we have things like starting a new chat, search, various plugins, automations.
1:44.114–1:49.310
Just below that, we have our main organization, right?
1:49.320–1:52.384
And this is where you can organize your projects, okay?
1:52.384–2:06.368
And the idea here is that anytime you have a project, you want to click here, and you want to either start it from scratch or you use an existing folder because these are not organized just logically.
2:06.368–2:11.264
They're actually linked to folders on your disk, okay?
2:11.264–2:16.340
And so, everything that you see here represents actual folders.
2:16.340–2:19.993
Now, inside of these folders, we have some items here.
2:19.993–2:24.010
Now, these are not files, and they do not represent anything on the disk.
2:24.010–2:26.398
These are actually conversations, right?
2:26.398–2:32.579
And you can think of them as, you know, similar to what you might have in Chat GPT, okay?
2:32.579–2:42.878
So, if you're working on this project, you can create a new conversation simply by, you know, clicking here or pressing command and and telling it what you want to happen.
2:42.878–2:48.101
Now, in the center pane over here, this is where you're going to be communicating, right?
2:48.101–2:52.583
So, if we scroll back up, this was my initial prompt here.
2:52.583–2:59.251
I want to build a very, very simple web app that arranges items as a Trello Kanban board style, etc.
2:59.251–3:01.951
And then I have this interaction here, right?
3:01.951–3:06.628
It does something, I ask it to do something else, etc., etc.
3:06.628–3:11.419
Now, just below that is where you're going to be entering your prompt, okay?
3:11.419–3:20.061
So, you're going to be selecting the model, uh the different reasoning, and we're going to be covering all that, but this is the main text box for the model.
3:20.061–3:27.252
Now, on the right-hand side, there's a lot of interesting things happening here that a lot of people are not really aware of, okay?
3:27.252–3:30.313
And a lot of people are not really like using it.
3:30.313–3:35.115
And And you need to understand to leverage this whole app experience, right?
3:35.115–3:43.909
So, right here, we have this little card that displays a little bit of information about this specific conversation, right?
3:43.909–3:47.885
So, we have branch details, we have some artifacts, right?
3:47.885–3:52.916
And these are the data that happened as a result of this convo, right?
3:52.916–3:56.914
And so, if I go to another conversation, we might have different artifacts, right?
3:56.914–4:03.524
And you can think of an artifact as a side effect of, you know, of your conversation, okay?
4:03.524–4:06.817
So, if you've created a readme file, you're going to see it here.
4:06.817–4:09.310
If you did a web search, you're going to see it here.
4:09.320–4:15.293
Now, one of the more interesting things happens when you click this button and open the right-hand pane.
4:15.293–4:18.177
And here, you can see all kinds of interesting things, right?
4:18.177–4:23.922
So, for instance, if I click this button, I can have a side chat, or I can have a browser.
4:23.922–4:41.430
Now, the browser feature is actually very, very powerful, because I can simply open this up here, and as I'm developing this app, it's going to give me a URL that I can open here in this browser, and that will allow me quick iteration, because I'll be able to
4:41.440–4:45.796
see exactly how the app looks as I'm developing it.
4:45.796–4:53.870
And we're going to be doing all of that in more detail a little bit later in this tutorial.
4:53.880–4:56.235
First, let's talk about Codex.
4:56.235–5:06.799
The easiest way to understand Codex is that it starts from the same basic idea as ChatGPT, but it is connected to your actual working environment.
5:06.799–5:19.454
So, instead of only answering questions, it can inspect files, edit code, run commands, use the browser, test the app, and help move a project forward.
5:19.454–5:21.741
The difference matters a lot.
5:21.741–5:28.477
ChatGPT is great when I want an explanation, a rewrite, a brainstorm, or a quick answer.
5:28.477–5:33.968
Codex is what I use when I want work to happen inside a real project.
5:33.968–5:41.832
It can do many of the same reasoning tasks as ChatGPT, but it can also act on the project directly.
5:41.832–5:50.441
That is why I keep ChatGPT mostly for pure informational questions, and I keep Coda for work threads.
5:50.441–5:54.830
So, my project context stays focused and clean.
5:54.840–5:57.157
There are two main ways to use Coda.
5:57.157–6:10.529
The first is through the CLI, which is best when you already live in the terminal and want to run quick repo tasks, scripts, lightweight edits, or developer style iterations.
6:10.529–6:16.098
The second is the Mac app, which is usually better for visual app building work.
6:16.098–6:32.478
If I want to see the browser preview, inspect file changes, manage a longer project, approve permissions, review artifacts, or teach the workflow on screen, the Mac app gives me a much clearer workspace.
6:32.478–6:38.305
And that is why I highly prefer to use the Mac app, and that is what I recommend you use as well.
6:38.305–6:59.018
Inside the Mac app, the main pieces to understand are the project or the workspace, the thread area, the model selector, the thinking mode selector, file changes, terminal output, browser preview, artifacts, permissions, and the review flow.
6:59.018–7:08.881
Once those pieces make sense, Coda stops feeling like a chat box and starts feeling like an app building environment.
7:08.881–7:13.550
The project pane is where you open or switch between projects.
7:13.560–7:18.750
The thread area is where the conversation and task history lives.
7:18.760–7:25.123
The file change view shows what Coda wants to edit before those changes are accepted.
7:25.123–7:31.175
The terminal output shows commands, builds, errors, and verification steps.
7:31.175–7:36.310
The browser preview is where you can inspect the running app is where you can inspect the running app visually.
7:36.320–7:44.710
Together, these pieces make Coda feel less like a chat bot and more like a working development environment.
7:44.720–7:47.150
Permission flow is also important.
7:47.160–7:52.854
Cortex should never feel like a black box that silently changes everything.
7:52.854–8:08.990
As soon as it finishes running commands, editing files, or taking an action that matters, you can always inspect what it's doing, approve the right actions, and keep control over the project.
8:09.000–8:13.710
The next thing to understand is that Cortex is not just one fixed experience.
8:13.720–8:20.006
There are a few workflow decisions you make each time you use it, and the first one is which model to use.
8:20.006–8:27.790
In practice, I usually default to the latest strongest model unless I have a clear reason not to.
8:27.800–8:32.477
Because most app building tasks benefit from better reasoning.
8:32.477–8:38.270
Here's a rough guide to picking the correct model for your specific task.
8:38.270–8:51.590
So, for architecture, back-end design, multi-step implementation, difficult debugging, or final review passes, I want a stronger model, such as GPT-5.5.
8:51.600–9:03.288
For small copy tweaks, simple UI polish, short refactors, or low-risk tasks, a faster, a lighter model can be a better tool.
9:03.288–9:11.692
And here's where you can use an older model, or a mini, or a nano version of the current latest model.
9:11.692–9:24.110
For example, if I'm asking Cortex to rename a button, tighten some copy, or adjust spacing on one component, I do not need to overthink the model choice.
9:24.120–9:42.070
But if I'm asking Cortex to design the Convex schema, think through permissions, restructure several files, or debug a problem that spans front-end and back-end code, That is where I want the strongest model That is where I want the strongest model available.
9:42.080–9:53.710
The more expensive the mistake, the more I want to slow down and use the better reasoning setup.
9:53.720–9:56.812
The next important decision is the reasoning mode.
9:56.812–10:05.404
This controls how much time and effort Cortex spends thinking through the task before and during the work.
10:05.404–10:12.842
This decision is a little more nuanced than model choice because every reasoning mode has a place.
10:12.842–10:19.435
Low thinking is useful for quick, obvious tasks where the risk is small.
10:19.435–10:31.172
Medium is good for normal app building work, first pass UI normal app building work, first pass UI implementation, straightforward debugging, and routine feature work.
10:31.172–10:35.150
High is what I use when the decision is more expensive.
10:35.160–10:47.482
Architecture, convex data model design, authentication, permissions, hard bugs, multi-file changes, and the final review.
10:47.482–11:01.190
My default for serious app building work is usually a strong model with high thinking because that gives me the best balance between speed and the best balance between speed and quality.
11:01.200–11:03.750
But, the practical lesson is simple.
11:03.760–11:08.578
Match the model and thinking mode to the risk of the decision.
11:08.578–11:13.045
If the task is small and reversible, keep it fast.
11:13.045–11:19.165
If the task affects the structure of the app, slow the model down and let it reason.
11:19.165–11:30.429
Now, as you're working on your project and you're in this conversation project and you're in this conversation view, you can enter your prompts here, and just below, you can select various things.
11:30.429–11:34.134
Now, first of all, you have your contacts window here, right?
11:34.134–11:37.341
Here you can see how much of the context you have used.
11:37.341–11:43.191
Now, Korax says that it automatically compacts its contacts.
11:43.191–11:48.416
And yeah, you can do that, but over time, it's not going to be as effective.
11:48.416–11:57.620
And so, you always want to be starting new conversations anytime you're working on something new that requires a context switch, okay?
11:57.620–12:01.835
Next, we have here the all-important model selector, okay?
12:01.835–12:11.423
So, if I click over here, I have it automatically set to GPT-5.5, which is the newest model as of the time of recording this video, okay?
12:11.423–12:19.895
You can also switch it to some of the older models as well, but I see no reason to do that because this model has been very, very capable.
12:19.895–12:24.981
We also have things like speed, standard versus fast.
12:24.981–12:31.402
Fast is 1 and 1/2 times faster, but it also uses more of your usage, okay?
12:31.402–12:35.828
So, depending on which plan you're at, you may want to stay on standard.
12:35.828–12:40.440
I mostly keep it on standard unless, you know, I'm in a hurry and I want to switch it on fast.
12:40.440–12:42.751
Next, we have intelligence, right?
12:42.751–12:44.697
Now, this is very, very important.
12:44.697–12:47.576
By default, I keep this on high.
12:47.576–13:02.050
I found that to be a good balance between speed and quality because as you go towards lower intelligence, the model is going to be faster, but you're going to be giving up quality, right?
13:02.050–13:04.400
You're going to be giving up intelligence.
13:04.400–13:12.011
On the other hand, as you go into higher and higher intelligence, the model is going to be slower, but it's going to be thinking more, right?
13:12.011–13:13.947
It's kind of like a person, right?
13:13.947–13:21.811
You can ask a person a question, and that person may think more, think through something longer, right?
13:21.811–13:27.834
You know how people say, "Let me sleep or let me sleep on it." Or let me think it over, right?
13:27.834–13:39.110
The longer you think, the more the more you figure something out, and the the the the the higher chance you're going to arrive at the correct answer, at least for you.
13:39.120–13:48.670
You're going to think through all the possibilities, whereas the first answer might be wrong, and usually is because you haven't thought everything through.
13:48.680–13:51.097
And it's the exact same thing here, right?
13:51.097–13:58.389
If you set something too low, and you're working through something fairly complex, well, the model is not going to think it through.
13:58.389–14:06.750
It's going to give you an answer that well, it's an answer, but it might not be the ideal answer, okay?
14:06.760–14:16.703
On the other hand, with extra high, you know, the model is going to think longer, but it may not be necessary in a lot of situations.
14:16.703–14:29.698
And so, I typically keep it on high, sometimes medium, very rarely low, and also very rarely extra high, unless I'm working through something that the model has trouble with high.
14:29.698–14:35.474
You know, the situations where extra high really proven itself over high, it hasn't been that many.
14:35.474–14:40.279
And so, for the most part, I keep it on high, sometimes I also switch it back to medium.
14:40.279–14:54.230
And as you start to use Codex more and more, and as you begin building more and more apps with it, and you'll be able to better judge which thinking mode to better judge which thinking mode to select.
14:54.240–15:03.041
Now, before we go deeper into the workflow, I want to quickly talk about pricing and plans because this is one of the first practical questions people have with Codex.
15:03.041–15:07.950
For most people learning Codex, the important question is not what is the most expensive plan.
15:07.960–15:12.119
The question is, what do I actually need for the kind of work I'm doing?
15:12.119–15:20.638
If you're learning, testing prompts, and building smaller projects, you can usually start with the normal Chat GPT plan access available to you.
15:20.638–15:32.251
If you're doing heavier app builds, longer agent runs, team workflows, or professional coding work, then plan limits, credits, and business options start to matter more.
15:32.251–15:36.205
Now, here I am on OpenAI's Codex pricing page.
15:36.205–15:43.223
And if you scroll down, you can see the prices that are available at the time of filming this video, right?
15:43.223–15:49.359
So, we have the free plan, and this allows you to explore Codex capabilities on quick coding tasks.
15:49.359–15:55.288
We have the gold plan, which is $8 a month, and you can use Codex for lightweight coding tasks.
15:55.288–16:05.590
We have the plus plan, which is fairly popular, 20 bucks a month, and here you can finally start to actually do something meaningful, right?
16:05.600–16:09.537
Something like, you know, building a part of an app, or building some scripts.
16:09.537–16:14.670
And they say this can power a few focused coding sessions each week.
16:14.680–16:16.545
Next, we have the pro plan, right?
16:16.545–16:24.889
And so, here you can choose whether you want the 5x or the 20x higher rate limits than plus, and this is $100 a month.
16:24.889–16:28.190
I'm actually using the pro plan 20x.
16:28.190–16:37.443
Okay, so I'm paying 200 bucks a month, and at this level, I am at a point where I pretty much never reach any limits.
16:37.443–16:46.492
And that means I can build, you know, multiple projects at once, and use Codex for all kinds of tasks, and still not reach limits.
16:46.492–16:54.145
And so, during the time where I'm when I'm, you know, building heavy apps and and doing some serious work, I might get close, right?
16:54.145–16:56.312
But I never really get to the limit.
16:56.312–16:59.470
You need to decide which plan is right for you.
16:59.480–17:03.280
Now, from what I understand, plus plan is very, very popular.
17:03.280–17:15.790
And so, what I would do is I would obviously, you know, try the free plan, try to see how that goes, and, you know, obviously, you know, if you do anything serious or remotely serious, you're probably, you know, you're going to run out run out of
17:15.800–17:16.331
this plan.
17:16.331–17:19.521
And so, the next logical step is to try out the plus plan.
17:19.521–17:31.390
The plus plan is where a lot of people start and it gives you a reference point as to, you know, the amount of work that you're doing, how much can this plan actually cover the amount of work you're doing.
17:31.400–17:39.201
Because the fact of the matter is there people that work on very heavy projects and, you know, there they work on big repos, right?
17:39.201–17:40.779
Lots and lots of code base.
17:40.779–17:43.717
They run out of their plan very, very quickly.
17:43.717–17:48.025
But if you're working on a smaller projects, you're not using the fast mode.
17:48.025–17:57.830
So for instance, you're not coming here and you're changing you're not changing speed because I'm using the fast mode from time to time and that, you know, increases the usage as well.
17:57.840–18:01.619
So if you're on standard and you're using maybe medium often, right?
18:01.619–18:09.788
You're not really using high that much and you're almost never using extra high, you can get a lot of mileage out of this plus plan.
18:09.788–18:18.848
And when this plus plan starts to run out, you know, you're you're starting to notice some tight limits, you may want to switch to a higher plan, okay?
18:18.848–18:20.921
Such as the pro 5x or 20x.
18:20.921–18:26.642
Now you can also ask Codex to help you choose the right Codex plan for your specific use case.
18:26.642–18:32.990
For instance, you can use this prompt here, help me choose the right Codex plan for my use case, okay?
18:33.000–18:37.176
Use only current official OpenAI pricing and help center information.
18:37.176–18:40.065
And I'm going to go ahead and run this and see what it says.
18:40.065–18:42.395
All right, then this is what we got back.
18:42.395–18:46.639
As of this day, ChatGPT plan is that include Codex, okay?
18:46.639–18:48.310
So this is the practical read.
18:48.320–18:51.279
Free, try Codex on quick tasks.
18:51.279–18:53.387
Go lightweight coding tasks.
18:53.387–18:56.670
Plus a few focus coding sessions each week, okay?
18:56.680–19:00.283
And this is exactly what I just told you from that official page.
19:00.283–19:04.107
And so if you scroll down, you can see how Codex usage and credits work.
19:04.107–19:05.826
You can learn you can read this.
19:05.826–19:08.209
Best fit for your use case, okay?
19:08.209–19:13.971
For learning Codex and building small to medium apps, ChatGPT plus is the sensible default.
19:13.971–19:20.760
If your current plan is Plus, I would not upgrade until you actually hit Codex limits often enough that the friction matters.
19:20.760–19:26.299
Okay, when heavier or business plans make sense, what to verify live before deciding?
19:26.299–19:33.149
And so, a sensible thing to do would be to try Codex Plus and see if that's enough for your specific use case.
19:33.149–19:38.242
If you're not a heavy Codex user, if you just want to experiment, it should be more than enough.
19:38.242–19:45.470
And then you can decide whether you want to upgrade to the higher tier plans.
19:45.480–19:53.557
Now, before we move into the app building workflow, I want to take a moment to talk about some of the things Codex does that can greatly increase your productivity.
19:53.557–19:57.786
These are features I use all the time across different projects.
19:57.786–20:05.079
Skills, plugins, automations, and MCP along with its tools and connectors.
20:05.079–20:24.270
The best way to think about all that is skills tell Codex how to do a workflow, plugins package capabilities, automations let work happen later, and MCP tools and connectors give Codex controlled access to outside systems.
20:24.280–20:31.296
Once those pieces make sense, Codex feels less like a code editor and more like a project agent.
20:31.296–20:36.819
First, let's talk about one of my favorite features that I use pretty much all the time, skills.
20:36.819–20:42.950
Skills are reusable instructions for how Codex should do a workflow.
20:42.960–20:45.465
They're not external tools by themselves.
20:45.465–20:56.714
They're more like local playbooks that tell Codex the style, process, output format, and validation steps for a specific kind of work.
20:56.714–21:06.790
For example, this course uses skills for explainers, Notion editing, video timelines, and other repeatable production tasks.
21:06.800–21:18.550
Instead of explaining the same rules every time, I can point Codex to the skill and it knows the house style, the workflow, and the mistakes to avoid.
21:18.560–21:19.808
The rule is simple.
21:19.808–21:24.330
Anything that gets used over and over again becomes a skill.
21:24.330–21:28.986
That matters because a lot of real work is not just about getting an answer.
21:28.986–21:39.150
It's about getting an answer in the right format, following the right process, and producing something consistent with the rest of the project.
21:39.160–21:45.390
All right, so here I am in my Codex instance here, and I want to show you some things that you can do with skills.
21:45.400–21:49.190
So, I have here a conversation for an app that I was building.
21:49.200–21:54.923
And if I press the the forward slash, you can see that I have many options here, right?
21:54.923–21:56.550
I can do many, many things.
21:56.560–22:00.049
And as you can see for skills, I have lots and lots of skills.
22:00.049–22:02.997
I have tons and tons of skills over there.
22:02.997–22:07.578
And skills allow me to package a repeatable process.
22:07.578–22:11.075
You can think of it as a function that does something.
22:11.075–22:14.150
It gets some input and it produces an output.
22:14.160–22:18.343
And the goal is to produce consistent output as you've done before.
22:18.343–22:23.242
And so, as an example, let's say if I'm working in this convo here, right?
22:23.242–22:25.960
And I asked the model to do something for me.
22:25.960–22:32.078
So, here I have I want to build a very simple web app that arranges items as a Trello Kanban board style, okay?
22:32.078–22:33.707
And it comes up with this.
22:33.707–22:36.493
Now, right here can package that as a skill.
22:36.493–22:38.990
Now, what do I want to package as a skill?
22:38.990–22:42.876
Well, I want to package, for instance, maybe creating the architecture.
22:42.876–22:52.932
So, I can say something like package the architecture step as a skill, and then I just give it a name of the skill.
22:52.932–22:54.670
Sample arch stack.
22:54.680–22:55.133
Okay?
22:55.133–23:06.478
And that's going to create a repeatable skill that will allow me to generate an architecture for any kind of project that I may be working in the future.
23:06.478–23:13.487
So, I'm going to go ahead and jump into the plan mode in case the model wants to confirm something or clarify something.
23:13.487–23:15.780
And I'm going to go ahead and execute this.
23:15.780–23:17.343
And let's see what happens.
23:17.343–23:22.310
Now, it came back to me and it wants me to answer a question.
23:22.320–23:32.437
Should the sample arch stack package this as a general architecture planning skill or specifically as the Kanban Trello app architecture, right?
23:32.437–23:35.063
So, we want it to be a general app architecture.
23:35.063–23:36.869
So, I'm going to go ahead and save this.
23:36.869–23:39.301
And now it came back with a plan, okay?
23:39.301–23:47.131
Create the reusable Codex skill named sample arch stack under wherever it's storing those skills.
23:47.131–23:51.550
The skill will guide Codex through the architecture step for simple app ideas.
23:51.560–23:54.994
And it's going to package that step into a reusable process.
23:54.994–23:55.580
All right.
23:55.580–23:58.110
And now it tells me that created the skill app.
23:58.120–24:04.270
It contains skill.md and then It contains skill.md and then agents.for.openai.yaml.
24:04.280–24:06.480
Validation passed, etc. etc.
24:06.480–24:21.516
And now what I can do is I can enter a prompt and I can say use this skill for a brand new project management app and it should use this skill to create an architecture stack for this kind of app.
24:21.516–24:27.152
So, it wants to know for the brand new project management app, what should the version one data model support?
24:27.152–24:28.806
We're just going to do local only.
24:28.806–24:30.676
And here it came back with a plan.
24:30.676–24:34.775
Brand new local only project management app architecture, right?
24:34.775–24:36.701
That's the purpose of the skill, okay?
24:36.701–24:41.090
We're going to expand this and it's coming up with this architecture, right?
24:41.090–24:46.710
App shape, data state model, component architecture, test plan, etc.
24:46.720–24:46.970
etc.
24:46.970–24:50.615
And we can say yes and it's going to go ahead and implement all that.
24:50.615–25:02.104
And so, this is actually a fairly valuable skill because that is exactly what you want to be doing in those initial stages when you're building an app, as you're going to see a little bit later.
25:02.104–25:08.510
But, by having the skill, we do not need to explain all of that over and over again.
25:08.520–25:14.280
So, as you're building more and more apps, you can simply reuse this skill from now on.
25:14.280–25:23.830
Now, before moving further, I also want to explain a few terms that can sound similar at first, plugins, automations, and MCP.
25:23.840–25:28.774
They all expand what Codex can do, but they are not the same thing.
25:28.774–25:36.710
Plugins are packaged capabilities or workflows that make Codex better at a specific kind of make Codex better at a specific kind of work.
25:36.720–25:42.818
For example, a Notion plugin can help Codex read and update Notion pages.
25:42.818–25:47.270
A Vercel plugin can help with deploys and project settings.
25:47.280–25:58.030
A Hyperframes plugin can help create explainers, and browser or document tools can help Codex inspect apps or work with files.
25:58.040–26:00.850
The simple way to think about plugins is this.
26:00.850–26:07.430
They give Codex a more specialized tool set for a specific job.
26:07.440–26:18.358
Codex still needs the right context and the right instruction, but the plugin gives it a cleaner way to operate inside that workflow.
26:18.358–26:20.252
Automations are different.
26:20.252–26:22.330
A plugin gives Codex a different.
26:22.330–26:30.190
A plugin gives Codex a capability, but an automation gives Codex a time-based job or follow-up behavior.
26:30.200–26:42.430
That might be a reminder, a recurring check, a scheduled review, or a request to come back to a thread later and continue the work.
26:42.440–26:47.228
This is useful because not every task needs to happen immediately.
26:47.228–27:02.990
Sometimes, you might want Codex to check something again tomorrow, remind you to review an outline, monitor whether a deployment is still working, or wake this thread back up when you need it to continue.
27:03.000–27:11.171
Automations turn Codex from a one-time assistant into something that can help manage longer-running work.
27:11.171–27:13.861
The important distinction is simple.
27:13.861–27:21.188
Plugins are about what Codex can do, and automations are about when Codex should do it.
27:21.188–27:25.922
All right, so here I am back in Codex, and I want to show you how plugins work, right?
27:25.922–27:30.752
So, if you click over here on plugins, you can see all the plugins that you have here, okay?
27:30.752–27:37.372
And so, it it tells you that make Codex work your way, and if you scroll down, you can see all the different plugins, right?
27:37.372–27:40.861
So, you can click on the plugin, and you can learn more about it, right?
27:40.861–27:46.425
So, for instance, this spreadsheets allows you to create and edit spreadsheet files, right?
27:46.425–27:52.730
You can use this plugin to create a spreadsheet to analyze this company's financial, etc., etc., right?
27:52.730–27:59.961
Create, edit, inspect, render, verify, and export Excel SX, CSV, and TSV spreadsheets locally.
27:59.961–28:05.845
Use spreadsheets when the durable output or target is a spreadsheet workbook, etc., etc.
28:05.845–28:08.095
So, this includes the skill, right?
28:08.095–28:20.561
So, you can think of package as kind of an umbrella that includes a skill, but it also gives Codex an ability to to connect to external systems, right?
28:20.561–28:23.764
It's kind of this higher-level structure, okay?
28:23.764–28:27.415
Whereas a skill is a very, very specific thing.
28:27.415–28:29.854
It's a specific piece of instruction.
28:29.854–28:31.644
Essentially, a specific prompt.
28:31.644–28:35.440
A plugin is this umbrella that contains a skill, right?
28:35.440–28:36.603
So, you can have that.
28:36.603–28:39.213
One plugin that I use all the time is Notion.
28:39.213–28:45.162
So, if we click over here, you can see that this actually includes a lot more interesting things, right?
28:45.162–28:51.072
Notion workflows for specs, research, meetings, and knowledge capture, right?
28:51.072–28:54.510
So, you can specify this, and then you can give it a prompt.
28:54.520–29:00.047
And if you scroll down, you can see that it includes the Notion app, the knowledge capture.
29:00.047–29:01.150
These are skills.
29:01.160–29:02.514
This is an app.
29:02.514–29:06.630
Okay, so this allows it to connect to an external system, right?
29:06.640–29:11.917
So, if I click over here, I can manage this in ChatGPT as well, because it's an external app.
29:11.917–29:14.774
And this right here, these are skills, right?
29:14.774–29:18.097
I can open that, and that's going to open the skill right here, right?
29:18.097–29:21.514
This is This is how the skill is actually stored.
29:21.514–29:26.510
And I can also turn it off or turn it on, depending on if I want that skill enabled or not.
29:26.520–29:29.734
Now, this is a plugin that I use all the time, right?
29:29.734–29:36.935
I use Notion for my planning, for, you know, writing stuff, scheduling stuff like that.
29:36.935–29:40.552
It's the brain of my workflow, essentially.
29:40.552–29:51.287
And then I installed this pre-built Notion plugin, and the first time I ran it, it authenticated against my Notion workspace, right?
29:51.287–29:53.112
Connected to my Notion account.
29:53.112–30:10.910
And from then on, I can simply say, "Hey, you know, use this Notion spec to do this, or to do that, or, you know, edit this document, edit that document." And it's able to go out and edit the right documents, and essentially make Notion an extension of
30:10.920–30:11.243
Codex.
30:11.243–30:16.058
That's kind of the purpose of a skill, to make something an extension of Codex.
30:16.058–30:16.557
Right?
30:16.557–30:19.691
And that's the main idea with all of this, right?
30:19.691–30:23.707
Another really cool one is, like, for instance, Google Calendar is another one, right?
30:23.707–30:29.787
Instead of connecting to Notion, or in addition to connecting to Notion, you can also connect to Google Calendar.
30:29.787–30:34.833
I personally do not use Google Calendar, I use Notion, so I do not have this skill set up.
30:34.833–30:41.430
Another really useful skill that you're definitely going to be using if you're building apps is Vercel, right?
30:41.440–30:47.700
Vercel, or maybe something like Netlify for deploying your apps, right?
30:47.700–30:50.692
I use Vercel when demoing apps.
30:50.692–31:06.310
And by having this package installed, it can figure out how to deploy, how to check deployment, how to do everything without me needing to actually understand how all of that works, without me needing to go to to Vercel and read their docs and
31:06.320–31:08.201
understand how to deploy and all of that.
31:08.201–31:17.748
I simply install this skill and then I you know, I click here and now I can say, you know, Vercel, order this repo for Vercel deployment risk.
31:17.748–31:22.099
Or Vercel, which Vercel tools fit fit this app app best.
31:22.099–31:24.886
Or Vercel, deploy this app, right?
31:24.886–31:30.153
And if you scroll down, you can see that this has this app and then it has all of these skills.
31:30.153–31:31.743
All of these different skills.
31:31.743–31:32.342
Look at this.
31:32.342–31:34.399
It has a ton a ton of skills.
31:34.399–31:37.091
Vercel CLI, Vercel agent, all of these.
31:37.091–31:41.786
And obviously, these skills are not just for deploying, right?
31:41.786–31:43.515
Because we also have payments.
31:43.515–31:45.399
We have best practices.
31:45.399–31:47.995
We have all of these other ones.
31:47.995–31:55.230
So, these skills essentially map to different parts of Vercel, to different features of Vercel.
31:55.240–32:01.537
We're not just talking about, you know, deploying your app, because this could be just a skill, deployment, right?
32:01.537–32:03.854
This could be one skill that I may need.
32:03.854–32:06.550
I I may not need all of these other skills.
32:06.560–32:07.332
But why not?
32:07.332–32:14.621
You know, Codex will figure out which skill it needs to consult, you know, according to the prompt that I give it.
32:14.621–32:19.199
So, it doesn't you know, it's not a big deal to have all of these enabled if I'm using Vercel.
32:19.199–32:25.072
And like I said, this allows me to basically bring Vercel into my Codex workflow.
32:25.072–32:27.719
That's the beauty of these plugins, okay?
32:27.719–32:30.048
And that's the same idea with all of these plugins.
32:30.048–32:35.654
You're essentially bringing an external system and letting Codex manage it for you.
32:35.654–32:38.775
Now, automations work very, very differently.
32:38.775–32:47.784
So, if you click on automations here, you can see that automations, they allow you to automate work by setting up scheduled chats, okay?
32:47.784–32:49.259
And you can learn more here.
32:49.259–32:54.174
Now, if you click on any of these automations, you can see exactly how they're going to be working.
32:54.174–33:02.963
So, if I click on something like summarize yesterday's Git activity for standup, you can see that it wants to create an automation for me, okay?
33:02.963–33:05.147
And what exactly is it trying to do?
33:05.147–33:11.392
Well, it's essentially trying to create a essentially trying to create a conversation that will be repeatable, okay?
33:11.392–33:12.903
So, it creates this automation.
33:12.903–33:15.370
This is the name of the automation, right?
33:15.370–33:16.463
This is the prompt.
33:16.463–33:18.294
This right here is the prompt.
33:18.294–33:24.614
And the prompt is summarize yesterday's Git activity for standup, grounding rules, etc., etc.
33:24.614–33:26.358
We can select a work tree.
33:26.358–33:28.597
We can select a project here.
33:28.597–33:35.109
And then we can select the time where it's going to run over and over again, right?
33:35.109–33:39.907
So, with this kind of automation, you may want to run it on weekdays at 9:00 a.m.
33:39.907–33:45.508
But, you can also select it, make it hourly, daily, weekly, etc., etc.
33:45.508–33:48.642
And you can also change the time, obviously.
33:48.642–33:53.780
Now, here you can change the model, and here you can change the reasoning level.
33:53.780–33:57.264
Now, with this kind of automation, you don't really need a high reasoning.
33:57.264–33:59.177
Medium is going to be just fine.
33:59.177–34:08.149
And after you're done, you can simply click create, and now you're going to have an automation that will run every weekday at 9:00 a.m.
34:08.159–34:09.214
running this prompt.
34:09.214–34:11.627
And And remember, this is a special prompt.
34:11.627–34:14.666
Here, you're asking it to consult Git activity.
34:14.666–34:26.742
And so, the idea is you may have, you know, Git connected via a plugin or something else, and it's going to connect to your Git environment, and then figure something out for you.
34:26.742–34:30.225
And that's going to run every weekday at 9:00 a.m., right?
34:30.225–34:41.864
So, instead of you needing to, you know, jump into Codox first thing weekday morning and execute this prompt manually, you can create an automation to do just that.
34:41.864–34:44.762
If you scroll down, you can see some other automations here.
34:44.762–34:47.923
You have incidents, you have code quality, right?
34:47.923–34:51.813
Maybe you want to run a code quality check every 24 hours.
34:51.813–34:55.884
Well, you can click here daily at 9:00 a.m., right?
34:55.884–35:04.273
Scan recent commits since the last run or last 24 hours for likely bugs and propose minimal fixes.
35:04.273–35:09.071
Okay, that's another very, very useful automation, right?
35:09.071–35:10.498
Repo maintenance.
35:10.498–35:14.030
You have here growth and exploration, right?
35:14.040–35:19.780
Click here from recent PRs and reviews, suggest next skills to deepen.
35:19.780–35:21.331
This is great, right?
35:21.331–35:24.988
So, automations, they could be used for pretty much anything, right?
35:24.988–35:28.225
And they are, you know, it doesn't really matter what kind of niche you're in.
35:28.225–35:33.201
You don't need to be in software development or project management or anything like that.
35:33.201–35:34.747
You can be a writer, right?
35:34.747–35:35.753
You want a status.
35:35.753–35:38.026
You're writing maybe 1,000 words every day.
35:38.026–35:51.120
You know, you can have an automation that checks for spelling, grammar errors that you may have done, and then it may suggest some fixes and also another automation that gives you more ideas, you know, to break through writer's block.
35:51.120–35:55.609
And that can run every morning at 9:00 or 10:00 a.m., okay?
35:55.609–36:03.993
And so, automations are very, very useful if you need some kind of a repeatable structure in your workflows.
36:03.993–36:07.533
And I want to talk a little bit about MCP.
36:07.533–36:12.675
So, MCP or model context protocol is very, very important, okay?
36:12.675–36:18.435
So, if you press command comma or you go into settings over here, you're going to be on this screen.
36:18.435–36:28.035
And if you choose MCP servers, you're going to see all your MCP servers that you have here configured, and you can also see whether they're enabled or not.
36:28.035–36:31.274
Now, an MCP server is basically a server.
36:31.274–36:36.025
It's a remote system that your Codex instance can connect to.
36:36.025–36:40.673
So, as you can see, I have a bunch of MCP servers here that do all kinds of interesting things.
36:40.673–36:45.014
For instance, I have here a Stitch MCP server configured.
36:45.014–36:48.022
I have here a Superbase MCP server.
36:48.022–36:54.177
I also have, you know, Flow Upload Designer, Flow Base, a bunch of apps that support MCP.
36:54.177–36:59.572
And when you connect to them, Codex is acting like an MCP client.
36:59.572–37:03.056
So, you have that same client-server paradigm.
37:03.056–37:09.103
Now, why would you want to use an MCP server to connect to something like Superbase or something else?
37:09.103–37:11.705
Well, the reason is very simple.
37:11.705–37:16.935
You want Codex to do all the administration, all the work for you, right?
37:16.935–37:27.384
So, if you're building an app using something like Superbase, and we're going to touch upon that a little bit later in the video, you can set up Superbase yourself.
37:27.384–37:28.846
You can configure all of that.
37:28.846–37:31.436
That takes time, but it's, you know, it's very, very doable.
37:31.436–37:38.633
Or, you can simply configure a Superbase MCP server in your Codex instance.
37:38.633–37:49.879
And that will allow Codex to use that MCP server to essentially manage this remote server, this tool, this app for you.
37:49.879–38:05.470
And as you're going to see a little bit later in this tutorial, this is very, very helpful to us because it saves a lot of time and it enables things that we couldn't really do before because now Codex understands One Piece and via MCP
38:05.480–38:21.390
it can get more contacts and create a much more robust app for you or a tool for you or anything else, a system, if you will, because now it can connect to other remote systems and essentially consult that data with the data we
38:21.400–38:27.968
already have, such as the code or things it has been working on, and figure out a unified solution.
38:27.968–38:30.812
And this is extremely helpful to us, okay?
38:30.812–38:33.882
And so, there's a couple of ways that you can add a server.
38:33.882–38:37.140
You can click here, and you can fill all of this manually.
38:37.140–38:43.993
Or, you can simply tell Codex, "Set up and activate a Supabase MCP server." It's going to figure out how to do that.
38:43.993–38:45.047
It's going to search for it.
38:45.047–38:48.566
It's going to figure out the specs, and it's going to set it up for you.
38:48.566–38:50.632
And the same thing for all of these other ones.
38:50.632–38:54.624
Now, after setting up the MCP server, you can simply tell Codex to use it.
38:54.624–39:15.990
So, I can say something like, "Use the Supabase MCP server to query data, or check how many tables we have, or pretty much anything else." And it's going to go ahead and connect to your Supabase instance in this example via the configured MCP server.
39:16.000–39:23.730
Now that we have laid the foundation, and before we start building the real app, let's talk about the ideal Codex workflow.
39:23.730–39:26.143
What is the best way to approach it?
39:26.143–39:32.868
Before we begin building our app, you want to establish the workflow that you're going to use again and again.
39:32.868–39:34.896
The loop is simple.
39:34.896–39:39.081
Inspect, plan, edit, verify, and report.
39:39.081–39:49.033
That sounds basic, but it is the difference between using Codex as a random code generator and using Codex as a controlled build partner.
39:49.033–40:00.470
The mistake a lot of people make is that they jump straight to "Build this app." or "Fix this problem." without giving the agent a clean process.
40:00.480–40:06.390
That can work for small tasks, but it breaks down quickly on real projects.
40:06.400–40:19.997
For a serious build, you want Codex to understand the repo first, explain the plan, make a focused change, verify the result, and then report back in a way that you can re-review.
40:19.997–40:22.830
A good Codex prompt is not just a request.
40:22.830–40:24.820
It is a small project brief.
40:24.820–40:34.663
The better the prompt is, the easier it is for Codex to understand the current state, choose the right amount of work, and verify the result.
40:34.663–40:36.990
The basic structure is simple.
40:37.000–40:48.087
Explain the goal, give the relevant context, define what should change, define what should not change, and tell Codex how to verify the work.
40:48.087–40:56.051
If the task is risky or unclear, ask Codex to inspect first and make a plan before editing.
40:56.051–41:13.030
For instance, instead of saying "Build the app," I would say, "Inspect the project first, do not edit yet, identify the existing structure, propose the smallest first version, list the files you expect to touch, and explain
41:13.040–41:17.867
how you will verify." That gives Codex a much cleaner job.
41:17.867–41:30.750
For implementation prompts, I want the request to be specific enough that Codex can act, but not so over-specified that I accidentally force the wrong solution.
41:30.760–41:37.779
I usually describe the outcome I want, the constraints I care about, and the checks that need to pass.
41:37.779–41:43.187
Then Codex can use the actual project context to choose the cleanest path.
41:43.187–41:50.151
As part of this workflow, I want to introduce you to one of the most important Codex features, plan mode.
41:50.151–41:56.630
Plan mode is a superpower that I use for 80 to 90% of my prompts.
41:56.640–42:00.190
There are two main benefits to using the plan mode.
42:00.200–42:07.277
First, it's a form of brainstorming where the model cannot change or alter your files.
42:07.277–42:14.285
Second, it's a way for the model to clarify your requests by asking follow-up questions.
42:14.285–42:18.122
This is especially useful when the request is under specified.
42:18.122–42:24.342
If I say, "Build the booking flow." there are a lot of hidden decisions inside that request.
42:24.342–42:26.809
What fields does the form need?
42:26.809–42:29.734
What status should the booking start with?
42:29.734–42:32.457
Where should the booking appear for the helper?
42:32.457–42:35.519
What should happen after submission?
42:35.519–42:42.384
Plan mode gives Codex a chance to surface those questions before it edits the app.
42:42.384–42:45.451
I also use plan mode as a quality filter.
42:45.451–42:53.656
If the plan is vague, too large, or misses something important, I know the implementation will probably be messy.
42:53.656–43:02.036
If the plan is specific, scoped, and easy to verify, then the actual coding step becomes much safer.
43:02.036–43:15.224
So, you want to use plan mode initially while brainstorming and also as you enhance your app because it gives the model a chance to ask follow-up questions to ensure there's no misunderstanding.
43:15.224–43:21.561
Now, if you're working with an existing repo, the first step should always be to inspect.
43:21.561–43:30.150
Codex should understand the files, the app structure, the current state, and the goal before changing anything.
43:30.160–43:34.996
Then it should plan the work in a way that is small enough to review.
43:34.996–43:42.081
Only then, once Codex is fully in sync with your goals, should it make the actual edits and write code.
43:42.081–43:49.992
Once the code is written, it should verify the code with the browser, terminal, using tests, or the build output.
43:49.992–43:55.515
And finally, it should report what changed and what still needs attention.
43:55.515–43:58.668
Verification is the part I want to emphasize.
43:58.668–44:03.310
A task is not finished just because Codex wrote code.
44:03.320–44:06.070
For UI work, I want to see the browser.
44:06.080–44:12.204
For back-end work, I want to see the function call, the dashboard row, or the test results.
44:12.204–44:17.990
For deployment work, I want the live URL and a real smoke test.
44:18.000–44:25.159
That habit keeps the workflow grounded in evidence instead of trusting that the code is probably fine.
44:25.159–44:30.186
Additionally, you always want to break big tasks into smaller one.
44:30.186–44:46.510
Instead of asking Codex to build the whole marketplace as one prompt, you want to ask it to plan the app, build the first UI shell, wire one initial database backed version, add the booking flow, add the helper dashboard,
44:46.520–44:47.870
and so on.
44:47.880–44:53.584
Each step has a clear target and a clear way to check whether it worked.
44:53.584–44:58.264
A good Codex task should usually fit into one reviewable outcome.
44:58.264–45:02.745
Create the first static marketplace homepage is reviewable.
45:02.745–45:07.182
Wire service listings from Convex is reviewable.
45:07.182–45:12.473
Add booking creation and verify the booking row appears is reviewable.
45:12.473–45:19.950
Build the whole app is not reviewable because there are too many decisions happening at once.
45:19.960–45:23.178
So, the workflow is not just a technical process.
45:23.178–45:26.374
It is also a way to stay in control.
45:26.374–45:39.688
We let Codex do meaningful work, but we keep the work divided into chunks where we can understand the change, approve the direction, and catch problems before they spread.
45:39.688–45:46.520
And so, here I am back in Codex, and you can enable plan mode by pressing shift tab, and here you have plan mode.
45:46.520–45:49.062
Or, you can click here and toggle this.
45:49.062–45:53.830
I typically just use shift tab cuz it's a lot easier and it's a lot faster.
45:53.840–45:57.300
And then, whenever I'm in plan mode, I can start brainstorming.
45:57.300–46:14.750
And not only that, it's useful because Codex will not make changes whenever it's in plan mode, and it also gives Codex to come back to you with follow-up clarifying questions, and I find that super super helpful because we always want to make sure that
46:14.760–46:17.214
Codex knows exactly what it's doing.
46:17.214–46:18.465
We Codex knows exactly what it's doing.
46:18.465–46:23.031
We never the last thing that we want is for Codex to assume something.
46:23.031–46:25.305
We never want it to assume anything.
46:25.305–46:28.683
We always want to make sure that we are on the same page.
46:28.683–46:33.466
And so, let's say I have a command over here going, and I want to build an architecture.
46:33.466–46:37.350
I want to build some kind of a an intricate architecture.
46:37.360–46:41.641
And, you know, I I want to make sure that we built out an architecture.
46:41.641–46:49.603
I may not know exactly how far I want to go, exactly all the details, but I want to make sure that Codex is on the same page.
46:49.603–47:02.470
So, I can say something like, "Come up with an architecture that will allow me to create both web and mobile and desktop versions of the app.
47:02.480–47:06.109
Ensure it is fast and robust.
47:06.109–47:06.735
Okay?
47:06.735–47:13.054
I'm here in plan mode, and typically with this kind of prompt, it's not clear what I want.
47:13.054–47:14.657
I don't even know what I want.
47:14.657–47:19.567
I want Codex to figure it out, but I want Codex to come back to me and confirm with me.
47:19.567–47:24.292
And so, if we execute this prompt, hopefully it's going to ask me some follow-up questions.
47:24.292–47:24.921
Let's see.
47:24.921–47:35.006
And so, as expected, Codex came back with a question, "Which cross-platform strategy should the architecture optimize for?" And there are two questions, okay?
47:35.006–47:40.866
Do we want shared core native shells, and you can click here, and you can get a little detail.
47:40.866–47:45.976
You share TypeScript domain logic with separate Expo mobile, etc.
47:45.976–47:51.849
Do we want a one universal app, or do we want web first wrappers, right?
47:51.849–48:00.698
Because I asked for a cross-platform product, but there's many ways of doing it, and there's many trade-offs with each approach.
48:00.698–48:06.341
And so, it came back to me, and it wants to clarify one universal app, this or that.
48:06.341–48:07.807
So, I'm going to say this one.
48:07.807–48:09.801
I'm going to I'm going to go with recommended.
48:09.801–48:14.517
And now, it wants to know what should the app support for data and reliability.
48:14.517–48:19.389
Offline first cloud sync, cloud only real-time, or local only.
48:19.389–48:24.141
And you can click and you can hover over the little I to get more details.
48:24.141–48:28.634
Users can can work offline and sync across devices.
48:28.634–48:33.657
Cloud only, simpler shared back and live updates, but weaker offline behavior.
48:33.657–48:36.023
Now, here you can also tell Codex something else.
48:36.023–48:38.910
You can say, "Well, I want this, this, this, this."
48:38.920–48:39.380
Right?
48:39.380–48:44.716
Or, you can press escape, and you can ask Codex to explain the question.
48:44.716–48:50.270
I can say something like this, "Explain the last question in simple terms."
48:50.280–48:50.573
Okay?
48:50.573–48:52.742
I don't need to answer it right away.
48:52.742–48:55.858
I can get Codex to kind of walk me through it, right?
48:55.858–48:56.995
Explain the last question.
48:56.995–48:58.108
Let's see what it says.
48:58.108–49:00.430
I was asking two choices.
49:00.440–49:02.050
How should data work?
49:02.050–49:07.062
My recommendation, shared code and native shells plus offline first cloud sync.
49:07.062–49:09.229
If you want this to become a serious app.
49:09.229–49:10.690
So, it tells you these things.
49:10.690–49:14.937
And so, you don't need to pick a pick a choice or tell it something else.
49:14.937–49:19.950
You can close that, and you can ask Codex to clarify.
49:19.960–49:23.874
And now, what we can do is ask me those questions again.
49:23.874–49:26.604
You can do that, or you can simply answer it here.
49:26.604–49:27.248
It doesn't matter.
49:27.248–49:29.918
So, if you do that, it's going to come back with that question here again.
49:29.918–49:31.171
And here are the questions.
49:31.171–49:37.225
I'm going to say this, and now I want to say this because I I I understood what it was asking me.
49:37.225–49:37.738
Got it.
49:37.738–49:45.870
Your choices are that means the architecture should prioritize a shared TypeScript app a brand used by this, this, this, this.
49:45.880–49:46.614
And that's good.
49:46.614–49:49.906
And now, I can exit the plan mode, and I can say, "Go ahead and do it.
49:49.906–49:53.830
Go and implement this." Something like this or something more specific.
49:53.840–50:05.310
And so, plan mode is something that I use all the time, and you should definitely make it an integral part of your workflow as well.
50:05.320–50:08.910
Now, I want to talk to you about some advanced Codex workflow techniques.
50:08.920–50:16.149
These are the little tips and tricks that I use all the time and will greatly help you when using Codex to to build apps and solve problems.
50:16.149–50:21.550
One thing I do all the time is asking Codex to create a handoff before I start a new thread.
50:21.560–50:31.208
This is useful when a thread has gotten long, when the context has been compacted, or when I want to move from planning to implementation with a cleaner workspace.
50:31.208–50:33.694
A good handoff is not a vague summary.
50:33.694–50:42.976
I want the current state, the files that changed, the commands that were run, what still needs to happen, and any risks or open decisions.
50:42.976–50:50.135
That way, the next Codex thread can pick up the work without rereading the entire conversation or repeating mistakes.
50:50.135–50:53.630
And there are two main reasons that you may want to do that.
50:53.630–50:59.975
The first reason is that after a while, this conversation here, this it starts to degrade.
50:59.975–51:06.096
As you keep typing new prompts, and as the model answers, the convo starts to degrade.
51:06.096–51:12.178
Now, Codex tells you that it automatically compacts its context, and that is true.
51:12.178–51:16.230
You do not need to start a new convo every time.
51:16.230–51:18.726
It it does automatically compact it.
51:18.726–51:29.190
But, you're going to notice that as your conversations get long and you keep asking questions and it keeps answering, quality of the responses will degrade.
51:29.200–51:43.270
And moreover, you know, your conversation is going to get fairly long, and that might, you know, degrade the performance of the app itself. right there is a good use case to create a brand new convo using the handoff as the
51:43.280–51:44.216
starting point.
51:44.216–51:55.073
Another really, really good reason to create a new convo with a handoff is when you're trying to solve a problem but the model is not getting you the solution that you want.
51:55.073–52:03.882
And so if you're trying to solve a particular problem and you've prompted the model a couple of ways and it's trying it's giving you answers but those answers are not ideal.
52:03.882–52:05.989
It doesn't give you the right algorithm.
52:05.989–52:07.861
It doesn't give you the right solution.
52:07.861–52:12.907
There's a high chance that each additional prompt is not going to get you closer to a solution.
52:12.907–52:25.870
So when you experience something like that the best thing that you can do would be starting over by creating a new conversation and giving the model a handoff with the things that it has done and the things that that are not working
52:25.880–52:32.226
and where you are right now and telling the model as part of that handoff prompt to work on a different solution.
52:32.226–52:40.270
And because AI is is can be fairly random in some ways, creating a new conversation usually give you a different solution.
52:40.280–52:41.925
That solution might actually work.
52:41.925–52:49.164
Now there are various ways to create this handoff prompt that's going to give you a handoff for a new conversation.
52:49.164–52:53.394
One of the simplest ways would be by typing something like this.
52:53.394–52:59.870
Okay, this is a very very simple prompt that still delivers a fairly high quality handoff.
52:59.880–53:06.412
Okay, so you can type create a detailed handoff prompt that I can use for a new Codex convo.
53:06.412–53:06.800
Okay.
53:06.800–53:11.674
So let's go ahead and send this and see what what answer we get.
53:11.674–53:11.964
Right.
53:11.964–53:13.585
And this is the response we got.
53:13.585–53:18.030
I want to design a fast robust cross platform project management app.
53:18.040–53:22.120
So it's essentially summarizing everything that has happened in the convo, right?
53:22.120–53:23.412
This is the context.
53:23.412–53:24.812
This is the product direction.
53:24.812–53:26.728
This is the architecture preference.
53:26.728–53:31.708
Please produce a detailed architecture plan covering all this important, right?
53:31.708–53:32.769
Also some constraints.
53:32.769–53:38.687
And so what you can do is you can copy that and then you can go ahead and create a brand new convo.
53:38.687–53:41.901
For instance, you can click here and you can simply paste it.
53:41.901–53:44.217
Okay, well you you don't want to delete that.
53:44.217–53:45.961
You want to delete like the top.
53:45.961–53:47.459
You want to delete that.
53:47.459–53:55.104
And when you paste it, that's going to create a conversation and the model can simply continue where the other conversation.
53:55.104–53:56.626
That is one way to do it.
53:56.626–54:01.911
Another way to do it is by giving it a more detailed handoff prompt.
54:01.911–54:06.390
So, let's go back here and let's go ahead and give it a slightly different prompt.
54:06.400–54:09.593
Create a clean handoff for a new Codex thread.
54:09.593–54:10.830
Include all of this.
54:10.830–54:12.477
Do not make any changes.
54:12.477–54:18.522
So, this prompt is slightly more detailed and you can bet that it's going to give you a higher quality handoff.
54:18.522–54:26.223
Okay, so let's go ahead and run this and then we can compare the two handoffs and see which one is more detailed.
54:26.223–54:28.782
Now, take a look at this handoff right here.
54:28.782–54:34.234
Look at how much more detailed this handoff versus this handoff right here.
54:34.234–54:39.126
Now, this handoff would definitely work, but this handoff would work even better.
54:39.126–54:42.041
Going to result in a higher quality conversation.
54:42.041–54:56.990
Okay, so given an option, you can certainly use a prompt such as this, but it's a lot better to use something like this that's more detailed and it's going to save you a lot of time in the long run.
54:57.000–55:01.605
The next practical habit is using Git as a checkpoint system.
55:01.605–55:06.550
Before I let Codex do meaningful work, I want to know whether the current state is clean.
55:06.560–55:11.950
After each milestone, I want a diff that is small enough to review and explain.
55:11.960–55:17.746
That is what keeps an agentic workflow from turning into one giant mystery edit.
55:17.746–55:22.326
The useful trick is to make Codex summarize the diff in plain English.
55:22.326–55:33.939
I do not only want to know what files change, I want to know why they changed, whether each change belongs to the task, and whether anything looks unrelated before I accept it or move on.
55:33.939–55:42.990
So, when you are working in Codex, you do not want to be just creating edits without recording what the edit is all about.
55:43.000–55:48.782
And in software development, you want to be using a source control system, such as Git.
55:48.782–55:56.190
We have here a convo where we were building an app, and in this particular instance, we did not use Git.
55:56.200–56:01.752
And so, I do not know, I have no way to check which changes were made where.
56:01.752–56:04.317
I have no way to revert the changes.
56:04.317–56:08.115
I have no way to see what the actual change represents.
56:08.115–56:14.232
And if working in, you know, bigger teams, I do not know who was the person responsible for the change.
56:14.232–56:16.980
Now, in this convo, we have another problem, okay?
56:16.980–56:19.368
The current working directory is missing.
56:19.368–56:32.477
And so, in this case, what we can do is we can take a handoff prompt, and we can create a brand new project, insert that handoff prompt, start a new convo, and then enabled Git, and set up so that we have Git control.
56:32.477–56:33.799
So, I'm going to go over here.
56:33.799–56:35.506
I'm just going to do start from scratch.
56:35.506–56:39.810
I'm going to paste this handoff prompt to start a brand new convo.
56:39.810–56:45.473
And I'm going to preface it by telling it to create a Git repository.
56:45.473–56:51.934
Create a Git repo if it doesn't exist, and do an initial commit with the code.
56:51.934–56:53.775
So, I'm going to run that.
56:53.775–57:00.070
And the idea is we are going to initialize Git if needed, and then commit the current code as is.
57:00.080–57:00.552
All right.
57:00.552–57:06.750
So, what it did was it initialized a Git repo in this directory, and made an initial commit.
57:06.760–57:08.990
Initial architecture plan here, okay?
57:09.000–57:10.784
The workspace was empty when I inspected.
57:10.784–57:11.897
There was nothing there.
57:11.897–57:16.160
We just created a brand new project, and it essentially created an architecture.
57:16.160–57:23.430
And so, at this point, we have here a Git repo, which means that each additional change will be automatically tracked.
57:23.440–57:32.832
So, for instance, I can say something like, "Make the smallest possible change, a route that displays 'Hello, world.'" Okay?
57:32.832–57:34.258
Let's go ahead and run that.
57:34.258–57:36.343
So, it now created this index.html.
57:36.343–57:39.203
We're going to open it, and it says hello world.
57:39.203–57:44.852
And so, now what we can do is we can say check the Git status.
57:44.852–57:49.270
And obviously, this file is not going to be in our Git, right?
57:49.270–57:52.310
You see this is not tracked, an untracked file.
57:52.320–57:57.349
So, what we want is we want to commit index.html as initial commit.
57:57.349–58:02.402
Because in Git, you can have files that are tracked, and also files that are not tracked.
58:02.402–58:05.690
The files that are not tracked are the files you don't really care about, right?
58:05.690–58:08.139
You don't You don't really need to store them in Git.
58:08.139–58:15.321
These could be like media files, or generated files, code generated files that that can always be regenerated.
58:15.321–58:19.218
But for your actual code, you always want to be tracking them, right?
58:19.218–58:25.437
So, we we have this commit, and now this files is going to be tracked, and it's going to be committed as well.
58:25.437–58:25.726
Okay?
58:25.726–58:28.899
So, now it says committed as initial commit, right?
58:28.899–58:32.108
We have this It's now on main, which is the a type of branch.
58:32.108–58:36.881
And so, now if we go into changes, you can see that we can select a branch here.
58:36.881–58:39.528
And as you can see here, it says no file changes yet.
58:39.528–58:44.301
And that is because we have not made any changes since tracking that file.
58:44.301–58:50.013
So, what I'm going to do now is that make index.html output hello James.
58:50.013–58:52.950
That has updated, and now it says hello James.
58:52.960–58:54.944
And now what we can do is we can commit it.
58:54.944–58:56.527
Commit index.html.
58:56.527–59:03.089
And now if we type give me Git status, it's going to tell you that it's not It hasn't been committed, right?
59:03.089–59:06.214
It's modified, and it's tracked, but it hasn't been committed.
59:06.214–59:06.481
Okay?
59:06.481–59:09.103
It has been modified and uncommitted, right?
59:09.103–59:11.621
You see this M, which means this has been modified.
59:11.621–59:15.270
So, we're going to do commit index.html.
59:15.280–59:18.753
And it will also generate a default message.
59:18.753–59:20.232
Here it has committed it.
59:20.232–59:26.558
We can click here, and we can click select review, and you can select the the of change you want to see.
59:26.558–59:30.580
You can see on stage, stage, branch, or last turn.
59:30.580–59:34.949
And when you click on last turn, you can see what was changed, okay?
59:34.949–59:37.732
Because we are we are using source control.
59:37.732–59:39.404
We can see the stuff that was changed.
59:39.404–59:42.434
As you can see, this is the one line that was changed.
59:42.434–59:46.143
Red means it was deleted, and green means it was inserted.
59:46.143–59:48.792
So, this was deleted, and this was inserted.
59:48.792–59:52.710
We basically changed the message that it says from Hello World to Hello James.
59:52.720–59:55.965
And so, Git is very very important.
59:55.965–59:58.923
If you're working on any kind of project, right?
59:58.923–1:00:10.350
Anything beyond something super simple, you want to create a repo, and you want to implement source control into your workflow.
1:00:10.360–1:00:16.390
One advanced trick that becomes more useful as projects get bigger is working with Git work trees.
1:00:16.390–1:00:22.599
A work tree is a separate working copy of the same repo connected to a different branch.
1:00:22.599–1:00:31.870
The practical benefit is that you can keep one version of the app stable while trying a risky feature, new eye direction, or refactor somewhere else.
1:00:31.880–1:00:34.073
This matters a lot with the genetic coding.
1:00:34.073–1:00:45.270
If you want to try two approaches in parallel, or or keep a clean version ready for recording while another code expert keeps building, a work tree gives you that separation.
1:00:45.280–1:00:50.034
Now, what's nice about work trees is that they give you parallelism.
1:00:50.034–1:01:04.489
So, if you are working on multiple features in your app, maybe you're using sub agents or something else, it's important that no two processes work on the same file at the same time, because that's going to create corruption.
1:01:04.489–1:01:12.107
And so, what you typically end up doing is you create a work tree for a specific feature, and you work on that work tree.
1:01:12.107–1:01:16.864
And when you're done, you merge the changes back onto your main tree.
1:01:16.864–1:01:19.790
Now, that doesn't mean you can only create one work tree.
1:01:19.800–1:01:34.310
You can create multiple work trees, as many as you want, and you can also work on the same feature because after one worktree is done, it's going to merge to main, and if there's a conflict, it's going to resolve that conflict, and then
1:01:34.320–1:01:47.390
another worktree, when it is done, it's going to also merge into your main branch where your development is happening, and if there's a conflict because they ended up working on the same feature, it will also resolve that
1:01:47.400–1:01:49.350
conflict so that there's no corruption.
1:01:49.360–1:01:52.367
Now, this is a feature I use all the time in big projects.
1:01:52.367–1:01:55.029
Now, let's say I'm working on this app over here.
1:01:55.029–1:02:04.691
You can ask Codox to work in main without creating any worktrees, or I can ask it to create a new worktree while it makes changes.
1:02:04.691–1:02:07.052
So, let's continue what we were doing.
1:02:07.052–1:02:11.674
So, let's say I want to change this index.html, and I wanted to say something else.
1:02:11.674–1:02:21.397
So, I'm going to go ahead and tell it, "Make index.html output hello, plan." But this time, we want to make sure that it works in a different worktree.
1:02:21.397–1:02:35.276
So, what I'm going to do is I'm going to say, "Work in a new worktree, and then merge, clean up after you're done, okay?" So, we're going to go ahead and run this, and now it's not going to modify the file on our main branch.
1:02:35.276–1:02:40.968
It's going to branch out, do the work, and then come back and merge the changes back in.
1:02:40.968–1:02:44.094
And so, as you can see here, there's more stuff happening.
1:02:44.094–1:02:52.724
I'll make this in a separate Git worktree, commit there, fast forward merge changes to main, and then remove the worktree and delete the branch.
1:02:52.724–1:03:06.710
And that's exactly what it did, except it did it very, very quickly because this was a, you know, a very small change, but you saw it doing all that, and before you know it, it did all that, made the change, merged everything back,
1:03:06.720–1:03:08.038
and deleted the worktree.
1:03:08.038–1:03:10.754
And so, that was a very, very small change.
1:03:10.754–1:03:18.114
Now, another thing that you can do is you can click here, and you can fork this whole convo in a separate worktree, right?
1:03:18.114–1:03:22.962
So, if I click over here, that will fork it into a separate work tree.
1:03:22.962–1:03:27.097
And here you can see we're working in a separate work tree here, okay?
1:03:27.097–1:03:39.078
So, now as we're doing work, we don't need to constantly tell Cortex, "Hey, you know, create a new work tree, clean up, and do all this when you're done." We can continue working and then merge our changes.
1:03:39.078–1:03:44.494
So, for instance, I can say something like to say, "Hello, USA." I can simply do that.
1:03:44.494–1:03:49.204
I don't need to tell it to work in a separate work tree because we are isolated here, okay?
1:03:49.204–1:03:51.470
So, here's the file, we can open it.
1:03:51.470–1:03:52.590
Hello, USA here.
1:03:52.600–1:03:58.412
And so, at this point, we have merged the work tree change into main and cleaned up the temporary work tree, right?
1:03:58.412–1:04:02.787
Index now displays Hello, USA, and we no longer have this temporary work tree.
1:04:02.787–1:04:07.243
We've done everything that we needed to do separate from the main branch and then we merge.
1:04:07.243–1:04:15.332
And as far as we are concerned, this convo is now finished because it's tied to the old work tree, but we've did everything we needed to do.
1:04:15.332–1:04:22.769
We've updated the files, we merged back into main, and so now we can start a brand new convo to work on a different feature.
1:04:22.769–1:04:26.150
And so, this is really nice for feature isolation.
1:04:26.160–1:04:36.510
Create a new work tree, work there, merge back into main, and then simply click here to archive this conversation.
1:04:36.520–1:04:40.744
Another advanced trick is using sub-agents for parallel work.
1:04:40.744–1:04:45.499
The idea is not to throw a whole project at a bunch of agents and hope it works.
1:04:45.499–1:04:47.950
The useful version is much more controlled.
1:04:47.960–1:04:56.458
An agent explores the code base, another works on a clearly bounded part of the UI, another checks tests, or reviews the result.
1:04:56.458–1:04:57.713
The key is ownership.
1:04:57.713–1:05:04.281
If you use sub-agents, you want each one to have a specific job, clear file area, and a clear output.
1:05:04.281–1:05:08.999
That keeps the work parallel without turning it into a merge mess.
1:05:08.999–1:05:17.868
Sub-agents are best when the tasks are independent enough to run side by side, but still simple enough to integrate at the end.
1:05:17.868–1:05:23.399
Now, sub-agents is another really cool feature that will help speed up your workflows.
1:05:23.399–1:05:32.288
And this is something that I use all the time, especially in big repos, in big codebases, to do multiple tasks in parallel.
1:05:32.288–1:05:35.923
All right, so here I have a very, very simple Kanban app.
1:05:35.923–1:05:38.231
If I click over here, I have this.
1:05:38.231–1:05:42.018
I can drag and drop. create new tasks, etc., etc.
1:05:42.018–1:05:56.350
And so, what I want to know is if I'm going to be building more and more features, complex stuff, new functionality, I want to use sub-agents to help me kind of make sense of it, you know, and help me build it in the most efficient way
1:05:56.360–1:05:56.779
possible.
1:05:56.779–1:05:59.024
And so, I'm going to paste this prompt here.
1:05:59.024–1:06:02.281
Plan how to split this feature across sub-agents, right?
1:06:02.281–1:06:03.469
Do not edit files yet.
1:06:03.469–1:06:04.022
Recommend.
1:06:04.022–1:06:06.263
We're going to jump into plan mode.
1:06:06.263–1:06:08.553
Preface this with the feature.
1:06:08.553–1:06:13.315
Add to party apps, such as make.com, Zapier, etc.
1:06:13.315–1:06:15.420
And so, I'm going to I'm going to leave it at this.
1:06:15.420–1:06:17.124
And I'm going to go ahead and run this.
1:06:17.124–1:06:18.893
And so, let's go ahead and run this.
1:06:18.893–1:06:20.414
And here we have the plan.
1:06:20.414–1:06:25.390
The safest split is for the main thread to own architecture, shared data contracts.
1:06:25.400–1:06:34.286
Sub-agents can work on isolated feature areas inside index.html, but they must not all edit the same broad sections at once.
1:06:34.286–1:06:37.083
Okay, so we have main thread responsibilities.
1:06:37.083–1:06:39.568
And then we have sub-agent delegation.
1:06:39.568–1:06:44.304
Integration settings, integration data model, web hook event dispatcher.
1:06:44.304–1:06:53.342
So, I'm going to copy this plan, and then I'm going to preface it by telling it spawn sub-agents right away to help design the third-party API functionality.
1:06:53.342–1:06:54.721
Let's go ahead and run this.
1:06:54.721–1:07:03.214
Right away, it's telling me, "I'll spawn the four-focused sub-agents and keep the main thread responsible for the final." So, as you can see, it's spawning them.
1:07:03.214–1:07:05.200
And each sub-agent gets a prompt.
1:07:05.200–1:07:08.270
It's basically like me creating a new conversation.
1:07:08.280–1:07:15.663
Your sub agent one integration, your sub agent two integration data model, your sub agent three, and they're working independently.
1:07:15.663–1:07:18.555
And here it tells you all four sub agents are running.
1:07:18.555–1:07:23.770
While they work, I'll inspect the current partial edit, and you can see these background agents here.
1:07:23.770–1:07:24.074
Okay?
1:07:24.074–1:07:25.797
So, they're working in parallel.
1:07:25.797–1:07:27.507
They're working on their own thing.
1:07:27.507–1:07:30.950
They own different pieces of the app, and they're kind of working.
1:07:30.960–1:07:34.554
And when they're done, they come back to this main agent, right?
1:07:34.554–1:07:37.365
This combo here, and tell it what happened, right?
1:07:37.365–1:07:38.874
They come back with the result.
1:07:38.874–1:07:42.641
And so, now it says the persistent sub agent returned a cleaner data shape.
1:07:42.641–1:07:46.529
And here you can actually click on any one of these and see what's happening.
1:07:46.529–1:07:51.161
You can click here, you can come back, you can click on this one, and see what it's doing.
1:07:51.161–1:07:52.496
So, this one is finished.
1:07:52.496–1:07:53.496
Some are finished.
1:07:53.496–1:07:54.631
How about this one?
1:07:54.631–1:07:55.995
This one is also finished.
1:07:55.995–1:07:57.338
And so, that's how it works.
1:07:57.338–1:08:01.093
And when they finish, they come back, and then it decides what to do later.
1:08:01.093–1:08:04.333
Maybe it's going to respond, and maybe it's going to spawn something else.
1:08:04.333–1:08:05.269
Maybe it's done.
1:08:05.269–1:08:07.008
They did what they needed to do.
1:08:07.008–1:08:11.569
They finished their isolated task, and their services are no longer needed.
1:08:11.569–1:08:14.949
And again, sub agent is something that I use all the time.
1:08:14.949–1:08:26.135
I use it all the time, especially in big repos, because they help speed up the work by isolating different areas, different responsibility clusters, to different agents.
1:08:26.135–1:08:31.309
And that's a huge productivity boost.
1:08:31.319–1:08:40.621
Now, in this section, we're going to bring all of the previous sections together by giving Codex project instructions in an agents.md file.
1:08:40.621–1:08:47.057
This is where you can write down the rules you want Codex to follow every time it works in a specific repo.
1:08:47.057–1:08:56.502
Which commands to run, which folders matter, which patterns to preserve, how to verify changes, and when to use work trees or sub agents.
1:08:56.502–1:09:01.822
This is useful because you do not want to repeat the same project rules in every prompt.
1:09:01.822–1:09:17.100
If this project should always run a specific check, use a specific design system, avoid certain files, create work trees for risky experiments, or split large tasks into sub-agents, those instructions belong in agents.md.
1:09:17.100–1:09:22.278
It turns your preferences into reusable project context.
1:09:22.278–1:09:28.250
And here's a prompt that you can use, which is going to draft agents.md for this project.
1:09:28.250–1:09:34.837
Do not write the file yet include the project purpose, the main folders, work tree, sub-agents, stuff like that.
1:09:34.837–1:09:36.617
So, we're going to jump into plan mode.
1:09:36.617–1:09:38.947
We're going to go ahead and run that.
1:09:38.947–1:09:44.036
And here's the draft for this agents.md tailored to the current project, right?
1:09:44.036–1:09:49.075
Project purpose, main folders, verification steps after changes.
1:09:49.075–1:09:53.470
Serve the app locally, coding and design patterns to preserve.
1:09:53.470–1:09:55.832
When codex should use a work tree.
1:09:55.832–1:09:58.510
Use a separate work tree when these happen.
1:09:58.520–1:10:00.674
When codex should use sub-agents.
1:10:00.674–1:10:06.295
Use sub-agents when work can be split into clearly separate ownership areas such as these.
1:10:06.295–1:10:09.407
What codex should avoid changing without asking?
1:10:09.407–1:10:10.117
All of this.
1:10:10.117–1:10:22.865
Now, the beautiful thing about this agents.md file is that you no longer have to worry about, you know, asking codex to spawn sub-agents or create separate work trees.
1:10:22.865–1:10:24.492
It will be automatic.
1:10:24.492–1:10:28.755
It's like saving you from typing those prompts every single time.
1:10:28.755–1:10:34.110
So, if you want to add a feature, well, you don't need to tell it, "Hey, create a new work tree."
1:10:34.120–1:10:36.366
Or make sure you spawn sub-agents.
1:10:36.366–1:10:37.823
It's going to be automatic.
1:10:37.823–1:10:44.140
And so, at this point, you want to review this proposal here, and you want to save this as agents.md.
1:10:44.140–1:10:49.958
So, I'm going to say, "Save it as agents." So, now it's saved it as agents.md.
1:10:49.958–1:10:54.230
You You can click here, and you can see the whole file right here.
1:10:54.240–1:10:58.561
And this file will be used only for this specific project.
1:10:58.561–1:11:00.137
They're based on a repo.
1:11:00.137–1:11:06.499
So now for my next prompt, if it's a simple change, it's not going to create a work tree probably.
1:11:06.499–1:11:15.150
And it will also not spawn sub-agents, but if it's a more complex change, it should probably create a work tree and maybe even spawn sub-agents.
1:11:15.150–1:11:17.223
So let's go ahead and see if this works.
1:11:17.223–1:11:28.986
So now, let's go ahead and ask it make a simple change that that changes the title for the main index.html to awesome Kanban app.
1:11:28.986–1:11:31.298
Okay, I'm going to go ahead and run it directly.
1:11:31.298–1:11:34.130
So now the title is awesome Kanban app.
1:11:34.130–1:11:52.270
Okay, but if we ask it something more complex, like, you know, figure out a third-party, you know, integration, design, you know, support API calls, or support MCP, or anything like that, it should probably use sub-agents to figure it out and
1:11:52.280–1:11:54.758
implement the changes in its own work tree.
1:11:54.758–1:11:56.472
So let's see if this works.
1:11:56.472–1:12:03.824
Add a robust API functionality for handling outgoing API calls and incoming webhooks.
1:12:03.824–1:12:08.235
Okay, I'm going to jump into plan mode to see if it has any questions for me.
1:12:08.235–1:12:14.404
See how it says agents.mdx explicitly says not to add a backend or proxy without asking.
1:12:14.404–1:12:16.250
Okay, so it did consult this.
1:12:16.250–1:12:18.052
So we're going to add a backend.
1:12:18.052–1:12:26.207
We're going to create tasks and let's see if it's going to create a work tree automatically and maybe even use sub-agents.
1:12:26.207–1:12:30.783
Another question, should the new backend become the source of truth for Kanban tasks?
1:12:30.783–1:12:32.861
Yes, let's just go with the recommended.
1:12:32.861–1:12:41.406
Okay, we're going to expand this plan and we're going to see if it's going to be using a work tree or sub-agents for any of these things.
1:12:41.406–1:12:45.272
Okay, so I do not see it's going to be using sub-agents.
1:12:45.272–1:12:45.768
Update.
1:12:45.768–1:12:53.068
So before we run it, let's ask it, do you plan on using a work tree or sub-agents for this task.
1:12:53.068–1:12:53.837
There you go.
1:12:53.837–1:13:04.070
Yes, for implementation I'd use a work tree because this changes the project from a static only app into a node server app with API routes and persistent states.
1:13:04.080–1:13:08.173
I'd also use subagents, but only for bounded design review tasks.
1:13:08.173–1:13:19.225
And so it's telling you right there that it will be using a work tree and it will be using subagents, and you can bet that this would never happen if we didn't have this agents.md file.
1:13:19.225–1:13:21.722
And so agents.md is super important.
1:13:21.722–1:13:27.383
It's going to save you a lot of time because it basically codifies repeatable tasks.
1:13:27.383–1:13:34.910
So you never have to re-prompt the same thing over and over again.
1:13:34.920–1:13:39.249
Now, before we build real apps, there is one security habit you want to establish early.
1:13:39.249–1:13:43.791
Codex can help inspect configuration, but we should be careful with secrets.
1:13:43.791–1:13:52.037
An environment variable might be safe and public, like a front-end URL, or it might be private, like an API key or deploy token.
1:13:52.037–1:13:57.504
These should not be casually pasted into a prompt or committed into the repo.
1:13:57.504–1:14:02.736
The other important thing is that local config and deployment config are not the same thing.
1:14:02.736–1:14:09.749
A local.env file helps the app run on my machine, but Vercel does not automatically copy that file into production.
1:14:09.749–1:14:15.458
For a deployed app, the required variables need to exist in the deployment environment, too.
1:14:15.458–1:14:26.203
So the right workflow is to ask Codex to identify what variables are needed, classify them as public or private, and then advise you where each one needs to be configured.
1:14:26.203–1:14:31.631
Now, let's say we're building on this app, and we are adding external services.
1:14:31.631–1:14:38.070
So one of those services might be something like OpenAI, or another service could be Open Router.
1:14:38.080–1:14:51.853
Well, every time we connect to external services, we need to connect them using an API key, and those API keys are needed for those services to track how much usage we have so that they can bill us accordingly.
1:14:51.853–1:15:05.910
And so in your app, you need to be storing those API keys because when you're going to be making those requests, regardless whether that's an API token or some kind of deployment token or pretty much anything else, you need to be very, very careful
1:15:05.920–1:15:07.760
how you are storing them.
1:15:07.760–1:15:12.133
And so in this app, let's say we want to use OpenAI here.
1:15:12.133–1:15:12.586
Here.
1:15:12.586–1:15:17.231
So I'm going to say API stack and use the following key.
1:15:17.231–1:15:20.270
And let's say we give it a sample API key.
1:15:20.280–1:15:22.575
Sample API key as a sample.
1:15:22.575–1:15:24.583
We're going to jump into plan mode.
1:15:24.583–1:15:27.052
We're going to select this API stack only.
1:15:27.052–1:15:29.036
We're going to be doing native fetch.
1:15:29.036–1:15:29.531
All right.
1:15:29.531–1:15:33.294
So it went ahead and created our first API stack here.
1:15:33.294–1:15:37.057
And right here it mentions this file where it stores this key.
1:15:37.057–1:15:40.902
And so if you want to use a real key, you never want to paste it in chat.
1:15:40.902–1:15:44.641
What you want to do is you want to open this file and modify it directly.
1:15:44.641–1:15:46.020
So that's what we're going to do.
1:15:46.020–1:15:50.011
We're going to open this in the editor here and I'm going to paste this key right here.
1:15:50.011–1:15:52.359
And this right here is my actual key.
1:15:52.359–1:15:59.530
And so now I have an OpenAI, have an API stack and I have a real key in this file here, okay?
1:15:59.530–1:16:09.801
And now what I need to do is I need to run a check and ensure that we are storing the keys the right way and, you know, they're going to be deployed correctly and all that.
1:16:09.801–1:16:16.445
And so I have this prompt to do just that and it says here inspect this project for environment variables and deployment config.
1:16:16.445–1:16:19.746
Do not print secret values and then tell me all of these things.
1:16:19.746–1:16:20.875
So we're going to run this.
1:16:20.875–1:16:29.335
So now it's telling us that environment inspection required environment variables required only for post OpenAI front end variables, right?
1:16:29.335–1:16:35.386
We don't have any public because, you know, sometimes your app can have both private keys and public keys, right?
1:16:35.386–1:16:42.968
So if you're using something like Superbase, Superbase has an anon key or a secret key or they call it something else now.
1:16:42.968–1:16:48.668
And the idea is the public key can be made available, but it has very, very strict permissions.
1:16:48.668–1:16:57.832
Whereas something like your OpenAI API key or your open router API key or something of that sort needs to be very, very secret, right?
1:16:57.832–1:17:02.312
Because with that key, you can make a lot of calls and do a lot of things.
1:17:02.312–1:17:04.550
And so here it says we have a private key.
1:17:04.560–1:17:07.616
OpenAI PK is private and must stay server-side.
1:17:07.616–1:17:09.606
It is used here, needed locally.
1:17:09.606–1:17:17.983
Hosted service config or cell or another node capable host config as a private server environment variables, port, etc., etc.
1:17:17.983–1:17:21.122
Okay, dot env examples cuz currently untracked.
1:17:21.122–1:17:25.796
So, what we have safest next step before deploying, replace it with only this.
1:17:25.796–1:17:31.005
Only config the real key in the deployment provider's private environment variable settings.
1:17:31.005–1:17:31.452
Okay.
1:17:31.452–1:17:40.588
So, I want to store the key locally for testing, and I want to ensure that it will be deployed also later.
1:17:40.588–1:17:45.131
And so we want that key locally so that we can test, but we also want it to deploy it.
1:17:45.131–1:17:51.435
And that means we need to create a couple of files, one for local settings and one for deployment settings.
1:17:51.435–1:17:57.380
And it's telling us which is the wrong file for local secret because examples are usually committed.
1:17:57.380–1:17:59.843
So let's say we're doing a Vercel deploy.
1:17:59.843–1:18:01.149
We're going to switch that.
1:18:01.149–1:18:04.775
And there we have it, store the real key locally in an untracked.
1:18:04.775–1:18:05.120
Right?
1:18:05.120–1:18:08.393
We need to make sure that this is never committed to Git.
1:18:08.393–1:18:09.597
It needs to be untracked.
1:18:09.597–1:18:12.890
So we're going to expand this, submit this.
1:18:12.890–1:18:14.370
Do not use public.
1:18:14.370–1:18:16.190
These are not public keys.
1:18:16.200–1:18:19.771
Replace dot env example with create dot env.
1:18:19.771–1:18:22.911
Okay, so it's it's going to be creating this dot env.
1:18:22.911–1:18:25.560
The secret is now ignored in dot env.
1:18:25.560–1:18:32.006
And then I'm updating readme and agents to make the local and Vercel setup unambiguous.
1:18:32.006–1:18:35.351
And that way we have the local key stored for local testing.
1:18:35.351–1:18:45.459
It's never going to be committed into Git and then we'll be able to send that key, also deploy that key on Vercel because Vercel is going to be running our app.
1:18:45.459–1:18:47.135
It needs access to that key as well.
1:18:47.135–1:18:48.190
It needs to be secret.
1:18:48.200–1:18:51.102
Okay, implemented the local Vercel key setup.
1:18:51.102–1:19:03.150
And so in this point we've made the the secret key management and not just secret key, any kind of key management is part of our workflow and we can be assured that we have the key for local stuff and we also going to be
1:19:03.160–1:19:12.310
deploying the key correctly for production stuff, regardless what kind of host you're using.
1:19:12.320–1:19:21.345
Now, when you're developing an app, you're going to be writing code for the core stuff, but a lot of things that your app will be doing will be done by existing code.
1:19:21.345–1:19:24.510
You're not going to be building your app from scratch, right?
1:19:24.520–1:19:29.197
You're going to be using existing libraries, existing frameworks, stuff like that.
1:19:29.197–1:19:34.576
And those are called dependencies and that is because your app depends on them to function.
1:19:34.576–1:19:37.738
Without those things, your app will not function.
1:19:37.738–1:19:43.164
And you need to ensure that you have a process for managing these dependencies.
1:19:43.164–1:19:50.148
And I have here a prompt that you can use that will help you inspect this project before adding any dependencies.
1:19:50.148–1:19:51.706
Do not install anything yet.
1:19:51.706–1:19:52.833
Tell me all of this.
1:19:52.833–1:19:54.911
And so let's go ahead and run this prompt.
1:19:54.911–1:19:57.030
Right, and this is what it came back with.
1:19:57.040–1:19:59.155
Dependency project inspection.
1:19:59.155–1:20:01.090
Framework and package manager.
1:20:01.090–1:20:02.410
Framework non-detected.
1:20:02.410–1:20:07.792
This appears to be a plain static JavaScript app served by a custom node server.
1:20:07.792–1:20:12.655
Now, of course, this will definitely not be the case when it comes to your real apps.
1:20:12.655–1:20:19.198
You're going to be using some kind of framework, something that will make your app behave like a real app.
1:20:19.198–1:20:21.597
Here we just have a very, very plain app.
1:20:21.597–1:20:23.910
Package manager non-detected.
1:20:23.920–1:20:25.105
Oh, none of this.
1:20:25.105–1:20:29.446
And of course, when you're going to be building your app, you're going to be having all this as well.
1:20:29.446–1:20:30.765
Available scripts.
1:20:30.765–1:20:36.230
No NPM scripts exist because there's no package manager, because there's no manager, because there's no package.json.
1:20:36.240–1:20:40.308
Current documented run command, we just have this very, very basic.
1:20:40.308–1:20:43.388
Definitely not the case when it comes to production apps.
1:20:43.388–1:20:45.637
OpenAI local env run command.
1:20:45.637–1:20:48.769
So, we have this relevant install dependency.
1:20:48.769–1:20:51.978
So, we do have some basic node built-ins.
1:20:51.978–1:20:55.382
All of these OpenAI calls native fetch, okay?
1:20:55.382–1:20:56.581
So, it's native.
1:20:56.581–1:21:00.766
It's not using the OpenAI SDK, which would have been a dependency.
1:21:00.766–1:21:03.708
Can the task be completed without adding a package?
1:21:03.708–1:21:10.870
Yes, for the current OpenAI API stack and local serving, the project already calls OpenAI via native fetch.
1:21:10.880–1:21:14.816
If a new package is recommended, no package is recommended right now.
1:21:14.816–1:21:26.551
A package could be recommended later if we use Express, Fastify, we start using the official SDK, .env files likely to change if proceeding, right?
1:21:26.551–1:21:30.738
API behavior, OpenAI calls, front end, etc., etc.
1:21:30.738–1:21:35.230
And so, dependencies are important, and you want to limit your dependencies.
1:21:35.240–1:21:39.204
You don't want the system to just add dependencies blindly.
1:21:39.204–1:21:44.724
And so, this is going to be super useful as you're building your app so that you can streamline it.
1:21:44.724–1:21:52.103
Because as I was just building this simple app, Codex asked me whether I want to use OpenAI SDK or native fetch.
1:21:52.103–1:21:55.353
And you always want to err on the side of native stuff.
1:21:55.353–1:21:59.595
If you can avoid a dependency or an SDK, that would be the right move.
1:21:59.595–1:22:01.237
And that's exactly what I did here.
1:22:01.237–1:22:02.524
I just used native, right?
1:22:02.524–1:22:06.564
I could have used an SDK, but I decided I'm just going to keep it as simple as possible.
1:22:06.564–1:22:08.414
And that's really the goal here.
1:22:08.414–1:22:21.252
And this prompt and making this part of your workflow is going to enable you to keep your app streamlined so that you have less dependencies, less chance for something to go wrong, less bloat, etc., etc.
1:22:21.252–1:22:24.959
So, definitely add this to your app building workflow.
1:22:24.959–1:22:34.910
And then ensure that Codex knows about it by making this a part of your agent's MD or a separate step.
1:22:34.920–1:22:40.881
Now that the Cortex foundation is clear, we are going to start with something intentionally small.
1:22:40.881–1:22:43.988
The first step is called Habit Card.
1:22:43.988–1:22:53.385
And it is a tiny habit tracker where users can add habits, check them off for the day, and see a simple streak or count.
1:22:53.385–1:23:02.950
This is a great starter project because the result is visual, easy to check, and small enough that every step stays clear.
1:23:02.960–1:23:18.423
Cortex can plan the app, build the UI, show us the file changes, open the browser, polish the result, and get the front end ready to deploy without also introducing back end complexity.
1:23:18.423–1:23:24.710
Habit Card gives us the core app building pieces without much product complexity.
1:23:24.720–1:23:33.453
A form, a list, a daily check-in state, simple feedback, and later local storage persistence.
1:23:33.453–1:23:40.169
It does not need authentication, payments, APIs, or a real database at first.
1:23:40.169–1:23:48.022
This first app is about getting comfortable with the full Cortex loop on something we can understand immediately.
1:23:48.022–1:23:57.982
Now, here in Cortex, the first thing that you want to do is you want to click here, and you can select start from scratch, but I like to have it set to a specific folder.
1:23:57.982–1:24:03.780
So, I'm going to click on use an existing folder, and I have here a folder prepared called demos.
1:24:03.780–1:24:11.710
I'm going to open this here, and now we have a new project that has been associated with a specific folder.
1:24:11.720–1:24:16.962
And here we can start a brand new And here we can start a brand new conversation for the app that we are building.
1:24:16.962–1:24:23.381
Now, anytime I start building a brand new app, I always want to create a visual architecture.
1:24:23.381–1:24:32.605
Being a visual person, this gives me an understanding of the scope of an app, how the app looks, the user flow, and stuff like that.
1:24:32.605–1:24:38.400
And we can actually use Codex to create that visual architecture for us.
1:24:38.400–1:24:52.192
Now, I have here a prepared prompt that creates this visual architecture, and we want to ensure that we use the built-in image generation that we have as well as Chat GPT to do it.
1:24:52.192–1:24:56.811
So, I'm going to press forward slash, and I'm going to search for Imagen.
1:24:56.811–1:25:01.321
Okay, and then we can say something like use Imagen for the following.
1:25:01.321–1:25:05.936
And I'm going to go jump into plan mode, and I'm going to go ahead and and execute it.
1:25:05.936–1:25:15.285
Okay, and it came back with a habit card architecture diagram, and here it says create one raster infographic using this.
1:25:15.285–1:25:16.444
So, everything looks good.
1:25:16.444–1:25:19.470
There there's some diagram content, visual direction.
1:25:19.480–1:25:21.272
That's a wide composition.
1:25:21.272–1:25:22.030
Looks good.
1:25:22.040–1:25:24.270
We're going to say yes, implement this.
1:25:24.280–1:25:26.162
Okay, and that is our habit card.
1:25:26.162–1:25:28.314
That is our visual interface.
1:25:28.314–1:25:32.382
And right away, I can see what this app is all about, right?
1:25:32.382–1:25:39.086
We have add habit, we have habit list, we have today check-in, and we have a streak count.
1:25:39.086–1:25:44.350
Then we have an empty state, we have local storage later, and we have the Versel deploy.
1:25:44.360–1:25:52.045
And so, this is a very, very simplified visual architecture, but it is very, very important.
1:25:52.045–1:26:01.184
I want to see right away what I'm dealing with, what I'm working with, how many pages, you know, how complex is the app, how simple is the app.
1:26:01.184–1:26:04.756
I see that this is not going to be, you know, a very complex app.
1:26:04.756–1:26:10.190
It's going to be a fairly simple app, but we do have some interesting bits here, right?
1:26:10.200–1:26:14.954
This empty state, we have some local storage, we have a Versel deploy.
1:26:14.954–1:26:19.102
And so, it's a fairly simple app, but still a fairly workable app.
1:26:19.102–1:26:22.777
Now, the next thing that I like to do is create the entity architecture.
1:26:22.777–1:26:28.305
And this is where we're going to be mapping the small set of entities behind the app.
1:26:28.305–1:26:41.540
So, even though the first version is front end only, it is useful to name the habit, the daily check-in, and the streak count summary before we add a local storage later.
1:26:41.540–1:26:44.278
And this right here is the entity diagram.
1:26:44.278–1:26:47.925
And I'm just going to say use ImageGen for below.
1:26:47.925–1:26:50.037
Going to go ahead and run that.
1:26:50.037–1:26:51.870
And I can run it directly.
1:26:51.880–1:26:56.687
I don't really need to run it in plan mode because it's just generating a diagram.
1:26:56.687–1:27:05.737
I'm not asking it a complex, ambiguous coding question or giving it a an ambiguous coding instruction.
1:27:05.737–1:27:08.258
And here is our entity architecture.
1:27:08.258–1:27:18.270
And unlike the visual architecture that we've generated previously, here we're actually seeing the entities that will later become the actual storage schema.
1:27:18.280–1:27:18.608
Okay?
1:27:18.608–1:27:26.650
So, we have the habit, we have a habit check-in, we have a streak summary, and then local storage as the back end.
1:27:26.650–1:27:30.393
So, no back end, everything is stored locally with local storage.
1:27:30.393–1:27:39.005
And this is also very, very useful because unlike the visual diagram here, I want to see the actual schema.
1:27:39.005–1:27:48.894
I want to see what kind of, you know, elements or what kind of, you know, tables we might need to translate this app schema into.
1:27:48.894–1:27:51.590
And as you can see, this is fairly simple.
1:27:51.600–1:27:54.430
Habit, habit check-in, streak summary.
1:27:54.440–1:28:01.398
We have these three main functions here, these three main features that were translated into entities.
1:28:01.398–1:28:01.733
Okay?
1:28:01.733–1:28:08.133
And then we have And for each entity, we have things like name, created at date, completed count.
1:28:08.133–1:28:13.430
Now, at this point, we have both the visual architecture as well as the entity architecture.
1:28:13.430–1:28:21.907
And this is something that I like to do for pretty much every single app that I build because I want to get an idea what I'm really dealing with, right?
1:28:21.907–1:28:26.383
I want to have an understanding of the the scope of the app.
1:28:26.383–1:28:29.138
And right now I can see exactly where we are.
1:28:29.138–1:28:31.547
I can see that this is a fairly simple app.
1:28:31.547–1:28:33.324
I can see the entities.
1:28:33.324–1:28:35.460
I I I see the app building.
1:28:35.460–1:28:37.014
I see the future of the app.
1:28:37.014–1:28:38.628
I see the app coming together.
1:28:38.628–1:28:48.790
Now, the next thing that we want to do is we want to use the plan mode to ask Codex what stack makes sense for this first app.
1:28:48.800–1:28:55.490
The important part is that Codex should recommend the simplest path before it edits any files.
1:28:55.490–1:28:59.271
And as you might have guessed, we are going to be doing this in plan mode.
1:28:59.271–1:28:59.787
All right?
1:28:59.787–1:29:01.988
And here's the prompt that we're going to be using.
1:29:01.988–1:29:03.435
Do not edit files yet.
1:29:03.435–1:29:09.123
Inspect the current project and recommend the simplest stack for Habit Card, right?
1:29:09.123–1:29:23.443
And we ask it what what it should come back with, and we're going to press shift tab to enable the plan mode, of course, because we want it to come back to us if it needs to and ask any clarifying questions.
1:29:23.443–1:29:29.110
We need it to clarify everything before we go deeper into the building the app.
1:29:29.120–1:29:30.992
Okay, I'm going to go ahead and execute this.
1:29:30.992–1:29:33.372
And let's see what it comes back with.
1:29:33.372–1:29:38.230
And in this case, it did not come back with any clarifying questions.
1:29:38.240–1:29:38.639
Okay?
1:29:38.639–1:29:40.552
So, it's writing a plan.
1:29:40.552–1:29:45.017
And the recommended front end stack is going to be React TypeScript, right?
1:29:45.017–1:29:49.396
It wants to use Tailwind CSS for fast simple styling.
1:29:49.396–1:29:51.481
This is the testing library.
1:29:51.481–1:29:52.739
No React Router.
1:29:52.739–1:29:55.317
It's a simple single screen app.
1:29:55.317–1:29:57.230
No global state library.
1:29:57.240–1:29:57.612
Okay?
1:29:57.612–1:29:58.949
Back end decision.
1:29:58.949–1:30:01.652
No back end is needed for the first version, right?
1:30:01.652–1:30:03.187
And that's what we told it.
1:30:03.187–1:30:06.663
We said bias toward a front end only implementation first.
1:30:06.663–1:30:09.635
And then it's also going to use browser verification.
1:30:09.635–1:30:12.423
Okay, open the app in the browser, verify all this.
1:30:12.423–1:30:15.176
Okay, so let's go ahead and and run this.
1:30:15.176–1:30:23.830
All right, so it worked for about 10 minutes and it has implemented the habit card as a front-end only React TypeScript app.
1:30:23.840–1:30:25.652
This is where it is and this is what it did, right?
1:30:25.652–1:30:27.207
It built the app shell and did, right?
1:30:27.207–1:30:35.795
It built the app shell and UI, habit logic, local storage, components for adding form for the add form, list card, and empty state.
1:30:35.795–1:30:42.957
Tests for app flow logic and storage, and verification passed nine tests, production build succeeded.
1:30:42.957–1:30:47.331
And it also gave us a dev server that is running the app.
1:30:47.331–1:30:56.159
And so this dev server is running on my machine right now and this allows us to quickly test things without needing to deploy and test there.
1:30:56.159–1:31:09.161
And on the right-hand side we have this card that is always available and it shows us things like artifacts, background terminal, and basically things that were created as part of this conversation.
1:31:09.161–1:31:13.753
Okay, so we have the images that were generated, we have the index.html for the app.
1:31:13.753–1:31:16.821
We have the background terminal that is running here.
1:31:16.821–1:31:23.003
And so I can click here and that's going to go ahead and and go to the server that's running our app.
1:31:23.003–1:31:23.927
So let's do that.
1:31:23.927–1:31:25.316
That's going to go ahead and open.
1:31:25.316–1:31:29.320
It's also going to open the browser right here in the right-hand pane.
1:31:29.320–1:31:35.352
Now, before we had we had no right-hand pane, but if you click here, you can see that it opens up here right there.
1:31:35.352–1:31:38.416
Another thing that you can do is you can open the browser directly.
1:31:38.416–1:31:42.282
This is the front page here and I can add a habit, habit one.
1:31:42.282–1:31:44.900
I can click here and we have a habit here.
1:31:44.900–1:31:46.299
I can add another we have a habit here.
1:31:46.299–1:31:49.039
I can add another habit, habit two or maybe gym.
1:31:49.039–1:31:51.682
And it's creating these these habits here.
1:31:51.682–1:31:54.038
So I can check it off and that is done.
1:31:54.038–1:31:54.835
Check it off.
1:31:54.835–1:31:57.082
And so it's a very very simple app.
1:31:57.082–1:32:05.420
And if you want to see the actual files that were created as part of this, you can simply right click here and open in finder.
1:32:05.420–1:32:08.653
And this is the React app that was created for this here.
1:32:08.653–1:32:13.981
Once the UI works, we'll add a small persistence step with local storage.
1:32:13.981–1:32:18.025
Habits and today's check-ins can persist after refresh.
1:32:18.025–1:32:23.851
So, the app starts to feel real without introducing a backend yet.
1:32:23.851–1:32:26.038
And this is the prompt that we're going to be using.
1:32:26.038–1:32:31.120
Upgrade habit card so habits and today's check-ins persist with local storage.
1:32:31.120–1:32:35.030
I'm going to jump into the plan mode here just in case.
1:32:35.040–1:32:36.790
And I'm going to go ahead and run this.
1:32:36.800–1:32:45.305
Now, it's actually telling us that inspection shows that habit card already implements the requested front-end only local storage persistence.
1:32:45.305–1:32:45.726
Okay?
1:32:45.726–1:32:48.350
So, no file edits are needed for this upgrade.
1:32:48.360–1:32:52.129
So, we must have done this in one of the previous prompts.
1:32:52.129–1:32:55.750
But, if we hadn't done this, then we would run this prompt.
1:32:55.760–1:32:57.230
But, still, let's go ahead and run it.
1:32:57.240–1:33:05.270
And now it tells us that persistence works through this storage using these keys and a lot of other details here.
1:33:05.280–1:33:05.811
Okay?
1:33:05.811–1:33:10.587
So, we can reload this and now we have something called local storage.
1:33:10.587–1:33:17.734
And what this means is that this app does not have a backend, but this stuff is going to be stored on my browser.
1:33:17.734–1:33:18.168
Okay?
1:33:18.168–1:33:22.437
So, if I'm using this instance, it's going to be stored on this browser.
1:33:22.437–1:33:26.189
If I run it in a different browser, then it's not going to have the data.
1:33:26.189–1:33:30.483
So, whatever I do in that new browser is going to have fresh data.
1:33:30.483–1:33:35.894
And so, this is a way to create, you know, storage just for testing me.
1:33:35.894–1:33:41.036
I mean, you can use this in production as well for certain apps, for certain situations.
1:33:41.036–1:33:48.357
It does have its place, but it's very, very limiting compared to something like Supabase or something of that sort.
1:33:48.357–1:33:53.019
And so, we can delete all this, we can do all that, we can start.
1:33:53.019–1:34:09.630
And if I copy this, run this app, and I load this app, there's nothing there because I'm using a brand new browser instance, and I can create, I can do, I can check off, I can do this, I can do all that, but if I go back to CodeX, there's nothing here,
1:34:09.640–1:34:10.005
right?
1:34:10.005–1:34:23.345
It's not syncing, it's not using my account, and it's not using a unified back-end, so that no matter which browser I use, it will still store the data and keep track of everything.
1:34:23.345–1:34:24.721
That is not happening.
1:34:24.721–1:34:28.369
Once the app works locally, it's time to deploy it.
1:34:28.369–1:34:37.811
Even though Habit Card is simple, this is the first moment where CodeX helps move something from local code to a real-life URL.
1:34:37.811–1:34:41.106
And so, CodeX can do the whole deployment process.
1:34:41.106–1:34:52.542
It can run the local checks, prepare the projects, connect or create the Vercel project, deploy the front-end, and then verify that the live page actually loads.
1:34:52.542–1:34:56.905
And additionally, you want that first deployment to feel very concrete.
1:34:56.905–1:35:00.350
We're not just writing code and hoping it works.
1:35:00.360–1:35:09.530
We're taking a small app, shipping it, opening the deployed URL, and checking the result like we would with a real project.
1:35:09.530–1:35:12.815
And here is my Vercel deployment prompt.
1:35:12.815–1:35:20.132
Prepare Habit Card for deployment on Vercel, and verify it works as a small front-end only app.
1:35:20.132–1:35:23.696
So, at this point, we are just preparing it for deployment.
1:35:23.696–1:35:34.570
We're not yet deploying it, but still, this is an important step because this will ensure that once we do deploy it, that it will work without any issues.
1:35:34.570–1:35:44.590
I'm going to go jump into the plan mode, and remember, we do have that Vercel plugin enabled, and so it should use it automatically with no issues.
1:35:44.600–1:35:46.350
I'm going to go ahead and execute this.
1:35:46.360–1:35:49.983
All right, so it went ahead and created a Vercel deployment plan.
1:35:49.983–1:35:55.916
Okay, Habit Card is already a suitable for a front-end only for sale deployment, okay?
1:35:55.916–1:36:00.334
And this is what it's going to do, and here is the deployment implementation.
1:36:00.334–1:36:10.230
Keep the app front-end only, do not add Convex, which is a back-end APIs or database server functions, or external services, none of functions, or external services, none of that.
1:36:10.240–1:36:16.755
And local storage persistence is expected to be local to each browser and deployment origin.
1:36:16.755–1:36:20.067
Data will not sync across devices or URLs, okay?
1:36:20.067–1:36:22.969
Let's go ahead and implement this plan.
1:36:22.969–1:36:29.180
And 3 minutes later, it tells us that deployed Habit Card to Vercel and verified it live, okay?
1:36:29.180–1:36:31.226
So, this is the live URL.
1:36:31.226–1:36:38.011
We can click here, and that's going to open our Habit Card app running on the web, right?
1:36:38.011–1:36:39.495
Accessible to everybody.
1:36:39.495–1:36:42.572
And this again uses local storage, okay?
1:36:42.572–1:36:50.208
So, we can do that over here, and of course, you know, it's not going to be available in another instance because it's all stored locally.
1:36:50.208–1:37:05.769
And so, at this point, we designed, architected, built, tested, and then deployed a very, very simple web app that uses local storage as our back-end, and this proved the whole cycle for us.
1:37:05.769–1:37:25.350
Now, in the next several modules, we're going to be doing the same, but with more complex apps, slowly adding things like authentication, back-end, and other important components that you need for a real production app.
1:37:25.360–1:37:33.938
The second app we'll be building will be a mini team voting app where people submit lunch or snack ideas and vote on the winner.
1:37:33.938–1:37:38.903
It's a bit more complex with more features, but still fairly simple overall.
1:37:38.903–1:37:48.550
Snack Vote has a submit option form, a snack option list, vote buttons, a live leaderboard, and a winner card.
1:37:48.560–1:37:55.749
This app will serve as a bridge between a simple front end and the larger marketplace app we'll build right after this.
1:37:55.749–1:38:06.471
Instead of jumping straight into complex entities such as customers, bookings, and permissions, we can first learn the back end pattern on a much smaller app.
1:38:06.471–1:38:10.409
Snack Vote only needs snack options and votes.
1:38:10.409–1:38:17.379
Someone can submit an option, other people can vote, and the leaderboard updates as the vote counts change.
1:38:17.379–1:38:25.168
That gives us enough structure to understand live back end data without making the product itself hard to follow.
1:38:25.168–1:38:30.628
As always, in this first step, we'll be mapping the Snack Vote interface visually.
1:38:30.628–1:38:34.350
The app should be simple enough to understand immediately.
1:38:34.360–1:38:45.446
Create or join a voting room, submit a snack option, vote once, watch the leaderboard update, and see a leaderboard update, and see a deadline-driven winner state.
1:38:45.446–1:38:51.588
Now, here in Codex, we're going to come here, and we're going to create a new project from an existing folder.
1:38:51.588–1:38:52.950
We're going to click over here.
1:38:52.960–1:38:54.904
Here, we're going to create a new folder.
1:38:54.904–1:38:58.476
I'm going to type Snack Vote, and we're going to click open.
1:38:58.476–1:39:02.802
And now, we have a brand new project configured here in Codex.
1:39:02.802–1:39:06.089
And here's our prompt for the visual architecture.
1:39:06.089–1:39:12.249
We want to preface that we want to use this image, and we're going to jump into plan mode and execute this.
1:39:12.249–1:39:13.390
And that looks good.
1:39:13.400–1:39:15.150
We're going to go ahead and expand that.
1:39:15.160–1:39:16.656
Go ahead and implement that.
1:39:16.656–1:39:19.704
And here's our Snack Vote visual architecture.
1:39:19.704–1:39:21.679
Look at this beautiful diagram.
1:39:21.679–1:39:24.081
So, you can create or join a room.
1:39:24.081–1:39:29.150
In the current room, you're going to be seeing this, members and the time left.
1:39:29.150–1:39:31.494
You can You have here a snack list.
1:39:31.494–1:39:34.230
You have your your voting buttons.
1:39:34.240–1:39:38.782
You have a live leaderboard, and you have a closed winner state.
1:39:38.782–1:39:46.714
Okay, with some voting deadlines here, here as well, and then we also have our Vercel deploy.
1:39:46.714–1:39:54.110
And so this looks like a fairly fun app with a lot of things going on, and so I can't wait to implement this.
1:39:54.120–1:39:57.924
And we're also going to be adding more and more features as we go along.
1:39:57.924–1:40:04.070
Next, I want to go ahead and create an entity diagram, an entity architecture diagram.
1:40:04.080–1:40:05.334
So here's our prompt.
1:40:05.334–1:40:09.213
We're going to do this, and we're going to go ahead and execute that.
1:40:09.213–1:40:11.158
And here's our entity diagram.
1:40:11.158–1:40:17.073
Okay, so a room contains multiple snack options and has one voting session, right?
1:40:17.073–1:40:21.623
We have the voting room, many snack options, and many votes, right?
1:40:21.623–1:40:31.514
We have We have here some winner logic, the winner logic snack option with the highest vote count when now is greater than or equal to closes at, right?
1:40:31.514–1:40:39.030
So after the deadline, we have here a legend, and here we have a sample kind of workflow, a pipeline.
1:40:39.040–1:40:41.709
Build the UI first, connect it to Convex.
1:40:41.709–1:40:52.364
Later, Convex is going to be our backend, and we are going to be leveraging things like real-time updates, persistence, and live vote counts.
1:40:52.364–1:41:07.550
And so now that we've generated a visual architecture diagram, as well as our entity diagram, the next thing that we want to do is we want to ask Codex for some stack recommendations, because there are lots of ways that we
1:41:07.560–1:41:12.885
can build out this app, and we want Codex to tell us the best options for this specific app.
1:41:12.885–1:41:17.723
Here's the prompt that we're going to be using, and I'm going to switch into plan mode here.
1:41:17.723–1:41:25.466
And it's telling us do not edit files yet, inspect the current project, and recommend the simplest stack for Snack Poll.
1:41:25.466–1:41:27.504
And here's the plan that it came back with.
1:41:27.504–1:41:29.396
Here we have the stack recommendation.
1:41:29.396–1:41:32.955
We're going to be using React, TypeScript, Tailwind.
1:41:32.955–1:41:39.317
And here it says backend later Convex with TypeScript server functions and generated client types.
1:41:39.317–1:41:55.830
And so, for the most part, uh this is very, very similar, if not the exact same architecture stack that we use for the first app, except we're going to be adding more and more features, and also connecting a back end for the first time
1:41:55.840–1:41:57.088
in this tutorial.
1:41:57.088–1:42:06.250
Now, here, instead of clicking submit, I'm going to give it another prompt, and this prompt is going to start building the app, writing the code.
1:42:06.250–1:42:14.308
And here's the prompt, "Implement the first working Snack Vote UI without a database or persistence, okay?
1:42:14.308–1:42:23.030
Inspect the current project first, then build the smallest useful Snack Vote UI." And there's some verification steps as well.
1:42:23.040–1:42:32.002
And we also explicitly tell it to not use convex, local storage, or an API, nothing of that, just keep it to these specs right here.
1:42:32.002–1:42:33.963
And we also have some verification.
1:42:33.963–1:42:38.724
So, I'm going to go ahead and run this in plan mode, in case it wants to ask me something.
1:42:38.724–1:42:50.131
So, it doesn't have any questions for us, and that is because in this specific conversation, we already fleshed out, you know, things like the architecture, the stack, and all of that stuff.
1:42:50.131–1:42:54.142
And so, it kind of knows what it needs to do to build out this app.
1:42:54.142–1:43:00.100
So, we're going to say, "Yes, implement this." because this is the step where we actually want the code written.
1:43:00.100–1:43:07.860
All right, so this has completed, and it says here, "Implemented the first working UI-only Snack Vote app here.
1:43:07.860–1:43:09.748
Created all of this.
1:43:09.748–1:43:10.954
What works?
1:43:10.954–1:43:12.995
Verification completed.
1:43:12.995–1:43:15.070
Still needs attention later."
1:43:15.080–1:43:18.617
Okay, all of these things, and we'll talk about that a little bit later.
1:43:18.617–1:43:20.792
And so, now we have a web preview.
1:43:20.792–1:43:27.300
So, we can click on open, and that's going to go ahead and open it right here in our built-in browser here.
1:43:27.300–1:43:28.993
This is our app right here.
1:43:28.993–1:43:31.508
And so, we have snack and lunch options.
1:43:31.508–1:43:41.790
We can create, we can submit an option, add sample snacks, click here, and we have these snack options here with some votes here.
1:43:41.800–1:43:43.179
Leaderboard, right?
1:43:43.179–1:43:44.630
So, this is winning.
1:43:44.640–1:43:48.471
Winner state, current winner leader, spicy ramen bowls.
1:43:48.471–1:43:52.717
And so, if I vote on falafel wraps, uh wraps, six.
1:43:52.717–1:43:53.246
Right?
1:43:53.246–1:43:54.526
So, now it's six.
1:43:54.526–1:43:55.918
I can keep voting.
1:43:55.918–1:43:59.754
And that's a problem right away, and it's in memory.
1:43:59.754–1:44:03.474
And one person can vote multiple times, which is an issue.
1:44:03.474–1:44:07.815
We're going to fix that a little bit later, but I can also add a snack.
1:44:07.815–1:44:09.335
Let's say sushi.
1:44:09.335–1:44:10.617
I don't know, sushi.
1:44:10.617–1:44:14.017
Add this, and we have sushi, and I can also vote on that.
1:44:14.017–1:44:19.630
So, it's a big big issue, but for the most part, the logic works, the UI works.
1:44:19.640–1:44:25.946
Now, once the snack vote UI exists, we're going to replace the mock snack data with real Convex data.
1:44:25.946–1:44:33.424
And for those of you that that are not familiar, Convex is a back end that we're going to be using in this tutorial.
1:44:33.424–1:44:35.807
It's an awesome back end, super fast.
1:44:35.807–1:44:42.670
And if you want to learn more information, I actually did a dedicated video on it that you can find right there.
1:44:42.680–1:44:52.392
And so, once we add Convex, our app will stop being a static interface and start behaving like a real database back product.
1:44:52.392–1:44:54.523
And the path is very very simple.
1:44:54.523–1:45:07.322
Code X creates the Convex schema, adds a query, adds mutations, connects it to the UI, and then we verify the result in both the browser and the Convex dashboard.
1:45:07.322–1:45:12.660
And so, when we submit an option in the app, it should be written back to Convex.
1:45:12.660–1:45:17.870
When we look inside the Convex dashboard, that snack option should be there.
1:45:17.870–1:45:30.110
And when someone votes, the UI should update live so that we can see the front end and back end working together instead of treating the back end like a black box.
1:45:30.120–1:45:34.470
And when you head over to convex.dev, you can learn more about this back end.
1:45:34.480–1:45:36.470
And this is a great, great back end.
1:45:36.480–1:45:41.464
It's very, very fast, and it works really great with agents, right?
1:45:41.464–1:45:44.386
So, the back end building blocks for your agents, okay?
1:45:44.386–1:45:47.438
So, I'm going to go ahead and log in to my free account.
1:45:47.438–1:45:48.766
I'm using the free plan.
1:45:48.766–1:45:50.233
I'm not paying for anything.
1:45:50.233–1:45:54.006
And this is also an open-source back end, so you can also self-host it if you want.
1:45:54.006–1:45:55.576
So, I'm going to go ahead and log in.
1:45:55.576–1:45:57.057
All right, so here I am logged in.
1:45:57.057–1:45:59.859
And as you can see, I have here two projects.
1:45:59.859–1:46:06.887
Now, our app is going to automatically create a brand new project for its data, for its functions, for everything.
1:46:06.887–1:46:12.030
And here back in Codex, we're going to paste a new prompt that looks something like this.
1:46:12.040–1:46:19.835
Upgrade Snack Votes to Snack Options, and Votes are stored in Convex instead of local in-memory state.
1:46:19.835–1:46:26.473
Now, if I press command, comma, and go to MCP Servers, you can see that I do not have the Convex MCP server.
1:46:26.473–1:46:30.296
And that is because we're not going to be connecting to Convex via MCP.
1:46:30.296–1:46:39.310
We're actually going to be connecting to it using a much simpler method, and that is the CLI, which stands for command line interface.
1:46:39.320–1:46:45.634
And actually, before I run this prompt, we're going to check to make sure that we have a connection.
1:46:45.634–1:46:54.550
Can you first check that we have the Convex CLI installed, and if not, do install it.
1:46:54.560–1:46:55.905
I'm going to go ahead and run it.
1:46:55.905–1:47:01.630
Now, I already have Convex CLI installed, but you can just tell Codex to install it.
1:47:01.640–1:47:02.410
It's that easy.
1:47:02.410–1:47:11.707
And so, it's telling me that NPX, which is a package manager, could fetch Convex temporarily, but the project does not have it installed.
1:47:11.707–1:47:16.903
I'm installing Convex into the project now as a dev dependency, okay?
1:47:16.903–1:47:19.144
Convex is installed locally now, okay?
1:47:19.144–1:47:20.884
I'll verify the CLI results.
1:47:20.884–1:47:26.861
And so, you don't need to read lots and lots of documentation, figure out how to connect to it.
1:47:26.861–1:47:29.409
You just tell Codex that you want to connect to it.
1:47:29.409–1:47:30.431
It's that easy.
1:47:30.431–1:47:34.070
So, Convex CLI is installed locally in the project now.
1:47:34.080–1:47:36.590
Okay, so now we can paste the prompt.
1:47:36.600–1:47:42.531
Upgrade snack votes so snack options and votes are stored in Convex instead of local in-memory state.
1:47:42.531–1:47:46.323
So, I'm going to go ahead and do this and let's go into plan mode.
1:47:46.323–1:47:49.757
See if it wants to ask me something or clarify something.
1:47:49.757–1:47:53.095
And so, it's telling me one material set of choices to open.
1:47:53.095–1:47:55.304
There's no existing Convex folder.
1:47:55.304–1:47:58.859
So, this app is not linked to a Convex deployment yet.
1:47:58.859–1:47:59.676
And that is correct.
1:47:59.676–1:48:01.342
And that's what we want to do next.
1:48:01.342–1:48:07.902
And now it's asking me which Convex backend should snack vote use for this first backed version.
1:48:07.902–1:48:09.745
We want to create a new one, right?
1:48:09.745–1:48:12.459
So, we're going to go with the recommended option.
1:48:12.459–1:48:20.634
All right, and now we have a new plan to upgrade the existing app from in-memory snack options to live Convex data.
1:48:20.634–1:48:21.110
Okay?
1:48:21.120–1:48:29.574
So, it's going to do everything and it's going to essentially configure the backend to be Convex, set up the schema, set up the data, everything.
1:48:29.574–1:48:36.175
And once it's done, we should be able to go to Convex and see a brand new project here automatically created.
1:48:36.175–1:48:37.849
So, I'm going to hit submit here.
1:48:37.849–1:48:45.354
All right, so it says it has created a fresh cloud project and synced the backend function successfully.
1:48:45.354–1:48:49.916
And now you see this cursor, it's testing out the UI.
1:48:49.916–1:48:53.354
And so, right now it's not running, so it should start it out.
1:48:53.354–1:48:58.710
And here it says the existing browser tab was sitting on the browser error, so it has restarted it.
1:48:58.720–1:49:03.879
And if we jump into Convex, you can see that we have a new project created.
1:49:03.879–1:49:08.756
Now, I did authenticate this account with Codex, so it knows that this is my account.
1:49:08.756–1:49:13.144
And so, if we click over here, we should see some initial stuff happening, right?
1:49:13.144–1:49:16.430
There's some data, functions, and it's not done yet, right?
1:49:16.440–1:49:17.816
It's still working.
1:49:17.816–1:49:21.470
And while it's working, we can see what has been done.
1:49:21.480–1:49:22.848
And it's actually typing it.
1:49:22.848–1:49:23.609
Look at that.
1:49:23.609–1:49:24.919
Key press input.
1:49:24.919–1:49:26.310
It's creating it.
1:49:26.320–1:49:27.646
It's testing it right here.
1:49:27.646–1:49:29.408
You can actually see it happening.
1:49:29.408–1:49:33.788
This snack was submitted through the browser and appeared from Convex.
1:49:33.788–1:49:35.430
I'm voting on it.
1:49:35.440–1:49:38.650
There is this testing all the flows, which is pretty cool.
1:49:38.650–1:49:50.884
All right, now it's telling us implemented the Convex back snack vote upgrade, changed all of this, what changed, verification, edge cases handled, and it is running.
1:49:50.884–1:49:52.802
So, we can test it out ourselves.
1:49:52.802–1:49:54.713
And so, here's the app.
1:49:54.713–1:49:57.036
And now it's Convex here's the app.
1:49:57.036–1:49:57.750
And now it's Convex backed.
1:49:57.760–1:50:01.692
And so, now if we head to Convex, we should see the data.
1:50:01.692–1:50:05.310
So, as you can see, snack options, this has a vote of one.
1:50:05.320–1:50:07.884
This is the snack tools, vote one.
1:50:07.884–1:50:11.634
And if we increase the vote, it should be two, and it's automatic.
1:50:11.634–1:50:13.011
It's absolutely two, and it's automatic.
1:50:13.011–1:50:13.630
It's absolutely automatic.
1:50:13.640–1:50:14.744
Three, it's three.
1:50:14.744–1:50:16.643
It does not need to do anything.
1:50:16.643–1:50:21.150
And we can create a new snack option, let's say sushi, submit.
1:50:21.160–1:50:23.860
And if we come over here, we see sushi, zero votes.
1:50:23.860–1:50:25.312
Now it's winning.
1:50:25.312–1:50:30.561
And so, this is essentially the same app, except it's Convex backed.
1:50:30.561–1:50:32.675
And we also have functions.
1:50:32.675–1:50:37.767
And with Convex, you need to create functions to access your data.
1:50:37.767–1:50:41.296
It's not like with other systems where it's automatic.
1:50:41.296–1:50:45.870
Here you need list, you need submit, you need a vote, you need functions.
1:50:45.880–1:50:52.127
And so, the snack options table or document has three functions.
1:50:52.127–1:50:57.910
No files, no schedules, and there's some logs here, so that you can see things are here, so that you can see things are happening.
1:50:57.920–1:51:01.079
>> Okay, so this was a fairly successful migration.
1:51:01.079–1:51:06.250
We went to no back end to a Convex back end very, very quickly.
1:51:06.250–1:51:12.334
Now that snack vote has real Convex data, we can make it feel more like a shared group app.
1:51:12.334–1:51:21.597
Instead of one global snackboard, users can create or join a simple voting room like Friday lunch or team snacks.
1:51:21.597–1:51:28.835
Each room should own its own snack options, votes, leaderboard, and winner state.
1:51:28.835–1:51:36.266
This keeps the app more interesting while teaching a clean back-end concept, scoped data.
1:51:36.266–1:51:41.400
We still do not need accounts, permissions, invites, or admin tools.
1:51:41.400–1:51:44.230
And here's the prompt that we're going to be using.
1:51:44.240–1:51:49.274
Upgrade snack vote so voting happens inside simple rooms.
1:51:49.274–1:51:52.236
And I'm going to run this in a plan mode.
1:51:52.236–1:51:55.070
All right, so it came back with a plan for us.
1:51:55.070–1:51:58.350
This is the room-based snack vote upgrade.
1:51:58.360–1:52:03.510
Upgrade the current Convex back app from one global snackboard to simple rooms.
1:52:03.520–1:52:04.842
Can I expand that?
1:52:04.842–1:52:06.310
Yes, implement that.
1:52:06.320–1:52:10.710
Now, as it's running, I am seeing an error message here.
1:52:10.720–1:52:14.430
Did you forget to run NPX Convex dev?
1:52:14.440–1:52:20.378
Okay, so let's see if it's able to catch that and solve it before the next prompt.
1:52:20.378–1:52:21.096
It is done.
1:52:21.096–1:52:24.221
So, it has implemented room-based snack vote.
1:52:24.221–1:52:29.167
This is what it changed, files, things, verification limits.
1:52:29.167–1:52:30.599
Okay, very important.
1:52:30.599–1:52:32.757
Limits is actually very, very useful.
1:52:32.757–1:52:37.719
No auth, ownership, invites, or duplicate vote guard yet.
1:52:37.719–1:52:40.168
And we'll fix some of these a little later.
1:52:40.168–1:52:41.703
Room selection, room codes.
1:52:41.703–1:52:43.162
Okay, so how does this work?
1:52:43.162–1:52:44.667
Let's go ahead and refresh this.
1:52:44.667–1:52:49.869
All right, so we can create or join a room, and there are some rooms over here.
1:52:49.869–1:52:54.452
So, let's say we type Friday lunch, and so now we've switched the room.
1:52:54.452–1:52:56.830
Okay, current room Friday lunch.
1:52:56.840–1:52:59.228
And now we can do the same thing.
1:52:59.228–1:53:01.124
We're now in in the scope.
1:53:01.124–1:53:03.476
It's all about scoping now, right?
1:53:03.476–1:53:08.884
And so this is a specific room, and I can say, I don't know, submit.
1:53:08.884–1:53:10.867
There we have it in this room.
1:53:10.867–1:53:15.250
And now if I switch a room, let's say I switch to launch ideas.
1:53:15.250–1:53:16.822
So now it's brand new.
1:53:16.822–1:53:18.825
There's nothing nothing there.
1:53:18.825–1:53:22.008
And I can say something like I don't know, tacos.
1:53:22.008–1:53:23.587
And now we have tacos here.
1:53:23.587–1:53:26.517
And if we go into Codex, we should see that.
1:53:26.517–1:53:30.830
So we have voting rooms here, and we have different ideas here.
1:53:30.840–1:53:35.684
And now if we go into snack options, we can see that they belong to a specific room.
1:53:35.684–1:53:36.710
We have the room IDs.
1:53:36.710–1:53:41.730
These are the same same room that we have a bunch of different room IDs there.
1:53:41.730–1:53:47.702
Probably some of them created by Codex as part of testing, like lunch ideas.
1:53:47.702–1:53:49.600
Oh, no, I created lunch ideas.
1:53:49.600–1:53:53.203
These ones were created by Codex, these three rooms.
1:53:53.203–1:53:55.035
And we can remove them.
1:53:55.035–1:53:58.020
I can select these, and we can delete these.
1:53:58.020–1:54:02.940
And if we go into functions, we can see that for snack options, it's the same pre-functions.
1:54:02.940–1:54:08.708
But for voting room, we have get, create, or join, bunch of other functions that we have.
1:54:08.708–1:54:10.771
And And so it pretty much did everything.
1:54:10.771–1:54:18.392
It created the functions, it created the schema, it even, you know, created some test data while it was testing.
1:54:18.392–1:54:24.121
We'll add one simple rule that makes the voting feel like a real product.
1:54:24.121–1:54:30.434
After all, a person should not be able to spam the same room with repeated votes.
1:54:30.434–1:54:33.589
And that is because we still do not have real authentication.
1:54:33.589–1:54:39.153
And so for this tutorial, a local or session-based voter identity is enough.
1:54:39.153–1:54:42.359
And that's what we're going to be doing right now.
1:54:42.359–1:54:44.069
And here's my next prompt.
1:54:44.069–1:54:50.947
We're going to upgrade snack votes, so each person can only have one active vote per room.
1:54:50.947–1:54:52.622
Jump into plan mode.
1:54:52.622–1:54:53.427
Run that.
1:54:53.427–1:54:55.027
So here's the plan.
1:54:55.027–1:54:57.163
One active vote per room.
1:54:57.163–1:55:00.270
Add a lightweight session-based voting rule.
1:55:00.280–1:55:09.392
Each browser session gets a session ID and Convex stores one active vote per room ID and session ID, right?
1:55:09.392–1:55:11.163
So, this needs to be unique.
1:55:11.163–1:55:16.091
So, if I voted in that room, my session ID was used to vote.
1:55:16.091–1:55:17.950
And so, this needs to be unique.
1:55:17.960–1:55:22.080
So, for that room, my session can only happen twice.
1:55:22.080–1:55:26.190
If there's a chance for a repeat, it's not going to count it.
1:55:26.200–1:55:31.470
Yeah, I can vote in other rooms, but per session per room can only happen once.
1:55:31.480–1:55:32.894
We're going to expand this.
1:55:32.894–1:55:33.470
Looks good.
1:55:33.480–1:55:34.672
And submit this.
1:55:34.672–1:55:35.790
So, it is done.
1:55:35.800–1:55:39.270
Implemented one active vote per room.
1:55:39.280–1:55:40.676
Okay, change this.
1:55:40.676–1:55:41.685
What changed?
1:55:41.685–1:55:43.900
And it added this get my vote.
1:55:43.900–1:55:45.488
Added votes with table.
1:55:45.488–1:55:47.645
So, let's go ahead and try this out.
1:55:47.645–1:55:48.566
Open this here.
1:55:48.566–1:55:51.968
So, let's say I go to another room, friend Friday lunch.
1:55:51.968–1:55:54.390
I switch that room and I have my burrito.
1:55:54.400–1:55:55.866
So, I'm going to vote for this.
1:55:55.866–1:55:57.956
I just voted and I can't vote again.
1:55:57.956–1:55:58.763
You see that?
1:55:58.763–1:56:08.953
I can't vote again because if I go to Convex and I go into data and I go into votes, I should see a session ID with room ID.
1:56:08.953–1:56:14.270
So, let me go ahead and delete all of these so that we can see which one is mine.
1:56:14.280–1:56:15.561
And so, now I can vote again.
1:56:15.561–1:56:16.673
You see it's back up.
1:56:16.673–1:56:18.507
It's it's it's uh reactive.
1:56:18.507–1:56:20.430
I'm going to hit vote.
1:56:20.440–1:56:24.028
And now you see room ID and session ID.
1:56:24.028–1:56:28.051
These two, if they can only appear once in this table.
1:56:28.051–1:56:35.604
And so, obviously now it's knows that my session ID and I'm trying to vote for this one and that's not going to work because I'm in this room.
1:56:35.604–1:56:37.794
I'm in this room here, Friday lunch.
1:56:37.794–1:56:39.630
Friday lunch right there.
1:56:39.640–1:56:44.021
Now, if I switch rooms, let's so let's say I go to another room.
1:56:44.021–1:56:46.470
Let's say I go into Sunday brunch.
1:56:46.470–1:56:48.227
Now, I can vote, right?
1:56:48.227–1:56:49.454
I can vote for anything.
1:56:49.454–1:56:50.751
I can say tacos.
1:56:50.751–1:56:51.472
Submit.
1:56:51.472–1:56:53.121
I can vote here.
1:56:53.121–1:56:55.036
And let's say I create another one.
1:56:55.036–1:56:56.381
I I change my vote.
1:56:56.381–1:57:02.602
Yes, I can switch votes, but I cannot pad, you know, with multiple votes an item.
1:57:02.602–1:57:05.854
And so, if I go back here, now there are two options, right?
1:57:05.854–1:57:12.179
Two different rooms, same session ID, but I cannot vote in the same room more than once.
1:57:12.179–1:57:14.717
So, this works really, really nice.
1:57:14.717–1:57:21.382
And finally, we'll add a deadline, so each room has a moment when voting closes.
1:57:21.382–1:57:24.903
Before the deadline, people can submit and vote.
1:57:24.903–1:57:31.918
After the deadline, voting locks and the app shows the winner or a simple tie state.
1:57:31.918–1:57:37.308
This adds time-based product state without becoming a scheduling system.
1:57:37.308–1:57:49.310
It is still a small group decision app, but now it shows how front-end UI and back-end data can derive open, closed, winner, and tie states from one field.
1:57:49.320–1:57:51.583
And here's the prompt that we're going to be using.
1:57:51.583–1:57:54.594
I'm going to switch into plan mode, run this.
1:57:54.594–1:57:56.936
Oh, it needs a product decision.
1:57:56.936–1:58:02.635
Okay, how should users set a room deadline in this small tutorial version?
1:58:02.635–1:58:12.765
Quick durations, okay, add simple buttons like 1 minute, 5 minutes, 15 minutes when creating opening a room, date time input, or fixed default.
1:58:12.765–1:58:14.630
Let's do quick durations.
1:58:14.640–1:58:15.673
That sounds good.
1:58:15.673–1:58:16.950
Let's implement this.
1:58:16.960–1:58:18.228
And it is complete.
1:58:18.228–1:58:20.486
Implemented simple voting deadlines.
1:58:20.486–1:58:22.178
This is what was changed.
1:58:22.178–1:58:28.413
Added quick deadline choices, no deadline, 1 minute, 5 minutes, 15 minutes.
1:58:28.413–1:58:32.225
All of this, and let's go ahead and see how this works.
1:58:32.225–1:58:33.841
All right, so here we are.
1:58:33.841–1:58:39.614
And let's go ahead and create a room, Friday lunch, and let's say it's 5 minutes.
1:58:39.614–1:58:41.831
Select 5 minutes, open the room.
1:58:41.831–1:58:43.464
This still says no deadline.
1:58:43.464–1:58:44.750
Let's try another room.
1:58:44.750–1:58:46.562
Let's say Sunday brunch.
1:58:46.562–1:58:48.409
I can select no deadline.
1:58:48.409–1:58:49.674
I can do 15 minutes.
1:58:49.674–1:58:51.333
Let's Let's 15 minutes.
1:58:51.333–1:58:53.079
See, it says no deadline.
1:58:53.079–1:58:54.258
Okay, that's a bug.
1:58:54.258–1:58:55.620
That's definitely a bug.
1:58:55.620–1:58:57.967
So, let's see if it's able to fix it.
1:58:57.967–1:59:03.870
That's the first bug that has happened to us as far as I that has happened to us as far as I remember.
1:59:03.880–1:59:15.327
And so, we're going to say created tried creating a room and selecting a deadline, but it ended up creating a room with no deadline.
1:59:15.327–1:59:18.331
And we don't really need plan mode for this.
1:59:18.331–1:59:21.870
There's no, you know, clarifying questions here.
1:59:21.880–1:59:23.179
It's a simple bug.
1:59:23.179–1:59:25.695
And we don't really want it to clarify.
1:59:25.695–1:59:27.196
We we know what the bug is.
1:59:27.196–1:59:28.517
We just want it to fix it.
1:59:28.517–1:59:31.069
So, there's really no ambiguity there.
1:59:31.069–1:59:34.865
It's like It's like I'm not looking to negotiate with Codex.
1:59:34.865–1:59:38.390
I know this is a bug and I want it to fix it, right?
1:59:38.400–1:59:39.702
There's no other ways.
1:59:39.702–1:59:41.704
There's nothing else happening.
1:59:41.704–1:59:49.633
Unless I'm wrong, and in that case, it's going to tell me that I'm wrong, that it works, but there's no other paths here as far as I'm concerned.
1:59:49.633–1:59:57.638
Now, sometimes Codex would output something like this and it tries to go into plan mode.
1:59:57.638–2:00:04.299
And so, right now it thinks it's in plan mode, but it's it actually is not in plan mode.
2:00:04.299–2:00:13.007
And so, if I say something like do it, it's going to complain that that I did not uh leave the plan mode while I'm not in the plan mode.
2:00:13.007–2:00:21.532
So, this is a bug that I have been experiencing from time to time and it's annoying, but it's it's easily fixable.
2:00:21.532–2:00:26.670
You see, it says I can't edit files because this thread is in plan mode, but we're not in plan mode.
2:00:26.680–2:00:31.043
And so, the solution is to go into plan mode and type something.
2:00:31.043–2:00:32.150
Okay, fix it.
2:00:32.160–2:00:35.409
And then it's going to say something like, well, you know, I can't do it.
2:00:35.409–2:00:36.195
I'm in plan mode.
2:00:36.195–2:00:37.911
And then you can leave plan mode.
2:00:37.911–2:00:39.550
And now it understands it.
2:00:39.560–2:00:41.340
You see, now it's correct.
2:00:41.340–2:00:48.790
Fixed the bug where it's selecting a deadline and opening an existing no deadline room still leaves the room with no deadline.
2:00:48.800–2:00:50.140
So, we're going to submit this.
2:00:50.140–2:00:50.722
All right.
2:00:50.722–2:01:00.941
So, it looks like it fixed it and here it says in the browser, I created a no deadline room, reopened it with 15 minutes, and it showed open plus closes in, etc.
2:01:00.941–2:01:06.736
So, let's go ahead and test this out ourselves to ensure that it does really work.
2:01:06.736–2:01:12.299
So, we have this and let's do Friday lunch and we said 15 minutes.
2:01:12.299–2:01:13.548
And now it shows it.
2:01:13.548–2:01:17.017
And let's say 1 minute room one, 1 minute.
2:01:17.017–2:01:17.989
There we go.
2:01:17.989–2:01:18.753
1 minute.
2:01:18.753–2:01:24.210
And let's try no deadline room two, select no deadline, open no deadline.
2:01:24.210–2:01:24.636
Okay.
2:01:24.636–2:01:28.526
So, this looks like this was finally fixed.
2:01:28.526–2:01:43.941
Now, once SnackVote has rooms, session-based voting, and a deadline, we are ready to deploy the front-end app with Vercel and verify that the deployed app points to the right back-end environment.
2:01:43.941–2:01:47.430
And this will round up this specific app build.
2:01:47.440–2:01:56.377
And here's our prompt, prepare SnackVote for deployment on Vercel and verify it works with the Convex back-end, okay?
2:01:56.377–2:01:59.426
I'm just going to do it in plan mode, run that.
2:01:59.426–2:02:01.988
Here it's being very, very clever.
2:02:01.988–2:02:12.630
One important deployment decision remains, whether the Vercel app should use the existing Convex dev deployment or it should promote it to production, okay?
2:02:12.640–2:02:17.910
And this is really, really cool because this is something that I wanted to cover once this was done.
2:02:17.920–2:02:24.830
So, if we go into Convex and you click over here, you can see all your deployments, your different deployments.
2:02:24.840–2:02:30.070
So, so we we are currently under development deployment, under development cloud.
2:02:30.080–2:02:34.888
We can also have a production deployment, preview deployments, other deployments, stuff like that.
2:02:34.888–2:02:44.290
So, ideally, once we deploy it with Vercel, we want it to use the production Convex, and that's what we're going to select, because this makes sense.
2:02:44.290–2:02:48.710
Production deployment uses the production Convex.
2:02:48.720–2:02:51.785
Development deployment uses the development Convex.
2:02:51.785–2:03:00.262
And this is our plan prepare snack vote for a production result deploy connected to the Convex production backend.
2:03:00.262–2:03:02.002
We're going to hit submit.
2:03:02.002–2:03:05.277
And it's going to create a production.
2:03:05.277–2:03:06.974
In fact, they already did it, right?
2:03:06.974–2:03:12.865
We can switch to this and it's going to have a production environment here created for us.
2:03:12.865–2:03:13.417
All right.
2:03:13.417–2:03:19.508
So, it has deployed snack vote to Vercel and verified it against Convex production, okay?
2:03:19.508–2:03:22.942
So, this is the live URL, what we're seeing here.
2:03:22.942–2:03:25.719
Deployment URL and the Convex backend.
2:03:25.719–2:03:32.256
Okay, and if we go into Convex, you can see that it's currently pointing to the production URL here.
2:03:32.256–2:03:34.723
And we have everything here in production, right?
2:03:34.723–2:03:39.663
So, we have the dev instance pointing to the dev deployment in Convex.
2:03:39.663–2:03:46.068
And the production instance in Vercel pointing to the production instance here in Convex.
2:03:46.068–2:03:48.265
So, we have all the same functions.
2:03:48.265–2:03:49.800
We have all the same data.
2:03:49.800–2:03:51.078
Everything is there.
2:03:51.078–2:03:56.927
The data might be a little different, but the schema is exactly the same and it works, right?
2:03:56.927–2:04:01.590
So, we can create a room, whatever new room, 1 minute, open it.
2:04:01.600–2:04:05.163
And now 59 seconds, 58 seconds, looks good.
2:04:05.163–2:04:08.576
We can create another room, room three, no deadline.
2:04:08.576–2:04:10.050
And that has no deadline.
2:04:10.050–2:04:11.545
So, I'm currently in this room.
2:04:11.545–2:04:13.405
I can create a food option.
2:04:13.405–2:04:14.153
I can vote.
2:04:14.153–2:04:15.804
I can't vote anymore.
2:04:15.804–2:04:17.613
One active vote per room.
2:04:17.613–2:04:19.350
This is the leaderboard.
2:04:19.360–2:04:21.564
So, it looks really good.
2:04:21.564–2:04:35.622
And this time we've actually built a fairly cool and a fun app along with a backend that uses several different deployments depending on where the app is is running.
2:04:35.622–2:04:44.937
So, for local deployment, we have the local, the dev convex deployment, and for the production Vercel deployment, we're using the production convex deployment, okay?
2:04:44.937–2:04:48.870
So, this was a slightly more complex app.
2:04:48.880–2:04:54.422
But, there's still one more app that I want to build, and this app is going to be the most complex of them all.
2:04:54.422–2:05:09.830
It's going to bring a lot of these things that we've been talking about so far together, and also we're going to be introducing some new functionality, new features, and a lot of really cool features, and a lot of really cool things.
2:05:09.840–2:05:14.022
Now, for this last app in the course, we're going to be building FlexHelp.
2:05:14.022–2:05:26.561
And this is where we take the workflow from the first two smaller apps and apply it to a more realistic product, a two-sided marketplace where helpers offer fixers services and customers book them.
2:05:26.561–2:05:30.403
The important thing is that we will still build it in controlled steps.
2:05:30.403–2:05:33.897
We're not going to ask Codex to build the whole marketplace at once.
2:05:33.897–2:05:39.250
We are going to architect the design, and build the UI, then add feature by feature.
2:05:39.250–2:05:44.123
And last but not least, we're going to be deploying the app, making it available to anyone.
2:05:44.123–2:05:48.757
As always, our first step will be creating the visual architecture.
2:05:48.757–2:05:58.480
This gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
2:05:58.480–2:06:02.941
Now, here in Codex, we're going to click here, and we're going to create a brand new project.
2:06:02.941–2:06:07.948
Now, I like to start it from an existing folder, and I'm going to create a new folder.
2:06:07.948–2:06:08.590
FlexHelp.
2:06:08.600–2:06:11.089
I'm going to hit create, and I'm going to click open.
2:06:11.089–2:06:13.405
And that creates a brand new project.
2:06:13.405–2:06:21.586
Now, the first thing that we're going to be doing is we're going to be building a visual architecture, the same thing that we did for the previous two apps.
2:06:21.586–2:06:32.710
And this is important because this gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
2:06:32.720–2:06:38.354
And here's the prompt that I'm going to be using and I want to specify that we want to use ImageGen.
2:06:38.354–2:06:41.702
We're going to jump into plan mode and we're going to run this.
2:06:41.702–2:06:44.807
And here we have the Flex Help Visual Architecture.
2:06:44.807–2:06:46.349
And here's a better view.
2:06:46.349–2:06:54.655
And so here we have the customer, we have the shared marketplace screens, and we have the helper, which are the two sides of this marketplace.
2:06:54.655–2:06:57.502
We also have the Convex and the Versel here.
2:06:57.502–2:07:03.953
On the customer side, we have browse services, get the service detail, and then send a booking request.
2:07:03.953–2:07:07.836
The helper side, we have the helper dashboard and the status updates.
2:07:07.836–2:07:14.583
And on the shared marketplace screens, we have explore the marketplace, my bookings, and booking details.
2:07:14.583–2:07:19.847
So right off the bat, this app is a bit more complex than the previous apps that we were building.
2:07:19.847–2:07:27.866
And that's really the goal, to finish off with a more complex, but also a more realistic, more production-ready app.
2:07:27.866–2:07:29.693
Next, we'll map the core entities.
2:07:29.693–2:07:40.784
And this is where the product becomes more tangible because we can actually see the real objects in the app before Codex starts writing the schema for code.
2:07:40.784–2:07:42.302
And here's our prompt.
2:07:42.302–2:07:45.029
We want to preface this with this ImageGen.
2:07:45.029–2:07:47.603
All right, and here's our entity architecture.
2:07:47.603–2:07:52.043
Okay, so we have the user, that could be a customer or a helper profile.
2:07:52.043–2:07:59.575
We have the booking here, booking status, service, category, review, and all of that backed with Convex data.
2:07:59.575–2:08:05.729
So at this point, we have a better idea of how the final app is going to look.
2:08:05.729–2:08:10.161
I see that we need a user entity and that could be a customer or a helper profile.
2:08:10.161–2:08:16.829
And I see that booking is super important because everybody needs to have access to booking, both customers and helpers.
2:08:16.829–2:08:34.550
Booking status, service, category, and so right away I see that this is a fairly sophisticated app, but I can see that it's not a super complex or like a super complicated app that you know has a ton of different entities, has lots of things happening.
2:08:34.560–2:08:44.750
But still, as we are developing this app, we might be adding various entities and so that will increase the complexity as the development can continues.
2:08:44.750–2:08:59.670
Now, the next step is before we start actually building the app is we want to ask Codex to recommend the simplest stack for FlexHelp based on what we need to build based on what we've told it so far.
2:08:59.670–2:09:05.755
This keeps the technology choices tied to the product instead of starting with tools first.
2:09:05.755–2:09:13.489
And this is super important because we want to start with the blueprint before any code has been written.
2:09:13.489–2:09:15.267
And here's the prompt to do that.
2:09:15.267–2:09:18.060
Do not edit any files and spec everything.
2:09:18.060–2:09:26.264
And I'm going to be running this in plan mode so that I can decide whether I want to accept its recommendations or just leave it in the conversation.
2:09:26.264–2:09:27.510
Going to run this here.
2:09:27.520–2:09:29.287
This is what it's suggesting.
2:09:29.287–2:09:31.175
The workspace is currently empty.
2:09:31.175–2:09:41.206
The simplest course-friendly stack is React, TypeScript, Convex for backend data, off, Tailwind for UI, and Vercel for hosting.
2:09:41.206–2:09:44.473
Okay, and this is exactly what we've been doing so far.
2:09:44.473–2:09:47.310
And and here it's listing some primary routes.
2:09:47.320–2:09:51.567
Services, bookings, customer bookings, helper, helper services.
2:09:51.567–2:10:01.432
Here we have the data flow, the auth recommendations, UI and component approach, Vercel deployment path, staged build plan, everything.
2:10:01.432–2:10:01.701
Okay?
2:10:01.701–2:10:06.417
So, I'm going to exit out because this was only a read-only plan mode.
2:10:06.417–2:10:06.666
Okay?
2:10:06.666–2:10:11.545
I don't want it to do anything just yet because that's what we're going to be doing in the next step.
2:10:11.545–2:10:20.859
Now, from the visual architecture, the entity map, and the stack recommendation, we have a pretty good idea of how the FlexHelp app is evolving.
2:10:20.859–2:10:29.115
The next thing that we want to do is we want to get Codex to take a first pass at turning that plan into a static product UI.
2:10:29.115–2:10:32.550
Now, this first version does not need any back-end data.
2:10:32.560–2:10:39.058
The goal is to see how far Codex can get from the architecture alone to viable UI mock-ups.
2:10:39.058–2:10:41.553
And this is the prompt that I'm going to be using.
2:10:41.553–2:10:47.366
Build the first static FlexHelp UI design from the existing architecture and stack direction.
2:10:47.366–2:10:49.161
We're going to stay in the plan mode.
2:10:49.161–2:10:51.017
Going to go ahead and execute that.
2:10:51.017–2:10:53.110
And let's see how well it does.
2:10:53.120–2:10:55.212
And here's the plan that it came up with.
2:10:55.212–2:11:00.658
Okay, the goal is a polished visual prototype that matches the FlexHelp architecture.
2:11:00.658–2:11:04.317
Okay, and here it lists some details about the architecture.
2:11:04.317–2:11:07.463
And let's go ahead and run this prompt.
2:11:07.463–2:11:09.270
So, it finished working.
2:11:09.280–2:11:12.082
And let's go ahead and see what we have here.
2:11:12.082–2:11:13.891
Okay, so this is our app.
2:11:13.891–2:11:16.019
And this is kind of how it looks like.
2:11:16.019–2:11:17.661
Okay, book practical help.
2:11:17.661–2:11:20.011
And we have some active requests.
2:11:20.011–2:11:22.928
We have booking entry, helper dashboard.
2:11:22.928–2:11:23.979
We have this.
2:11:23.979–2:11:25.030
Look at this.
2:11:25.040–2:11:26.353
It even works.
2:11:26.353–2:11:31.590
Service detail, a small plumbing repair, helper dashboard shell.
2:11:31.600–2:11:34.270
And so, this UI doesn't look too bad.
2:11:34.280–2:11:39.151
But there's something that you need to know when you design UI with Codex.
2:11:39.151–2:11:43.872
They all look pretty much the same or at least very, very similar.
2:11:43.872–2:11:50.158
And that is because Codex is not really an expert when it comes to designing pages.
2:11:50.158–2:11:54.066
It's great for coding, for solving all kinds of problems.
2:11:54.066–2:11:58.950
But for actually designing stuff, it's not the most ideal tool.
2:11:58.960–2:12:01.893
There are a lot of other tools that do it a lot better.
2:12:01.893–2:12:17.608
And so, during this specific app build, I want to bring in another tool and show you how we can have a more specialized tool actually design the UI and then bring that UI back into Codex and get Codex to kind of implement it. okay?
2:12:17.608–2:12:21.518
Now, when it comes to UI designs, there's lots of cool tools.
2:12:21.518–2:12:29.698
There's Google Stitch, there's Figma, and there's also a tool that I really like to use, and it is called FlutterFlow Designer.
2:12:29.698–2:12:34.495
It's a very very lightweight tool, and it works really great with Codex.
2:12:34.495–2:12:40.510
And so, if you head over to designer.flutterflow.io, you're going to be on this page here.
2:12:40.520–2:12:47.350
And you can use the web app version here, but what I really like to do is I like to use their desktop app, okay?
2:12:47.360–2:12:53.011
Here's the desktop app, and what's nice about the desktop app is that you have this app integrations.
2:12:53.011–2:13:00.101
So, if you click over here, you can connect designer to external agents and IDEs.
2:13:00.101–2:13:03.202
So, Claude Code, Gemini CLI, and Codex.
2:13:03.202–2:13:04.718
And so, I have this set up.
2:13:04.718–2:13:06.767
So, all you need to do is click here.
2:13:06.767–2:13:08.134
Now it's installed.
2:13:08.134–2:13:13.755
And now, this app here is going to serve as an MCP server, okay?
2:13:13.755–2:13:23.540
Because if I go to Codex here, and I press command comma, and I go into MCP servers, I also have this FlutterFlow Designer configured here.
2:13:23.540–2:13:26.976
And if you want to set this up, you can simply ask Codex to do it.
2:13:26.976–2:13:36.948
It's going to research, it's going to figure out, and it's going to eventually set it up for you so that you can have this FlutterFlow Designer as one of your MCP servers here, okay?
2:13:36.948–2:13:52.203
So, now that we have this set up, what we want to do is we want to go into this designer, and we want to click a new design, and here you can enter a prompt ask it to design any kind of app UI for you, whether it is a mobile app or desktop app.
2:13:52.203–2:13:57.070
They also have, you know, explore styles feature, or you can have an instant generation.
2:13:57.080–2:14:00.790
Now, what you don't want to do is you do not want to type this prompt directly.
2:14:00.800–2:14:08.630
You want to ask Codex to generate a prompt for you since it knows a lot more about the app that you can input here.
2:14:08.640–2:14:16.369
And this is the same workflow regardless of whether you're using this tool, Google Stage, or pretty much any other tool out there.
2:14:16.369–2:14:20.785
And so, we're going to go ahead and we're going to grab a prompt to do just that.
2:14:20.785–2:14:22.621
And here's a prompt that we can use.
2:14:22.621–2:14:25.885
Create a polished FlutterFlow designer concept for FlexHelp.
2:14:25.885–2:14:31.299
FlexHelp is a two-sided marketplace, and we are telling it what kind of screens to design.
2:14:31.299–2:14:33.185
We give it some design requirements.
2:14:33.185–2:14:36.415
We give give it some guardrails, stuff like that.
2:14:36.415–2:14:45.932
And so, we're going to input this prompt, and here we're going to stay on the explore styles, and that way we can have different styles show up, and we can decide which one we like better.
2:14:45.932–2:14:49.480
So, I'm going to go ahead and run this, and here are the designs.
2:14:49.480–2:14:52.052
So, as you can see, they're all very different.
2:14:52.052–2:15:02.504
We have this, we have this, we have this, we have these ones, so and you got to admit that in my view, these look a lot better than what Codex did, right?
2:15:02.504–2:15:04.262
So, this is what Codex did.
2:15:04.262–2:15:09.863
In my view, these designs are a lot more interesting than Codex's design.
2:15:09.863–2:15:10.150
Okay?
2:15:10.150–2:15:12.527
So, I don't know which one you guys like.
2:15:12.527–2:15:14.136
This is a classical one.
2:15:14.136–2:15:15.116
This is nice.
2:15:15.116–2:15:16.191
Let's take a look.
2:15:16.191–2:15:18.030
Let's go ahead and use this classical one.
2:15:18.030–2:15:23.984
So, I'm going to say use this style, and it's going to use this style, and then it's going to generate all the pages that we need.
2:15:23.984–2:15:26.221
So, here we have seven pages that we need.
2:15:26.221–2:15:27.758
So, now we have all the pages.
2:15:27.758–2:15:41.627
Here we have customer home, we have service details, really nice page, booking request form, customer booking status, we even have a map, helper dashboard, helper request management, and a user profile.
2:15:41.627–2:15:50.470
The next thing that we want to do is we want to tell Codex to fetch these designs and implement them, bake them into our app.
2:15:50.480–2:15:51.654
And so, let's take a look.
2:15:51.654–2:15:55.245
So, this is called FlexHelp Marketplace, the name of the project here.
2:15:55.245–2:15:58.202
And so, now what we're going to do is we're going to go back to Codex.
2:15:58.202–2:16:12.750
We're going to close out this section here, and we're going to give it a prompt that's going to ask it to connect to FlutterFlow designer, look at that specific project and grab those designs and then bake them into our app
2:16:12.760–2:16:13.440
right here.
2:16:13.440–2:16:15.815
And I have a prompt here to do just that.
2:16:15.815–2:16:16.990
So, here's the prompt.
2:16:17.000–2:16:21.905
Update the Flex sub static UI to match the approved FlutterFlow Designer reference.
2:16:21.905–2:16:29.021
So, this is the main prompt, but we also need to ensure that we tell it that we want to use the FlutterFlow Designer MCP.
2:16:29.021–2:16:36.278
Use FlutterFlow Designer MCP and then project is because there are multiple projects.
2:16:36.278–2:16:38.197
We want to copy this project here.
2:16:38.197–2:16:38.486
This.
2:16:38.486–2:16:42.541
And we're going to go into plan mode just to make sure that everything is good.
2:16:42.541–2:16:43.596
And I'm going to run that.
2:16:43.596–2:16:51.732
And here it says, "Next, I'm opening a Designer MCP session." And once it does that, you can see you can actually see the agent working.
2:16:51.732–2:16:58.600
This is our agent, our client cuz Codex is acting as an MCP client connecting to this MCP server.
2:16:58.600–2:17:01.368
And as you can see, it's it's analyzing this page.
2:17:01.368–2:17:04.597
And you can see this little Codex icon here.
2:17:04.597–2:17:16.621
And you can see it says here, "One active agent." It's studying the designs and then it's going to pull the designs back here and build an actual UI using those designs.
2:17:16.621–2:17:23.612
And the goal here is to ensure that it builds a pixel-perfect or at least as close as possible to what we see here.
2:17:23.612–2:17:23.929
Okay?
2:17:23.929–2:17:25.774
So, let's see what it's doing.
2:17:25.774–2:17:27.830
So, now it came back with a plan.
2:17:27.840–2:17:34.356
Update the existing React static UI to visually follow the approved FlutterFlow Designer reference.
2:17:34.356–2:17:39.917
So, here it's it has five pages, but over here we actually have more.
2:17:39.917–2:17:41.511
We have seven pages.
2:17:41.511–2:17:48.205
So, I don't know if I if it missed it or that I did not it was it wasn't part of the prompt or some mix-up.
2:17:48.205–2:17:52.168
So, we want to make sure that it captures all the seven pages.
2:17:52.168–2:17:58.659
Ensure that it captures all the seven pages from FlutterFlow Designer project.
2:17:58.659–2:17:59.045
Okay?
2:17:59.045–2:18:06.854
And still in the plan mode just to make sure we get this right because our app ideally should should have all of these pages.
2:18:06.854–2:18:11.526
User profile, helper, request management, helper dashboard, etc. etc.
2:18:11.526–2:18:13.148
All of these make sense.
2:18:13.148–2:18:19.589
Okay, so it went ahead and it updated it and it's going to add static page components for all seven pages.
2:18:19.599–2:18:20.504
Okay, submit this.
2:18:20.504–2:18:25.517
All right, so it has implemented the seven page designer reference update.
2:18:25.517–2:18:27.557
Let's go ahead and see how it looks.
2:18:27.557–2:18:30.202
All right, so this looks a lot better in my opinion.
2:18:30.202–2:18:32.270
All right, we have settings.
2:18:32.270–2:18:34.908
We do have the CH customer home.
2:18:34.908–2:18:36.319
Do we even see that?
2:18:36.319–2:18:37.847
I don't even see that here.
2:18:37.847–2:18:42.051
But this customer home service details, click on book.
2:18:42.051–2:18:44.720
So this menu we need to kind of remove this.
2:18:44.720–2:18:46.300
So let me go ahead and sell it.
2:18:46.300–2:18:48.424
What are those abbreviations?
2:18:48.424–2:18:49.039
Let's see.
2:18:49.039–2:18:50.532
Do they need to be there?
2:18:50.532–2:18:52.117
Let's see what it says.
2:18:52.117–2:18:57.611
But it looks a lot cleaner than than the original UI, at least to my eyes.
2:18:57.611–2:19:02.541
And now we're doing a little bit of tweaking, clean-up plan.
2:19:02.541–2:19:08.047
Okay, they were placeholder text icons used to mimic the nav icon column.
2:19:08.047–2:19:13.112
So we need to remove that and we should probably remove any other placeholder icons.
2:19:13.112–2:19:15.163
But right now it looks fairly clean.
2:19:15.163–2:19:17.127
Static preview, what is that?
2:19:17.127–2:19:19.041
This this also needs to be removed.
2:19:19.041–2:19:27.399
So we're going to actually tell it check for any placeholders and see if you can match what it should be on the design.
2:19:27.399–2:19:33.015
Pull pull the design elements and re-replace these placeholders with with the actual design.
2:19:33.015–2:19:34.629
All right, so it has fixed it.
2:19:34.639–2:19:36.083
Now it looks a lot better.
2:19:36.083–2:19:38.258
We still see some other static preview.
2:19:38.258–2:19:38.950
That's okay.
2:19:38.960–2:19:43.168
Let's see if they go away once we have real data being fed.
2:19:43.168–2:19:48.133
So once we're happy with the UI, we can start designing the backend.
2:19:48.133–2:19:52.318
Data model should match the screens that we actually have here.
2:19:52.318–2:20:01.292
And so for FlexHelp, the first schema to support service browsing, helper profiles, booking creation, and helper status updates.
2:20:01.292–2:20:03.544
Anything beyond that can wait.
2:20:03.544–2:20:09.190
And here's a prompt that we can use to connect our app to Convex, okay?
2:20:09.200–2:20:12.157
We're going to be using Convex for this app as well.
2:20:12.157–2:20:17.673
So, we have here connect let's help UI to live Convex service and helper data.
2:20:17.673–2:20:20.012
Let's go ahead and keep it in plan mode.
2:20:20.012–2:20:21.573
All right, so this is our plan.
2:20:21.573–2:20:24.110
This is the Convex read path plan.
2:20:24.120–2:20:30.717
Connect the customer facing marketplace UI to Convex for the first database back read path.
2:20:30.717–2:20:33.458
The repo currently has no Convex setup.
2:20:33.458–2:20:36.838
So, add Convex from from scratch, etc., etc.
2:20:36.838–2:20:39.030
And we have Convex here running.
2:20:39.030–2:20:40.609
We have these three projects.
2:20:40.609–2:20:46.967
One that was created for the other app that we did, and so we're going to be creating another project for this app as well.
2:20:46.967–2:20:52.985
All right, so it has implemented the first Convex back read path for the customer marketplace.
2:20:52.985–2:20:55.030
And these are the files that has changed.
2:20:55.040–2:20:56.341
This is what's connected.
2:20:56.341–2:21:02.589
And if we jump into our Convex dashboard, we can see we have a brand new project here that wasn't there before.
2:21:02.589–2:21:08.818
And if we jump here, we should see that we have a deployment here on my own machine.
2:21:08.818–2:21:13.739
This is a local deployment that Convex is running on, right?
2:21:13.739–2:21:16.516
This is not on Convex, it's on my own machine.
2:21:16.516–2:21:18.649
And we also have a production, right?
2:21:18.649–2:21:25.165
So, with this deployment here, you go into data, we can see that we have categories, we have helper profiles.
2:21:25.165–2:21:26.548
We also have services.
2:21:26.548–2:21:29.216
And then we have a bunch of functions, right?
2:21:29.216–2:21:33.030
Marketplace list, and then we have seed, creating seed data.
2:21:33.040–2:21:36.789
Now, if you go into production, we may not see anything there, right?
2:21:36.789–2:21:40.346
There's nothing there because we haven't deployed this app to production.
2:21:40.346–2:21:43.510
There's no need for a production deployment.
2:21:43.520–2:21:51.922
Now, if we jump back to Codex and we refresh the app, this is now data that it's pulling from my local Convex deployment, okay?
2:21:51.922–2:21:53.192
So, we have here Marcus.
2:21:53.192–2:21:55.976
If you go back here, we should see Marcus, right?
2:21:55.976–2:21:57.888
Helper profiles, there's Marcus.
2:21:57.888–2:22:02.455
And if I change Marcus, if I edit name and I change, let's say, Marcus, right?
2:22:02.455–2:22:05.910
And I go back here, now it's automatically Marcus E here.
2:22:05.920–2:22:07.188
Automatically updates.
2:22:07.188–2:22:09.397
If I change that to James, guess what?
2:22:09.397–2:22:10.563
Now it says James S.
2:22:10.563–2:22:16.019
So, as you can see, this is now linked to our local Convex instance on my machine.
2:22:16.019–2:22:17.542
Both of these are on my machine.
2:22:17.542–2:22:24.237
Now, the next thing that I want to do is I want to build out the booking flow, because that's the key in this app, right?
2:22:24.237–2:22:26.767
The ability to book these services.
2:22:26.767–2:22:28.613
And I have a prompt here as well.
2:22:28.613–2:22:31.056
We're going to be using this prompt right here.
2:22:31.056–2:22:34.190
Okay, add the customer booking flow to FlexHelp.
2:22:34.200–2:22:38.109
Inspect all of this, and I'm going to set this to plan mode.
2:22:38.109–2:22:39.935
And let's go ahead and run that.
2:22:39.935–2:22:40.790
That's our plan.
2:22:40.800–2:22:48.291
We're going to be adding the first customer-side booking creation path on top of the existing Convex back service listing.
2:22:48.291–2:22:49.845
And there's some information there.
2:22:49.845–2:22:51.336
We're going to implement this plan.
2:22:51.336–2:22:55.810
All right, so it has implemented the customer booking creation path.
2:22:55.810–2:22:57.651
And it also tested it out.
2:22:57.651–2:23:01.298
As you can see, there's also a booking here as well.
2:23:01.298–2:23:03.350
So, let's go ahead and see if this works.
2:23:03.360–2:23:05.595
All right, so let's say I want to book James.
2:23:05.595–2:23:06.753
Click over here.
2:23:06.753–2:23:11.160
So, I can't quite pick anything here, but I can do request to book.
2:23:11.160–2:23:12.630
Send booking request.
2:23:12.640–2:23:13.905
And I need an address.
2:23:13.905–2:23:16.122
Okay, so let's say do, I don't know.
2:23:16.122–2:23:18.149
We need auto-complete here as well.
2:23:18.149–2:23:19.634
Fill in every field.
2:23:19.634–2:23:20.081
Okay.
2:23:20.081–2:23:21.870
Okay, so task, task.
2:23:21.880–2:23:24.390
Okay, this I cannot fill every field.
2:23:24.400–2:23:28.110
Okay, customer, schedule, say 10:00 a.m.
2:23:28.120–2:23:33.063
And this obviously needs to be, you know, like a calendar picker, that kind of thing.
2:23:33.063–2:23:34.996
Okay, and now we have the booking request.
2:23:34.996–2:23:38.160
And I can click on view bookings, and I see my bookings.
2:23:38.160–2:23:42.553
Okay, so this was done by the Codex while it was testing.
2:23:42.553–2:23:49.230
So, now if we jump into Codex, we should see on my local instance here, we should see bookings.
2:23:49.240–2:23:51.083
And we see two bookings, okay?
2:23:51.083–2:23:51.681
Right here.
2:23:51.681–2:23:53.596
So, the booking flow seems to work.
2:23:53.596–2:23:59.470
There are some rough edges here and there that we need to fix, but for the most part, it is coming together.
2:23:59.480–2:24:04.547
Now, once customers can create bookings, helpers need a place to see and manage them.
2:24:04.547–2:24:11.697
The helper dashboard should show incoming requests and make it obvious what action the helper can take next.
2:24:11.697–2:24:16.510
At the simplest level, the helper should be able to accept or decline a request.
2:24:16.520–2:24:22.901
After accepting, the helper should be able to move the job into progress and then mark it completed.
2:24:22.901–2:24:27.232
Those status changes are what turn the app into a workflow.
2:24:27.232–2:24:31.060
This is also a good place to show the power of live data.
2:24:31.060–2:24:36.506
When a status changes, the UI should update and the Convex row should change.
2:24:36.506–2:24:39.950
That gives us a real end-to-end marketplace loop.
2:24:39.960–2:24:44.291
Customer request, helper action, back end state, and UI update.
2:24:44.291–2:24:46.790
And this is the prompt that we're going to be using.
2:24:46.800–2:24:52.119
Add the helper dashboard workflow for viewing booking requests and updating booking status.
2:24:52.119–2:24:57.255
Okay, I'm going to switch into plan mode and we're going to go ahead and send this.
2:24:57.255–2:25:03.203
So, it's asking me that how should the helper workflow handle the existing requested booking status?
2:25:03.203–2:25:05.471
Keep requested, this is recommended.
2:25:05.471–2:25:10.544
Preserve existing created bookings, show it as pending in the UI, or rename to pending.
2:25:10.544–2:25:13.947
Change the stored initial status to pending and require a small data.
2:25:13.947–2:25:15.689
So, we don't want any migration.
2:25:15.689–2:25:18.402
We just want to go with the easiest option.
2:25:18.402–2:25:23.686
And then, how should the helper request visibility work before auth is added?
2:25:23.686–2:25:24.927
Helper selected.
2:25:24.927–2:25:32.310
This is add a simple static helper switcher filter, so each helper sees bookings for their Convex helper profile only.
2:25:32.320–2:25:34.675
Simplest UI and back end, but less realistic.
2:25:34.675–2:25:36.790
So, we want helper selected.
2:25:36.800–2:25:38.221
Okay, we're going to select that.
2:25:38.221–2:25:39.962
All right, there's the plan.
2:25:39.962–2:25:44.750
Add the first helper-facing workflow on top of existing convex booking creation pack.
2:25:44.760–2:25:46.032
We're going to submit this.
2:25:46.032–2:25:47.049
Here is our progress.
2:25:47.049–2:25:51.298
All right, so he just implemented the helper booking status workflow.
2:25:51.298–2:25:52.775
And these are the files that changed.
2:25:52.775–2:25:53.811
This is what it did.
2:25:53.811–2:25:58.148
So it updated it through pending, accepted, in progress, completed.
2:25:58.148–2:26:01.808
It viewed it under helper James created booking this.
2:26:01.808–2:26:02.720
So it did all that.
2:26:02.720–2:26:03.495
It did some tests.
2:26:03.495–2:26:04.727
Let's go ahead and open it.
2:26:04.727–2:26:06.315
And let's see what we can do.
2:26:06.315–2:26:08.911
So this is the helper booking status.
2:26:08.911–2:26:12.993
I'm going to helper dashboard have my incoming requests, right?
2:26:12.993–2:26:16.650
So I can accept it, I can start it, and I can complete it.
2:26:16.650–2:26:17.038
Okay?
2:26:17.038–2:26:19.398
So that's the piece that is working.
2:26:19.398–2:26:20.550
I can also cancel it.
2:26:20.560–2:26:21.954
And that is canceled.
2:26:21.954–2:26:22.884
And that's it.
2:26:22.884–2:26:24.108
I can't come back to it.
2:26:24.108–2:26:25.130
I can't do anything.
2:26:25.130–2:26:27.017
Here we have recent activity, right?
2:26:27.017–2:26:28.550
Completed, completed, canceled.
2:26:28.560–2:26:31.710
And this is the one that did 148 116.
2:26:31.720–2:26:33.950
This is the one that it has completed.
2:26:33.960–2:26:35.443
This seems to work, right?
2:26:35.443–2:26:38.081
And we have canceled, we have completed.
2:26:38.081–2:26:41.405
Even a simple marketplace has different responsibilities.
2:26:41.405–2:26:44.821
Customers create booking requests and view their own bookings.
2:26:44.821–2:26:48.990
Helpers manage requests that belong to them or are available to them.
2:26:49.000–2:26:55.022
Admin or system logic may handle category alteration or platform level controls later.
2:26:55.022–2:26:58.556
The key point is that these rules should not only live in the UI.
2:26:58.556–2:27:05.371
Back-end functions need to enforce ownership and permissions because the UI can always be bypassed.
2:27:05.371–2:27:10.770
This is where Codex needs to think carefully instead of just adding buttons.
2:27:10.770–2:27:16.750
And so now what we want to do is we want to add the roles off and the access boundary layer.
2:27:16.760–2:27:18.731
And here's the prompt to do that.
2:27:18.731–2:27:25.286
Add the first practical roles off and access boundary layer around the existing flex help workflows, okay?
2:27:25.286–2:27:27.816
So we're going to go definitely in the plan mode.
2:27:27.816–2:27:30.270
We're going to run this and see what it says.
2:27:30.280–2:27:32.001
And so it has a question for us.
2:27:32.001–2:27:36.767
Which identity approach should this plan should this step plan for?
2:27:36.767–2:27:37.945
Demo sessions.
2:27:37.945–2:27:50.974
Add Convex back demo users and for Convex or add real Convex or sign and sign up more production shape but larger and currently beta or this clerk use third-party or provider.
2:27:50.974–2:27:57.129
Let's go with Convex or how should customer helper roles be represented for or version one?
2:27:57.129–2:27:58.642
Role plus profile.
2:27:58.642–2:27:59.805
So what is this?
2:27:59.805–2:28:05.936
Each demo user has customer helper both and helpers linked to one helper profile for request.
2:28:05.936–2:28:07.090
Separate accounts.
2:28:07.090–2:28:10.405
Customer and helper are always separate demo users.
2:28:10.405–2:28:13.055
Simpler boundaries but less flexible.
2:28:13.055–2:28:19.241
And sometimes when I'm not sure but I want the system to come up with a really solid answer.
2:28:19.241–2:28:20.916
This is what I usually type.
2:28:20.916–2:28:26.294
For the second question, what's the most durable long-term option?
2:28:26.294–2:28:28.652
Okay, that's the key here, durable.
2:28:28.652–2:28:30.085
Now let's see what it says.
2:28:30.085–2:28:33.914
The most durable long-term option is role plus profile.
2:28:33.914–2:28:34.552
Perfect.
2:28:34.552–2:28:35.218
That's it.
2:28:35.218–2:28:39.561
And for the first question, choose demo sessions for the for this core step.
2:28:39.561–2:28:42.735
Okay, so let's go ahead with demo sessions, okay?
2:28:42.735–2:28:46.395
So do demo sessions and role plus profile.
2:28:46.395–2:28:48.992
Let's just go with the recommendations.
2:28:48.992–2:28:49.667
Expand it.
2:28:49.667–2:28:54.265
All right, so now you can see that Codex is testing everything, right?
2:28:54.265–2:28:58.962
It's testing on the UI in the browser and you see this cursor right here.
2:28:58.962–2:29:06.466
The browser flow now confirms a customer created book booking appears for the linked helper and can be moved into in progress.
2:29:06.466–2:29:13.003
All right, so it has finished and it has implemented the demo roles and access boundary layer over here, okay?
2:29:13.003–2:29:15.830
So marketplace browsing stays public.
2:29:15.840–2:29:19.971
Booking creation requires a customer or both demo user.
2:29:19.971–2:29:25.107
Customer booking status only shows bookings owned by the signed-in customer.
2:29:25.107–2:29:33.210
Helper request status updates require a helper or both demo user with a linked helper ID helper profile ID.
2:29:33.210–2:29:38.590
And so, remaining limitation, this is still tutorial demo auth, not production authentication.
2:29:38.600–2:29:46.392
Real Convex auth or Clerk can replace demo session issuance later while keeping the same role profile access model.
2:29:46.392–2:29:50.473
And so, this should give us some uh role separation, right?
2:29:50.473–2:29:52.515
Some kind of authentication on the backend.
2:29:52.515–2:29:57.518
And here, if we jump into Convex, you can see we now have users over here, right?
2:29:57.518–2:29:59.779
These are the users, and there's a role.
2:29:59.779–2:30:04.091
So, you can be either both, or you can be a helper, or you can be a customer.
2:30:04.091–2:30:08.966
And depending on which role you're you're in, you can do various operations.
2:30:08.966–2:30:16.146
Here we have sessions, we have various services, we also have functions that also handle these roles.
2:30:16.146–2:30:24.204
So, you can list demo users, you can start demo session, viewer list for helper, list for customer, etc., etc.
2:30:24.204–2:30:29.187
And these functions, they are meant to work with specific roles, right?
2:30:29.187–2:30:32.797
So, that authentic- -ation is is baked in into these functions.
2:30:32.797–2:30:39.510
Now, when something breaks, the wrong move is to immediately ask Codex to rewrite a whole section.
2:30:39.520–2:30:48.692
The better move is to give it the error, ask it to inspect the relevant files, and make it explain the likely cause before changing anything.
2:30:48.692–2:30:59.291
That debugging loop is the same whether the problem is a browser error, a build failure, a Convex function error, or a UI state that does not make sense.
2:30:59.291–2:31:04.368
Observe the issue, diagnose it, patch it narrowly, and verify the fix.
2:31:04.368–2:31:13.950
And so, let's give it a prompt that will deal with this sort of issue regarding debugging, polish, verification, stuff like that.
2:31:13.960–2:31:15.907
We're going to be using this prompt over here.
2:31:15.907–2:31:20.430
Debug, polish, and verify the existing flex help product workflow.
2:31:20.440–2:31:30.310
Inspect the current app first, then identify this is smallest set of fixes and polish improvements needed to make the current workflow feel credible.
2:31:30.320–2:31:32.084
Let's jump into plan mode.
2:31:32.084–2:31:40.004
Right away, it tells us that I see a few concrete polish fix candidates already and it lists some here, okay?
2:31:40.004–2:31:44.038
And so, the build passes and both local servers are responding.
2:31:44.038–2:31:48.150
So, it's using an in-app browser now for a quick workflow probe.
2:31:48.160–2:31:52.983
So, the plan targets actual UI issues rather than guesses, okay?
2:31:52.983–2:31:55.163
So, let's wait to see what it finds.
2:31:55.163–2:31:57.705
And this is the plan that it came up with.
2:31:57.705–2:32:04.674
Tighten the existing customer helper Convex and demo app workflows without adding new product scope, okay?
2:32:04.674–2:32:09.679
So, it lists a bunch of things and we want to quickly scan assumptions.
2:32:09.679–2:32:14.372
No new marketplace features will be added, no payments, nothing, okay?
2:32:14.372–2:32:17.345
That stays and here's some key changes.
2:32:17.345–2:32:19.131
You can kind of scan through that.
2:32:19.131–2:32:20.522
Let's go ahead and submit this.
2:32:20.522–2:32:25.175
Right, so it is done and it has implemented the debug polish task.
2:32:25.175–2:32:27.818
And it actually fixed a lot of interesting things.
2:32:27.818–2:32:35.834
It fixed some placeholders, it did some testing, it switched to different accounts, actually cleaned up a lot of cool stuff.
2:32:35.834–2:32:50.424
So, if we take a look here, we can see that we can book, we can request a book, we can describe the task, we can fill all of this out, send, add the preferred date, and now it's showing in that I'm signed in as the customer, right?
2:32:50.424–2:32:51.946
And I can switch a demo user.
2:32:51.946–2:32:55.870
Now, I'm signed in as the helper and now I'm signed in as both.
2:32:55.880–2:33:00.294
Customer access, choose a customer demo user to create a booking request.
2:33:00.294–2:33:03.870
So, it's coming along really, really nicely.
2:33:03.880–2:33:06.670
And the final build step is deployment.
2:33:06.680–2:33:16.180
The app is not done until the front end is live, connected to the intended Convex back end, and smoke tested through the real product workflow.
2:33:16.180–2:33:19.944
So, let's go ahead and grab this prompt and let's go ahead and paste it.
2:33:19.944–2:33:27.135
So, deploy the existing Flex app with Vercel and smoke test the connected Convex backend, okay?
2:33:27.135–2:33:31.587
We're going to jump into plan mode so that it can prepare everything, plan everything out.
2:33:31.587–2:33:38.230
One thing that I want to tell it that I didn't tell it, and I'm going to do that right now, is I want to make sure it uses the Vercel package.
2:33:38.240–2:33:40.874
Use the Vercel Vercel plugin.
2:33:40.874–2:33:50.010
And I'm going to press command enter so that it steers the conversation because we want the model to ensure that it catches that, right?
2:33:50.010–2:33:52.003
That we want to use the Vercel plugin.
2:33:52.003–2:33:56.376
Which Convex environment should the deployed Vercel app use for the smoke test?
2:33:56.376–2:33:57.659
We want to use production.
2:33:57.659–2:34:00.354
And where should the front end be deployed?
2:34:00.354–2:34:01.710
New personal project.
2:34:01.720–2:34:02.240
Exactly.
2:34:02.240–2:34:04.060
This is a brand new project.
2:34:04.060–2:34:05.910
We already have a bunch of projects, right?
2:34:05.920–2:34:08.241
So, if we go over here, we have this project.
2:34:08.241–2:34:10.394
Actually, we should have used the existing project.
2:34:10.394–2:34:13.504
We already have this project, but I think it's going to create a new project.
2:34:13.504–2:34:15.292
Let's see if we can tell it.
2:34:15.292–2:34:17.077
I'm going to copy that.
2:34:17.077–2:34:18.900
See if we can use the existing project.
2:34:18.900–2:34:20.628
No need to create a new project.
2:34:20.628–2:34:21.503
And let me check.
2:34:21.503–2:34:24.182
So, this is actually plan mode, so we're okay.
2:34:24.182–2:34:25.834
Okay, implement this.
2:34:25.834–2:34:27.990
And here it's going to create a production.
2:34:28.000–2:34:30.654
So, if we go over here, remember we're using this.
2:34:30.654–2:34:33.088
We also have a production deployment set up.
2:34:33.088–2:34:35.480
So, it's going to be using the production deployment.
2:34:35.480–2:34:40.531
So, we should see data and tables and functions and all that good stuff as part of this deployment.
2:34:40.531–2:34:44.989
Production Convex is now seeded and responding with services and demo users.
2:34:44.989–2:34:47.482
So, if you go over here, we have everything now.
2:34:47.482–2:34:48.030
Look at this.
2:34:48.040–2:34:49.491
Sessions, services.
2:34:49.491–2:34:50.790
We have the data.
2:34:50.800–2:35:04.520
All right, so looks like it has deployed it, and now it's doing a couple of smoke tests to make sure that everything works in production because now it's in production and it's also using the production Convex deployment, right?
2:35:04.520–2:35:09.407
So, we need to test things again because, you know, it's using new environments now.
2:35:09.407–2:35:11.015
All right, and it is done.
2:35:11.015–2:35:12.177
Deployed FlexHelp.
2:35:12.177–2:35:13.346
This is the URL.
2:35:13.346–2:35:16.264
This is the Vercel project deployment ID.
2:35:16.264–2:35:18.325
Everything is live now, okay?
2:35:18.325–2:35:21.644
And you can access it as well at this URL, okay?
2:35:21.644–2:35:28.582
So, we have customer home, and I'm signed in as one of these demo users, customer or helper, right?
2:35:28.582–2:35:36.574
I can go into helper dashboard, and let's say I go I sign in as a customer, and I go into customer home, but I can't click here, right?
2:35:36.574–2:35:37.946
This is helper access, right?
2:35:37.946–2:35:39.325
Remember the roles, right?
2:35:39.325–2:35:41.096
It's it's being handled here.
2:35:41.096–2:35:46.145
And so, now as a customer, I want to book professional seasonal garden cleanup.
2:35:46.145–2:35:54.804
I'm going to book this, request to book, I'm going to fill all of this out, 10:00 a.m., 2 hours, it's fixed address, send booking.
2:35:54.804–2:35:59.699
Okay, so with booking request submitted, your request was saved, view my bookings.
2:35:59.699–2:36:08.121
So, we have all of these pending, and so now I'm going to log in as Marcus, and Marcus is going to go into helper dashboard, and now he sees the booking.
2:36:08.121–2:36:11.492
And I'm going to say accept or complete, it's completed.
2:36:11.492–2:36:21.597
Now, if I come back as Anders again, and I go into customer's home, booking request for maybe summary, right here, customer booking status.
2:36:21.597–2:36:23.116
Okay, there we go, completed.
2:36:23.116–2:36:24.439
And here we see completed.
2:36:24.439–2:36:25.670
This one is completed.
2:36:25.680–2:36:28.486
Actually, this one, for Marcus, it has been completed.
2:36:28.486–2:36:30.289
And then there's some more requests here.
2:36:30.289–2:36:31.486
So, the flow is working.
2:36:31.486–2:36:33.310
The flow is working perfectly.
2:36:33.320–2:36:45.638
Of course, there are so many other things that we can do, we can use real auth, we can change the page, we can update things, but right now, the core of the app works perfectly.
2:36:45.638–2:37:01.950
And just as a little bonus, when you reach this stage, there's more things that you can do, but one thing that, you know, right away that you can ask Codex to do would be something like suggest top five high impact, low effort features,
2:37:01.960–2:37:02.760
functionalities.
2:37:02.760–2:37:12.587
And I'm going to switch into plan mode, and we want to see if there is some high amp impact features that we can add that do not require a lot of effort.
2:37:12.587–2:37:18.056
And here they are, top five high impact, low effort next features I prioritize.
2:37:18.056–2:37:23.911
Functional marketplace search, booking detail view, customer cancel pending requests, etc., etc.
2:37:23.911–2:37:40.988
And if you don't want to implement these right now, what I like to do is save this list as dots.todo.md as a markdown file and prioritize each item on a scale of one to five, one being urgent.
2:37:40.988–2:37:47.515
And so that way I have a constantly evolving list of things that I can build in the future.
2:37:47.515–2:37:53.032
So I do not need to ask Codex all the time constantly, you know, you know, to to suggest new features.
2:37:53.032–2:38:04.253
And I'm going to say submit and that's going to go create this dots directory as well and this todo.md, which is the file that I usually keep to store new features.
2:38:04.253–2:38:15.811
And now we can open this file and say, "Codex, so this is priority one, two, three, four, five." So now we have a an app that is live, that is on the internet, that we have built, that works.
2:38:15.811–2:38:24.233
This workflow, this main workflow works as expected, but of course, there's so many things that you can do to improve this app.
2:38:24.233–2:38:41.030
And in some of the later videos, I'm going to be showing you some more advanced Codex techniques that you can use to make your apps even better and more robust because I've been using Codex for a while now and I have some advanced tips and tricks that I'd
2:38:41.040–2:38:42.906
like to share you in some of the future videos.
2:38:42.906–2:38:48.132
And so I really hope that you enjoyed this mega Codex tutorial.
2:38:48.132–2:39:03.030
Now, if you want to go ahead and build this app or modify this app or whatnot, I'm going to be leaving all my prompts, every single prompt that I used to build this app inside of our amazing Patreon community and you can check it out and
2:39:03.040–2:39:03.794
hopefully join.
2:39:03.794–2:39:09.591
There are lots of great people there and of course, support this channel, and support my work.
2:39:09.591–2:39:15.000
And so, like this video, leave a comment, and check out our amazing Patreon community.
0:00.000–0:03.567
(此句尚無繁中翻譯)
0:03.567–0:10.693
(此句尚無繁中翻譯)
0:10.693–0:28.277
(此句尚無繁中翻譯)
0:28.277–0:31.885
(此句尚無繁中翻譯)
0:31.885–0:42.020
(此句尚無繁中翻譯)
0:42.020–0:53.676
(此句尚無繁中翻譯)
0:53.676–0:59.407
(此句尚無繁中翻譯)
0:59.407–1:04.331
(此句尚無繁中翻譯)
1:04.331–1:07.205
(此句尚無繁中翻譯)
1:07.205–1:09.548
(此句尚無繁中翻譯)
1:09.548–1:14.920
(此句尚無繁中翻譯)
1:14.920–1:17.442
(此句尚無繁中翻譯)
1:17.442–1:29.190
(此句尚無繁中翻譯)
1:29.200–1:32.393
(此句尚無繁中翻譯)
1:32.393–1:37.127
(此句尚無繁中翻譯)
1:37.127–1:44.114
(此句尚無繁中翻譯)
1:44.114–1:49.310
(此句尚無繁中翻譯)
1:49.320–1:52.384
(此句尚無繁中翻譯)
1:52.384–2:06.368
(此句尚無繁中翻譯)
2:06.368–2:11.264
(此句尚無繁中翻譯)
2:11.264–2:16.340
(此句尚無繁中翻譯)
2:16.340–2:19.993
(此句尚無繁中翻譯)
2:19.993–2:24.010
(此句尚無繁中翻譯)
2:24.010–2:26.398
(此句尚無繁中翻譯)
2:26.398–2:32.579
(此句尚無繁中翻譯)
2:32.579–2:42.878
(此句尚無繁中翻譯)
2:42.878–2:48.101
(此句尚無繁中翻譯)
2:48.101–2:52.583
(此句尚無繁中翻譯)
2:52.583–2:59.251
(此句尚無繁中翻譯)
2:59.251–3:01.951
(此句尚無繁中翻譯)
3:01.951–3:06.628
(此句尚無繁中翻譯)
3:06.628–3:11.419
(此句尚無繁中翻譯)
3:11.419–3:20.061
(此句尚無繁中翻譯)
3:20.061–3:27.252
(此句尚無繁中翻譯)
3:27.252–3:30.313
(此句尚無繁中翻譯)
3:30.313–3:35.115
(此句尚無繁中翻譯)
3:35.115–3:43.909
(此句尚無繁中翻譯)
3:43.909–3:47.885
(此句尚無繁中翻譯)
3:47.885–3:52.916
(此句尚無繁中翻譯)
3:52.916–3:56.914
(此句尚無繁中翻譯)
3:56.914–4:03.524
(此句尚無繁中翻譯)
4:03.524–4:06.817
(此句尚無繁中翻譯)
4:06.817–4:09.310
(此句尚無繁中翻譯)
4:09.320–4:15.293
(此句尚無繁中翻譯)
4:15.293–4:18.177
(此句尚無繁中翻譯)
4:18.177–4:23.922
(此句尚無繁中翻譯)
4:23.922–4:41.430
(此句尚無繁中翻譯)
4:41.440–4:45.796
(此句尚無繁中翻譯)
4:45.796–4:53.870
(此句尚無繁中翻譯)
4:53.880–4:56.235
(此句尚無繁中翻譯)
4:56.235–5:06.799
(此句尚無繁中翻譯)
5:06.799–5:19.454
(此句尚無繁中翻譯)
5:19.454–5:21.741
(此句尚無繁中翻譯)
5:21.741–5:28.477
(此句尚無繁中翻譯)
5:28.477–5:33.968
(此句尚無繁中翻譯)
5:33.968–5:41.832
(此句尚無繁中翻譯)
5:41.832–5:50.441
(此句尚無繁中翻譯)
5:50.441–5:54.830
(此句尚無繁中翻譯)
5:54.840–5:57.157
(此句尚無繁中翻譯)
5:57.157–6:10.529
(此句尚無繁中翻譯)
6:10.529–6:16.098
(此句尚無繁中翻譯)
6:16.098–6:32.478
(此句尚無繁中翻譯)
6:32.478–6:38.305
(此句尚無繁中翻譯)
6:38.305–6:59.018
(此句尚無繁中翻譯)
6:59.018–7:08.881
(此句尚無繁中翻譯)
7:08.881–7:13.550
(此句尚無繁中翻譯)
7:13.560–7:18.750
(此句尚無繁中翻譯)
7:18.760–7:25.123
(此句尚無繁中翻譯)
7:25.123–7:31.175
(此句尚無繁中翻譯)
7:31.175–7:36.310
(此句尚無繁中翻譯)
7:36.320–7:44.710
(此句尚無繁中翻譯)
7:44.720–7:47.150
(此句尚無繁中翻譯)
7:47.160–7:52.854
(此句尚無繁中翻譯)
7:52.854–8:08.990
(此句尚無繁中翻譯)
8:09.000–8:13.710
(此句尚無繁中翻譯)
8:13.720–8:20.006
(此句尚無繁中翻譯)
8:20.006–8:27.790
(此句尚無繁中翻譯)
8:27.800–8:32.477
(此句尚無繁中翻譯)
8:32.477–8:38.270
(此句尚無繁中翻譯)
8:38.270–8:51.590
(此句尚無繁中翻譯)
8:51.600–9:03.288
(此句尚無繁中翻譯)
9:03.288–9:11.692
(此句尚無繁中翻譯)
9:11.692–9:24.110
(此句尚無繁中翻譯)
9:24.120–9:42.070
(此句尚無繁中翻譯)
9:42.080–9:53.710
(此句尚無繁中翻譯)
9:53.720–9:56.812
(此句尚無繁中翻譯)
9:56.812–10:05.404
(此句尚無繁中翻譯)
10:05.404–10:12.842
(此句尚無繁中翻譯)
10:12.842–10:19.435
(此句尚無繁中翻譯)
10:19.435–10:31.172
(此句尚無繁中翻譯)
10:31.172–10:35.150
(此句尚無繁中翻譯)
10:35.160–10:47.482
(此句尚無繁中翻譯)
10:47.482–11:01.190
(此句尚無繁中翻譯)
11:01.200–11:03.750
(此句尚無繁中翻譯)
11:03.760–11:08.578
(此句尚無繁中翻譯)
11:08.578–11:13.045
(此句尚無繁中翻譯)
11:13.045–11:19.165
(此句尚無繁中翻譯)
11:19.165–11:30.429
(此句尚無繁中翻譯)
11:30.429–11:34.134
(此句尚無繁中翻譯)
11:34.134–11:37.341
(此句尚無繁中翻譯)
11:37.341–11:43.191
(此句尚無繁中翻譯)
11:43.191–11:48.416
(此句尚無繁中翻譯)
11:48.416–11:57.620
(此句尚無繁中翻譯)
11:57.620–12:01.835
(此句尚無繁中翻譯)
12:01.835–12:11.423
(此句尚無繁中翻譯)
12:11.423–12:19.895
(此句尚無繁中翻譯)
12:19.895–12:24.981
(此句尚無繁中翻譯)
12:24.981–12:31.402
(此句尚無繁中翻譯)
12:31.402–12:35.828
(此句尚無繁中翻譯)
12:35.828–12:40.440
(此句尚無繁中翻譯)
12:40.440–12:42.751
(此句尚無繁中翻譯)
12:42.751–12:44.697
(此句尚無繁中翻譯)
12:44.697–12:47.576
(此句尚無繁中翻譯)
12:47.576–13:02.050
(此句尚無繁中翻譯)
13:02.050–13:04.400
(此句尚無繁中翻譯)
13:04.400–13:12.011
(此句尚無繁中翻譯)
13:12.011–13:13.947
(此句尚無繁中翻譯)
13:13.947–13:21.811
(此句尚無繁中翻譯)
13:21.811–13:27.834
(此句尚無繁中翻譯)
13:27.834–13:39.110
(此句尚無繁中翻譯)
13:39.120–13:48.670
(此句尚無繁中翻譯)
13:48.680–13:51.097
(此句尚無繁中翻譯)
13:51.097–13:58.389
(此句尚無繁中翻譯)
13:58.389–14:06.750
(此句尚無繁中翻譯)
14:06.760–14:16.703
(此句尚無繁中翻譯)
14:16.703–14:29.698
(此句尚無繁中翻譯)
14:29.698–14:35.474
(此句尚無繁中翻譯)
14:35.474–14:40.279
(此句尚無繁中翻譯)
14:40.279–14:54.230
(此句尚無繁中翻譯)
14:54.240–15:03.041
(此句尚無繁中翻譯)
15:03.041–15:07.950
(此句尚無繁中翻譯)
15:07.960–15:12.119
(此句尚無繁中翻譯)
15:12.119–15:20.638
(此句尚無繁中翻譯)
15:20.638–15:32.251
(此句尚無繁中翻譯)
15:32.251–15:36.205
(此句尚無繁中翻譯)
15:36.205–15:43.223
(此句尚無繁中翻譯)
15:43.223–15:49.359
(此句尚無繁中翻譯)
15:49.359–15:55.288
(此句尚無繁中翻譯)
15:55.288–16:05.590
(此句尚無繁中翻譯)
16:05.600–16:09.537
(此句尚無繁中翻譯)
16:09.537–16:14.670
(此句尚無繁中翻譯)
16:14.680–16:16.545
(此句尚無繁中翻譯)
16:16.545–16:24.889
(此句尚無繁中翻譯)
16:24.889–16:28.190
(此句尚無繁中翻譯)
16:28.190–16:37.443
(此句尚無繁中翻譯)
16:37.443–16:46.492
(此句尚無繁中翻譯)
16:46.492–16:54.145
(此句尚無繁中翻譯)
16:54.145–16:56.312
(此句尚無繁中翻譯)
16:56.312–16:59.470
(此句尚無繁中翻譯)
16:59.480–17:03.280
(此句尚無繁中翻譯)
17:03.280–17:15.790
(此句尚無繁中翻譯)
17:15.800–17:16.331
(此句尚無繁中翻譯)
17:16.331–17:19.521
(此句尚無繁中翻譯)
17:19.521–17:31.390
(此句尚無繁中翻譯)
17:31.400–17:39.201
(此句尚無繁中翻譯)
17:39.201–17:40.779
(此句尚無繁中翻譯)
17:40.779–17:43.717
(此句尚無繁中翻譯)
17:43.717–17:48.025
(此句尚無繁中翻譯)
17:48.025–17:57.830
(此句尚無繁中翻譯)
17:57.840–18:01.619
(此句尚無繁中翻譯)
18:01.619–18:09.788
(此句尚無繁中翻譯)
18:09.788–18:18.848
(此句尚無繁中翻譯)
18:18.848–18:20.921
(此句尚無繁中翻譯)
18:20.921–18:26.642
(此句尚無繁中翻譯)
18:26.642–18:32.990
(此句尚無繁中翻譯)
18:33.000–18:37.176
(此句尚無繁中翻譯)
18:37.176–18:40.065
(此句尚無繁中翻譯)
18:40.065–18:42.395
(此句尚無繁中翻譯)
18:42.395–18:46.639
(此句尚無繁中翻譯)
18:46.639–18:48.310
(此句尚無繁中翻譯)
18:48.320–18:51.279
(此句尚無繁中翻譯)
18:51.279–18:53.387
(此句尚無繁中翻譯)
18:53.387–18:56.670
(此句尚無繁中翻譯)
18:56.680–19:00.283
(此句尚無繁中翻譯)
19:00.283–19:04.107
(此句尚無繁中翻譯)
19:04.107–19:05.826
(此句尚無繁中翻譯)
19:05.826–19:08.209
(此句尚無繁中翻譯)
19:08.209–19:13.971
(此句尚無繁中翻譯)
19:13.971–19:20.760
(此句尚無繁中翻譯)
19:20.760–19:26.299
(此句尚無繁中翻譯)
19:26.299–19:33.149
(此句尚無繁中翻譯)
19:33.149–19:38.242
(此句尚無繁中翻譯)
19:38.242–19:45.470
(此句尚無繁中翻譯)
19:45.480–19:53.557
(此句尚無繁中翻譯)
19:53.557–19:57.786
(此句尚無繁中翻譯)
19:57.786–20:05.079
(此句尚無繁中翻譯)
20:05.079–20:24.270
(此句尚無繁中翻譯)
20:24.280–20:31.296
(此句尚無繁中翻譯)
20:31.296–20:36.819
(此句尚無繁中翻譯)
20:36.819–20:42.950
(此句尚無繁中翻譯)
20:42.960–20:45.465
(此句尚無繁中翻譯)
20:45.465–20:56.714
(此句尚無繁中翻譯)
20:56.714–21:06.790
(此句尚無繁中翻譯)
21:06.800–21:18.550
(此句尚無繁中翻譯)
21:18.560–21:19.808
(此句尚無繁中翻譯)
21:19.808–21:24.330
(此句尚無繁中翻譯)
21:24.330–21:28.986
(此句尚無繁中翻譯)
21:28.986–21:39.150
(此句尚無繁中翻譯)
21:39.160–21:45.390
(此句尚無繁中翻譯)
21:45.400–21:49.190
(此句尚無繁中翻譯)
21:49.200–21:54.923
(此句尚無繁中翻譯)
21:54.923–21:56.550
(此句尚無繁中翻譯)
21:56.560–22:00.049
(此句尚無繁中翻譯)
22:00.049–22:02.997
(此句尚無繁中翻譯)
22:02.997–22:07.578
(此句尚無繁中翻譯)
22:07.578–22:11.075
(此句尚無繁中翻譯)
22:11.075–22:14.150
(此句尚無繁中翻譯)
22:14.160–22:18.343
(此句尚無繁中翻譯)
22:18.343–22:23.242
(此句尚無繁中翻譯)
22:23.242–22:25.960
(此句尚無繁中翻譯)
22:25.960–22:32.078
(此句尚無繁中翻譯)
22:32.078–22:33.707
(此句尚無繁中翻譯)
22:33.707–22:36.493
(此句尚無繁中翻譯)
22:36.493–22:38.990
(此句尚無繁中翻譯)
22:38.990–22:42.876
(此句尚無繁中翻譯)
22:42.876–22:52.932
(此句尚無繁中翻譯)
22:52.932–22:54.670
(此句尚無繁中翻譯)
22:54.680–22:55.133
(此句尚無繁中翻譯)
22:55.133–23:06.478
(此句尚無繁中翻譯)
23:06.478–23:13.487
(此句尚無繁中翻譯)
23:13.487–23:15.780
(此句尚無繁中翻譯)
23:15.780–23:17.343
(此句尚無繁中翻譯)
23:17.343–23:22.310
(此句尚無繁中翻譯)
23:22.320–23:32.437
(此句尚無繁中翻譯)
23:32.437–23:35.063
(此句尚無繁中翻譯)
23:35.063–23:36.869
(此句尚無繁中翻譯)
23:36.869–23:39.301
(此句尚無繁中翻譯)
23:39.301–23:47.131
(此句尚無繁中翻譯)
23:47.131–23:51.550
(此句尚無繁中翻譯)
23:51.560–23:54.994
(此句尚無繁中翻譯)
23:54.994–23:55.580
(此句尚無繁中翻譯)
23:55.580–23:58.110
(此句尚無繁中翻譯)
23:58.120–24:04.270
(此句尚無繁中翻譯)
24:04.280–24:06.480
(此句尚無繁中翻譯)
24:06.480–24:21.516
(此句尚無繁中翻譯)
24:21.516–24:27.152
(此句尚無繁中翻譯)
24:27.152–24:28.806
(此句尚無繁中翻譯)
24:28.806–24:30.676
(此句尚無繁中翻譯)
24:30.676–24:34.775
(此句尚無繁中翻譯)
24:34.775–24:36.701
(此句尚無繁中翻譯)
24:36.701–24:41.090
(此句尚無繁中翻譯)
24:41.090–24:46.710
(此句尚無繁中翻譯)
24:46.720–24:46.970
(此句尚無繁中翻譯)
24:46.970–24:50.615
(此句尚無繁中翻譯)
24:50.615–25:02.104
(此句尚無繁中翻譯)
25:02.104–25:08.510
(此句尚無繁中翻譯)
25:08.520–25:14.280
(此句尚無繁中翻譯)
25:14.280–25:23.830
(此句尚無繁中翻譯)
25:23.840–25:28.774
(此句尚無繁中翻譯)
25:28.774–25:36.710
(此句尚無繁中翻譯)
25:36.720–25:42.818
(此句尚無繁中翻譯)
25:42.818–25:47.270
(此句尚無繁中翻譯)
25:47.280–25:58.030
(此句尚無繁中翻譯)
25:58.040–26:00.850
(此句尚無繁中翻譯)
26:00.850–26:07.430
(此句尚無繁中翻譯)
26:07.440–26:18.358
(此句尚無繁中翻譯)
26:18.358–26:20.252
(此句尚無繁中翻譯)
26:20.252–26:22.330
(此句尚無繁中翻譯)
26:22.330–26:30.190
(此句尚無繁中翻譯)
26:30.200–26:42.430
(此句尚無繁中翻譯)
26:42.440–26:47.228
(此句尚無繁中翻譯)
26:47.228–27:02.990
(此句尚無繁中翻譯)
27:03.000–27:11.171
(此句尚無繁中翻譯)
27:11.171–27:13.861
(此句尚無繁中翻譯)
27:13.861–27:21.188
(此句尚無繁中翻譯)
27:21.188–27:25.922
(此句尚無繁中翻譯)
27:25.922–27:30.752
(此句尚無繁中翻譯)
27:30.752–27:37.372
(此句尚無繁中翻譯)
27:37.372–27:40.861
(此句尚無繁中翻譯)
27:40.861–27:46.425
(此句尚無繁中翻譯)
27:46.425–27:52.730
(此句尚無繁中翻譯)
27:52.730–27:59.961
(此句尚無繁中翻譯)
27:59.961–28:05.845
(此句尚無繁中翻譯)
28:05.845–28:08.095
(此句尚無繁中翻譯)
28:08.095–28:20.561
(此句尚無繁中翻譯)
28:20.561–28:23.764
(此句尚無繁中翻譯)
28:23.764–28:27.415
(此句尚無繁中翻譯)
28:27.415–28:29.854
(此句尚無繁中翻譯)
28:29.854–28:31.644
(此句尚無繁中翻譯)
28:31.644–28:35.440
(此句尚無繁中翻譯)
28:35.440–28:36.603
(此句尚無繁中翻譯)
28:36.603–28:39.213
(此句尚無繁中翻譯)
28:39.213–28:45.162
(此句尚無繁中翻譯)
28:45.162–28:51.072
(此句尚無繁中翻譯)
28:51.072–28:54.510
(此句尚無繁中翻譯)
28:54.520–29:00.047
(此句尚無繁中翻譯)
29:00.047–29:01.150
(此句尚無繁中翻譯)
29:01.160–29:02.514
(此句尚無繁中翻譯)
29:02.514–29:06.630
(此句尚無繁中翻譯)
29:06.640–29:11.917
(此句尚無繁中翻譯)
29:11.917–29:14.774
(此句尚無繁中翻譯)
29:14.774–29:18.097
(此句尚無繁中翻譯)
29:18.097–29:21.514
(此句尚無繁中翻譯)
29:21.514–29:26.510
(此句尚無繁中翻譯)
29:26.520–29:29.734
(此句尚無繁中翻譯)
29:29.734–29:36.935
(此句尚無繁中翻譯)
29:36.935–29:40.552
(此句尚無繁中翻譯)
29:40.552–29:51.287
(此句尚無繁中翻譯)
29:51.287–29:53.112
(此句尚無繁中翻譯)
29:53.112–30:10.910
(此句尚無繁中翻譯)
30:10.920–30:11.243
(此句尚無繁中翻譯)
30:11.243–30:16.058
(此句尚無繁中翻譯)
30:16.058–30:16.557
(此句尚無繁中翻譯)
30:16.557–30:19.691
(此句尚無繁中翻譯)
30:19.691–30:23.707
(此句尚無繁中翻譯)
30:23.707–30:29.787
(此句尚無繁中翻譯)
30:29.787–30:34.833
(此句尚無繁中翻譯)
30:34.833–30:41.430
(此句尚無繁中翻譯)
30:41.440–30:47.700
(此句尚無繁中翻譯)
30:47.700–30:50.692
(此句尚無繁中翻譯)
30:50.692–31:06.310
(此句尚無繁中翻譯)
31:06.320–31:08.201
(此句尚無繁中翻譯)
31:08.201–31:17.748
(此句尚無繁中翻譯)
31:17.748–31:22.099
(此句尚無繁中翻譯)
31:22.099–31:24.886
(此句尚無繁中翻譯)
31:24.886–31:30.153
(此句尚無繁中翻譯)
31:30.153–31:31.743
(此句尚無繁中翻譯)
31:31.743–31:32.342
(此句尚無繁中翻譯)
31:32.342–31:34.399
(此句尚無繁中翻譯)
31:34.399–31:37.091
(此句尚無繁中翻譯)
31:37.091–31:41.786
(此句尚無繁中翻譯)
31:41.786–31:43.515
(此句尚無繁中翻譯)
31:43.515–31:45.399
(此句尚無繁中翻譯)
31:45.399–31:47.995
(此句尚無繁中翻譯)
31:47.995–31:55.230
(此句尚無繁中翻譯)
31:55.240–32:01.537
(此句尚無繁中翻譯)
32:01.537–32:03.854
(此句尚無繁中翻譯)
32:03.854–32:06.550
(此句尚無繁中翻譯)
32:06.560–32:07.332
(此句尚無繁中翻譯)
32:07.332–32:14.621
(此句尚無繁中翻譯)
32:14.621–32:19.199
(此句尚無繁中翻譯)
32:19.199–32:25.072
(此句尚無繁中翻譯)
32:25.072–32:27.719
(此句尚無繁中翻譯)
32:27.719–32:30.048
(此句尚無繁中翻譯)
32:30.048–32:35.654
(此句尚無繁中翻譯)
32:35.654–32:38.775
(此句尚無繁中翻譯)
32:38.775–32:47.784
(此句尚無繁中翻譯)
32:47.784–32:49.259
(此句尚無繁中翻譯)
32:49.259–32:54.174
(此句尚無繁中翻譯)
32:54.174–33:02.963
(此句尚無繁中翻譯)
33:02.963–33:05.147
(此句尚無繁中翻譯)
33:05.147–33:11.392
(此句尚無繁中翻譯)
33:11.392–33:12.903
(此句尚無繁中翻譯)
33:12.903–33:15.370
(此句尚無繁中翻譯)
33:15.370–33:16.463
(此句尚無繁中翻譯)
33:16.463–33:18.294
(此句尚無繁中翻譯)
33:18.294–33:24.614
(此句尚無繁中翻譯)
33:24.614–33:26.358
(此句尚無繁中翻譯)
33:26.358–33:28.597
(此句尚無繁中翻譯)
33:28.597–33:35.109
(此句尚無繁中翻譯)
33:35.109–33:39.907
(此句尚無繁中翻譯)
33:39.907–33:45.508
(此句尚無繁中翻譯)
33:45.508–33:48.642
(此句尚無繁中翻譯)
33:48.642–33:53.780
(此句尚無繁中翻譯)
33:53.780–33:57.264
(此句尚無繁中翻譯)
33:57.264–33:59.177
(此句尚無繁中翻譯)
33:59.177–34:08.149
(此句尚無繁中翻譯)
34:08.159–34:09.214
(此句尚無繁中翻譯)
34:09.214–34:11.627
(此句尚無繁中翻譯)
34:11.627–34:14.666
(此句尚無繁中翻譯)
34:14.666–34:26.742
(此句尚無繁中翻譯)
34:26.742–34:30.225
(此句尚無繁中翻譯)
34:30.225–34:41.864
(此句尚無繁中翻譯)
34:41.864–34:44.762
(此句尚無繁中翻譯)
34:44.762–34:47.923
(此句尚無繁中翻譯)
34:47.923–34:51.813
(此句尚無繁中翻譯)
34:51.813–34:55.884
(此句尚無繁中翻譯)
34:55.884–35:04.273
(此句尚無繁中翻譯)
35:04.273–35:09.071
(此句尚無繁中翻譯)
35:09.071–35:10.498
(此句尚無繁中翻譯)
35:10.498–35:14.030
(此句尚無繁中翻譯)
35:14.040–35:19.780
(此句尚無繁中翻譯)
35:19.780–35:21.331
(此句尚無繁中翻譯)
35:21.331–35:24.988
(此句尚無繁中翻譯)
35:24.988–35:28.225
(此句尚無繁中翻譯)
35:28.225–35:33.201
(此句尚無繁中翻譯)
35:33.201–35:34.747
(此句尚無繁中翻譯)
35:34.747–35:35.753
(此句尚無繁中翻譯)
35:35.753–35:38.026
(此句尚無繁中翻譯)
35:38.026–35:51.120
(此句尚無繁中翻譯)
35:51.120–35:55.609
(此句尚無繁中翻譯)
35:55.609–36:03.993
(此句尚無繁中翻譯)
36:03.993–36:07.533
(此句尚無繁中翻譯)
36:07.533–36:12.675
(此句尚無繁中翻譯)
36:12.675–36:18.435
(此句尚無繁中翻譯)
36:18.435–36:28.035
(此句尚無繁中翻譯)
36:28.035–36:31.274
(此句尚無繁中翻譯)
36:31.274–36:36.025
(此句尚無繁中翻譯)
36:36.025–36:40.673
(此句尚無繁中翻譯)
36:40.673–36:45.014
(此句尚無繁中翻譯)
36:45.014–36:48.022
(此句尚無繁中翻譯)
36:48.022–36:54.177
(此句尚無繁中翻譯)
36:54.177–36:59.572
(此句尚無繁中翻譯)
36:59.572–37:03.056
(此句尚無繁中翻譯)
37:03.056–37:09.103
(此句尚無繁中翻譯)
37:09.103–37:11.705
(此句尚無繁中翻譯)
37:11.705–37:16.935
(此句尚無繁中翻譯)
37:16.935–37:27.384
(此句尚無繁中翻譯)
37:27.384–37:28.846
(此句尚無繁中翻譯)
37:28.846–37:31.436
(此句尚無繁中翻譯)
37:31.436–37:38.633
(此句尚無繁中翻譯)
37:38.633–37:49.879
(此句尚無繁中翻譯)
37:49.879–38:05.470
(此句尚無繁中翻譯)
38:05.480–38:21.390
(此句尚無繁中翻譯)
38:21.400–38:27.968
(此句尚無繁中翻譯)
38:27.968–38:30.812
(此句尚無繁中翻譯)
38:30.812–38:33.882
(此句尚無繁中翻譯)
38:33.882–38:37.140
(此句尚無繁中翻譯)
38:37.140–38:43.993
(此句尚無繁中翻譯)
38:43.993–38:45.047
(此句尚無繁中翻譯)
38:45.047–38:48.566
(此句尚無繁中翻譯)
38:48.566–38:50.632
(此句尚無繁中翻譯)
38:50.632–38:54.624
(此句尚無繁中翻譯)
38:54.624–39:15.990
(此句尚無繁中翻譯)
39:16.000–39:23.730
(此句尚無繁中翻譯)
39:23.730–39:26.143
(此句尚無繁中翻譯)
39:26.143–39:32.868
(此句尚無繁中翻譯)
39:32.868–39:34.896
(此句尚無繁中翻譯)
39:34.896–39:39.081
(此句尚無繁中翻譯)
39:39.081–39:49.033
(此句尚無繁中翻譯)
39:49.033–40:00.470
(此句尚無繁中翻譯)
40:00.480–40:06.390
(此句尚無繁中翻譯)
40:06.400–40:19.997
(此句尚無繁中翻譯)
40:19.997–40:22.830
(此句尚無繁中翻譯)
40:22.830–40:24.820
(此句尚無繁中翻譯)
40:24.820–40:34.663
(此句尚無繁中翻譯)
40:34.663–40:36.990
(此句尚無繁中翻譯)
40:37.000–40:48.087
(此句尚無繁中翻譯)
40:48.087–40:56.051
(此句尚無繁中翻譯)
40:56.051–41:13.030
(此句尚無繁中翻譯)
41:13.040–41:17.867
(此句尚無繁中翻譯)
41:17.867–41:30.750
(此句尚無繁中翻譯)
41:30.760–41:37.779
(此句尚無繁中翻譯)
41:37.779–41:43.187
(此句尚無繁中翻譯)
41:43.187–41:50.151
(此句尚無繁中翻譯)
41:50.151–41:56.630
(此句尚無繁中翻譯)
41:56.640–42:00.190
(此句尚無繁中翻譯)
42:00.200–42:07.277
(此句尚無繁中翻譯)
42:07.277–42:14.285
(此句尚無繁中翻譯)
42:14.285–42:18.122
(此句尚無繁中翻譯)
42:18.122–42:24.342
(此句尚無繁中翻譯)
42:24.342–42:26.809
(此句尚無繁中翻譯)
42:26.809–42:29.734
(此句尚無繁中翻譯)
42:29.734–42:32.457
(此句尚無繁中翻譯)
42:32.457–42:35.519
(此句尚無繁中翻譯)
42:35.519–42:42.384
(此句尚無繁中翻譯)
42:42.384–42:45.451
(此句尚無繁中翻譯)
42:45.451–42:53.656
(此句尚無繁中翻譯)
42:53.656–43:02.036
(此句尚無繁中翻譯)
43:02.036–43:15.224
(此句尚無繁中翻譯)
43:15.224–43:21.561
(此句尚無繁中翻譯)
43:21.561–43:30.150
(此句尚無繁中翻譯)
43:30.160–43:34.996
(此句尚無繁中翻譯)
43:34.996–43:42.081
(此句尚無繁中翻譯)
43:42.081–43:49.992
(此句尚無繁中翻譯)
43:49.992–43:55.515
(此句尚無繁中翻譯)
43:55.515–43:58.668
(此句尚無繁中翻譯)
43:58.668–44:03.310
(此句尚無繁中翻譯)
44:03.320–44:06.070
(此句尚無繁中翻譯)
44:06.080–44:12.204
(此句尚無繁中翻譯)
44:12.204–44:17.990
(此句尚無繁中翻譯)
44:18.000–44:25.159
(此句尚無繁中翻譯)
44:25.159–44:30.186
(此句尚無繁中翻譯)
44:30.186–44:46.510
(此句尚無繁中翻譯)
44:46.520–44:47.870
(此句尚無繁中翻譯)
44:47.880–44:53.584
(此句尚無繁中翻譯)
44:53.584–44:58.264
(此句尚無繁中翻譯)
44:58.264–45:02.745
(此句尚無繁中翻譯)
45:02.745–45:07.182
(此句尚無繁中翻譯)
45:07.182–45:12.473
(此句尚無繁中翻譯)
45:12.473–45:19.950
(此句尚無繁中翻譯)
45:19.960–45:23.178
(此句尚無繁中翻譯)
45:23.178–45:26.374
(此句尚無繁中翻譯)
45:26.374–45:39.688
(此句尚無繁中翻譯)
45:39.688–45:46.520
(此句尚無繁中翻譯)
45:46.520–45:49.062
(此句尚無繁中翻譯)
45:49.062–45:53.830
(此句尚無繁中翻譯)
45:53.840–45:57.300
(此句尚無繁中翻譯)
45:57.300–46:14.750
(此句尚無繁中翻譯)
46:14.760–46:17.214
(此句尚無繁中翻譯)
46:17.214–46:18.465
(此句尚無繁中翻譯)
46:18.465–46:23.031
(此句尚無繁中翻譯)
46:23.031–46:25.305
(此句尚無繁中翻譯)
46:25.305–46:28.683
(此句尚無繁中翻譯)
46:28.683–46:33.466
(此句尚無繁中翻譯)
46:33.466–46:37.350
(此句尚無繁中翻譯)
46:37.360–46:41.641
(此句尚無繁中翻譯)
46:41.641–46:49.603
(此句尚無繁中翻譯)
46:49.603–47:02.470
(此句尚無繁中翻譯)
47:02.480–47:06.109
(此句尚無繁中翻譯)
47:06.109–47:06.735
(此句尚無繁中翻譯)
47:06.735–47:13.054
(此句尚無繁中翻譯)
47:13.054–47:14.657
(此句尚無繁中翻譯)
47:14.657–47:19.567
(此句尚無繁中翻譯)
47:19.567–47:24.292
(此句尚無繁中翻譯)
47:24.292–47:24.921
(此句尚無繁中翻譯)
47:24.921–47:35.006
(此句尚無繁中翻譯)
47:35.006–47:40.866
(此句尚無繁中翻譯)
47:40.866–47:45.976
(此句尚無繁中翻譯)
47:45.976–47:51.849
(此句尚無繁中翻譯)
47:51.849–48:00.698
(此句尚無繁中翻譯)
48:00.698–48:06.341
(此句尚無繁中翻譯)
48:06.341–48:07.807
(此句尚無繁中翻譯)
48:07.807–48:09.801
(此句尚無繁中翻譯)
48:09.801–48:14.517
(此句尚無繁中翻譯)
48:14.517–48:19.389
(此句尚無繁中翻譯)
48:19.389–48:24.141
(此句尚無繁中翻譯)
48:24.141–48:28.634
(此句尚無繁中翻譯)
48:28.634–48:33.657
(此句尚無繁中翻譯)
48:33.657–48:36.023
(此句尚無繁中翻譯)
48:36.023–48:38.910
(此句尚無繁中翻譯)
48:38.920–48:39.380
(此句尚無繁中翻譯)
48:39.380–48:44.716
(此句尚無繁中翻譯)
48:44.716–48:50.270
(此句尚無繁中翻譯)
48:50.280–48:50.573
(此句尚無繁中翻譯)
48:50.573–48:52.742
(此句尚無繁中翻譯)
48:52.742–48:55.858
(此句尚無繁中翻譯)
48:55.858–48:56.995
(此句尚無繁中翻譯)
48:56.995–48:58.108
(此句尚無繁中翻譯)
48:58.108–49:00.430
(此句尚無繁中翻譯)
49:00.440–49:02.050
(此句尚無繁中翻譯)
49:02.050–49:07.062
(此句尚無繁中翻譯)
49:07.062–49:09.229
(此句尚無繁中翻譯)
49:09.229–49:10.690
(此句尚無繁中翻譯)
49:10.690–49:14.937
(此句尚無繁中翻譯)
49:14.937–49:19.950
(此句尚無繁中翻譯)
49:19.960–49:23.874
(此句尚無繁中翻譯)
49:23.874–49:26.604
(此句尚無繁中翻譯)
49:26.604–49:27.248
(此句尚無繁中翻譯)
49:27.248–49:29.918
(此句尚無繁中翻譯)
49:29.918–49:31.171
(此句尚無繁中翻譯)
49:31.171–49:37.225
(此句尚無繁中翻譯)
49:37.225–49:37.738
(此句尚無繁中翻譯)
49:37.738–49:45.870
(此句尚無繁中翻譯)
49:45.880–49:46.614
(此句尚無繁中翻譯)
49:46.614–49:49.906
(此句尚無繁中翻譯)
49:49.906–49:53.830
(此句尚無繁中翻譯)
49:53.840–50:05.310
(此句尚無繁中翻譯)
50:05.320–50:08.910
(此句尚無繁中翻譯)
50:08.920–50:16.149
(此句尚無繁中翻譯)
50:16.149–50:21.550
(此句尚無繁中翻譯)
50:21.560–50:31.208
(此句尚無繁中翻譯)
50:31.208–50:33.694
(此句尚無繁中翻譯)
50:33.694–50:42.976
(此句尚無繁中翻譯)
50:42.976–50:50.135
(此句尚無繁中翻譯)
50:50.135–50:53.630
(此句尚無繁中翻譯)
50:53.630–50:59.975
(此句尚無繁中翻譯)
50:59.975–51:06.096
(此句尚無繁中翻譯)
51:06.096–51:12.178
(此句尚無繁中翻譯)
51:12.178–51:16.230
(此句尚無繁中翻譯)
51:16.230–51:18.726
(此句尚無繁中翻譯)
51:18.726–51:29.190
(此句尚無繁中翻譯)
51:29.200–51:43.270
(此句尚無繁中翻譯)
51:43.280–51:44.216
(此句尚無繁中翻譯)
51:44.216–51:55.073
(此句尚無繁中翻譯)
51:55.073–52:03.882
(此句尚無繁中翻譯)
52:03.882–52:05.989
(此句尚無繁中翻譯)
52:05.989–52:07.861
(此句尚無繁中翻譯)
52:07.861–52:12.907
(此句尚無繁中翻譯)
52:12.907–52:25.870
(此句尚無繁中翻譯)
52:25.880–52:32.226
(此句尚無繁中翻譯)
52:32.226–52:40.270
(此句尚無繁中翻譯)
52:40.280–52:41.925
(此句尚無繁中翻譯)
52:41.925–52:49.164
(此句尚無繁中翻譯)
52:49.164–52:53.394
(此句尚無繁中翻譯)
52:53.394–52:59.870
(此句尚無繁中翻譯)
52:59.880–53:06.412
(此句尚無繁中翻譯)
53:06.412–53:06.800
(此句尚無繁中翻譯)
53:06.800–53:11.674
(此句尚無繁中翻譯)
53:11.674–53:11.964
(此句尚無繁中翻譯)
53:11.964–53:13.585
(此句尚無繁中翻譯)
53:13.585–53:18.030
(此句尚無繁中翻譯)
53:18.040–53:22.120
(此句尚無繁中翻譯)
53:22.120–53:23.412
(此句尚無繁中翻譯)
53:23.412–53:24.812
(此句尚無繁中翻譯)
53:24.812–53:26.728
(此句尚無繁中翻譯)
53:26.728–53:31.708
(此句尚無繁中翻譯)
53:31.708–53:32.769
(此句尚無繁中翻譯)
53:32.769–53:38.687
(此句尚無繁中翻譯)
53:38.687–53:41.901
(此句尚無繁中翻譯)
53:41.901–53:44.217
(此句尚無繁中翻譯)
53:44.217–53:45.961
(此句尚無繁中翻譯)
53:45.961–53:47.459
(此句尚無繁中翻譯)
53:47.459–53:55.104
(此句尚無繁中翻譯)
53:55.104–53:56.626
(此句尚無繁中翻譯)
53:56.626–54:01.911
(此句尚無繁中翻譯)
54:01.911–54:06.390
(此句尚無繁中翻譯)
54:06.400–54:09.593
(此句尚無繁中翻譯)
54:09.593–54:10.830
(此句尚無繁中翻譯)
54:10.830–54:12.477
(此句尚無繁中翻譯)
54:12.477–54:18.522
(此句尚無繁中翻譯)
54:18.522–54:26.223
(此句尚無繁中翻譯)
54:26.223–54:28.782
(此句尚無繁中翻譯)
54:28.782–54:34.234
(此句尚無繁中翻譯)
54:34.234–54:39.126
(此句尚無繁中翻譯)
54:39.126–54:42.041
(此句尚無繁中翻譯)
54:42.041–54:56.990
(此句尚無繁中翻譯)
54:57.000–55:01.605
(此句尚無繁中翻譯)
55:01.605–55:06.550
(此句尚無繁中翻譯)
55:06.560–55:11.950
(此句尚無繁中翻譯)
55:11.960–55:17.746
(此句尚無繁中翻譯)
55:17.746–55:22.326
(此句尚無繁中翻譯)
55:22.326–55:33.939
(此句尚無繁中翻譯)
55:33.939–55:42.990
(此句尚無繁中翻譯)
55:43.000–55:48.782
(此句尚無繁中翻譯)
55:48.782–55:56.190
(此句尚無繁中翻譯)
55:56.200–56:01.752
(此句尚無繁中翻譯)
56:01.752–56:04.317
(此句尚無繁中翻譯)
56:04.317–56:08.115
(此句尚無繁中翻譯)
56:08.115–56:14.232
(此句尚無繁中翻譯)
56:14.232–56:16.980
(此句尚無繁中翻譯)
56:16.980–56:19.368
(此句尚無繁中翻譯)
56:19.368–56:32.477
(此句尚無繁中翻譯)
56:32.477–56:33.799
(此句尚無繁中翻譯)
56:33.799–56:35.506
(此句尚無繁中翻譯)
56:35.506–56:39.810
(此句尚無繁中翻譯)
56:39.810–56:45.473
(此句尚無繁中翻譯)
56:45.473–56:51.934
(此句尚無繁中翻譯)
56:51.934–56:53.775
(此句尚無繁中翻譯)
56:53.775–57:00.070
(此句尚無繁中翻譯)
57:00.080–57:00.552
(此句尚無繁中翻譯)
57:00.552–57:06.750
(此句尚無繁中翻譯)
57:06.760–57:08.990
(此句尚無繁中翻譯)
57:09.000–57:10.784
(此句尚無繁中翻譯)
57:10.784–57:11.897
(此句尚無繁中翻譯)
57:11.897–57:16.160
(此句尚無繁中翻譯)
57:16.160–57:23.430
(此句尚無繁中翻譯)
57:23.440–57:32.832
(此句尚無繁中翻譯)
57:32.832–57:34.258
(此句尚無繁中翻譯)
57:34.258–57:36.343
(此句尚無繁中翻譯)
57:36.343–57:39.203
(此句尚無繁中翻譯)
57:39.203–57:44.852
(此句尚無繁中翻譯)
57:44.852–57:49.270
(此句尚無繁中翻譯)
57:49.270–57:52.310
(此句尚無繁中翻譯)
57:52.320–57:57.349
(此句尚無繁中翻譯)
57:57.349–58:02.402
(此句尚無繁中翻譯)
58:02.402–58:05.690
(此句尚無繁中翻譯)
58:05.690–58:08.139
(此句尚無繁中翻譯)
58:08.139–58:15.321
(此句尚無繁中翻譯)
58:15.321–58:19.218
(此句尚無繁中翻譯)
58:19.218–58:25.437
(此句尚無繁中翻譯)
58:25.437–58:25.726
(此句尚無繁中翻譯)
58:25.726–58:28.899
(此句尚無繁中翻譯)
58:28.899–58:32.108
(此句尚無繁中翻譯)
58:32.108–58:36.881
(此句尚無繁中翻譯)
58:36.881–58:39.528
(此句尚無繁中翻譯)
58:39.528–58:44.301
(此句尚無繁中翻譯)
58:44.301–58:50.013
(此句尚無繁中翻譯)
58:50.013–58:52.950
(此句尚無繁中翻譯)
58:52.960–58:54.944
(此句尚無繁中翻譯)
58:54.944–58:56.527
(此句尚無繁中翻譯)
58:56.527–59:03.089
(此句尚無繁中翻譯)
59:03.089–59:06.214
(此句尚無繁中翻譯)
59:06.214–59:06.481
(此句尚無繁中翻譯)
59:06.481–59:09.103
(此句尚無繁中翻譯)
59:09.103–59:11.621
(此句尚無繁中翻譯)
59:11.621–59:15.270
(此句尚無繁中翻譯)
59:15.280–59:18.753
(此句尚無繁中翻譯)
59:18.753–59:20.232
(此句尚無繁中翻譯)
59:20.232–59:26.558
(此句尚無繁中翻譯)
59:26.558–59:30.580
(此句尚無繁中翻譯)
59:30.580–59:34.949
(此句尚無繁中翻譯)
59:34.949–59:37.732
(此句尚無繁中翻譯)
59:37.732–59:39.404
(此句尚無繁中翻譯)
59:39.404–59:42.434
(此句尚無繁中翻譯)
59:42.434–59:46.143
(此句尚無繁中翻譯)
59:46.143–59:48.792
(此句尚無繁中翻譯)
59:48.792–59:52.710
(此句尚無繁中翻譯)
59:52.720–59:55.965
(此句尚無繁中翻譯)
59:55.965–59:58.923
(此句尚無繁中翻譯)
59:58.923–1:00:10.350
(此句尚無繁中翻譯)
1:00:10.360–1:00:16.390
(此句尚無繁中翻譯)
1:00:16.390–1:00:22.599
(此句尚無繁中翻譯)
1:00:22.599–1:00:31.870
(此句尚無繁中翻譯)
1:00:31.880–1:00:34.073
(此句尚無繁中翻譯)
1:00:34.073–1:00:45.270
(此句尚無繁中翻譯)
1:00:45.280–1:00:50.034
(此句尚無繁中翻譯)
1:00:50.034–1:01:04.489
(此句尚無繁中翻譯)
1:01:04.489–1:01:12.107
(此句尚無繁中翻譯)
1:01:12.107–1:01:16.864
(此句尚無繁中翻譯)
1:01:16.864–1:01:19.790
(此句尚無繁中翻譯)
1:01:19.800–1:01:34.310
(此句尚無繁中翻譯)
1:01:34.320–1:01:47.390
(此句尚無繁中翻譯)
1:01:47.400–1:01:49.350
(此句尚無繁中翻譯)
1:01:49.360–1:01:52.367
(此句尚無繁中翻譯)
1:01:52.367–1:01:55.029
(此句尚無繁中翻譯)
1:01:55.029–1:02:04.691
(此句尚無繁中翻譯)
1:02:04.691–1:02:07.052
(此句尚無繁中翻譯)
1:02:07.052–1:02:11.674
(此句尚無繁中翻譯)
1:02:11.674–1:02:21.397
(此句尚無繁中翻譯)
1:02:21.397–1:02:35.276
(此句尚無繁中翻譯)
1:02:35.276–1:02:40.968
(此句尚無繁中翻譯)
1:02:40.968–1:02:44.094
(此句尚無繁中翻譯)
1:02:44.094–1:02:52.724
(此句尚無繁中翻譯)
1:02:52.724–1:03:06.710
(此句尚無繁中翻譯)
1:03:06.720–1:03:08.038
(此句尚無繁中翻譯)
1:03:08.038–1:03:10.754
(此句尚無繁中翻譯)
1:03:10.754–1:03:18.114
(此句尚無繁中翻譯)
1:03:18.114–1:03:22.962
(此句尚無繁中翻譯)
1:03:22.962–1:03:27.097
(此句尚無繁中翻譯)
1:03:27.097–1:03:39.078
(此句尚無繁中翻譯)
1:03:39.078–1:03:44.494
(此句尚無繁中翻譯)
1:03:44.494–1:03:49.204
(此句尚無繁中翻譯)
1:03:49.204–1:03:51.470
(此句尚無繁中翻譯)
1:03:51.470–1:03:52.590
(此句尚無繁中翻譯)
1:03:52.600–1:03:58.412
(此句尚無繁中翻譯)
1:03:58.412–1:04:02.787
(此句尚無繁中翻譯)
1:04:02.787–1:04:07.243
(此句尚無繁中翻譯)
1:04:07.243–1:04:15.332
(此句尚無繁中翻譯)
1:04:15.332–1:04:22.769
(此句尚無繁中翻譯)
1:04:22.769–1:04:26.150
(此句尚無繁中翻譯)
1:04:26.160–1:04:36.510
(此句尚無繁中翻譯)
1:04:36.520–1:04:40.744
(此句尚無繁中翻譯)
1:04:40.744–1:04:45.499
(此句尚無繁中翻譯)
1:04:45.499–1:04:47.950
(此句尚無繁中翻譯)
1:04:47.960–1:04:56.458
(此句尚無繁中翻譯)
1:04:56.458–1:04:57.713
(此句尚無繁中翻譯)
1:04:57.713–1:05:04.281
(此句尚無繁中翻譯)
1:05:04.281–1:05:08.999
(此句尚無繁中翻譯)
1:05:08.999–1:05:17.868
(此句尚無繁中翻譯)
1:05:17.868–1:05:23.399
(此句尚無繁中翻譯)
1:05:23.399–1:05:32.288
(此句尚無繁中翻譯)
1:05:32.288–1:05:35.923
(此句尚無繁中翻譯)
1:05:35.923–1:05:38.231
(此句尚無繁中翻譯)
1:05:38.231–1:05:42.018
(此句尚無繁中翻譯)
1:05:42.018–1:05:56.350
(此句尚無繁中翻譯)
1:05:56.360–1:05:56.779
(此句尚無繁中翻譯)
1:05:56.779–1:05:59.024
(此句尚無繁中翻譯)
1:05:59.024–1:06:02.281
(此句尚無繁中翻譯)
1:06:02.281–1:06:03.469
(此句尚無繁中翻譯)
1:06:03.469–1:06:04.022
(此句尚無繁中翻譯)
1:06:04.022–1:06:06.263
(此句尚無繁中翻譯)
1:06:06.263–1:06:08.553
(此句尚無繁中翻譯)
1:06:08.553–1:06:13.315
(此句尚無繁中翻譯)
1:06:13.315–1:06:15.420
(此句尚無繁中翻譯)
1:06:15.420–1:06:17.124
(此句尚無繁中翻譯)
1:06:17.124–1:06:18.893
(此句尚無繁中翻譯)
1:06:18.893–1:06:20.414
(此句尚無繁中翻譯)
1:06:20.414–1:06:25.390
(此句尚無繁中翻譯)
1:06:25.400–1:06:34.286
(此句尚無繁中翻譯)
1:06:34.286–1:06:37.083
(此句尚無繁中翻譯)
1:06:37.083–1:06:39.568
(此句尚無繁中翻譯)
1:06:39.568–1:06:44.304
(此句尚無繁中翻譯)
1:06:44.304–1:06:53.342
(此句尚無繁中翻譯)
1:06:53.342–1:06:54.721
(此句尚無繁中翻譯)
1:06:54.721–1:07:03.214
(此句尚無繁中翻譯)
1:07:03.214–1:07:05.200
(此句尚無繁中翻譯)
1:07:05.200–1:07:08.270
(此句尚無繁中翻譯)
1:07:08.280–1:07:15.663
(此句尚無繁中翻譯)
1:07:15.663–1:07:18.555
(此句尚無繁中翻譯)
1:07:18.555–1:07:23.770
(此句尚無繁中翻譯)
1:07:23.770–1:07:24.074
(此句尚無繁中翻譯)
1:07:24.074–1:07:25.797
(此句尚無繁中翻譯)
1:07:25.797–1:07:27.507
(此句尚無繁中翻譯)
1:07:27.507–1:07:30.950
(此句尚無繁中翻譯)
1:07:30.960–1:07:34.554
(此句尚無繁中翻譯)
1:07:34.554–1:07:37.365
(此句尚無繁中翻譯)
1:07:37.365–1:07:38.874
(此句尚無繁中翻譯)
1:07:38.874–1:07:42.641
(此句尚無繁中翻譯)
1:07:42.641–1:07:46.529
(此句尚無繁中翻譯)
1:07:46.529–1:07:51.161
(此句尚無繁中翻譯)
1:07:51.161–1:07:52.496
(此句尚無繁中翻譯)
1:07:52.496–1:07:53.496
(此句尚無繁中翻譯)
1:07:53.496–1:07:54.631
(此句尚無繁中翻譯)
1:07:54.631–1:07:55.995
(此句尚無繁中翻譯)
1:07:55.995–1:07:57.338
(此句尚無繁中翻譯)
1:07:57.338–1:08:01.093
(此句尚無繁中翻譯)
1:08:01.093–1:08:04.333
(此句尚無繁中翻譯)
1:08:04.333–1:08:05.269
(此句尚無繁中翻譯)
1:08:05.269–1:08:07.008
(此句尚無繁中翻譯)
1:08:07.008–1:08:11.569
(此句尚無繁中翻譯)
1:08:11.569–1:08:14.949
(此句尚無繁中翻譯)
1:08:14.949–1:08:26.135
(此句尚無繁中翻譯)
1:08:26.135–1:08:31.309
(此句尚無繁中翻譯)
1:08:31.319–1:08:40.621
(此句尚無繁中翻譯)
1:08:40.621–1:08:47.057
(此句尚無繁中翻譯)
1:08:47.057–1:08:56.502
(此句尚無繁中翻譯)
1:08:56.502–1:09:01.822
(此句尚無繁中翻譯)
1:09:01.822–1:09:17.100
(此句尚無繁中翻譯)
1:09:17.100–1:09:22.278
(此句尚無繁中翻譯)
1:09:22.278–1:09:28.250
(此句尚無繁中翻譯)
1:09:28.250–1:09:34.837
(此句尚無繁中翻譯)
1:09:34.837–1:09:36.617
(此句尚無繁中翻譯)
1:09:36.617–1:09:38.947
(此句尚無繁中翻譯)
1:09:38.947–1:09:44.036
(此句尚無繁中翻譯)
1:09:44.036–1:09:49.075
(此句尚無繁中翻譯)
1:09:49.075–1:09:53.470
(此句尚無繁中翻譯)
1:09:53.470–1:09:55.832
(此句尚無繁中翻譯)
1:09:55.832–1:09:58.510
(此句尚無繁中翻譯)
1:09:58.520–1:10:00.674
(此句尚無繁中翻譯)
1:10:00.674–1:10:06.295
(此句尚無繁中翻譯)
1:10:06.295–1:10:09.407
(此句尚無繁中翻譯)
1:10:09.407–1:10:10.117
(此句尚無繁中翻譯)
1:10:10.117–1:10:22.865
(此句尚無繁中翻譯)
1:10:22.865–1:10:24.492
(此句尚無繁中翻譯)
1:10:24.492–1:10:28.755
(此句尚無繁中翻譯)
1:10:28.755–1:10:34.110
(此句尚無繁中翻譯)
1:10:34.120–1:10:36.366
(此句尚無繁中翻譯)
1:10:36.366–1:10:37.823
(此句尚無繁中翻譯)
1:10:37.823–1:10:44.140
(此句尚無繁中翻譯)
1:10:44.140–1:10:49.958
(此句尚無繁中翻譯)
1:10:49.958–1:10:54.230
(此句尚無繁中翻譯)
1:10:54.240–1:10:58.561
(此句尚無繁中翻譯)
1:10:58.561–1:11:00.137
(此句尚無繁中翻譯)
1:11:00.137–1:11:06.499
(此句尚無繁中翻譯)
1:11:06.499–1:11:15.150
(此句尚無繁中翻譯)
1:11:15.150–1:11:17.223
(此句尚無繁中翻譯)
1:11:17.223–1:11:28.986
(此句尚無繁中翻譯)
1:11:28.986–1:11:31.298
(此句尚無繁中翻譯)
1:11:31.298–1:11:34.130
(此句尚無繁中翻譯)
1:11:34.130–1:11:52.270
(此句尚無繁中翻譯)
1:11:52.280–1:11:54.758
(此句尚無繁中翻譯)
1:11:54.758–1:11:56.472
(此句尚無繁中翻譯)
1:11:56.472–1:12:03.824
(此句尚無繁中翻譯)
1:12:03.824–1:12:08.235
(此句尚無繁中翻譯)
1:12:08.235–1:12:14.404
(此句尚無繁中翻譯)
1:12:14.404–1:12:16.250
(此句尚無繁中翻譯)
1:12:16.250–1:12:18.052
(此句尚無繁中翻譯)
1:12:18.052–1:12:26.207
(此句尚無繁中翻譯)
1:12:26.207–1:12:30.783
(此句尚無繁中翻譯)
1:12:30.783–1:12:32.861
(此句尚無繁中翻譯)
1:12:32.861–1:12:41.406
(此句尚無繁中翻譯)
1:12:41.406–1:12:45.272
(此句尚無繁中翻譯)
1:12:45.272–1:12:45.768
(此句尚無繁中翻譯)
1:12:45.768–1:12:53.068
(此句尚無繁中翻譯)
1:12:53.068–1:12:53.837
(此句尚無繁中翻譯)
1:12:53.837–1:13:04.070
(此句尚無繁中翻譯)
1:13:04.080–1:13:08.173
(此句尚無繁中翻譯)
1:13:08.173–1:13:19.225
(此句尚無繁中翻譯)
1:13:19.225–1:13:21.722
(此句尚無繁中翻譯)
1:13:21.722–1:13:27.383
(此句尚無繁中翻譯)
1:13:27.383–1:13:34.910
(此句尚無繁中翻譯)
1:13:34.920–1:13:39.249
(此句尚無繁中翻譯)
1:13:39.249–1:13:43.791
(此句尚無繁中翻譯)
1:13:43.791–1:13:52.037
(此句尚無繁中翻譯)
1:13:52.037–1:13:57.504
(此句尚無繁中翻譯)
1:13:57.504–1:14:02.736
(此句尚無繁中翻譯)
1:14:02.736–1:14:09.749
(此句尚無繁中翻譯)
1:14:09.749–1:14:15.458
(此句尚無繁中翻譯)
1:14:15.458–1:14:26.203
(此句尚無繁中翻譯)
1:14:26.203–1:14:31.631
(此句尚無繁中翻譯)
1:14:31.631–1:14:38.070
(此句尚無繁中翻譯)
1:14:38.080–1:14:51.853
(此句尚無繁中翻譯)
1:14:51.853–1:15:05.910
(此句尚無繁中翻譯)
1:15:05.920–1:15:07.760
(此句尚無繁中翻譯)
1:15:07.760–1:15:12.133
(此句尚無繁中翻譯)
1:15:12.133–1:15:12.586
(此句尚無繁中翻譯)
1:15:12.586–1:15:17.231
(此句尚無繁中翻譯)
1:15:17.231–1:15:20.270
(此句尚無繁中翻譯)
1:15:20.280–1:15:22.575
(此句尚無繁中翻譯)
1:15:22.575–1:15:24.583
(此句尚無繁中翻譯)
1:15:24.583–1:15:27.052
(此句尚無繁中翻譯)
1:15:27.052–1:15:29.036
(此句尚無繁中翻譯)
1:15:29.036–1:15:29.531
(此句尚無繁中翻譯)
1:15:29.531–1:15:33.294
(此句尚無繁中翻譯)
1:15:33.294–1:15:37.057
(此句尚無繁中翻譯)
1:15:37.057–1:15:40.902
(此句尚無繁中翻譯)
1:15:40.902–1:15:44.641
(此句尚無繁中翻譯)
1:15:44.641–1:15:46.020
(此句尚無繁中翻譯)
1:15:46.020–1:15:50.011
(此句尚無繁中翻譯)
1:15:50.011–1:15:52.359
(此句尚無繁中翻譯)
1:15:52.359–1:15:59.530
(此句尚無繁中翻譯)
1:15:59.530–1:16:09.801
(此句尚無繁中翻譯)
1:16:09.801–1:16:16.445
(此句尚無繁中翻譯)
1:16:16.445–1:16:19.746
(此句尚無繁中翻譯)
1:16:19.746–1:16:20.875
(此句尚無繁中翻譯)
1:16:20.875–1:16:29.335
(此句尚無繁中翻譯)
1:16:29.335–1:16:35.386
(此句尚無繁中翻譯)
1:16:35.386–1:16:42.968
(此句尚無繁中翻譯)
1:16:42.968–1:16:48.668
(此句尚無繁中翻譯)
1:16:48.668–1:16:57.832
(此句尚無繁中翻譯)
1:16:57.832–1:17:02.312
(此句尚無繁中翻譯)
1:17:02.312–1:17:04.550
(此句尚無繁中翻譯)
1:17:04.560–1:17:07.616
(此句尚無繁中翻譯)
1:17:07.616–1:17:09.606
(此句尚無繁中翻譯)
1:17:09.606–1:17:17.983
(此句尚無繁中翻譯)
1:17:17.983–1:17:21.122
(此句尚無繁中翻譯)
1:17:21.122–1:17:25.796
(此句尚無繁中翻譯)
1:17:25.796–1:17:31.005
(此句尚無繁中翻譯)
1:17:31.005–1:17:31.452
(此句尚無繁中翻譯)
1:17:31.452–1:17:40.588
(此句尚無繁中翻譯)
1:17:40.588–1:17:45.131
(此句尚無繁中翻譯)
1:17:45.131–1:17:51.435
(此句尚無繁中翻譯)
1:17:51.435–1:17:57.380
(此句尚無繁中翻譯)
1:17:57.380–1:17:59.843
(此句尚無繁中翻譯)
1:17:59.843–1:18:01.149
(此句尚無繁中翻譯)
1:18:01.149–1:18:04.775
(此句尚無繁中翻譯)
1:18:04.775–1:18:05.120
(此句尚無繁中翻譯)
1:18:05.120–1:18:08.393
(此句尚無繁中翻譯)
1:18:08.393–1:18:09.597
(此句尚無繁中翻譯)
1:18:09.597–1:18:12.890
(此句尚無繁中翻譯)
1:18:12.890–1:18:14.370
(此句尚無繁中翻譯)
1:18:14.370–1:18:16.190
(此句尚無繁中翻譯)
1:18:16.200–1:18:19.771
(此句尚無繁中翻譯)
1:18:19.771–1:18:22.911
(此句尚無繁中翻譯)
1:18:22.911–1:18:25.560
(此句尚無繁中翻譯)
1:18:25.560–1:18:32.006
(此句尚無繁中翻譯)
1:18:32.006–1:18:35.351
(此句尚無繁中翻譯)
1:18:35.351–1:18:45.459
(此句尚無繁中翻譯)
1:18:45.459–1:18:47.135
(此句尚無繁中翻譯)
1:18:47.135–1:18:48.190
(此句尚無繁中翻譯)
1:18:48.200–1:18:51.102
(此句尚無繁中翻譯)
1:18:51.102–1:19:03.150
(此句尚無繁中翻譯)
1:19:03.160–1:19:12.310
(此句尚無繁中翻譯)
1:19:12.320–1:19:21.345
(此句尚無繁中翻譯)
1:19:21.345–1:19:24.510
(此句尚無繁中翻譯)
1:19:24.520–1:19:29.197
(此句尚無繁中翻譯)
1:19:29.197–1:19:34.576
(此句尚無繁中翻譯)
1:19:34.576–1:19:37.738
(此句尚無繁中翻譯)
1:19:37.738–1:19:43.164
(此句尚無繁中翻譯)
1:19:43.164–1:19:50.148
(此句尚無繁中翻譯)
1:19:50.148–1:19:51.706
(此句尚無繁中翻譯)
1:19:51.706–1:19:52.833
(此句尚無繁中翻譯)
1:19:52.833–1:19:54.911
(此句尚無繁中翻譯)
1:19:54.911–1:19:57.030
(此句尚無繁中翻譯)
1:19:57.040–1:19:59.155
(此句尚無繁中翻譯)
1:19:59.155–1:20:01.090
(此句尚無繁中翻譯)
1:20:01.090–1:20:02.410
(此句尚無繁中翻譯)
1:20:02.410–1:20:07.792
(此句尚無繁中翻譯)
1:20:07.792–1:20:12.655
(此句尚無繁中翻譯)
1:20:12.655–1:20:19.198
(此句尚無繁中翻譯)
1:20:19.198–1:20:21.597
(此句尚無繁中翻譯)
1:20:21.597–1:20:23.910
(此句尚無繁中翻譯)
1:20:23.920–1:20:25.105
(此句尚無繁中翻譯)
1:20:25.105–1:20:29.446
(此句尚無繁中翻譯)
1:20:29.446–1:20:30.765
(此句尚無繁中翻譯)
1:20:30.765–1:20:36.230
(此句尚無繁中翻譯)
1:20:36.240–1:20:40.308
(此句尚無繁中翻譯)
1:20:40.308–1:20:43.388
(此句尚無繁中翻譯)
1:20:43.388–1:20:45.637
(此句尚無繁中翻譯)
1:20:45.637–1:20:48.769
(此句尚無繁中翻譯)
1:20:48.769–1:20:51.978
(此句尚無繁中翻譯)
1:20:51.978–1:20:55.382
(此句尚無繁中翻譯)
1:20:55.382–1:20:56.581
(此句尚無繁中翻譯)
1:20:56.581–1:21:00.766
(此句尚無繁中翻譯)
1:21:00.766–1:21:03.708
(此句尚無繁中翻譯)
1:21:03.708–1:21:10.870
(此句尚無繁中翻譯)
1:21:10.880–1:21:14.816
(此句尚無繁中翻譯)
1:21:14.816–1:21:26.551
(此句尚無繁中翻譯)
1:21:26.551–1:21:30.738
(此句尚無繁中翻譯)
1:21:30.738–1:21:35.230
(此句尚無繁中翻譯)
1:21:35.240–1:21:39.204
(此句尚無繁中翻譯)
1:21:39.204–1:21:44.724
(此句尚無繁中翻譯)
1:21:44.724–1:21:52.103
(此句尚無繁中翻譯)
1:21:52.103–1:21:55.353
(此句尚無繁中翻譯)
1:21:55.353–1:21:59.595
(此句尚無繁中翻譯)
1:21:59.595–1:22:01.237
(此句尚無繁中翻譯)
1:22:01.237–1:22:02.524
(此句尚無繁中翻譯)
1:22:02.524–1:22:06.564
(此句尚無繁中翻譯)
1:22:06.564–1:22:08.414
(此句尚無繁中翻譯)
1:22:08.414–1:22:21.252
(此句尚無繁中翻譯)
1:22:21.252–1:22:24.959
(此句尚無繁中翻譯)
1:22:24.959–1:22:34.910
(此句尚無繁中翻譯)
1:22:34.920–1:22:40.881
(此句尚無繁中翻譯)
1:22:40.881–1:22:43.988
(此句尚無繁中翻譯)
1:22:43.988–1:22:53.385
(此句尚無繁中翻譯)
1:22:53.385–1:23:02.950
(此句尚無繁中翻譯)
1:23:02.960–1:23:18.423
(此句尚無繁中翻譯)
1:23:18.423–1:23:24.710
(此句尚無繁中翻譯)
1:23:24.720–1:23:33.453
(此句尚無繁中翻譯)
1:23:33.453–1:23:40.169
(此句尚無繁中翻譯)
1:23:40.169–1:23:48.022
(此句尚無繁中翻譯)
1:23:48.022–1:23:57.982
(此句尚無繁中翻譯)
1:23:57.982–1:24:03.780
(此句尚無繁中翻譯)
1:24:03.780–1:24:11.710
(此句尚無繁中翻譯)
1:24:11.720–1:24:16.962
(此句尚無繁中翻譯)
1:24:16.962–1:24:23.381
(此句尚無繁中翻譯)
1:24:23.381–1:24:32.605
(此句尚無繁中翻譯)
1:24:32.605–1:24:38.400
(此句尚無繁中翻譯)
1:24:38.400–1:24:52.192
(此句尚無繁中翻譯)
1:24:52.192–1:24:56.811
(此句尚無繁中翻譯)
1:24:56.811–1:25:01.321
(此句尚無繁中翻譯)
1:25:01.321–1:25:05.936
(此句尚無繁中翻譯)
1:25:05.936–1:25:15.285
(此句尚無繁中翻譯)
1:25:15.285–1:25:16.444
(此句尚無繁中翻譯)
1:25:16.444–1:25:19.470
(此句尚無繁中翻譯)
1:25:19.480–1:25:21.272
(此句尚無繁中翻譯)
1:25:21.272–1:25:22.030
(此句尚無繁中翻譯)
1:25:22.040–1:25:24.270
(此句尚無繁中翻譯)
1:25:24.280–1:25:26.162
(此句尚無繁中翻譯)
1:25:26.162–1:25:28.314
(此句尚無繁中翻譯)
1:25:28.314–1:25:32.382
(此句尚無繁中翻譯)
1:25:32.382–1:25:39.086
(此句尚無繁中翻譯)
1:25:39.086–1:25:44.350
(此句尚無繁中翻譯)
1:25:44.360–1:25:52.045
(此句尚無繁中翻譯)
1:25:52.045–1:26:01.184
(此句尚無繁中翻譯)
1:26:01.184–1:26:04.756
(此句尚無繁中翻譯)
1:26:04.756–1:26:10.190
(此句尚無繁中翻譯)
1:26:10.200–1:26:14.954
(此句尚無繁中翻譯)
1:26:14.954–1:26:19.102
(此句尚無繁中翻譯)
1:26:19.102–1:26:22.777
(此句尚無繁中翻譯)
1:26:22.777–1:26:28.305
(此句尚無繁中翻譯)
1:26:28.305–1:26:41.540
(此句尚無繁中翻譯)
1:26:41.540–1:26:44.278
(此句尚無繁中翻譯)
1:26:44.278–1:26:47.925
(此句尚無繁中翻譯)
1:26:47.925–1:26:50.037
(此句尚無繁中翻譯)
1:26:50.037–1:26:51.870
(此句尚無繁中翻譯)
1:26:51.880–1:26:56.687
(此句尚無繁中翻譯)
1:26:56.687–1:27:05.737
(此句尚無繁中翻譯)
1:27:05.737–1:27:08.258
(此句尚無繁中翻譯)
1:27:08.258–1:27:18.270
(此句尚無繁中翻譯)
1:27:18.280–1:27:18.608
(此句尚無繁中翻譯)
1:27:18.608–1:27:26.650
(此句尚無繁中翻譯)
1:27:26.650–1:27:30.393
(此句尚無繁中翻譯)
1:27:30.393–1:27:39.005
(此句尚無繁中翻譯)
1:27:39.005–1:27:48.894
(此句尚無繁中翻譯)
1:27:48.894–1:27:51.590
(此句尚無繁中翻譯)
1:27:51.600–1:27:54.430
(此句尚無繁中翻譯)
1:27:54.440–1:28:01.398
(此句尚無繁中翻譯)
1:28:01.398–1:28:01.733
(此句尚無繁中翻譯)
1:28:01.733–1:28:08.133
(此句尚無繁中翻譯)
1:28:08.133–1:28:13.430
(此句尚無繁中翻譯)
1:28:13.430–1:28:21.907
(此句尚無繁中翻譯)
1:28:21.907–1:28:26.383
(此句尚無繁中翻譯)
1:28:26.383–1:28:29.138
(此句尚無繁中翻譯)
1:28:29.138–1:28:31.547
(此句尚無繁中翻譯)
1:28:31.547–1:28:33.324
(此句尚無繁中翻譯)
1:28:33.324–1:28:35.460
(此句尚無繁中翻譯)
1:28:35.460–1:28:37.014
(此句尚無繁中翻譯)
1:28:37.014–1:28:38.628
(此句尚無繁中翻譯)
1:28:38.628–1:28:48.790
(此句尚無繁中翻譯)
1:28:48.800–1:28:55.490
(此句尚無繁中翻譯)
1:28:55.490–1:28:59.271
(此句尚無繁中翻譯)
1:28:59.271–1:28:59.787
(此句尚無繁中翻譯)
1:28:59.787–1:29:01.988
(此句尚無繁中翻譯)
1:29:01.988–1:29:03.435
(此句尚無繁中翻譯)
1:29:03.435–1:29:09.123
(此句尚無繁中翻譯)
1:29:09.123–1:29:23.443
(此句尚無繁中翻譯)
1:29:23.443–1:29:29.110
(此句尚無繁中翻譯)
1:29:29.120–1:29:30.992
(此句尚無繁中翻譯)
1:29:30.992–1:29:33.372
(此句尚無繁中翻譯)
1:29:33.372–1:29:38.230
(此句尚無繁中翻譯)
1:29:38.240–1:29:38.639
(此句尚無繁中翻譯)
1:29:38.639–1:29:40.552
(此句尚無繁中翻譯)
1:29:40.552–1:29:45.017
(此句尚無繁中翻譯)
1:29:45.017–1:29:49.396
(此句尚無繁中翻譯)
1:29:49.396–1:29:51.481
(此句尚無繁中翻譯)
1:29:51.481–1:29:52.739
(此句尚無繁中翻譯)
1:29:52.739–1:29:55.317
(此句尚無繁中翻譯)
1:29:55.317–1:29:57.230
(此句尚無繁中翻譯)
1:29:57.240–1:29:57.612
(此句尚無繁中翻譯)
1:29:57.612–1:29:58.949
(此句尚無繁中翻譯)
1:29:58.949–1:30:01.652
(此句尚無繁中翻譯)
1:30:01.652–1:30:03.187
(此句尚無繁中翻譯)
1:30:03.187–1:30:06.663
(此句尚無繁中翻譯)
1:30:06.663–1:30:09.635
(此句尚無繁中翻譯)
1:30:09.635–1:30:12.423
(此句尚無繁中翻譯)
1:30:12.423–1:30:15.176
(此句尚無繁中翻譯)
1:30:15.176–1:30:23.830
(此句尚無繁中翻譯)
1:30:23.840–1:30:25.652
(此句尚無繁中翻譯)
1:30:25.652–1:30:27.207
(此句尚無繁中翻譯)
1:30:27.207–1:30:35.795
(此句尚無繁中翻譯)
1:30:35.795–1:30:42.957
(此句尚無繁中翻譯)
1:30:42.957–1:30:47.331
(此句尚無繁中翻譯)
1:30:47.331–1:30:56.159
(此句尚無繁中翻譯)
1:30:56.159–1:31:09.161
(此句尚無繁中翻譯)
1:31:09.161–1:31:13.753
(此句尚無繁中翻譯)
1:31:13.753–1:31:16.821
(此句尚無繁中翻譯)
1:31:16.821–1:31:23.003
(此句尚無繁中翻譯)
1:31:23.003–1:31:23.927
(此句尚無繁中翻譯)
1:31:23.927–1:31:25.316
(此句尚無繁中翻譯)
1:31:25.316–1:31:29.320
(此句尚無繁中翻譯)
1:31:29.320–1:31:35.352
(此句尚無繁中翻譯)
1:31:35.352–1:31:38.416
(此句尚無繁中翻譯)
1:31:38.416–1:31:42.282
(此句尚無繁中翻譯)
1:31:42.282–1:31:44.900
(此句尚無繁中翻譯)
1:31:44.900–1:31:46.299
(此句尚無繁中翻譯)
1:31:46.299–1:31:49.039
(此句尚無繁中翻譯)
1:31:49.039–1:31:51.682
(此句尚無繁中翻譯)
1:31:51.682–1:31:54.038
(此句尚無繁中翻譯)
1:31:54.038–1:31:54.835
(此句尚無繁中翻譯)
1:31:54.835–1:31:57.082
(此句尚無繁中翻譯)
1:31:57.082–1:32:05.420
(此句尚無繁中翻譯)
1:32:05.420–1:32:08.653
(此句尚無繁中翻譯)
1:32:08.653–1:32:13.981
(此句尚無繁中翻譯)
1:32:13.981–1:32:18.025
(此句尚無繁中翻譯)
1:32:18.025–1:32:23.851
(此句尚無繁中翻譯)
1:32:23.851–1:32:26.038
(此句尚無繁中翻譯)
1:32:26.038–1:32:31.120
(此句尚無繁中翻譯)
1:32:31.120–1:32:35.030
(此句尚無繁中翻譯)
1:32:35.040–1:32:36.790
(此句尚無繁中翻譯)
1:32:36.800–1:32:45.305
(此句尚無繁中翻譯)
1:32:45.305–1:32:45.726
(此句尚無繁中翻譯)
1:32:45.726–1:32:48.350
(此句尚無繁中翻譯)
1:32:48.360–1:32:52.129
(此句尚無繁中翻譯)
1:32:52.129–1:32:55.750
(此句尚無繁中翻譯)
1:32:55.760–1:32:57.230
(此句尚無繁中翻譯)
1:32:57.240–1:33:05.270
(此句尚無繁中翻譯)
1:33:05.280–1:33:05.811
(此句尚無繁中翻譯)
1:33:05.811–1:33:10.587
(此句尚無繁中翻譯)
1:33:10.587–1:33:17.734
(此句尚無繁中翻譯)
1:33:17.734–1:33:18.168
(此句尚無繁中翻譯)
1:33:18.168–1:33:22.437
(此句尚無繁中翻譯)
1:33:22.437–1:33:26.189
(此句尚無繁中翻譯)
1:33:26.189–1:33:30.483
(此句尚無繁中翻譯)
1:33:30.483–1:33:35.894
(此句尚無繁中翻譯)
1:33:35.894–1:33:41.036
(此句尚無繁中翻譯)
1:33:41.036–1:33:48.357
(此句尚無繁中翻譯)
1:33:48.357–1:33:53.019
(此句尚無繁中翻譯)
1:33:53.019–1:34:09.630
(此句尚無繁中翻譯)
1:34:09.640–1:34:10.005
(此句尚無繁中翻譯)
1:34:10.005–1:34:23.345
(此句尚無繁中翻譯)
1:34:23.345–1:34:24.721
(此句尚無繁中翻譯)
1:34:24.721–1:34:28.369
(此句尚無繁中翻譯)
1:34:28.369–1:34:37.811
(此句尚無繁中翻譯)
1:34:37.811–1:34:41.106
(此句尚無繁中翻譯)
1:34:41.106–1:34:52.542
(此句尚無繁中翻譯)
1:34:52.542–1:34:56.905
(此句尚無繁中翻譯)
1:34:56.905–1:35:00.350
(此句尚無繁中翻譯)
1:35:00.360–1:35:09.530
(此句尚無繁中翻譯)
1:35:09.530–1:35:12.815
(此句尚無繁中翻譯)
1:35:12.815–1:35:20.132
(此句尚無繁中翻譯)
1:35:20.132–1:35:23.696
(此句尚無繁中翻譯)
1:35:23.696–1:35:34.570
(此句尚無繁中翻譯)
1:35:34.570–1:35:44.590
(此句尚無繁中翻譯)
1:35:44.600–1:35:46.350
(此句尚無繁中翻譯)
1:35:46.360–1:35:49.983
(此句尚無繁中翻譯)
1:35:49.983–1:35:55.916
(此句尚無繁中翻譯)
1:35:55.916–1:36:00.334
(此句尚無繁中翻譯)
1:36:00.334–1:36:10.230
(此句尚無繁中翻譯)
1:36:10.240–1:36:16.755
(此句尚無繁中翻譯)
1:36:16.755–1:36:20.067
(此句尚無繁中翻譯)
1:36:20.067–1:36:22.969
(此句尚無繁中翻譯)
1:36:22.969–1:36:29.180
(此句尚無繁中翻譯)
1:36:29.180–1:36:31.226
(此句尚無繁中翻譯)
1:36:31.226–1:36:38.011
(此句尚無繁中翻譯)
1:36:38.011–1:36:39.495
(此句尚無繁中翻譯)
1:36:39.495–1:36:42.572
(此句尚無繁中翻譯)
1:36:42.572–1:36:50.208
(此句尚無繁中翻譯)
1:36:50.208–1:37:05.769
(此句尚無繁中翻譯)
1:37:05.769–1:37:25.350
(此句尚無繁中翻譯)
1:37:25.360–1:37:33.938
(此句尚無繁中翻譯)
1:37:33.938–1:37:38.903
(此句尚無繁中翻譯)
1:37:38.903–1:37:48.550
(此句尚無繁中翻譯)
1:37:48.560–1:37:55.749
(此句尚無繁中翻譯)
1:37:55.749–1:38:06.471
(此句尚無繁中翻譯)
1:38:06.471–1:38:10.409
(此句尚無繁中翻譯)
1:38:10.409–1:38:17.379
(此句尚無繁中翻譯)
1:38:17.379–1:38:25.168
(此句尚無繁中翻譯)
1:38:25.168–1:38:30.628
(此句尚無繁中翻譯)
1:38:30.628–1:38:34.350
(此句尚無繁中翻譯)
1:38:34.360–1:38:45.446
(此句尚無繁中翻譯)
1:38:45.446–1:38:51.588
(此句尚無繁中翻譯)
1:38:51.588–1:38:52.950
(此句尚無繁中翻譯)
1:38:52.960–1:38:54.904
(此句尚無繁中翻譯)
1:38:54.904–1:38:58.476
(此句尚無繁中翻譯)
1:38:58.476–1:39:02.802
(此句尚無繁中翻譯)
1:39:02.802–1:39:06.089
(此句尚無繁中翻譯)
1:39:06.089–1:39:12.249
(此句尚無繁中翻譯)
1:39:12.249–1:39:13.390
(此句尚無繁中翻譯)
1:39:13.400–1:39:15.150
(此句尚無繁中翻譯)
1:39:15.160–1:39:16.656
(此句尚無繁中翻譯)
1:39:16.656–1:39:19.704
(此句尚無繁中翻譯)
1:39:19.704–1:39:21.679
(此句尚無繁中翻譯)
1:39:21.679–1:39:24.081
(此句尚無繁中翻譯)
1:39:24.081–1:39:29.150
(此句尚無繁中翻譯)
1:39:29.150–1:39:31.494
(此句尚無繁中翻譯)
1:39:31.494–1:39:34.230
(此句尚無繁中翻譯)
1:39:34.240–1:39:38.782
(此句尚無繁中翻譯)
1:39:38.782–1:39:46.714
(此句尚無繁中翻譯)
1:39:46.714–1:39:54.110
(此句尚無繁中翻譯)
1:39:54.120–1:39:57.924
(此句尚無繁中翻譯)
1:39:57.924–1:40:04.070
(此句尚無繁中翻譯)
1:40:04.080–1:40:05.334
(此句尚無繁中翻譯)
1:40:05.334–1:40:09.213
(此句尚無繁中翻譯)
1:40:09.213–1:40:11.158
(此句尚無繁中翻譯)
1:40:11.158–1:40:17.073
(此句尚無繁中翻譯)
1:40:17.073–1:40:21.623
(此句尚無繁中翻譯)
1:40:21.623–1:40:31.514
(此句尚無繁中翻譯)
1:40:31.514–1:40:39.030
(此句尚無繁中翻譯)
1:40:39.040–1:40:41.709
(此句尚無繁中翻譯)
1:40:41.709–1:40:52.364
(此句尚無繁中翻譯)
1:40:52.364–1:41:07.550
(此句尚無繁中翻譯)
1:41:07.560–1:41:12.885
(此句尚無繁中翻譯)
1:41:12.885–1:41:17.723
(此句尚無繁中翻譯)
1:41:17.723–1:41:25.466
(此句尚無繁中翻譯)
1:41:25.466–1:41:27.504
(此句尚無繁中翻譯)
1:41:27.504–1:41:29.396
(此句尚無繁中翻譯)
1:41:29.396–1:41:32.955
(此句尚無繁中翻譯)
1:41:32.955–1:41:39.317
(此句尚無繁中翻譯)
1:41:39.317–1:41:55.830
(此句尚無繁中翻譯)
1:41:55.840–1:41:57.088
(此句尚無繁中翻譯)
1:41:57.088–1:42:06.250
(此句尚無繁中翻譯)
1:42:06.250–1:42:14.308
(此句尚無繁中翻譯)
1:42:14.308–1:42:23.030
(此句尚無繁中翻譯)
1:42:23.040–1:42:32.002
(此句尚無繁中翻譯)
1:42:32.002–1:42:33.963
(此句尚無繁中翻譯)
1:42:33.963–1:42:38.724
(此句尚無繁中翻譯)
1:42:38.724–1:42:50.131
(此句尚無繁中翻譯)
1:42:50.131–1:42:54.142
(此句尚無繁中翻譯)
1:42:54.142–1:43:00.100
(此句尚無繁中翻譯)
1:43:00.100–1:43:07.860
(此句尚無繁中翻譯)
1:43:07.860–1:43:09.748
(此句尚無繁中翻譯)
1:43:09.748–1:43:10.954
(此句尚無繁中翻譯)
1:43:10.954–1:43:12.995
(此句尚無繁中翻譯)
1:43:12.995–1:43:15.070
(此句尚無繁中翻譯)
1:43:15.080–1:43:18.617
(此句尚無繁中翻譯)
1:43:18.617–1:43:20.792
(此句尚無繁中翻譯)
1:43:20.792–1:43:27.300
(此句尚無繁中翻譯)
1:43:27.300–1:43:28.993
(此句尚無繁中翻譯)
1:43:28.993–1:43:31.508
(此句尚無繁中翻譯)
1:43:31.508–1:43:41.790
(此句尚無繁中翻譯)
1:43:41.800–1:43:43.179
(此句尚無繁中翻譯)
1:43:43.179–1:43:44.630
(此句尚無繁中翻譯)
1:43:44.640–1:43:48.471
(此句尚無繁中翻譯)
1:43:48.471–1:43:52.717
(此句尚無繁中翻譯)
1:43:52.717–1:43:53.246
(此句尚無繁中翻譯)
1:43:53.246–1:43:54.526
(此句尚無繁中翻譯)
1:43:54.526–1:43:55.918
(此句尚無繁中翻譯)
1:43:55.918–1:43:59.754
(此句尚無繁中翻譯)
1:43:59.754–1:44:03.474
(此句尚無繁中翻譯)
1:44:03.474–1:44:07.815
(此句尚無繁中翻譯)
1:44:07.815–1:44:09.335
(此句尚無繁中翻譯)
1:44:09.335–1:44:10.617
(此句尚無繁中翻譯)
1:44:10.617–1:44:14.017
(此句尚無繁中翻譯)
1:44:14.017–1:44:19.630
(此句尚無繁中翻譯)
1:44:19.640–1:44:25.946
(此句尚無繁中翻譯)
1:44:25.946–1:44:33.424
(此句尚無繁中翻譯)
1:44:33.424–1:44:35.807
(此句尚無繁中翻譯)
1:44:35.807–1:44:42.670
(此句尚無繁中翻譯)
1:44:42.680–1:44:52.392
(此句尚無繁中翻譯)
1:44:52.392–1:44:54.523
(此句尚無繁中翻譯)
1:44:54.523–1:45:07.322
(此句尚無繁中翻譯)
1:45:07.322–1:45:12.660
(此句尚無繁中翻譯)
1:45:12.660–1:45:17.870
(此句尚無繁中翻譯)
1:45:17.870–1:45:30.110
(此句尚無繁中翻譯)
1:45:30.120–1:45:34.470
(此句尚無繁中翻譯)
1:45:34.480–1:45:36.470
(此句尚無繁中翻譯)
1:45:36.480–1:45:41.464
(此句尚無繁中翻譯)
1:45:41.464–1:45:44.386
(此句尚無繁中翻譯)
1:45:44.386–1:45:47.438
(此句尚無繁中翻譯)
1:45:47.438–1:45:48.766
(此句尚無繁中翻譯)
1:45:48.766–1:45:50.233
(此句尚無繁中翻譯)
1:45:50.233–1:45:54.006
(此句尚無繁中翻譯)
1:45:54.006–1:45:55.576
(此句尚無繁中翻譯)
1:45:55.576–1:45:57.057
(此句尚無繁中翻譯)
1:45:57.057–1:45:59.859
(此句尚無繁中翻譯)
1:45:59.859–1:46:06.887
(此句尚無繁中翻譯)
1:46:06.887–1:46:12.030
(此句尚無繁中翻譯)
1:46:12.040–1:46:19.835
(此句尚無繁中翻譯)
1:46:19.835–1:46:26.473
(此句尚無繁中翻譯)
1:46:26.473–1:46:30.296
(此句尚無繁中翻譯)
1:46:30.296–1:46:39.310
(此句尚無繁中翻譯)
1:46:39.320–1:46:45.634
(此句尚無繁中翻譯)
1:46:45.634–1:46:54.550
(此句尚無繁中翻譯)
1:46:54.560–1:46:55.905
(此句尚無繁中翻譯)
1:46:55.905–1:47:01.630
(此句尚無繁中翻譯)
1:47:01.640–1:47:02.410
(此句尚無繁中翻譯)
1:47:02.410–1:47:11.707
(此句尚無繁中翻譯)
1:47:11.707–1:47:16.903
(此句尚無繁中翻譯)
1:47:16.903–1:47:19.144
(此句尚無繁中翻譯)
1:47:19.144–1:47:20.884
(此句尚無繁中翻譯)
1:47:20.884–1:47:26.861
(此句尚無繁中翻譯)
1:47:26.861–1:47:29.409
(此句尚無繁中翻譯)
1:47:29.409–1:47:30.431
(此句尚無繁中翻譯)
1:47:30.431–1:47:34.070
(此句尚無繁中翻譯)
1:47:34.080–1:47:36.590
(此句尚無繁中翻譯)
1:47:36.600–1:47:42.531
(此句尚無繁中翻譯)
1:47:42.531–1:47:46.323
(此句尚無繁中翻譯)
1:47:46.323–1:47:49.757
(此句尚無繁中翻譯)
1:47:49.757–1:47:53.095
(此句尚無繁中翻譯)
1:47:53.095–1:47:55.304
(此句尚無繁中翻譯)
1:47:55.304–1:47:58.859
(此句尚無繁中翻譯)
1:47:58.859–1:47:59.676
(此句尚無繁中翻譯)
1:47:59.676–1:48:01.342
(此句尚無繁中翻譯)
1:48:01.342–1:48:07.902
(此句尚無繁中翻譯)
1:48:07.902–1:48:09.745
(此句尚無繁中翻譯)
1:48:09.745–1:48:12.459
(此句尚無繁中翻譯)
1:48:12.459–1:48:20.634
(此句尚無繁中翻譯)
1:48:20.634–1:48:21.110
(此句尚無繁中翻譯)
1:48:21.120–1:48:29.574
(此句尚無繁中翻譯)
1:48:29.574–1:48:36.175
(此句尚無繁中翻譯)
1:48:36.175–1:48:37.849
(此句尚無繁中翻譯)
1:48:37.849–1:48:45.354
(此句尚無繁中翻譯)
1:48:45.354–1:48:49.916
(此句尚無繁中翻譯)
1:48:49.916–1:48:53.354
(此句尚無繁中翻譯)
1:48:53.354–1:48:58.710
(此句尚無繁中翻譯)
1:48:58.720–1:49:03.879
(此句尚無繁中翻譯)
1:49:03.879–1:49:08.756
(此句尚無繁中翻譯)
1:49:08.756–1:49:13.144
(此句尚無繁中翻譯)
1:49:13.144–1:49:16.430
(此句尚無繁中翻譯)
1:49:16.440–1:49:17.816
(此句尚無繁中翻譯)
1:49:17.816–1:49:21.470
(此句尚無繁中翻譯)
1:49:21.480–1:49:22.848
(此句尚無繁中翻譯)
1:49:22.848–1:49:23.609
(此句尚無繁中翻譯)
1:49:23.609–1:49:24.919
(此句尚無繁中翻譯)
1:49:24.919–1:49:26.310
(此句尚無繁中翻譯)
1:49:26.320–1:49:27.646
(此句尚無繁中翻譯)
1:49:27.646–1:49:29.408
(此句尚無繁中翻譯)
1:49:29.408–1:49:33.788
(此句尚無繁中翻譯)
1:49:33.788–1:49:35.430
(此句尚無繁中翻譯)
1:49:35.440–1:49:38.650
(此句尚無繁中翻譯)
1:49:38.650–1:49:50.884
(此句尚無繁中翻譯)
1:49:50.884–1:49:52.802
(此句尚無繁中翻譯)
1:49:52.802–1:49:54.713
(此句尚無繁中翻譯)
1:49:54.713–1:49:57.036
(此句尚無繁中翻譯)
1:49:57.036–1:49:57.750
(此句尚無繁中翻譯)
1:49:57.760–1:50:01.692
(此句尚無繁中翻譯)
1:50:01.692–1:50:05.310
(此句尚無繁中翻譯)
1:50:05.320–1:50:07.884
(此句尚無繁中翻譯)
1:50:07.884–1:50:11.634
(此句尚無繁中翻譯)
1:50:11.634–1:50:13.011
(此句尚無繁中翻譯)
1:50:13.011–1:50:13.630
(此句尚無繁中翻譯)
1:50:13.640–1:50:14.744
(此句尚無繁中翻譯)
1:50:14.744–1:50:16.643
(此句尚無繁中翻譯)
1:50:16.643–1:50:21.150
(此句尚無繁中翻譯)
1:50:21.160–1:50:23.860
(此句尚無繁中翻譯)
1:50:23.860–1:50:25.312
(此句尚無繁中翻譯)
1:50:25.312–1:50:30.561
(此句尚無繁中翻譯)
1:50:30.561–1:50:32.675
(此句尚無繁中翻譯)
1:50:32.675–1:50:37.767
(此句尚無繁中翻譯)
1:50:37.767–1:50:41.296
(此句尚無繁中翻譯)
1:50:41.296–1:50:45.870
(此句尚無繁中翻譯)
1:50:45.880–1:50:52.127
(此句尚無繁中翻譯)
1:50:52.127–1:50:57.910
(此句尚無繁中翻譯)
1:50:57.920–1:51:01.079
(此句尚無繁中翻譯)
1:51:01.079–1:51:06.250
(此句尚無繁中翻譯)
1:51:06.250–1:51:12.334
(此句尚無繁中翻譯)
1:51:12.334–1:51:21.597
(此句尚無繁中翻譯)
1:51:21.597–1:51:28.835
(此句尚無繁中翻譯)
1:51:28.835–1:51:36.266
(此句尚無繁中翻譯)
1:51:36.266–1:51:41.400
(此句尚無繁中翻譯)
1:51:41.400–1:51:44.230
(此句尚無繁中翻譯)
1:51:44.240–1:51:49.274
(此句尚無繁中翻譯)
1:51:49.274–1:51:52.236
(此句尚無繁中翻譯)
1:51:52.236–1:51:55.070
(此句尚無繁中翻譯)
1:51:55.070–1:51:58.350
(此句尚無繁中翻譯)
1:51:58.360–1:52:03.510
(此句尚無繁中翻譯)
1:52:03.520–1:52:04.842
(此句尚無繁中翻譯)
1:52:04.842–1:52:06.310
(此句尚無繁中翻譯)
1:52:06.320–1:52:10.710
(此句尚無繁中翻譯)
1:52:10.720–1:52:14.430
(此句尚無繁中翻譯)
1:52:14.440–1:52:20.378
(此句尚無繁中翻譯)
1:52:20.378–1:52:21.096
(此句尚無繁中翻譯)
1:52:21.096–1:52:24.221
(此句尚無繁中翻譯)
1:52:24.221–1:52:29.167
(此句尚無繁中翻譯)
1:52:29.167–1:52:30.599
(此句尚無繁中翻譯)
1:52:30.599–1:52:32.757
(此句尚無繁中翻譯)
1:52:32.757–1:52:37.719
(此句尚無繁中翻譯)
1:52:37.719–1:52:40.168
(此句尚無繁中翻譯)
1:52:40.168–1:52:41.703
(此句尚無繁中翻譯)
1:52:41.703–1:52:43.162
(此句尚無繁中翻譯)
1:52:43.162–1:52:44.667
(此句尚無繁中翻譯)
1:52:44.667–1:52:49.869
(此句尚無繁中翻譯)
1:52:49.869–1:52:54.452
(此句尚無繁中翻譯)
1:52:54.452–1:52:56.830
(此句尚無繁中翻譯)
1:52:56.840–1:52:59.228
(此句尚無繁中翻譯)
1:52:59.228–1:53:01.124
(此句尚無繁中翻譯)
1:53:01.124–1:53:03.476
(此句尚無繁中翻譯)
1:53:03.476–1:53:08.884
(此句尚無繁中翻譯)
1:53:08.884–1:53:10.867
(此句尚無繁中翻譯)
1:53:10.867–1:53:15.250
(此句尚無繁中翻譯)
1:53:15.250–1:53:16.822
(此句尚無繁中翻譯)
1:53:16.822–1:53:18.825
(此句尚無繁中翻譯)
1:53:18.825–1:53:22.008
(此句尚無繁中翻譯)
1:53:22.008–1:53:23.587
(此句尚無繁中翻譯)
1:53:23.587–1:53:26.517
(此句尚無繁中翻譯)
1:53:26.517–1:53:30.830
(此句尚無繁中翻譯)
1:53:30.840–1:53:35.684
(此句尚無繁中翻譯)
1:53:35.684–1:53:36.710
(此句尚無繁中翻譯)
1:53:36.710–1:53:41.730
(此句尚無繁中翻譯)
1:53:41.730–1:53:47.702
(此句尚無繁中翻譯)
1:53:47.702–1:53:49.600
(此句尚無繁中翻譯)
1:53:49.600–1:53:53.203
(此句尚無繁中翻譯)
1:53:53.203–1:53:55.035
(此句尚無繁中翻譯)
1:53:55.035–1:53:58.020
(此句尚無繁中翻譯)
1:53:58.020–1:54:02.940
(此句尚無繁中翻譯)
1:54:02.940–1:54:08.708
(此句尚無繁中翻譯)
1:54:08.708–1:54:10.771
(此句尚無繁中翻譯)
1:54:10.771–1:54:18.392
(此句尚無繁中翻譯)
1:54:18.392–1:54:24.121
(此句尚無繁中翻譯)
1:54:24.121–1:54:30.434
(此句尚無繁中翻譯)
1:54:30.434–1:54:33.589
(此句尚無繁中翻譯)
1:54:33.589–1:54:39.153
(此句尚無繁中翻譯)
1:54:39.153–1:54:42.359
(此句尚無繁中翻譯)
1:54:42.359–1:54:44.069
(此句尚無繁中翻譯)
1:54:44.069–1:54:50.947
(此句尚無繁中翻譯)
1:54:50.947–1:54:52.622
(此句尚無繁中翻譯)
1:54:52.622–1:54:53.427
(此句尚無繁中翻譯)
1:54:53.427–1:54:55.027
(此句尚無繁中翻譯)
1:54:55.027–1:54:57.163
(此句尚無繁中翻譯)
1:54:57.163–1:55:00.270
(此句尚無繁中翻譯)
1:55:00.280–1:55:09.392
(此句尚無繁中翻譯)
1:55:09.392–1:55:11.163
(此句尚無繁中翻譯)
1:55:11.163–1:55:16.091
(此句尚無繁中翻譯)
1:55:16.091–1:55:17.950
(此句尚無繁中翻譯)
1:55:17.960–1:55:22.080
(此句尚無繁中翻譯)
1:55:22.080–1:55:26.190
(此句尚無繁中翻譯)
1:55:26.200–1:55:31.470
(此句尚無繁中翻譯)
1:55:31.480–1:55:32.894
(此句尚無繁中翻譯)
1:55:32.894–1:55:33.470
(此句尚無繁中翻譯)
1:55:33.480–1:55:34.672
(此句尚無繁中翻譯)
1:55:34.672–1:55:35.790
(此句尚無繁中翻譯)
1:55:35.800–1:55:39.270
(此句尚無繁中翻譯)
1:55:39.280–1:55:40.676
(此句尚無繁中翻譯)
1:55:40.676–1:55:41.685
(此句尚無繁中翻譯)
1:55:41.685–1:55:43.900
(此句尚無繁中翻譯)
1:55:43.900–1:55:45.488
(此句尚無繁中翻譯)
1:55:45.488–1:55:47.645
(此句尚無繁中翻譯)
1:55:47.645–1:55:48.566
(此句尚無繁中翻譯)
1:55:48.566–1:55:51.968
(此句尚無繁中翻譯)
1:55:51.968–1:55:54.390
(此句尚無繁中翻譯)
1:55:54.400–1:55:55.866
(此句尚無繁中翻譯)
1:55:55.866–1:55:57.956
(此句尚無繁中翻譯)
1:55:57.956–1:55:58.763
(此句尚無繁中翻譯)
1:55:58.763–1:56:08.953
(此句尚無繁中翻譯)
1:56:08.953–1:56:14.270
(此句尚無繁中翻譯)
1:56:14.280–1:56:15.561
(此句尚無繁中翻譯)
1:56:15.561–1:56:16.673
(此句尚無繁中翻譯)
1:56:16.673–1:56:18.507
(此句尚無繁中翻譯)
1:56:18.507–1:56:20.430
(此句尚無繁中翻譯)
1:56:20.440–1:56:24.028
(此句尚無繁中翻譯)
1:56:24.028–1:56:28.051
(此句尚無繁中翻譯)
1:56:28.051–1:56:35.604
(此句尚無繁中翻譯)
1:56:35.604–1:56:37.794
(此句尚無繁中翻譯)
1:56:37.794–1:56:39.630
(此句尚無繁中翻譯)
1:56:39.640–1:56:44.021
(此句尚無繁中翻譯)
1:56:44.021–1:56:46.470
(此句尚無繁中翻譯)
1:56:46.470–1:56:48.227
(此句尚無繁中翻譯)
1:56:48.227–1:56:49.454
(此句尚無繁中翻譯)
1:56:49.454–1:56:50.751
(此句尚無繁中翻譯)
1:56:50.751–1:56:51.472
(此句尚無繁中翻譯)
1:56:51.472–1:56:53.121
(此句尚無繁中翻譯)
1:56:53.121–1:56:55.036
(此句尚無繁中翻譯)
1:56:55.036–1:56:56.381
(此句尚無繁中翻譯)
1:56:56.381–1:57:02.602
(此句尚無繁中翻譯)
1:57:02.602–1:57:05.854
(此句尚無繁中翻譯)
1:57:05.854–1:57:12.179
(此句尚無繁中翻譯)
1:57:12.179–1:57:14.717
(此句尚無繁中翻譯)
1:57:14.717–1:57:21.382
(此句尚無繁中翻譯)
1:57:21.382–1:57:24.903
(此句尚無繁中翻譯)
1:57:24.903–1:57:31.918
(此句尚無繁中翻譯)
1:57:31.918–1:57:37.308
(此句尚無繁中翻譯)
1:57:37.308–1:57:49.310
(此句尚無繁中翻譯)
1:57:49.320–1:57:51.583
(此句尚無繁中翻譯)
1:57:51.583–1:57:54.594
(此句尚無繁中翻譯)
1:57:54.594–1:57:56.936
(此句尚無繁中翻譯)
1:57:56.936–1:58:02.635
(此句尚無繁中翻譯)
1:58:02.635–1:58:12.765
(此句尚無繁中翻譯)
1:58:12.765–1:58:14.630
(此句尚無繁中翻譯)
1:58:14.640–1:58:15.673
(此句尚無繁中翻譯)
1:58:15.673–1:58:16.950
(此句尚無繁中翻譯)
1:58:16.960–1:58:18.228
(此句尚無繁中翻譯)
1:58:18.228–1:58:20.486
(此句尚無繁中翻譯)
1:58:20.486–1:58:22.178
(此句尚無繁中翻譯)
1:58:22.178–1:58:28.413
(此句尚無繁中翻譯)
1:58:28.413–1:58:32.225
(此句尚無繁中翻譯)
1:58:32.225–1:58:33.841
(此句尚無繁中翻譯)
1:58:33.841–1:58:39.614
(此句尚無繁中翻譯)
1:58:39.614–1:58:41.831
(此句尚無繁中翻譯)
1:58:41.831–1:58:43.464
(此句尚無繁中翻譯)
1:58:43.464–1:58:44.750
(此句尚無繁中翻譯)
1:58:44.750–1:58:46.562
(此句尚無繁中翻譯)
1:58:46.562–1:58:48.409
(此句尚無繁中翻譯)
1:58:48.409–1:58:49.674
(此句尚無繁中翻譯)
1:58:49.674–1:58:51.333
(此句尚無繁中翻譯)
1:58:51.333–1:58:53.079
(此句尚無繁中翻譯)
1:58:53.079–1:58:54.258
(此句尚無繁中翻譯)
1:58:54.258–1:58:55.620
(此句尚無繁中翻譯)
1:58:55.620–1:58:57.967
(此句尚無繁中翻譯)
1:58:57.967–1:59:03.870
(此句尚無繁中翻譯)
1:59:03.880–1:59:15.327
(此句尚無繁中翻譯)
1:59:15.327–1:59:18.331
(此句尚無繁中翻譯)
1:59:18.331–1:59:21.870
(此句尚無繁中翻譯)
1:59:21.880–1:59:23.179
(此句尚無繁中翻譯)
1:59:23.179–1:59:25.695
(此句尚無繁中翻譯)
1:59:25.695–1:59:27.196
(此句尚無繁中翻譯)
1:59:27.196–1:59:28.517
(此句尚無繁中翻譯)
1:59:28.517–1:59:31.069
(此句尚無繁中翻譯)
1:59:31.069–1:59:34.865
(此句尚無繁中翻譯)
1:59:34.865–1:59:38.390
(此句尚無繁中翻譯)
1:59:38.400–1:59:39.702
(此句尚無繁中翻譯)
1:59:39.702–1:59:41.704
(此句尚無繁中翻譯)
1:59:41.704–1:59:49.633
(此句尚無繁中翻譯)
1:59:49.633–1:59:57.638
(此句尚無繁中翻譯)
1:59:57.638–2:00:04.299
(此句尚無繁中翻譯)
2:00:04.299–2:00:13.007
(此句尚無繁中翻譯)
2:00:13.007–2:00:21.532
(此句尚無繁中翻譯)
2:00:21.532–2:00:26.670
(此句尚無繁中翻譯)
2:00:26.680–2:00:31.043
(此句尚無繁中翻譯)
2:00:31.043–2:00:32.150
(此句尚無繁中翻譯)
2:00:32.160–2:00:35.409
(此句尚無繁中翻譯)
2:00:35.409–2:00:36.195
(此句尚無繁中翻譯)
2:00:36.195–2:00:37.911
(此句尚無繁中翻譯)
2:00:37.911–2:00:39.550
(此句尚無繁中翻譯)
2:00:39.560–2:00:41.340
(此句尚無繁中翻譯)
2:00:41.340–2:00:48.790
(此句尚無繁中翻譯)
2:00:48.800–2:00:50.140
(此句尚無繁中翻譯)
2:00:50.140–2:00:50.722
(此句尚無繁中翻譯)
2:00:50.722–2:01:00.941
(此句尚無繁中翻譯)
2:01:00.941–2:01:06.736
(此句尚無繁中翻譯)
2:01:06.736–2:01:12.299
(此句尚無繁中翻譯)
2:01:12.299–2:01:13.548
(此句尚無繁中翻譯)
2:01:13.548–2:01:17.017
(此句尚無繁中翻譯)
2:01:17.017–2:01:17.989
(此句尚無繁中翻譯)
2:01:17.989–2:01:18.753
(此句尚無繁中翻譯)
2:01:18.753–2:01:24.210
(此句尚無繁中翻譯)
2:01:24.210–2:01:24.636
(此句尚無繁中翻譯)
2:01:24.636–2:01:28.526
(此句尚無繁中翻譯)
2:01:28.526–2:01:43.941
(此句尚無繁中翻譯)
2:01:43.941–2:01:47.430
(此句尚無繁中翻譯)
2:01:47.440–2:01:56.377
(此句尚無繁中翻譯)
2:01:56.377–2:01:59.426
(此句尚無繁中翻譯)
2:01:59.426–2:02:01.988
(此句尚無繁中翻譯)
2:02:01.988–2:02:12.630
(此句尚無繁中翻譯)
2:02:12.640–2:02:17.910
(此句尚無繁中翻譯)
2:02:17.920–2:02:24.830
(此句尚無繁中翻譯)
2:02:24.840–2:02:30.070
(此句尚無繁中翻譯)
2:02:30.080–2:02:34.888
(此句尚無繁中翻譯)
2:02:34.888–2:02:44.290
(此句尚無繁中翻譯)
2:02:44.290–2:02:48.710
(此句尚無繁中翻譯)
2:02:48.720–2:02:51.785
(此句尚無繁中翻譯)
2:02:51.785–2:03:00.262
(此句尚無繁中翻譯)
2:03:00.262–2:03:02.002
(此句尚無繁中翻譯)
2:03:02.002–2:03:05.277
(此句尚無繁中翻譯)
2:03:05.277–2:03:06.974
(此句尚無繁中翻譯)
2:03:06.974–2:03:12.865
(此句尚無繁中翻譯)
2:03:12.865–2:03:13.417
(此句尚無繁中翻譯)
2:03:13.417–2:03:19.508
(此句尚無繁中翻譯)
2:03:19.508–2:03:22.942
(此句尚無繁中翻譯)
2:03:22.942–2:03:25.719
(此句尚無繁中翻譯)
2:03:25.719–2:03:32.256
(此句尚無繁中翻譯)
2:03:32.256–2:03:34.723
(此句尚無繁中翻譯)
2:03:34.723–2:03:39.663
(此句尚無繁中翻譯)
2:03:39.663–2:03:46.068
(此句尚無繁中翻譯)
2:03:46.068–2:03:48.265
(此句尚無繁中翻譯)
2:03:48.265–2:03:49.800
(此句尚無繁中翻譯)
2:03:49.800–2:03:51.078
(此句尚無繁中翻譯)
2:03:51.078–2:03:56.927
(此句尚無繁中翻譯)
2:03:56.927–2:04:01.590
(此句尚無繁中翻譯)
2:04:01.600–2:04:05.163
(此句尚無繁中翻譯)
2:04:05.163–2:04:08.576
(此句尚無繁中翻譯)
2:04:08.576–2:04:10.050
(此句尚無繁中翻譯)
2:04:10.050–2:04:11.545
(此句尚無繁中翻譯)
2:04:11.545–2:04:13.405
(此句尚無繁中翻譯)
2:04:13.405–2:04:14.153
(此句尚無繁中翻譯)
2:04:14.153–2:04:15.804
(此句尚無繁中翻譯)
2:04:15.804–2:04:17.613
(此句尚無繁中翻譯)
2:04:17.613–2:04:19.350
(此句尚無繁中翻譯)
2:04:19.360–2:04:21.564
(此句尚無繁中翻譯)
2:04:21.564–2:04:35.622
(此句尚無繁中翻譯)
2:04:35.622–2:04:44.937
(此句尚無繁中翻譯)
2:04:44.937–2:04:48.870
(此句尚無繁中翻譯)
2:04:48.880–2:04:54.422
(此句尚無繁中翻譯)
2:04:54.422–2:05:09.830
(此句尚無繁中翻譯)
2:05:09.840–2:05:14.022
(此句尚無繁中翻譯)
2:05:14.022–2:05:26.561
(此句尚無繁中翻譯)
2:05:26.561–2:05:30.403
(此句尚無繁中翻譯)
2:05:30.403–2:05:33.897
(此句尚無繁中翻譯)
2:05:33.897–2:05:39.250
(此句尚無繁中翻譯)
2:05:39.250–2:05:44.123
(此句尚無繁中翻譯)
2:05:44.123–2:05:48.757
(此句尚無繁中翻譯)
2:05:48.757–2:05:58.480
(此句尚無繁中翻譯)
2:05:58.480–2:06:02.941
(此句尚無繁中翻譯)
2:06:02.941–2:06:07.948
(此句尚無繁中翻譯)
2:06:07.948–2:06:08.590
(此句尚無繁中翻譯)
2:06:08.600–2:06:11.089
(此句尚無繁中翻譯)
2:06:11.089–2:06:13.405
(此句尚無繁中翻譯)
2:06:13.405–2:06:21.586
(此句尚無繁中翻譯)
2:06:21.586–2:06:32.710
(此句尚無繁中翻譯)
2:06:32.720–2:06:38.354
(此句尚無繁中翻譯)
2:06:38.354–2:06:41.702
(此句尚無繁中翻譯)
2:06:41.702–2:06:44.807
(此句尚無繁中翻譯)
2:06:44.807–2:06:46.349
(此句尚無繁中翻譯)
2:06:46.349–2:06:54.655
(此句尚無繁中翻譯)
2:06:54.655–2:06:57.502
(此句尚無繁中翻譯)
2:06:57.502–2:07:03.953
(此句尚無繁中翻譯)
2:07:03.953–2:07:07.836
(此句尚無繁中翻譯)
2:07:07.836–2:07:14.583
(此句尚無繁中翻譯)
2:07:14.583–2:07:19.847
(此句尚無繁中翻譯)
2:07:19.847–2:07:27.866
(此句尚無繁中翻譯)
2:07:27.866–2:07:29.693
(此句尚無繁中翻譯)
2:07:29.693–2:07:40.784
(此句尚無繁中翻譯)
2:07:40.784–2:07:42.302
(此句尚無繁中翻譯)
2:07:42.302–2:07:45.029
(此句尚無繁中翻譯)
2:07:45.029–2:07:47.603
(此句尚無繁中翻譯)
2:07:47.603–2:07:52.043
(此句尚無繁中翻譯)
2:07:52.043–2:07:59.575
(此句尚無繁中翻譯)
2:07:59.575–2:08:05.729
(此句尚無繁中翻譯)
2:08:05.729–2:08:10.161
(此句尚無繁中翻譯)
2:08:10.161–2:08:16.829
(此句尚無繁中翻譯)
2:08:16.829–2:08:34.550
(此句尚無繁中翻譯)
2:08:34.560–2:08:44.750
(此句尚無繁中翻譯)
2:08:44.750–2:08:59.670
(此句尚無繁中翻譯)
2:08:59.670–2:09:05.755
(此句尚無繁中翻譯)
2:09:05.755–2:09:13.489
(此句尚無繁中翻譯)
2:09:13.489–2:09:15.267
(此句尚無繁中翻譯)
2:09:15.267–2:09:18.060
(此句尚無繁中翻譯)
2:09:18.060–2:09:26.264
(此句尚無繁中翻譯)
2:09:26.264–2:09:27.510
(此句尚無繁中翻譯)
2:09:27.520–2:09:29.287
(此句尚無繁中翻譯)
2:09:29.287–2:09:31.175
(此句尚無繁中翻譯)
2:09:31.175–2:09:41.206
(此句尚無繁中翻譯)
2:09:41.206–2:09:44.473
(此句尚無繁中翻譯)
2:09:44.473–2:09:47.310
(此句尚無繁中翻譯)
2:09:47.320–2:09:51.567
(此句尚無繁中翻譯)
2:09:51.567–2:10:01.432
(此句尚無繁中翻譯)
2:10:01.432–2:10:01.701
(此句尚無繁中翻譯)
2:10:01.701–2:10:06.417
(此句尚無繁中翻譯)
2:10:06.417–2:10:06.666
(此句尚無繁中翻譯)
2:10:06.666–2:10:11.545
(此句尚無繁中翻譯)
2:10:11.545–2:10:20.859
(此句尚無繁中翻譯)
2:10:20.859–2:10:29.115
(此句尚無繁中翻譯)
2:10:29.115–2:10:32.550
(此句尚無繁中翻譯)
2:10:32.560–2:10:39.058
(此句尚無繁中翻譯)
2:10:39.058–2:10:41.553
(此句尚無繁中翻譯)
2:10:41.553–2:10:47.366
(此句尚無繁中翻譯)
2:10:47.366–2:10:49.161
(此句尚無繁中翻譯)
2:10:49.161–2:10:51.017
(此句尚無繁中翻譯)
2:10:51.017–2:10:53.110
(此句尚無繁中翻譯)
2:10:53.120–2:10:55.212
(此句尚無繁中翻譯)
2:10:55.212–2:11:00.658
(此句尚無繁中翻譯)
2:11:00.658–2:11:04.317
(此句尚無繁中翻譯)
2:11:04.317–2:11:07.463
(此句尚無繁中翻譯)
2:11:07.463–2:11:09.270
(此句尚無繁中翻譯)
2:11:09.280–2:11:12.082
(此句尚無繁中翻譯)
2:11:12.082–2:11:13.891
(此句尚無繁中翻譯)
2:11:13.891–2:11:16.019
(此句尚無繁中翻譯)
2:11:16.019–2:11:17.661
(此句尚無繁中翻譯)
2:11:17.661–2:11:20.011
(此句尚無繁中翻譯)
2:11:20.011–2:11:22.928
(此句尚無繁中翻譯)
2:11:22.928–2:11:23.979
(此句尚無繁中翻譯)
2:11:23.979–2:11:25.030
(此句尚無繁中翻譯)
2:11:25.040–2:11:26.353
(此句尚無繁中翻譯)
2:11:26.353–2:11:31.590
(此句尚無繁中翻譯)
2:11:31.600–2:11:34.270
(此句尚無繁中翻譯)
2:11:34.280–2:11:39.151
(此句尚無繁中翻譯)
2:11:39.151–2:11:43.872
(此句尚無繁中翻譯)
2:11:43.872–2:11:50.158
(此句尚無繁中翻譯)
2:11:50.158–2:11:54.066
(此句尚無繁中翻譯)
2:11:54.066–2:11:58.950
(此句尚無繁中翻譯)
2:11:58.960–2:12:01.893
(此句尚無繁中翻譯)
2:12:01.893–2:12:17.608
(此句尚無繁中翻譯)
2:12:17.608–2:12:21.518
(此句尚無繁中翻譯)
2:12:21.518–2:12:29.698
(此句尚無繁中翻譯)
2:12:29.698–2:12:34.495
(此句尚無繁中翻譯)
2:12:34.495–2:12:40.510
(此句尚無繁中翻譯)
2:12:40.520–2:12:47.350
(此句尚無繁中翻譯)
2:12:47.360–2:12:53.011
(此句尚無繁中翻譯)
2:12:53.011–2:13:00.101
(此句尚無繁中翻譯)
2:13:00.101–2:13:03.202
(此句尚無繁中翻譯)
2:13:03.202–2:13:04.718
(此句尚無繁中翻譯)
2:13:04.718–2:13:06.767
(此句尚無繁中翻譯)
2:13:06.767–2:13:08.134
(此句尚無繁中翻譯)
2:13:08.134–2:13:13.755
(此句尚無繁中翻譯)
2:13:13.755–2:13:23.540
(此句尚無繁中翻譯)
2:13:23.540–2:13:26.976
(此句尚無繁中翻譯)
2:13:26.976–2:13:36.948
(此句尚無繁中翻譯)
2:13:36.948–2:13:52.203
(此句尚無繁中翻譯)
2:13:52.203–2:13:57.070
(此句尚無繁中翻譯)
2:13:57.080–2:14:00.790
(此句尚無繁中翻譯)
2:14:00.800–2:14:08.630
(此句尚無繁中翻譯)
2:14:08.640–2:14:16.369
(此句尚無繁中翻譯)
2:14:16.369–2:14:20.785
(此句尚無繁中翻譯)
2:14:20.785–2:14:22.621
(此句尚無繁中翻譯)
2:14:22.621–2:14:25.885
(此句尚無繁中翻譯)
2:14:25.885–2:14:31.299
(此句尚無繁中翻譯)
2:14:31.299–2:14:33.185
(此句尚無繁中翻譯)
2:14:33.185–2:14:36.415
(此句尚無繁中翻譯)
2:14:36.415–2:14:45.932
(此句尚無繁中翻譯)
2:14:45.932–2:14:49.480
(此句尚無繁中翻譯)
2:14:49.480–2:14:52.052
(此句尚無繁中翻譯)
2:14:52.052–2:15:02.504
(此句尚無繁中翻譯)
2:15:02.504–2:15:04.262
(此句尚無繁中翻譯)
2:15:04.262–2:15:09.863
(此句尚無繁中翻譯)
2:15:09.863–2:15:10.150
(此句尚無繁中翻譯)
2:15:10.150–2:15:12.527
(此句尚無繁中翻譯)
2:15:12.527–2:15:14.136
(此句尚無繁中翻譯)
2:15:14.136–2:15:15.116
(此句尚無繁中翻譯)
2:15:15.116–2:15:16.191
(此句尚無繁中翻譯)
2:15:16.191–2:15:18.030
(此句尚無繁中翻譯)
2:15:18.030–2:15:23.984
(此句尚無繁中翻譯)
2:15:23.984–2:15:26.221
(此句尚無繁中翻譯)
2:15:26.221–2:15:27.758
(此句尚無繁中翻譯)
2:15:27.758–2:15:41.627
(此句尚無繁中翻譯)
2:15:41.627–2:15:50.470
(此句尚無繁中翻譯)
2:15:50.480–2:15:51.654
(此句尚無繁中翻譯)
2:15:51.654–2:15:55.245
(此句尚無繁中翻譯)
2:15:55.245–2:15:58.202
(此句尚無繁中翻譯)
2:15:58.202–2:16:12.750
(此句尚無繁中翻譯)
2:16:12.760–2:16:13.440
(此句尚無繁中翻譯)
2:16:13.440–2:16:15.815
(此句尚無繁中翻譯)
2:16:15.815–2:16:16.990
(此句尚無繁中翻譯)
2:16:17.000–2:16:21.905
(此句尚無繁中翻譯)
2:16:21.905–2:16:29.021
(此句尚無繁中翻譯)
2:16:29.021–2:16:36.278
(此句尚無繁中翻譯)
2:16:36.278–2:16:38.197
(此句尚無繁中翻譯)
2:16:38.197–2:16:38.486
(此句尚無繁中翻譯)
2:16:38.486–2:16:42.541
(此句尚無繁中翻譯)
2:16:42.541–2:16:43.596
(此句尚無繁中翻譯)
2:16:43.596–2:16:51.732
(此句尚無繁中翻譯)
2:16:51.732–2:16:58.600
(此句尚無繁中翻譯)
2:16:58.600–2:17:01.368
(此句尚無繁中翻譯)
2:17:01.368–2:17:04.597
(此句尚無繁中翻譯)
2:17:04.597–2:17:16.621
(此句尚無繁中翻譯)
2:17:16.621–2:17:23.612
(此句尚無繁中翻譯)
2:17:23.612–2:17:23.929
(此句尚無繁中翻譯)
2:17:23.929–2:17:25.774
(此句尚無繁中翻譯)
2:17:25.774–2:17:27.830
(此句尚無繁中翻譯)
2:17:27.840–2:17:34.356
(此句尚無繁中翻譯)
2:17:34.356–2:17:39.917
(此句尚無繁中翻譯)
2:17:39.917–2:17:41.511
(此句尚無繁中翻譯)
2:17:41.511–2:17:48.205
(此句尚無繁中翻譯)
2:17:48.205–2:17:52.168
(此句尚無繁中翻譯)
2:17:52.168–2:17:58.659
(此句尚無繁中翻譯)
2:17:58.659–2:17:59.045
(此句尚無繁中翻譯)
2:17:59.045–2:18:06.854
(此句尚無繁中翻譯)
2:18:06.854–2:18:11.526
(此句尚無繁中翻譯)
2:18:11.526–2:18:13.148
(此句尚無繁中翻譯)
2:18:13.148–2:18:19.589
(此句尚無繁中翻譯)
2:18:19.599–2:18:20.504
(此句尚無繁中翻譯)
2:18:20.504–2:18:25.517
(此句尚無繁中翻譯)
2:18:25.517–2:18:27.557
(此句尚無繁中翻譯)
2:18:27.557–2:18:30.202
(此句尚無繁中翻譯)
2:18:30.202–2:18:32.270
(此句尚無繁中翻譯)
2:18:32.270–2:18:34.908
(此句尚無繁中翻譯)
2:18:34.908–2:18:36.319
(此句尚無繁中翻譯)
2:18:36.319–2:18:37.847
(此句尚無繁中翻譯)
2:18:37.847–2:18:42.051
(此句尚無繁中翻譯)
2:18:42.051–2:18:44.720
(此句尚無繁中翻譯)
2:18:44.720–2:18:46.300
(此句尚無繁中翻譯)
2:18:46.300–2:18:48.424
(此句尚無繁中翻譯)
2:18:48.424–2:18:49.039
(此句尚無繁中翻譯)
2:18:49.039–2:18:50.532
(此句尚無繁中翻譯)
2:18:50.532–2:18:52.117
(此句尚無繁中翻譯)
2:18:52.117–2:18:57.611
(此句尚無繁中翻譯)
2:18:57.611–2:19:02.541
(此句尚無繁中翻譯)
2:19:02.541–2:19:08.047
(此句尚無繁中翻譯)
2:19:08.047–2:19:13.112
(此句尚無繁中翻譯)
2:19:13.112–2:19:15.163
(此句尚無繁中翻譯)
2:19:15.163–2:19:17.127
(此句尚無繁中翻譯)
2:19:17.127–2:19:19.041
(此句尚無繁中翻譯)
2:19:19.041–2:19:27.399
(此句尚無繁中翻譯)
2:19:27.399–2:19:33.015
(此句尚無繁中翻譯)
2:19:33.015–2:19:34.629
(此句尚無繁中翻譯)
2:19:34.639–2:19:36.083
(此句尚無繁中翻譯)
2:19:36.083–2:19:38.258
(此句尚無繁中翻譯)
2:19:38.258–2:19:38.950
(此句尚無繁中翻譯)
2:19:38.960–2:19:43.168
(此句尚無繁中翻譯)
2:19:43.168–2:19:48.133
(此句尚無繁中翻譯)
2:19:48.133–2:19:52.318
(此句尚無繁中翻譯)
2:19:52.318–2:20:01.292
(此句尚無繁中翻譯)
2:20:01.292–2:20:03.544
(此句尚無繁中翻譯)
2:20:03.544–2:20:09.190
(此句尚無繁中翻譯)
2:20:09.200–2:20:12.157
(此句尚無繁中翻譯)
2:20:12.157–2:20:17.673
(此句尚無繁中翻譯)
2:20:17.673–2:20:20.012
(此句尚無繁中翻譯)
2:20:20.012–2:20:21.573
(此句尚無繁中翻譯)
2:20:21.573–2:20:24.110
(此句尚無繁中翻譯)
2:20:24.120–2:20:30.717
(此句尚無繁中翻譯)
2:20:30.717–2:20:33.458
(此句尚無繁中翻譯)
2:20:33.458–2:20:36.838
(此句尚無繁中翻譯)
2:20:36.838–2:20:39.030
(此句尚無繁中翻譯)
2:20:39.030–2:20:40.609
(此句尚無繁中翻譯)
2:20:40.609–2:20:46.967
(此句尚無繁中翻譯)
2:20:46.967–2:20:52.985
(此句尚無繁中翻譯)
2:20:52.985–2:20:55.030
(此句尚無繁中翻譯)
2:20:55.040–2:20:56.341
(此句尚無繁中翻譯)
2:20:56.341–2:21:02.589
(此句尚無繁中翻譯)
2:21:02.589–2:21:08.818
(此句尚無繁中翻譯)
2:21:08.818–2:21:13.739
(此句尚無繁中翻譯)
2:21:13.739–2:21:16.516
(此句尚無繁中翻譯)
2:21:16.516–2:21:18.649
(此句尚無繁中翻譯)
2:21:18.649–2:21:25.165
(此句尚無繁中翻譯)
2:21:25.165–2:21:26.548
(此句尚無繁中翻譯)
2:21:26.548–2:21:29.216
(此句尚無繁中翻譯)
2:21:29.216–2:21:33.030
(此句尚無繁中翻譯)
2:21:33.040–2:21:36.789
(此句尚無繁中翻譯)
2:21:36.789–2:21:40.346
(此句尚無繁中翻譯)
2:21:40.346–2:21:43.510
(此句尚無繁中翻譯)
2:21:43.520–2:21:51.922
(此句尚無繁中翻譯)
2:21:51.922–2:21:53.192
(此句尚無繁中翻譯)
2:21:53.192–2:21:55.976
(此句尚無繁中翻譯)
2:21:55.976–2:21:57.888
(此句尚無繁中翻譯)
2:21:57.888–2:22:02.455
(此句尚無繁中翻譯)
2:22:02.455–2:22:05.910
(此句尚無繁中翻譯)
2:22:05.920–2:22:07.188
(此句尚無繁中翻譯)
2:22:07.188–2:22:09.397
(此句尚無繁中翻譯)
2:22:09.397–2:22:10.563
(此句尚無繁中翻譯)
2:22:10.563–2:22:16.019
(此句尚無繁中翻譯)
2:22:16.019–2:22:17.542
(此句尚無繁中翻譯)
2:22:17.542–2:22:24.237
(此句尚無繁中翻譯)
2:22:24.237–2:22:26.767
(此句尚無繁中翻譯)
2:22:26.767–2:22:28.613
(此句尚無繁中翻譯)
2:22:28.613–2:22:31.056
(此句尚無繁中翻譯)
2:22:31.056–2:22:34.190
(此句尚無繁中翻譯)
2:22:34.200–2:22:38.109
(此句尚無繁中翻譯)
2:22:38.109–2:22:39.935
(此句尚無繁中翻譯)
2:22:39.935–2:22:40.790
(此句尚無繁中翻譯)
2:22:40.800–2:22:48.291
(此句尚無繁中翻譯)
2:22:48.291–2:22:49.845
(此句尚無繁中翻譯)
2:22:49.845–2:22:51.336
(此句尚無繁中翻譯)
2:22:51.336–2:22:55.810
(此句尚無繁中翻譯)
2:22:55.810–2:22:57.651
(此句尚無繁中翻譯)
2:22:57.651–2:23:01.298
(此句尚無繁中翻譯)
2:23:01.298–2:23:03.350
(此句尚無繁中翻譯)
2:23:03.360–2:23:05.595
(此句尚無繁中翻譯)
2:23:05.595–2:23:06.753
(此句尚無繁中翻譯)
2:23:06.753–2:23:11.160
(此句尚無繁中翻譯)
2:23:11.160–2:23:12.630
(此句尚無繁中翻譯)
2:23:12.640–2:23:13.905
(此句尚無繁中翻譯)
2:23:13.905–2:23:16.122
(此句尚無繁中翻譯)
2:23:16.122–2:23:18.149
(此句尚無繁中翻譯)
2:23:18.149–2:23:19.634
(此句尚無繁中翻譯)
2:23:19.634–2:23:20.081
(此句尚無繁中翻譯)
2:23:20.081–2:23:21.870
(此句尚無繁中翻譯)
2:23:21.880–2:23:24.390
(此句尚無繁中翻譯)
2:23:24.400–2:23:28.110
(此句尚無繁中翻譯)
2:23:28.120–2:23:33.063
(此句尚無繁中翻譯)
2:23:33.063–2:23:34.996
(此句尚無繁中翻譯)
2:23:34.996–2:23:38.160
(此句尚無繁中翻譯)
2:23:38.160–2:23:42.553
(此句尚無繁中翻譯)
2:23:42.553–2:23:49.230
(此句尚無繁中翻譯)
2:23:49.240–2:23:51.083
(此句尚無繁中翻譯)
2:23:51.083–2:23:51.681
(此句尚無繁中翻譯)
2:23:51.681–2:23:53.596
(此句尚無繁中翻譯)
2:23:53.596–2:23:59.470
(此句尚無繁中翻譯)
2:23:59.480–2:24:04.547
(此句尚無繁中翻譯)
2:24:04.547–2:24:11.697
(此句尚無繁中翻譯)
2:24:11.697–2:24:16.510
(此句尚無繁中翻譯)
2:24:16.520–2:24:22.901
(此句尚無繁中翻譯)
2:24:22.901–2:24:27.232
(此句尚無繁中翻譯)
2:24:27.232–2:24:31.060
(此句尚無繁中翻譯)
2:24:31.060–2:24:36.506
(此句尚無繁中翻譯)
2:24:36.506–2:24:39.950
(此句尚無繁中翻譯)
2:24:39.960–2:24:44.291
(此句尚無繁中翻譯)
2:24:44.291–2:24:46.790
(此句尚無繁中翻譯)
2:24:46.800–2:24:52.119
(此句尚無繁中翻譯)
2:24:52.119–2:24:57.255
(此句尚無繁中翻譯)
2:24:57.255–2:25:03.203
(此句尚無繁中翻譯)
2:25:03.203–2:25:05.471
(此句尚無繁中翻譯)
2:25:05.471–2:25:10.544
(此句尚無繁中翻譯)
2:25:10.544–2:25:13.947
(此句尚無繁中翻譯)
2:25:13.947–2:25:15.689
(此句尚無繁中翻譯)
2:25:15.689–2:25:18.402
(此句尚無繁中翻譯)
2:25:18.402–2:25:23.686
(此句尚無繁中翻譯)
2:25:23.686–2:25:24.927
(此句尚無繁中翻譯)
2:25:24.927–2:25:32.310
(此句尚無繁中翻譯)
2:25:32.320–2:25:34.675
(此句尚無繁中翻譯)
2:25:34.675–2:25:36.790
(此句尚無繁中翻譯)
2:25:36.800–2:25:38.221
(此句尚無繁中翻譯)
2:25:38.221–2:25:39.962
(此句尚無繁中翻譯)
2:25:39.962–2:25:44.750
(此句尚無繁中翻譯)
2:25:44.760–2:25:46.032
(此句尚無繁中翻譯)
2:25:46.032–2:25:47.049
(此句尚無繁中翻譯)
2:25:47.049–2:25:51.298
(此句尚無繁中翻譯)
2:25:51.298–2:25:52.775
(此句尚無繁中翻譯)
2:25:52.775–2:25:53.811
(此句尚無繁中翻譯)
2:25:53.811–2:25:58.148
(此句尚無繁中翻譯)
2:25:58.148–2:26:01.808
(此句尚無繁中翻譯)
2:26:01.808–2:26:02.720
(此句尚無繁中翻譯)
2:26:02.720–2:26:03.495
(此句尚無繁中翻譯)
2:26:03.495–2:26:04.727
(此句尚無繁中翻譯)
2:26:04.727–2:26:06.315
(此句尚無繁中翻譯)
2:26:06.315–2:26:08.911
(此句尚無繁中翻譯)
2:26:08.911–2:26:12.993
(此句尚無繁中翻譯)
2:26:12.993–2:26:16.650
(此句尚無繁中翻譯)
2:26:16.650–2:26:17.038
(此句尚無繁中翻譯)
2:26:17.038–2:26:19.398
(此句尚無繁中翻譯)
2:26:19.398–2:26:20.550
(此句尚無繁中翻譯)
2:26:20.560–2:26:21.954
(此句尚無繁中翻譯)
2:26:21.954–2:26:22.884
(此句尚無繁中翻譯)
2:26:22.884–2:26:24.108
(此句尚無繁中翻譯)
2:26:24.108–2:26:25.130
(此句尚無繁中翻譯)
2:26:25.130–2:26:27.017
(此句尚無繁中翻譯)
2:26:27.017–2:26:28.550
(此句尚無繁中翻譯)
2:26:28.560–2:26:31.710
(此句尚無繁中翻譯)
2:26:31.720–2:26:33.950
(此句尚無繁中翻譯)
2:26:33.960–2:26:35.443
(此句尚無繁中翻譯)
2:26:35.443–2:26:38.081
(此句尚無繁中翻譯)
2:26:38.081–2:26:41.405
(此句尚無繁中翻譯)
2:26:41.405–2:26:44.821
(此句尚無繁中翻譯)
2:26:44.821–2:26:48.990
(此句尚無繁中翻譯)
2:26:49.000–2:26:55.022
(此句尚無繁中翻譯)
2:26:55.022–2:26:58.556
(此句尚無繁中翻譯)
2:26:58.556–2:27:05.371
(此句尚無繁中翻譯)
2:27:05.371–2:27:10.770
(此句尚無繁中翻譯)
2:27:10.770–2:27:16.750
(此句尚無繁中翻譯)
2:27:16.760–2:27:18.731
(此句尚無繁中翻譯)
2:27:18.731–2:27:25.286
(此句尚無繁中翻譯)
2:27:25.286–2:27:27.816
(此句尚無繁中翻譯)
2:27:27.816–2:27:30.270
(此句尚無繁中翻譯)
2:27:30.280–2:27:32.001
(此句尚無繁中翻譯)
2:27:32.001–2:27:36.767
(此句尚無繁中翻譯)
2:27:36.767–2:27:37.945
(此句尚無繁中翻譯)
2:27:37.945–2:27:50.974
(此句尚無繁中翻譯)
2:27:50.974–2:27:57.129
(此句尚無繁中翻譯)
2:27:57.129–2:27:58.642
(此句尚無繁中翻譯)
2:27:58.642–2:27:59.805
(此句尚無繁中翻譯)
2:27:59.805–2:28:05.936
(此句尚無繁中翻譯)
2:28:05.936–2:28:07.090
(此句尚無繁中翻譯)
2:28:07.090–2:28:10.405
(此句尚無繁中翻譯)
2:28:10.405–2:28:13.055
(此句尚無繁中翻譯)
2:28:13.055–2:28:19.241
(此句尚無繁中翻譯)
2:28:19.241–2:28:20.916
(此句尚無繁中翻譯)
2:28:20.916–2:28:26.294
(此句尚無繁中翻譯)
2:28:26.294–2:28:28.652
(此句尚無繁中翻譯)
2:28:28.652–2:28:30.085
(此句尚無繁中翻譯)
2:28:30.085–2:28:33.914
(此句尚無繁中翻譯)
2:28:33.914–2:28:34.552
(此句尚無繁中翻譯)
2:28:34.552–2:28:35.218
(此句尚無繁中翻譯)
2:28:35.218–2:28:39.561
(此句尚無繁中翻譯)
2:28:39.561–2:28:42.735
(此句尚無繁中翻譯)
2:28:42.735–2:28:46.395
(此句尚無繁中翻譯)
2:28:46.395–2:28:48.992
(此句尚無繁中翻譯)
2:28:48.992–2:28:49.667
(此句尚無繁中翻譯)
2:28:49.667–2:28:54.265
(此句尚無繁中翻譯)
2:28:54.265–2:28:58.962
(此句尚無繁中翻譯)
2:28:58.962–2:29:06.466
(此句尚無繁中翻譯)
2:29:06.466–2:29:13.003
(此句尚無繁中翻譯)
2:29:13.003–2:29:15.830
(此句尚無繁中翻譯)
2:29:15.840–2:29:19.971
(此句尚無繁中翻譯)
2:29:19.971–2:29:25.107
(此句尚無繁中翻譯)
2:29:25.107–2:29:33.210
(此句尚無繁中翻譯)
2:29:33.210–2:29:38.590
(此句尚無繁中翻譯)
2:29:38.600–2:29:46.392
(此句尚無繁中翻譯)
2:29:46.392–2:29:50.473
(此句尚無繁中翻譯)
2:29:50.473–2:29:52.515
(此句尚無繁中翻譯)
2:29:52.515–2:29:57.518
(此句尚無繁中翻譯)
2:29:57.518–2:29:59.779
(此句尚無繁中翻譯)
2:29:59.779–2:30:04.091
(此句尚無繁中翻譯)
2:30:04.091–2:30:08.966
(此句尚無繁中翻譯)
2:30:08.966–2:30:16.146
(此句尚無繁中翻譯)
2:30:16.146–2:30:24.204
(此句尚無繁中翻譯)
2:30:24.204–2:30:29.187
(此句尚無繁中翻譯)
2:30:29.187–2:30:32.797
(此句尚無繁中翻譯)
2:30:32.797–2:30:39.510
(此句尚無繁中翻譯)
2:30:39.520–2:30:48.692
(此句尚無繁中翻譯)
2:30:48.692–2:30:59.291
(此句尚無繁中翻譯)
2:30:59.291–2:31:04.368
(此句尚無繁中翻譯)
2:31:04.368–2:31:13.950
(此句尚無繁中翻譯)
2:31:13.960–2:31:15.907
(此句尚無繁中翻譯)
2:31:15.907–2:31:20.430
(此句尚無繁中翻譯)
2:31:20.440–2:31:30.310
(此句尚無繁中翻譯)
2:31:30.320–2:31:32.084
(此句尚無繁中翻譯)
2:31:32.084–2:31:40.004
(此句尚無繁中翻譯)
2:31:40.004–2:31:44.038
(此句尚無繁中翻譯)
2:31:44.038–2:31:48.150
(此句尚無繁中翻譯)
2:31:48.160–2:31:52.983
(此句尚無繁中翻譯)
2:31:52.983–2:31:55.163
(此句尚無繁中翻譯)
2:31:55.163–2:31:57.705
(此句尚無繁中翻譯)
2:31:57.705–2:32:04.674
(此句尚無繁中翻譯)
2:32:04.674–2:32:09.679
(此句尚無繁中翻譯)
2:32:09.679–2:32:14.372
(此句尚無繁中翻譯)
2:32:14.372–2:32:17.345
(此句尚無繁中翻譯)
2:32:17.345–2:32:19.131
(此句尚無繁中翻譯)
2:32:19.131–2:32:20.522
(此句尚無繁中翻譯)
2:32:20.522–2:32:25.175
(此句尚無繁中翻譯)
2:32:25.175–2:32:27.818
(此句尚無繁中翻譯)
2:32:27.818–2:32:35.834
(此句尚無繁中翻譯)
2:32:35.834–2:32:50.424
(此句尚無繁中翻譯)
2:32:50.424–2:32:51.946
(此句尚無繁中翻譯)
2:32:51.946–2:32:55.870
(此句尚無繁中翻譯)
2:32:55.880–2:33:00.294
(此句尚無繁中翻譯)
2:33:00.294–2:33:03.870
(此句尚無繁中翻譯)
2:33:03.880–2:33:06.670
(此句尚無繁中翻譯)
2:33:06.680–2:33:16.180
(此句尚無繁中翻譯)
2:33:16.180–2:33:19.944
(此句尚無繁中翻譯)
2:33:19.944–2:33:27.135
(此句尚無繁中翻譯)
2:33:27.135–2:33:31.587
(此句尚無繁中翻譯)
2:33:31.587–2:33:38.230
(此句尚無繁中翻譯)
2:33:38.240–2:33:40.874
(此句尚無繁中翻譯)
2:33:40.874–2:33:50.010
(此句尚無繁中翻譯)
2:33:50.010–2:33:52.003
(此句尚無繁中翻譯)
2:33:52.003–2:33:56.376
(此句尚無繁中翻譯)
2:33:56.376–2:33:57.659
(此句尚無繁中翻譯)
2:33:57.659–2:34:00.354
(此句尚無繁中翻譯)
2:34:00.354–2:34:01.710
(此句尚無繁中翻譯)
2:34:01.720–2:34:02.240
(此句尚無繁中翻譯)
2:34:02.240–2:34:04.060
(此句尚無繁中翻譯)
2:34:04.060–2:34:05.910
(此句尚無繁中翻譯)
2:34:05.920–2:34:08.241
(此句尚無繁中翻譯)
2:34:08.241–2:34:10.394
(此句尚無繁中翻譯)
2:34:10.394–2:34:13.504
(此句尚無繁中翻譯)
2:34:13.504–2:34:15.292
(此句尚無繁中翻譯)
2:34:15.292–2:34:17.077
(此句尚無繁中翻譯)
2:34:17.077–2:34:18.900
(此句尚無繁中翻譯)
2:34:18.900–2:34:20.628
(此句尚無繁中翻譯)
2:34:20.628–2:34:21.503
(此句尚無繁中翻譯)
2:34:21.503–2:34:24.182
(此句尚無繁中翻譯)
2:34:24.182–2:34:25.834
(此句尚無繁中翻譯)
2:34:25.834–2:34:27.990
(此句尚無繁中翻譯)
2:34:28.000–2:34:30.654
(此句尚無繁中翻譯)
2:34:30.654–2:34:33.088
(此句尚無繁中翻譯)
2:34:33.088–2:34:35.480
(此句尚無繁中翻譯)
2:34:35.480–2:34:40.531
(此句尚無繁中翻譯)
2:34:40.531–2:34:44.989
(此句尚無繁中翻譯)
2:34:44.989–2:34:47.482
(此句尚無繁中翻譯)
2:34:47.482–2:34:48.030
(此句尚無繁中翻譯)
2:34:48.040–2:34:49.491
(此句尚無繁中翻譯)
2:34:49.491–2:34:50.790
(此句尚無繁中翻譯)
2:34:50.800–2:35:04.520
(此句尚無繁中翻譯)
2:35:04.520–2:35:09.407
(此句尚無繁中翻譯)
2:35:09.407–2:35:11.015
(此句尚無繁中翻譯)
2:35:11.015–2:35:12.177
(此句尚無繁中翻譯)
2:35:12.177–2:35:13.346
(此句尚無繁中翻譯)
2:35:13.346–2:35:16.264
(此句尚無繁中翻譯)
2:35:16.264–2:35:18.325
(此句尚無繁中翻譯)
2:35:18.325–2:35:21.644
(此句尚無繁中翻譯)
2:35:21.644–2:35:28.582
(此句尚無繁中翻譯)
2:35:28.582–2:35:36.574
(此句尚無繁中翻譯)
2:35:36.574–2:35:37.946
(此句尚無繁中翻譯)
2:35:37.946–2:35:39.325
(此句尚無繁中翻譯)
2:35:39.325–2:35:41.096
(此句尚無繁中翻譯)
2:35:41.096–2:35:46.145
(此句尚無繁中翻譯)
2:35:46.145–2:35:54.804
(此句尚無繁中翻譯)
2:35:54.804–2:35:59.699
(此句尚無繁中翻譯)
2:35:59.699–2:36:08.121
(此句尚無繁中翻譯)
2:36:08.121–2:36:11.492
(此句尚無繁中翻譯)
2:36:11.492–2:36:21.597
(此句尚無繁中翻譯)
2:36:21.597–2:36:23.116
(此句尚無繁中翻譯)
2:36:23.116–2:36:24.439
(此句尚無繁中翻譯)
2:36:24.439–2:36:25.670
(此句尚無繁中翻譯)
2:36:25.680–2:36:28.486
(此句尚無繁中翻譯)
2:36:28.486–2:36:30.289
(此句尚無繁中翻譯)
2:36:30.289–2:36:31.486
(此句尚無繁中翻譯)
2:36:31.486–2:36:33.310
(此句尚無繁中翻譯)
2:36:33.320–2:36:45.638
(此句尚無繁中翻譯)
2:36:45.638–2:37:01.950
(此句尚無繁中翻譯)
2:37:01.960–2:37:02.760
(此句尚無繁中翻譯)
2:37:02.760–2:37:12.587
(此句尚無繁中翻譯)
2:37:12.587–2:37:18.056
(此句尚無繁中翻譯)
2:37:18.056–2:37:23.911
(此句尚無繁中翻譯)
2:37:23.911–2:37:40.988
(此句尚無繁中翻譯)
2:37:40.988–2:37:47.515
(此句尚無繁中翻譯)
2:37:47.515–2:37:53.032
(此句尚無繁中翻譯)
2:37:53.032–2:38:04.253
(此句尚無繁中翻譯)
2:38:04.253–2:38:15.811
(此句尚無繁中翻譯)
2:38:15.811–2:38:24.233
(此句尚無繁中翻譯)
2:38:24.233–2:38:41.030
(此句尚無繁中翻譯)
2:38:41.040–2:38:42.906
(此句尚無繁中翻譯)
2:38:42.906–2:38:48.132
(此句尚無繁中翻譯)
2:38:48.132–2:39:03.030
(此句尚無繁中翻譯)
2:39:03.040–2:39:03.794
(此句尚無繁中翻譯)
2:39:03.794–2:39:09.591
(此句尚無繁中翻譯)
2:39:09.591–2:39:15.000
(此句尚無繁中翻譯)
0:00.000–0:03.567
In this video, we're going to do a comprehensive Codex tutorial.
(此句尚無繁中翻譯)
0:03.567–0:10.693
I want to show you not just what Codex is, but how to actually use it as a serious app building agent.
(此句尚無繁中翻譯)
0:10.693–0:28.277
We'll start with the foundations, how Codex works, how the Mac app and the CLI fit together, how to choose models and thinking modes, how threads and contexts work, and how to use tools like the browser, terminal, files, and external systems.
(此句尚無繁中翻譯)
0:28.277–0:31.885
Then, we'll turn that foundation into a real workflow.
(此句尚無繁中翻譯)
0:31.885–0:42.020
We'll use Codex to plan, architect, design, implement, debug, and ultimately deploy a production-ready app from scratch.
(此句尚無繁中翻譯)
0:42.020–0:53.676
By the end, you should understand the full Codex workflow well enough to take your app idea, break it into manageable steps, and use Codex to build it with much more confidence.
(此句尚無繁中翻譯)
0:53.676–0:59.407
Now, when you Google for Codex, you're going to land on this website here.
(此句尚無繁中翻譯)
0:59.407–1:04.331
And here, you can learn more about Codex, and you can also download the app.
(此句尚無繁中翻譯)
1:04.331–1:07.205
Now, as you can see, it says here download for macOS.
(此句尚無繁中翻譯)
1:07.205–1:09.548
That is because I have macOS.
(此句尚無繁中翻譯)
1:09.548–1:14.920
If you're running Windows, you're going to have a button that says download for Windows.
(此句尚無繁中翻譯)
1:14.920–1:17.442
So, it does support macOS and Windows.
(此句尚無繁中翻譯)
1:17.442–1:29.190
And when you scroll down, you can see the main screenshot that kind of gives you a general overview, general idea of what this app looks like, okay?
(此句尚無繁中翻譯)
1:29.200–1:32.393
And you can kind of scroll down, you can learn more about it.
(此句尚無繁中翻譯)
1:32.393–1:37.127
Or we can jump into my Codex instance here, and I can give you a quick overview.
(此句尚無繁中翻譯)
1:37.127–1:44.114
So, on the left-hand side, we have things like starting a new chat, search, various plugins, automations.
(此句尚無繁中翻譯)
1:44.114–1:49.310
Just below that, we have our main organization, right?
(此句尚無繁中翻譯)
1:49.320–1:52.384
And this is where you can organize your projects, okay?
(此句尚無繁中翻譯)
1:52.384–2:06.368
And the idea here is that anytime you have a project, you want to click here, and you want to either start it from scratch or you use an existing folder because these are not organized just logically.
(此句尚無繁中翻譯)
2:06.368–2:11.264
They're actually linked to folders on your disk, okay?
(此句尚無繁中翻譯)
2:11.264–2:16.340
And so, everything that you see here represents actual folders.
(此句尚無繁中翻譯)
2:16.340–2:19.993
Now, inside of these folders, we have some items here.
(此句尚無繁中翻譯)
2:19.993–2:24.010
Now, these are not files, and they do not represent anything on the disk.
(此句尚無繁中翻譯)
2:24.010–2:26.398
These are actually conversations, right?
(此句尚無繁中翻譯)
2:26.398–2:32.579
And you can think of them as, you know, similar to what you might have in Chat GPT, okay?
(此句尚無繁中翻譯)
2:32.579–2:42.878
So, if you're working on this project, you can create a new conversation simply by, you know, clicking here or pressing command and and telling it what you want to happen.
(此句尚無繁中翻譯)
2:42.878–2:48.101
Now, in the center pane over here, this is where you're going to be communicating, right?
(此句尚無繁中翻譯)
2:48.101–2:52.583
So, if we scroll back up, this was my initial prompt here.
(此句尚無繁中翻譯)
2:52.583–2:59.251
I want to build a very, very simple web app that arranges items as a Trello Kanban board style, etc.
(此句尚無繁中翻譯)
2:59.251–3:01.951
And then I have this interaction here, right?
(此句尚無繁中翻譯)
3:01.951–3:06.628
It does something, I ask it to do something else, etc., etc.
(此句尚無繁中翻譯)
3:06.628–3:11.419
Now, just below that is where you're going to be entering your prompt, okay?
(此句尚無繁中翻譯)
3:11.419–3:20.061
So, you're going to be selecting the model, uh the different reasoning, and we're going to be covering all that, but this is the main text box for the model.
(此句尚無繁中翻譯)
3:20.061–3:27.252
Now, on the right-hand side, there's a lot of interesting things happening here that a lot of people are not really aware of, okay?
(此句尚無繁中翻譯)
3:27.252–3:30.313
And a lot of people are not really like using it.
(此句尚無繁中翻譯)
3:30.313–3:35.115
And And you need to understand to leverage this whole app experience, right?
(此句尚無繁中翻譯)
3:35.115–3:43.909
So, right here, we have this little card that displays a little bit of information about this specific conversation, right?
(此句尚無繁中翻譯)
3:43.909–3:47.885
So, we have branch details, we have some artifacts, right?
(此句尚無繁中翻譯)
3:47.885–3:52.916
And these are the data that happened as a result of this convo, right?
(此句尚無繁中翻譯)
3:52.916–3:56.914
And so, if I go to another conversation, we might have different artifacts, right?
(此句尚無繁中翻譯)
3:56.914–4:03.524
And you can think of an artifact as a side effect of, you know, of your conversation, okay?
(此句尚無繁中翻譯)
4:03.524–4:06.817
So, if you've created a readme file, you're going to see it here.
(此句尚無繁中翻譯)
4:06.817–4:09.310
If you did a web search, you're going to see it here.
(此句尚無繁中翻譯)
4:09.320–4:15.293
Now, one of the more interesting things happens when you click this button and open the right-hand pane.
(此句尚無繁中翻譯)
4:15.293–4:18.177
And here, you can see all kinds of interesting things, right?
(此句尚無繁中翻譯)
4:18.177–4:23.922
So, for instance, if I click this button, I can have a side chat, or I can have a browser.
(此句尚無繁中翻譯)
4:23.922–4:41.430
Now, the browser feature is actually very, very powerful, because I can simply open this up here, and as I'm developing this app, it's going to give me a URL that I can open here in this browser, and that will allow me quick iteration, because I'll be able to
(此句尚無繁中翻譯)
4:41.440–4:45.796
see exactly how the app looks as I'm developing it.
(此句尚無繁中翻譯)
4:45.796–4:53.870
And we're going to be doing all of that in more detail a little bit later in this tutorial.
(此句尚無繁中翻譯)
4:53.880–4:56.235
First, let's talk about Codex.
(此句尚無繁中翻譯)
4:56.235–5:06.799
The easiest way to understand Codex is that it starts from the same basic idea as ChatGPT, but it is connected to your actual working environment.
(此句尚無繁中翻譯)
5:06.799–5:19.454
So, instead of only answering questions, it can inspect files, edit code, run commands, use the browser, test the app, and help move a project forward.
(此句尚無繁中翻譯)
5:19.454–5:21.741
The difference matters a lot.
(此句尚無繁中翻譯)
5:21.741–5:28.477
ChatGPT is great when I want an explanation, a rewrite, a brainstorm, or a quick answer.
(此句尚無繁中翻譯)
5:28.477–5:33.968
Codex is what I use when I want work to happen inside a real project.
(此句尚無繁中翻譯)
5:33.968–5:41.832
It can do many of the same reasoning tasks as ChatGPT, but it can also act on the project directly.
(此句尚無繁中翻譯)
5:41.832–5:50.441
That is why I keep ChatGPT mostly for pure informational questions, and I keep Coda for work threads.
(此句尚無繁中翻譯)
5:50.441–5:54.830
So, my project context stays focused and clean.
(此句尚無繁中翻譯)
5:54.840–5:57.157
There are two main ways to use Coda.
(此句尚無繁中翻譯)
5:57.157–6:10.529
The first is through the CLI, which is best when you already live in the terminal and want to run quick repo tasks, scripts, lightweight edits, or developer style iterations.
(此句尚無繁中翻譯)
6:10.529–6:16.098
The second is the Mac app, which is usually better for visual app building work.
(此句尚無繁中翻譯)
6:16.098–6:32.478
If I want to see the browser preview, inspect file changes, manage a longer project, approve permissions, review artifacts, or teach the workflow on screen, the Mac app gives me a much clearer workspace.
(此句尚無繁中翻譯)
6:32.478–6:38.305
And that is why I highly prefer to use the Mac app, and that is what I recommend you use as well.
(此句尚無繁中翻譯)
6:38.305–6:59.018
Inside the Mac app, the main pieces to understand are the project or the workspace, the thread area, the model selector, the thinking mode selector, file changes, terminal output, browser preview, artifacts, permissions, and the review flow.
(此句尚無繁中翻譯)
6:59.018–7:08.881
Once those pieces make sense, Coda stops feeling like a chat box and starts feeling like an app building environment.
(此句尚無繁中翻譯)
7:08.881–7:13.550
The project pane is where you open or switch between projects.
(此句尚無繁中翻譯)
7:13.560–7:18.750
The thread area is where the conversation and task history lives.
(此句尚無繁中翻譯)
7:18.760–7:25.123
The file change view shows what Coda wants to edit before those changes are accepted.
(此句尚無繁中翻譯)
7:25.123–7:31.175
The terminal output shows commands, builds, errors, and verification steps.
(此句尚無繁中翻譯)
7:31.175–7:36.310
The browser preview is where you can inspect the running app is where you can inspect the running app visually.
(此句尚無繁中翻譯)
7:36.320–7:44.710
Together, these pieces make Coda feel less like a chat bot and more like a working development environment.
(此句尚無繁中翻譯)
7:44.720–7:47.150
Permission flow is also important.
(此句尚無繁中翻譯)
7:47.160–7:52.854
Cortex should never feel like a black box that silently changes everything.
(此句尚無繁中翻譯)
7:52.854–8:08.990
As soon as it finishes running commands, editing files, or taking an action that matters, you can always inspect what it's doing, approve the right actions, and keep control over the project.
(此句尚無繁中翻譯)
8:09.000–8:13.710
The next thing to understand is that Cortex is not just one fixed experience.
(此句尚無繁中翻譯)
8:13.720–8:20.006
There are a few workflow decisions you make each time you use it, and the first one is which model to use.
(此句尚無繁中翻譯)
8:20.006–8:27.790
In practice, I usually default to the latest strongest model unless I have a clear reason not to.
(此句尚無繁中翻譯)
8:27.800–8:32.477
Because most app building tasks benefit from better reasoning.
(此句尚無繁中翻譯)
8:32.477–8:38.270
Here's a rough guide to picking the correct model for your specific task.
(此句尚無繁中翻譯)
8:38.270–8:51.590
So, for architecture, back-end design, multi-step implementation, difficult debugging, or final review passes, I want a stronger model, such as GPT-5.5.
(此句尚無繁中翻譯)
8:51.600–9:03.288
For small copy tweaks, simple UI polish, short refactors, or low-risk tasks, a faster, a lighter model can be a better tool.
(此句尚無繁中翻譯)
9:03.288–9:11.692
And here's where you can use an older model, or a mini, or a nano version of the current latest model.
(此句尚無繁中翻譯)
9:11.692–9:24.110
For example, if I'm asking Cortex to rename a button, tighten some copy, or adjust spacing on one component, I do not need to overthink the model choice.
(此句尚無繁中翻譯)
9:24.120–9:42.070
But if I'm asking Cortex to design the Convex schema, think through permissions, restructure several files, or debug a problem that spans front-end and back-end code, That is where I want the strongest model That is where I want the strongest model available.
(此句尚無繁中翻譯)
9:42.080–9:53.710
The more expensive the mistake, the more I want to slow down and use the better reasoning setup.
(此句尚無繁中翻譯)
9:53.720–9:56.812
The next important decision is the reasoning mode.
(此句尚無繁中翻譯)
9:56.812–10:05.404
This controls how much time and effort Cortex spends thinking through the task before and during the work.
(此句尚無繁中翻譯)
10:05.404–10:12.842
This decision is a little more nuanced than model choice because every reasoning mode has a place.
(此句尚無繁中翻譯)
10:12.842–10:19.435
Low thinking is useful for quick, obvious tasks where the risk is small.
(此句尚無繁中翻譯)
10:19.435–10:31.172
Medium is good for normal app building work, first pass UI normal app building work, first pass UI implementation, straightforward debugging, and routine feature work.
(此句尚無繁中翻譯)
10:31.172–10:35.150
High is what I use when the decision is more expensive.
(此句尚無繁中翻譯)
10:35.160–10:47.482
Architecture, convex data model design, authentication, permissions, hard bugs, multi-file changes, and the final review.
(此句尚無繁中翻譯)
10:47.482–11:01.190
My default for serious app building work is usually a strong model with high thinking because that gives me the best balance between speed and the best balance between speed and quality.
(此句尚無繁中翻譯)
11:01.200–11:03.750
But, the practical lesson is simple.
(此句尚無繁中翻譯)
11:03.760–11:08.578
Match the model and thinking mode to the risk of the decision.
(此句尚無繁中翻譯)
11:08.578–11:13.045
If the task is small and reversible, keep it fast.
(此句尚無繁中翻譯)
11:13.045–11:19.165
If the task affects the structure of the app, slow the model down and let it reason.
(此句尚無繁中翻譯)
11:19.165–11:30.429
Now, as you're working on your project and you're in this conversation project and you're in this conversation view, you can enter your prompts here, and just below, you can select various things.
(此句尚無繁中翻譯)
11:30.429–11:34.134
Now, first of all, you have your contacts window here, right?
(此句尚無繁中翻譯)
11:34.134–11:37.341
Here you can see how much of the context you have used.
(此句尚無繁中翻譯)
11:37.341–11:43.191
Now, Korax says that it automatically compacts its contacts.
(此句尚無繁中翻譯)
11:43.191–11:48.416
And yeah, you can do that, but over time, it's not going to be as effective.
(此句尚無繁中翻譯)
11:48.416–11:57.620
And so, you always want to be starting new conversations anytime you're working on something new that requires a context switch, okay?
(此句尚無繁中翻譯)
11:57.620–12:01.835
Next, we have here the all-important model selector, okay?
(此句尚無繁中翻譯)
12:01.835–12:11.423
So, if I click over here, I have it automatically set to GPT-5.5, which is the newest model as of the time of recording this video, okay?
(此句尚無繁中翻譯)
12:11.423–12:19.895
You can also switch it to some of the older models as well, but I see no reason to do that because this model has been very, very capable.
(此句尚無繁中翻譯)
12:19.895–12:24.981
We also have things like speed, standard versus fast.
(此句尚無繁中翻譯)
12:24.981–12:31.402
Fast is 1 and 1/2 times faster, but it also uses more of your usage, okay?
(此句尚無繁中翻譯)
12:31.402–12:35.828
So, depending on which plan you're at, you may want to stay on standard.
(此句尚無繁中翻譯)
12:35.828–12:40.440
I mostly keep it on standard unless, you know, I'm in a hurry and I want to switch it on fast.
(此句尚無繁中翻譯)
12:40.440–12:42.751
Next, we have intelligence, right?
(此句尚無繁中翻譯)
12:42.751–12:44.697
Now, this is very, very important.
(此句尚無繁中翻譯)
12:44.697–12:47.576
By default, I keep this on high.
(此句尚無繁中翻譯)
12:47.576–13:02.050
I found that to be a good balance between speed and quality because as you go towards lower intelligence, the model is going to be faster, but you're going to be giving up quality, right?
(此句尚無繁中翻譯)
13:02.050–13:04.400
You're going to be giving up intelligence.
(此句尚無繁中翻譯)
13:04.400–13:12.011
On the other hand, as you go into higher and higher intelligence, the model is going to be slower, but it's going to be thinking more, right?
(此句尚無繁中翻譯)
13:12.011–13:13.947
It's kind of like a person, right?
(此句尚無繁中翻譯)
13:13.947–13:21.811
You can ask a person a question, and that person may think more, think through something longer, right?
(此句尚無繁中翻譯)
13:21.811–13:27.834
You know how people say, "Let me sleep or let me sleep on it." Or let me think it over, right?
(此句尚無繁中翻譯)
13:27.834–13:39.110
The longer you think, the more the more you figure something out, and the the the the the higher chance you're going to arrive at the correct answer, at least for you.
(此句尚無繁中翻譯)
13:39.120–13:48.670
You're going to think through all the possibilities, whereas the first answer might be wrong, and usually is because you haven't thought everything through.
(此句尚無繁中翻譯)
13:48.680–13:51.097
And it's the exact same thing here, right?
(此句尚無繁中翻譯)
13:51.097–13:58.389
If you set something too low, and you're working through something fairly complex, well, the model is not going to think it through.
(此句尚無繁中翻譯)
13:58.389–14:06.750
It's going to give you an answer that well, it's an answer, but it might not be the ideal answer, okay?
(此句尚無繁中翻譯)
14:06.760–14:16.703
On the other hand, with extra high, you know, the model is going to think longer, but it may not be necessary in a lot of situations.
(此句尚無繁中翻譯)
14:16.703–14:29.698
And so, I typically keep it on high, sometimes medium, very rarely low, and also very rarely extra high, unless I'm working through something that the model has trouble with high.
(此句尚無繁中翻譯)
14:29.698–14:35.474
You know, the situations where extra high really proven itself over high, it hasn't been that many.
(此句尚無繁中翻譯)
14:35.474–14:40.279
And so, for the most part, I keep it on high, sometimes I also switch it back to medium.
(此句尚無繁中翻譯)
14:40.279–14:54.230
And as you start to use Codex more and more, and as you begin building more and more apps with it, and you'll be able to better judge which thinking mode to better judge which thinking mode to select.
(此句尚無繁中翻譯)
14:54.240–15:03.041
Now, before we go deeper into the workflow, I want to quickly talk about pricing and plans because this is one of the first practical questions people have with Codex.
(此句尚無繁中翻譯)
15:03.041–15:07.950
For most people learning Codex, the important question is not what is the most expensive plan.
(此句尚無繁中翻譯)
15:07.960–15:12.119
The question is, what do I actually need for the kind of work I'm doing?
(此句尚無繁中翻譯)
15:12.119–15:20.638
If you're learning, testing prompts, and building smaller projects, you can usually start with the normal Chat GPT plan access available to you.
(此句尚無繁中翻譯)
15:20.638–15:32.251
If you're doing heavier app builds, longer agent runs, team workflows, or professional coding work, then plan limits, credits, and business options start to matter more.
(此句尚無繁中翻譯)
15:32.251–15:36.205
Now, here I am on OpenAI's Codex pricing page.
(此句尚無繁中翻譯)
15:36.205–15:43.223
And if you scroll down, you can see the prices that are available at the time of filming this video, right?
(此句尚無繁中翻譯)
15:43.223–15:49.359
So, we have the free plan, and this allows you to explore Codex capabilities on quick coding tasks.
(此句尚無繁中翻譯)
15:49.359–15:55.288
We have the gold plan, which is $8 a month, and you can use Codex for lightweight coding tasks.
(此句尚無繁中翻譯)
15:55.288–16:05.590
We have the plus plan, which is fairly popular, 20 bucks a month, and here you can finally start to actually do something meaningful, right?
(此句尚無繁中翻譯)
16:05.600–16:09.537
Something like, you know, building a part of an app, or building some scripts.
(此句尚無繁中翻譯)
16:09.537–16:14.670
And they say this can power a few focused coding sessions each week.
(此句尚無繁中翻譯)
16:14.680–16:16.545
Next, we have the pro plan, right?
(此句尚無繁中翻譯)
16:16.545–16:24.889
And so, here you can choose whether you want the 5x or the 20x higher rate limits than plus, and this is $100 a month.
(此句尚無繁中翻譯)
16:24.889–16:28.190
I'm actually using the pro plan 20x.
(此句尚無繁中翻譯)
16:28.190–16:37.443
Okay, so I'm paying 200 bucks a month, and at this level, I am at a point where I pretty much never reach any limits.
(此句尚無繁中翻譯)
16:37.443–16:46.492
And that means I can build, you know, multiple projects at once, and use Codex for all kinds of tasks, and still not reach limits.
(此句尚無繁中翻譯)
16:46.492–16:54.145
And so, during the time where I'm when I'm, you know, building heavy apps and and doing some serious work, I might get close, right?
(此句尚無繁中翻譯)
16:54.145–16:56.312
But I never really get to the limit.
(此句尚無繁中翻譯)
16:56.312–16:59.470
You need to decide which plan is right for you.
(此句尚無繁中翻譯)
16:59.480–17:03.280
Now, from what I understand, plus plan is very, very popular.
(此句尚無繁中翻譯)
17:03.280–17:15.790
And so, what I would do is I would obviously, you know, try the free plan, try to see how that goes, and, you know, obviously, you know, if you do anything serious or remotely serious, you're probably, you know, you're going to run out run out of
(此句尚無繁中翻譯)
17:15.800–17:16.331
this plan.
(此句尚無繁中翻譯)
17:16.331–17:19.521
And so, the next logical step is to try out the plus plan.
(此句尚無繁中翻譯)
17:19.521–17:31.390
The plus plan is where a lot of people start and it gives you a reference point as to, you know, the amount of work that you're doing, how much can this plan actually cover the amount of work you're doing.
(此句尚無繁中翻譯)
17:31.400–17:39.201
Because the fact of the matter is there people that work on very heavy projects and, you know, there they work on big repos, right?
(此句尚無繁中翻譯)
17:39.201–17:40.779
Lots and lots of code base.
(此句尚無繁中翻譯)
17:40.779–17:43.717
They run out of their plan very, very quickly.
(此句尚無繁中翻譯)
17:43.717–17:48.025
But if you're working on a smaller projects, you're not using the fast mode.
(此句尚無繁中翻譯)
17:48.025–17:57.830
So for instance, you're not coming here and you're changing you're not changing speed because I'm using the fast mode from time to time and that, you know, increases the usage as well.
(此句尚無繁中翻譯)
17:57.840–18:01.619
So if you're on standard and you're using maybe medium often, right?
(此句尚無繁中翻譯)
18:01.619–18:09.788
You're not really using high that much and you're almost never using extra high, you can get a lot of mileage out of this plus plan.
(此句尚無繁中翻譯)
18:09.788–18:18.848
And when this plus plan starts to run out, you know, you're you're starting to notice some tight limits, you may want to switch to a higher plan, okay?
(此句尚無繁中翻譯)
18:18.848–18:20.921
Such as the pro 5x or 20x.
(此句尚無繁中翻譯)
18:20.921–18:26.642
Now you can also ask Codex to help you choose the right Codex plan for your specific use case.
(此句尚無繁中翻譯)
18:26.642–18:32.990
For instance, you can use this prompt here, help me choose the right Codex plan for my use case, okay?
(此句尚無繁中翻譯)
18:33.000–18:37.176
Use only current official OpenAI pricing and help center information.
(此句尚無繁中翻譯)
18:37.176–18:40.065
And I'm going to go ahead and run this and see what it says.
(此句尚無繁中翻譯)
18:40.065–18:42.395
All right, then this is what we got back.
(此句尚無繁中翻譯)
18:42.395–18:46.639
As of this day, ChatGPT plan is that include Codex, okay?
(此句尚無繁中翻譯)
18:46.639–18:48.310
So this is the practical read.
(此句尚無繁中翻譯)
18:48.320–18:51.279
Free, try Codex on quick tasks.
(此句尚無繁中翻譯)
18:51.279–18:53.387
Go lightweight coding tasks.
(此句尚無繁中翻譯)
18:53.387–18:56.670
Plus a few focus coding sessions each week, okay?
(此句尚無繁中翻譯)
18:56.680–19:00.283
And this is exactly what I just told you from that official page.
(此句尚無繁中翻譯)
19:00.283–19:04.107
And so if you scroll down, you can see how Codex usage and credits work.
(此句尚無繁中翻譯)
19:04.107–19:05.826
You can learn you can read this.
(此句尚無繁中翻譯)
19:05.826–19:08.209
Best fit for your use case, okay?
(此句尚無繁中翻譯)
19:08.209–19:13.971
For learning Codex and building small to medium apps, ChatGPT plus is the sensible default.
(此句尚無繁中翻譯)
19:13.971–19:20.760
If your current plan is Plus, I would not upgrade until you actually hit Codex limits often enough that the friction matters.
(此句尚無繁中翻譯)
19:20.760–19:26.299
Okay, when heavier or business plans make sense, what to verify live before deciding?
(此句尚無繁中翻譯)
19:26.299–19:33.149
And so, a sensible thing to do would be to try Codex Plus and see if that's enough for your specific use case.
(此句尚無繁中翻譯)
19:33.149–19:38.242
If you're not a heavy Codex user, if you just want to experiment, it should be more than enough.
(此句尚無繁中翻譯)
19:38.242–19:45.470
And then you can decide whether you want to upgrade to the higher tier plans.
(此句尚無繁中翻譯)
19:45.480–19:53.557
Now, before we move into the app building workflow, I want to take a moment to talk about some of the things Codex does that can greatly increase your productivity.
(此句尚無繁中翻譯)
19:53.557–19:57.786
These are features I use all the time across different projects.
(此句尚無繁中翻譯)
19:57.786–20:05.079
Skills, plugins, automations, and MCP along with its tools and connectors.
(此句尚無繁中翻譯)
20:05.079–20:24.270
The best way to think about all that is skills tell Codex how to do a workflow, plugins package capabilities, automations let work happen later, and MCP tools and connectors give Codex controlled access to outside systems.
(此句尚無繁中翻譯)
20:24.280–20:31.296
Once those pieces make sense, Codex feels less like a code editor and more like a project agent.
(此句尚無繁中翻譯)
20:31.296–20:36.819
First, let's talk about one of my favorite features that I use pretty much all the time, skills.
(此句尚無繁中翻譯)
20:36.819–20:42.950
Skills are reusable instructions for how Codex should do a workflow.
(此句尚無繁中翻譯)
20:42.960–20:45.465
They're not external tools by themselves.
(此句尚無繁中翻譯)
20:45.465–20:56.714
They're more like local playbooks that tell Codex the style, process, output format, and validation steps for a specific kind of work.
(此句尚無繁中翻譯)
20:56.714–21:06.790
For example, this course uses skills for explainers, Notion editing, video timelines, and other repeatable production tasks.
(此句尚無繁中翻譯)
21:06.800–21:18.550
Instead of explaining the same rules every time, I can point Codex to the skill and it knows the house style, the workflow, and the mistakes to avoid.
(此句尚無繁中翻譯)
21:18.560–21:19.808
The rule is simple.
(此句尚無繁中翻譯)
21:19.808–21:24.330
Anything that gets used over and over again becomes a skill.
(此句尚無繁中翻譯)
21:24.330–21:28.986
That matters because a lot of real work is not just about getting an answer.
(此句尚無繁中翻譯)
21:28.986–21:39.150
It's about getting an answer in the right format, following the right process, and producing something consistent with the rest of the project.
(此句尚無繁中翻譯)
21:39.160–21:45.390
All right, so here I am in my Codex instance here, and I want to show you some things that you can do with skills.
(此句尚無繁中翻譯)
21:45.400–21:49.190
So, I have here a conversation for an app that I was building.
(此句尚無繁中翻譯)
21:49.200–21:54.923
And if I press the the forward slash, you can see that I have many options here, right?
(此句尚無繁中翻譯)
21:54.923–21:56.550
I can do many, many things.
(此句尚無繁中翻譯)
21:56.560–22:00.049
And as you can see for skills, I have lots and lots of skills.
(此句尚無繁中翻譯)
22:00.049–22:02.997
I have tons and tons of skills over there.
(此句尚無繁中翻譯)
22:02.997–22:07.578
And skills allow me to package a repeatable process.
(此句尚無繁中翻譯)
22:07.578–22:11.075
You can think of it as a function that does something.
(此句尚無繁中翻譯)
22:11.075–22:14.150
It gets some input and it produces an output.
(此句尚無繁中翻譯)
22:14.160–22:18.343
And the goal is to produce consistent output as you've done before.
(此句尚無繁中翻譯)
22:18.343–22:23.242
And so, as an example, let's say if I'm working in this convo here, right?
(此句尚無繁中翻譯)
22:23.242–22:25.960
And I asked the model to do something for me.
(此句尚無繁中翻譯)
22:25.960–22:32.078
So, here I have I want to build a very simple web app that arranges items as a Trello Kanban board style, okay?
(此句尚無繁中翻譯)
22:32.078–22:33.707
And it comes up with this.
(此句尚無繁中翻譯)
22:33.707–22:36.493
Now, right here can package that as a skill.
(此句尚無繁中翻譯)
22:36.493–22:38.990
Now, what do I want to package as a skill?
(此句尚無繁中翻譯)
22:38.990–22:42.876
Well, I want to package, for instance, maybe creating the architecture.
(此句尚無繁中翻譯)
22:42.876–22:52.932
So, I can say something like package the architecture step as a skill, and then I just give it a name of the skill.
(此句尚無繁中翻譯)
22:52.932–22:54.670
Sample arch stack.
(此句尚無繁中翻譯)
22:54.680–22:55.133
Okay?
(此句尚無繁中翻譯)
22:55.133–23:06.478
And that's going to create a repeatable skill that will allow me to generate an architecture for any kind of project that I may be working in the future.
(此句尚無繁中翻譯)
23:06.478–23:13.487
So, I'm going to go ahead and jump into the plan mode in case the model wants to confirm something or clarify something.
(此句尚無繁中翻譯)
23:13.487–23:15.780
And I'm going to go ahead and execute this.
(此句尚無繁中翻譯)
23:15.780–23:17.343
And let's see what happens.
(此句尚無繁中翻譯)
23:17.343–23:22.310
Now, it came back to me and it wants me to answer a question.
(此句尚無繁中翻譯)
23:22.320–23:32.437
Should the sample arch stack package this as a general architecture planning skill or specifically as the Kanban Trello app architecture, right?
(此句尚無繁中翻譯)
23:32.437–23:35.063
So, we want it to be a general app architecture.
(此句尚無繁中翻譯)
23:35.063–23:36.869
So, I'm going to go ahead and save this.
(此句尚無繁中翻譯)
23:36.869–23:39.301
And now it came back with a plan, okay?
(此句尚無繁中翻譯)
23:39.301–23:47.131
Create the reusable Codex skill named sample arch stack under wherever it's storing those skills.
(此句尚無繁中翻譯)
23:47.131–23:51.550
The skill will guide Codex through the architecture step for simple app ideas.
(此句尚無繁中翻譯)
23:51.560–23:54.994
And it's going to package that step into a reusable process.
(此句尚無繁中翻譯)
23:54.994–23:55.580
All right.
(此句尚無繁中翻譯)
23:55.580–23:58.110
And now it tells me that created the skill app.
(此句尚無繁中翻譯)
23:58.120–24:04.270
It contains skill.md and then It contains skill.md and then agents.for.openai.yaml.
(此句尚無繁中翻譯)
24:04.280–24:06.480
Validation passed, etc. etc.
(此句尚無繁中翻譯)
24:06.480–24:21.516
And now what I can do is I can enter a prompt and I can say use this skill for a brand new project management app and it should use this skill to create an architecture stack for this kind of app.
(此句尚無繁中翻譯)
24:21.516–24:27.152
So, it wants to know for the brand new project management app, what should the version one data model support?
(此句尚無繁中翻譯)
24:27.152–24:28.806
We're just going to do local only.
(此句尚無繁中翻譯)
24:28.806–24:30.676
And here it came back with a plan.
(此句尚無繁中翻譯)
24:30.676–24:34.775
Brand new local only project management app architecture, right?
(此句尚無繁中翻譯)
24:34.775–24:36.701
That's the purpose of the skill, okay?
(此句尚無繁中翻譯)
24:36.701–24:41.090
We're going to expand this and it's coming up with this architecture, right?
(此句尚無繁中翻譯)
24:41.090–24:46.710
App shape, data state model, component architecture, test plan, etc.
(此句尚無繁中翻譯)
24:46.720–24:46.970
etc.
(此句尚無繁中翻譯)
24:46.970–24:50.615
And we can say yes and it's going to go ahead and implement all that.
(此句尚無繁中翻譯)
24:50.615–25:02.104
And so, this is actually a fairly valuable skill because that is exactly what you want to be doing in those initial stages when you're building an app, as you're going to see a little bit later.
(此句尚無繁中翻譯)
25:02.104–25:08.510
But, by having the skill, we do not need to explain all of that over and over again.
(此句尚無繁中翻譯)
25:08.520–25:14.280
So, as you're building more and more apps, you can simply reuse this skill from now on.
(此句尚無繁中翻譯)
25:14.280–25:23.830
Now, before moving further, I also want to explain a few terms that can sound similar at first, plugins, automations, and MCP.
(此句尚無繁中翻譯)
25:23.840–25:28.774
They all expand what Codex can do, but they are not the same thing.
(此句尚無繁中翻譯)
25:28.774–25:36.710
Plugins are packaged capabilities or workflows that make Codex better at a specific kind of make Codex better at a specific kind of work.
(此句尚無繁中翻譯)
25:36.720–25:42.818
For example, a Notion plugin can help Codex read and update Notion pages.
(此句尚無繁中翻譯)
25:42.818–25:47.270
A Vercel plugin can help with deploys and project settings.
(此句尚無繁中翻譯)
25:47.280–25:58.030
A Hyperframes plugin can help create explainers, and browser or document tools can help Codex inspect apps or work with files.
(此句尚無繁中翻譯)
25:58.040–26:00.850
The simple way to think about plugins is this.
(此句尚無繁中翻譯)
26:00.850–26:07.430
They give Codex a more specialized tool set for a specific job.
(此句尚無繁中翻譯)
26:07.440–26:18.358
Codex still needs the right context and the right instruction, but the plugin gives it a cleaner way to operate inside that workflow.
(此句尚無繁中翻譯)
26:18.358–26:20.252
Automations are different.
(此句尚無繁中翻譯)
26:20.252–26:22.330
A plugin gives Codex a different.
(此句尚無繁中翻譯)
26:22.330–26:30.190
A plugin gives Codex a capability, but an automation gives Codex a time-based job or follow-up behavior.
(此句尚無繁中翻譯)
26:30.200–26:42.430
That might be a reminder, a recurring check, a scheduled review, or a request to come back to a thread later and continue the work.
(此句尚無繁中翻譯)
26:42.440–26:47.228
This is useful because not every task needs to happen immediately.
(此句尚無繁中翻譯)
26:47.228–27:02.990
Sometimes, you might want Codex to check something again tomorrow, remind you to review an outline, monitor whether a deployment is still working, or wake this thread back up when you need it to continue.
(此句尚無繁中翻譯)
27:03.000–27:11.171
Automations turn Codex from a one-time assistant into something that can help manage longer-running work.
(此句尚無繁中翻譯)
27:11.171–27:13.861
The important distinction is simple.
(此句尚無繁中翻譯)
27:13.861–27:21.188
Plugins are about what Codex can do, and automations are about when Codex should do it.
(此句尚無繁中翻譯)
27:21.188–27:25.922
All right, so here I am back in Codex, and I want to show you how plugins work, right?
(此句尚無繁中翻譯)
27:25.922–27:30.752
So, if you click over here on plugins, you can see all the plugins that you have here, okay?
(此句尚無繁中翻譯)
27:30.752–27:37.372
And so, it it tells you that make Codex work your way, and if you scroll down, you can see all the different plugins, right?
(此句尚無繁中翻譯)
27:37.372–27:40.861
So, you can click on the plugin, and you can learn more about it, right?
(此句尚無繁中翻譯)
27:40.861–27:46.425
So, for instance, this spreadsheets allows you to create and edit spreadsheet files, right?
(此句尚無繁中翻譯)
27:46.425–27:52.730
You can use this plugin to create a spreadsheet to analyze this company's financial, etc., etc., right?
(此句尚無繁中翻譯)
27:52.730–27:59.961
Create, edit, inspect, render, verify, and export Excel SX, CSV, and TSV spreadsheets locally.
(此句尚無繁中翻譯)
27:59.961–28:05.845
Use spreadsheets when the durable output or target is a spreadsheet workbook, etc., etc.
(此句尚無繁中翻譯)
28:05.845–28:08.095
So, this includes the skill, right?
(此句尚無繁中翻譯)
28:08.095–28:20.561
So, you can think of package as kind of an umbrella that includes a skill, but it also gives Codex an ability to to connect to external systems, right?
(此句尚無繁中翻譯)
28:20.561–28:23.764
It's kind of this higher-level structure, okay?
(此句尚無繁中翻譯)
28:23.764–28:27.415
Whereas a skill is a very, very specific thing.
(此句尚無繁中翻譯)
28:27.415–28:29.854
It's a specific piece of instruction.
(此句尚無繁中翻譯)
28:29.854–28:31.644
Essentially, a specific prompt.
(此句尚無繁中翻譯)
28:31.644–28:35.440
A plugin is this umbrella that contains a skill, right?
(此句尚無繁中翻譯)
28:35.440–28:36.603
So, you can have that.
(此句尚無繁中翻譯)
28:36.603–28:39.213
One plugin that I use all the time is Notion.
(此句尚無繁中翻譯)
28:39.213–28:45.162
So, if we click over here, you can see that this actually includes a lot more interesting things, right?
(此句尚無繁中翻譯)
28:45.162–28:51.072
Notion workflows for specs, research, meetings, and knowledge capture, right?
(此句尚無繁中翻譯)
28:51.072–28:54.510
So, you can specify this, and then you can give it a prompt.
(此句尚無繁中翻譯)
28:54.520–29:00.047
And if you scroll down, you can see that it includes the Notion app, the knowledge capture.
(此句尚無繁中翻譯)
29:00.047–29:01.150
These are skills.
(此句尚無繁中翻譯)
29:01.160–29:02.514
This is an app.
(此句尚無繁中翻譯)
29:02.514–29:06.630
Okay, so this allows it to connect to an external system, right?
(此句尚無繁中翻譯)
29:06.640–29:11.917
So, if I click over here, I can manage this in ChatGPT as well, because it's an external app.
(此句尚無繁中翻譯)
29:11.917–29:14.774
And this right here, these are skills, right?
(此句尚無繁中翻譯)
29:14.774–29:18.097
I can open that, and that's going to open the skill right here, right?
(此句尚無繁中翻譯)
29:18.097–29:21.514
This is This is how the skill is actually stored.
(此句尚無繁中翻譯)
29:21.514–29:26.510
And I can also turn it off or turn it on, depending on if I want that skill enabled or not.
(此句尚無繁中翻譯)
29:26.520–29:29.734
Now, this is a plugin that I use all the time, right?
(此句尚無繁中翻譯)
29:29.734–29:36.935
I use Notion for my planning, for, you know, writing stuff, scheduling stuff like that.
(此句尚無繁中翻譯)
29:36.935–29:40.552
It's the brain of my workflow, essentially.
(此句尚無繁中翻譯)
29:40.552–29:51.287
And then I installed this pre-built Notion plugin, and the first time I ran it, it authenticated against my Notion workspace, right?
(此句尚無繁中翻譯)
29:51.287–29:53.112
Connected to my Notion account.
(此句尚無繁中翻譯)
29:53.112–30:10.910
And from then on, I can simply say, "Hey, you know, use this Notion spec to do this, or to do that, or, you know, edit this document, edit that document." And it's able to go out and edit the right documents, and essentially make Notion an extension of
(此句尚無繁中翻譯)
30:10.920–30:11.243
Codex.
(此句尚無繁中翻譯)
30:11.243–30:16.058
That's kind of the purpose of a skill, to make something an extension of Codex.
(此句尚無繁中翻譯)
30:16.058–30:16.557
Right?
(此句尚無繁中翻譯)
30:16.557–30:19.691
And that's the main idea with all of this, right?
(此句尚無繁中翻譯)
30:19.691–30:23.707
Another really cool one is, like, for instance, Google Calendar is another one, right?
(此句尚無繁中翻譯)
30:23.707–30:29.787
Instead of connecting to Notion, or in addition to connecting to Notion, you can also connect to Google Calendar.
(此句尚無繁中翻譯)
30:29.787–30:34.833
I personally do not use Google Calendar, I use Notion, so I do not have this skill set up.
(此句尚無繁中翻譯)
30:34.833–30:41.430
Another really useful skill that you're definitely going to be using if you're building apps is Vercel, right?
(此句尚無繁中翻譯)
30:41.440–30:47.700
Vercel, or maybe something like Netlify for deploying your apps, right?
(此句尚無繁中翻譯)
30:47.700–30:50.692
I use Vercel when demoing apps.
(此句尚無繁中翻譯)
30:50.692–31:06.310
And by having this package installed, it can figure out how to deploy, how to check deployment, how to do everything without me needing to actually understand how all of that works, without me needing to go to to Vercel and read their docs and
(此句尚無繁中翻譯)
31:06.320–31:08.201
understand how to deploy and all of that.
(此句尚無繁中翻譯)
31:08.201–31:17.748
I simply install this skill and then I you know, I click here and now I can say, you know, Vercel, order this repo for Vercel deployment risk.
(此句尚無繁中翻譯)
31:17.748–31:22.099
Or Vercel, which Vercel tools fit fit this app app best.
(此句尚無繁中翻譯)
31:22.099–31:24.886
Or Vercel, deploy this app, right?
(此句尚無繁中翻譯)
31:24.886–31:30.153
And if you scroll down, you can see that this has this app and then it has all of these skills.
(此句尚無繁中翻譯)
31:30.153–31:31.743
All of these different skills.
(此句尚無繁中翻譯)
31:31.743–31:32.342
Look at this.
(此句尚無繁中翻譯)
31:32.342–31:34.399
It has a ton a ton of skills.
(此句尚無繁中翻譯)
31:34.399–31:37.091
Vercel CLI, Vercel agent, all of these.
(此句尚無繁中翻譯)
31:37.091–31:41.786
And obviously, these skills are not just for deploying, right?
(此句尚無繁中翻譯)
31:41.786–31:43.515
Because we also have payments.
(此句尚無繁中翻譯)
31:43.515–31:45.399
We have best practices.
(此句尚無繁中翻譯)
31:45.399–31:47.995
We have all of these other ones.
(此句尚無繁中翻譯)
31:47.995–31:55.230
So, these skills essentially map to different parts of Vercel, to different features of Vercel.
(此句尚無繁中翻譯)
31:55.240–32:01.537
We're not just talking about, you know, deploying your app, because this could be just a skill, deployment, right?
(此句尚無繁中翻譯)
32:01.537–32:03.854
This could be one skill that I may need.
(此句尚無繁中翻譯)
32:03.854–32:06.550
I I may not need all of these other skills.
(此句尚無繁中翻譯)
32:06.560–32:07.332
But why not?
(此句尚無繁中翻譯)
32:07.332–32:14.621
You know, Codex will figure out which skill it needs to consult, you know, according to the prompt that I give it.
(此句尚無繁中翻譯)
32:14.621–32:19.199
So, it doesn't you know, it's not a big deal to have all of these enabled if I'm using Vercel.
(此句尚無繁中翻譯)
32:19.199–32:25.072
And like I said, this allows me to basically bring Vercel into my Codex workflow.
(此句尚無繁中翻譯)
32:25.072–32:27.719
That's the beauty of these plugins, okay?
(此句尚無繁中翻譯)
32:27.719–32:30.048
And that's the same idea with all of these plugins.
(此句尚無繁中翻譯)
32:30.048–32:35.654
You're essentially bringing an external system and letting Codex manage it for you.
(此句尚無繁中翻譯)
32:35.654–32:38.775
Now, automations work very, very differently.
(此句尚無繁中翻譯)
32:38.775–32:47.784
So, if you click on automations here, you can see that automations, they allow you to automate work by setting up scheduled chats, okay?
(此句尚無繁中翻譯)
32:47.784–32:49.259
And you can learn more here.
(此句尚無繁中翻譯)
32:49.259–32:54.174
Now, if you click on any of these automations, you can see exactly how they're going to be working.
(此句尚無繁中翻譯)
32:54.174–33:02.963
So, if I click on something like summarize yesterday's Git activity for standup, you can see that it wants to create an automation for me, okay?
(此句尚無繁中翻譯)
33:02.963–33:05.147
And what exactly is it trying to do?
(此句尚無繁中翻譯)
33:05.147–33:11.392
Well, it's essentially trying to create a essentially trying to create a conversation that will be repeatable, okay?
(此句尚無繁中翻譯)
33:11.392–33:12.903
So, it creates this automation.
(此句尚無繁中翻譯)
33:12.903–33:15.370
This is the name of the automation, right?
(此句尚無繁中翻譯)
33:15.370–33:16.463
This is the prompt.
(此句尚無繁中翻譯)
33:16.463–33:18.294
This right here is the prompt.
(此句尚無繁中翻譯)
33:18.294–33:24.614
And the prompt is summarize yesterday's Git activity for standup, grounding rules, etc., etc.
(此句尚無繁中翻譯)
33:24.614–33:26.358
We can select a work tree.
(此句尚無繁中翻譯)
33:26.358–33:28.597
We can select a project here.
(此句尚無繁中翻譯)
33:28.597–33:35.109
And then we can select the time where it's going to run over and over again, right?
(此句尚無繁中翻譯)
33:35.109–33:39.907
So, with this kind of automation, you may want to run it on weekdays at 9:00 a.m.
(此句尚無繁中翻譯)
33:39.907–33:45.508
But, you can also select it, make it hourly, daily, weekly, etc., etc.
(此句尚無繁中翻譯)
33:45.508–33:48.642
And you can also change the time, obviously.
(此句尚無繁中翻譯)
33:48.642–33:53.780
Now, here you can change the model, and here you can change the reasoning level.
(此句尚無繁中翻譯)
33:53.780–33:57.264
Now, with this kind of automation, you don't really need a high reasoning.
(此句尚無繁中翻譯)
33:57.264–33:59.177
Medium is going to be just fine.
(此句尚無繁中翻譯)
33:59.177–34:08.149
And after you're done, you can simply click create, and now you're going to have an automation that will run every weekday at 9:00 a.m.
(此句尚無繁中翻譯)
34:08.159–34:09.214
running this prompt.
(此句尚無繁中翻譯)
34:09.214–34:11.627
And And remember, this is a special prompt.
(此句尚無繁中翻譯)
34:11.627–34:14.666
Here, you're asking it to consult Git activity.
(此句尚無繁中翻譯)
34:14.666–34:26.742
And so, the idea is you may have, you know, Git connected via a plugin or something else, and it's going to connect to your Git environment, and then figure something out for you.
(此句尚無繁中翻譯)
34:26.742–34:30.225
And that's going to run every weekday at 9:00 a.m., right?
(此句尚無繁中翻譯)
34:30.225–34:41.864
So, instead of you needing to, you know, jump into Codox first thing weekday morning and execute this prompt manually, you can create an automation to do just that.
(此句尚無繁中翻譯)
34:41.864–34:44.762
If you scroll down, you can see some other automations here.
(此句尚無繁中翻譯)
34:44.762–34:47.923
You have incidents, you have code quality, right?
(此句尚無繁中翻譯)
34:47.923–34:51.813
Maybe you want to run a code quality check every 24 hours.
(此句尚無繁中翻譯)
34:51.813–34:55.884
Well, you can click here daily at 9:00 a.m., right?
(此句尚無繁中翻譯)
34:55.884–35:04.273
Scan recent commits since the last run or last 24 hours for likely bugs and propose minimal fixes.
(此句尚無繁中翻譯)
35:04.273–35:09.071
Okay, that's another very, very useful automation, right?
(此句尚無繁中翻譯)
35:09.071–35:10.498
Repo maintenance.
(此句尚無繁中翻譯)
35:10.498–35:14.030
You have here growth and exploration, right?
(此句尚無繁中翻譯)
35:14.040–35:19.780
Click here from recent PRs and reviews, suggest next skills to deepen.
(此句尚無繁中翻譯)
35:19.780–35:21.331
This is great, right?
(此句尚無繁中翻譯)
35:21.331–35:24.988
So, automations, they could be used for pretty much anything, right?
(此句尚無繁中翻譯)
35:24.988–35:28.225
And they are, you know, it doesn't really matter what kind of niche you're in.
(此句尚無繁中翻譯)
35:28.225–35:33.201
You don't need to be in software development or project management or anything like that.
(此句尚無繁中翻譯)
35:33.201–35:34.747
You can be a writer, right?
(此句尚無繁中翻譯)
35:34.747–35:35.753
You want a status.
(此句尚無繁中翻譯)
35:35.753–35:38.026
You're writing maybe 1,000 words every day.
(此句尚無繁中翻譯)
35:38.026–35:51.120
You know, you can have an automation that checks for spelling, grammar errors that you may have done, and then it may suggest some fixes and also another automation that gives you more ideas, you know, to break through writer's block.
(此句尚無繁中翻譯)
35:51.120–35:55.609
And that can run every morning at 9:00 or 10:00 a.m., okay?
(此句尚無繁中翻譯)
35:55.609–36:03.993
And so, automations are very, very useful if you need some kind of a repeatable structure in your workflows.
(此句尚無繁中翻譯)
36:03.993–36:07.533
And I want to talk a little bit about MCP.
(此句尚無繁中翻譯)
36:07.533–36:12.675
So, MCP or model context protocol is very, very important, okay?
(此句尚無繁中翻譯)
36:12.675–36:18.435
So, if you press command comma or you go into settings over here, you're going to be on this screen.
(此句尚無繁中翻譯)
36:18.435–36:28.035
And if you choose MCP servers, you're going to see all your MCP servers that you have here configured, and you can also see whether they're enabled or not.
(此句尚無繁中翻譯)
36:28.035–36:31.274
Now, an MCP server is basically a server.
(此句尚無繁中翻譯)
36:31.274–36:36.025
It's a remote system that your Codex instance can connect to.
(此句尚無繁中翻譯)
36:36.025–36:40.673
So, as you can see, I have a bunch of MCP servers here that do all kinds of interesting things.
(此句尚無繁中翻譯)
36:40.673–36:45.014
For instance, I have here a Stitch MCP server configured.
(此句尚無繁中翻譯)
36:45.014–36:48.022
I have here a Superbase MCP server.
(此句尚無繁中翻譯)
36:48.022–36:54.177
I also have, you know, Flow Upload Designer, Flow Base, a bunch of apps that support MCP.
(此句尚無繁中翻譯)
36:54.177–36:59.572
And when you connect to them, Codex is acting like an MCP client.
(此句尚無繁中翻譯)
36:59.572–37:03.056
So, you have that same client-server paradigm.
(此句尚無繁中翻譯)
37:03.056–37:09.103
Now, why would you want to use an MCP server to connect to something like Superbase or something else?
(此句尚無繁中翻譯)
37:09.103–37:11.705
Well, the reason is very simple.
(此句尚無繁中翻譯)
37:11.705–37:16.935
You want Codex to do all the administration, all the work for you, right?
(此句尚無繁中翻譯)
37:16.935–37:27.384
So, if you're building an app using something like Superbase, and we're going to touch upon that a little bit later in the video, you can set up Superbase yourself.
(此句尚無繁中翻譯)
37:27.384–37:28.846
You can configure all of that.
(此句尚無繁中翻譯)
37:28.846–37:31.436
That takes time, but it's, you know, it's very, very doable.
(此句尚無繁中翻譯)
37:31.436–37:38.633
Or, you can simply configure a Superbase MCP server in your Codex instance.
(此句尚無繁中翻譯)
37:38.633–37:49.879
And that will allow Codex to use that MCP server to essentially manage this remote server, this tool, this app for you.
(此句尚無繁中翻譯)
37:49.879–38:05.470
And as you're going to see a little bit later in this tutorial, this is very, very helpful to us because it saves a lot of time and it enables things that we couldn't really do before because now Codex understands One Piece and via MCP
(此句尚無繁中翻譯)
38:05.480–38:21.390
it can get more contacts and create a much more robust app for you or a tool for you or anything else, a system, if you will, because now it can connect to other remote systems and essentially consult that data with the data we
(此句尚無繁中翻譯)
38:21.400–38:27.968
already have, such as the code or things it has been working on, and figure out a unified solution.
(此句尚無繁中翻譯)
38:27.968–38:30.812
And this is extremely helpful to us, okay?
(此句尚無繁中翻譯)
38:30.812–38:33.882
And so, there's a couple of ways that you can add a server.
(此句尚無繁中翻譯)
38:33.882–38:37.140
You can click here, and you can fill all of this manually.
(此句尚無繁中翻譯)
38:37.140–38:43.993
Or, you can simply tell Codex, "Set up and activate a Supabase MCP server." It's going to figure out how to do that.
(此句尚無繁中翻譯)
38:43.993–38:45.047
It's going to search for it.
(此句尚無繁中翻譯)
38:45.047–38:48.566
It's going to figure out the specs, and it's going to set it up for you.
(此句尚無繁中翻譯)
38:48.566–38:50.632
And the same thing for all of these other ones.
(此句尚無繁中翻譯)
38:50.632–38:54.624
Now, after setting up the MCP server, you can simply tell Codex to use it.
(此句尚無繁中翻譯)
38:54.624–39:15.990
So, I can say something like, "Use the Supabase MCP server to query data, or check how many tables we have, or pretty much anything else." And it's going to go ahead and connect to your Supabase instance in this example via the configured MCP server.
(此句尚無繁中翻譯)
39:16.000–39:23.730
Now that we have laid the foundation, and before we start building the real app, let's talk about the ideal Codex workflow.
(此句尚無繁中翻譯)
39:23.730–39:26.143
What is the best way to approach it?
(此句尚無繁中翻譯)
39:26.143–39:32.868
Before we begin building our app, you want to establish the workflow that you're going to use again and again.
(此句尚無繁中翻譯)
39:32.868–39:34.896
The loop is simple.
(此句尚無繁中翻譯)
39:34.896–39:39.081
Inspect, plan, edit, verify, and report.
(此句尚無繁中翻譯)
39:39.081–39:49.033
That sounds basic, but it is the difference between using Codex as a random code generator and using Codex as a controlled build partner.
(此句尚無繁中翻譯)
39:49.033–40:00.470
The mistake a lot of people make is that they jump straight to "Build this app." or "Fix this problem." without giving the agent a clean process.
(此句尚無繁中翻譯)
40:00.480–40:06.390
That can work for small tasks, but it breaks down quickly on real projects.
(此句尚無繁中翻譯)
40:06.400–40:19.997
For a serious build, you want Codex to understand the repo first, explain the plan, make a focused change, verify the result, and then report back in a way that you can re-review.
(此句尚無繁中翻譯)
40:19.997–40:22.830
A good Codex prompt is not just a request.
(此句尚無繁中翻譯)
40:22.830–40:24.820
It is a small project brief.
(此句尚無繁中翻譯)
40:24.820–40:34.663
The better the prompt is, the easier it is for Codex to understand the current state, choose the right amount of work, and verify the result.
(此句尚無繁中翻譯)
40:34.663–40:36.990
The basic structure is simple.
(此句尚無繁中翻譯)
40:37.000–40:48.087
Explain the goal, give the relevant context, define what should change, define what should not change, and tell Codex how to verify the work.
(此句尚無繁中翻譯)
40:48.087–40:56.051
If the task is risky or unclear, ask Codex to inspect first and make a plan before editing.
(此句尚無繁中翻譯)
40:56.051–41:13.030
For instance, instead of saying "Build the app," I would say, "Inspect the project first, do not edit yet, identify the existing structure, propose the smallest first version, list the files you expect to touch, and explain
(此句尚無繁中翻譯)
41:13.040–41:17.867
how you will verify." That gives Codex a much cleaner job.
(此句尚無繁中翻譯)
41:17.867–41:30.750
For implementation prompts, I want the request to be specific enough that Codex can act, but not so over-specified that I accidentally force the wrong solution.
(此句尚無繁中翻譯)
41:30.760–41:37.779
I usually describe the outcome I want, the constraints I care about, and the checks that need to pass.
(此句尚無繁中翻譯)
41:37.779–41:43.187
Then Codex can use the actual project context to choose the cleanest path.
(此句尚無繁中翻譯)
41:43.187–41:50.151
As part of this workflow, I want to introduce you to one of the most important Codex features, plan mode.
(此句尚無繁中翻譯)
41:50.151–41:56.630
Plan mode is a superpower that I use for 80 to 90% of my prompts.
(此句尚無繁中翻譯)
41:56.640–42:00.190
There are two main benefits to using the plan mode.
(此句尚無繁中翻譯)
42:00.200–42:07.277
First, it's a form of brainstorming where the model cannot change or alter your files.
(此句尚無繁中翻譯)
42:07.277–42:14.285
Second, it's a way for the model to clarify your requests by asking follow-up questions.
(此句尚無繁中翻譯)
42:14.285–42:18.122
This is especially useful when the request is under specified.
(此句尚無繁中翻譯)
42:18.122–42:24.342
If I say, "Build the booking flow." there are a lot of hidden decisions inside that request.
(此句尚無繁中翻譯)
42:24.342–42:26.809
What fields does the form need?
(此句尚無繁中翻譯)
42:26.809–42:29.734
What status should the booking start with?
(此句尚無繁中翻譯)
42:29.734–42:32.457
Where should the booking appear for the helper?
(此句尚無繁中翻譯)
42:32.457–42:35.519
What should happen after submission?
(此句尚無繁中翻譯)
42:35.519–42:42.384
Plan mode gives Codex a chance to surface those questions before it edits the app.
(此句尚無繁中翻譯)
42:42.384–42:45.451
I also use plan mode as a quality filter.
(此句尚無繁中翻譯)
42:45.451–42:53.656
If the plan is vague, too large, or misses something important, I know the implementation will probably be messy.
(此句尚無繁中翻譯)
42:53.656–43:02.036
If the plan is specific, scoped, and easy to verify, then the actual coding step becomes much safer.
(此句尚無繁中翻譯)
43:02.036–43:15.224
So, you want to use plan mode initially while brainstorming and also as you enhance your app because it gives the model a chance to ask follow-up questions to ensure there's no misunderstanding.
(此句尚無繁中翻譯)
43:15.224–43:21.561
Now, if you're working with an existing repo, the first step should always be to inspect.
(此句尚無繁中翻譯)
43:21.561–43:30.150
Codex should understand the files, the app structure, the current state, and the goal before changing anything.
(此句尚無繁中翻譯)
43:30.160–43:34.996
Then it should plan the work in a way that is small enough to review.
(此句尚無繁中翻譯)
43:34.996–43:42.081
Only then, once Codex is fully in sync with your goals, should it make the actual edits and write code.
(此句尚無繁中翻譯)
43:42.081–43:49.992
Once the code is written, it should verify the code with the browser, terminal, using tests, or the build output.
(此句尚無繁中翻譯)
43:49.992–43:55.515
And finally, it should report what changed and what still needs attention.
(此句尚無繁中翻譯)
43:55.515–43:58.668
Verification is the part I want to emphasize.
(此句尚無繁中翻譯)
43:58.668–44:03.310
A task is not finished just because Codex wrote code.
(此句尚無繁中翻譯)
44:03.320–44:06.070
For UI work, I want to see the browser.
(此句尚無繁中翻譯)
44:06.080–44:12.204
For back-end work, I want to see the function call, the dashboard row, or the test results.
(此句尚無繁中翻譯)
44:12.204–44:17.990
For deployment work, I want the live URL and a real smoke test.
(此句尚無繁中翻譯)
44:18.000–44:25.159
That habit keeps the workflow grounded in evidence instead of trusting that the code is probably fine.
(此句尚無繁中翻譯)
44:25.159–44:30.186
Additionally, you always want to break big tasks into smaller one.
(此句尚無繁中翻譯)
44:30.186–44:46.510
Instead of asking Codex to build the whole marketplace as one prompt, you want to ask it to plan the app, build the first UI shell, wire one initial database backed version, add the booking flow, add the helper dashboard,
(此句尚無繁中翻譯)
44:46.520–44:47.870
and so on.
(此句尚無繁中翻譯)
44:47.880–44:53.584
Each step has a clear target and a clear way to check whether it worked.
(此句尚無繁中翻譯)
44:53.584–44:58.264
A good Codex task should usually fit into one reviewable outcome.
(此句尚無繁中翻譯)
44:58.264–45:02.745
Create the first static marketplace homepage is reviewable.
(此句尚無繁中翻譯)
45:02.745–45:07.182
Wire service listings from Convex is reviewable.
(此句尚無繁中翻譯)
45:07.182–45:12.473
Add booking creation and verify the booking row appears is reviewable.
(此句尚無繁中翻譯)
45:12.473–45:19.950
Build the whole app is not reviewable because there are too many decisions happening at once.
(此句尚無繁中翻譯)
45:19.960–45:23.178
So, the workflow is not just a technical process.
(此句尚無繁中翻譯)
45:23.178–45:26.374
It is also a way to stay in control.
(此句尚無繁中翻譯)
45:26.374–45:39.688
We let Codex do meaningful work, but we keep the work divided into chunks where we can understand the change, approve the direction, and catch problems before they spread.
(此句尚無繁中翻譯)
45:39.688–45:46.520
And so, here I am back in Codex, and you can enable plan mode by pressing shift tab, and here you have plan mode.
(此句尚無繁中翻譯)
45:46.520–45:49.062
Or, you can click here and toggle this.
(此句尚無繁中翻譯)
45:49.062–45:53.830
I typically just use shift tab cuz it's a lot easier and it's a lot faster.
(此句尚無繁中翻譯)
45:53.840–45:57.300
And then, whenever I'm in plan mode, I can start brainstorming.
(此句尚無繁中翻譯)
45:57.300–46:14.750
And not only that, it's useful because Codex will not make changes whenever it's in plan mode, and it also gives Codex to come back to you with follow-up clarifying questions, and I find that super super helpful because we always want to make sure that
(此句尚無繁中翻譯)
46:14.760–46:17.214
Codex knows exactly what it's doing.
(此句尚無繁中翻譯)
46:17.214–46:18.465
We Codex knows exactly what it's doing.
(此句尚無繁中翻譯)
46:18.465–46:23.031
We never the last thing that we want is for Codex to assume something.
(此句尚無繁中翻譯)
46:23.031–46:25.305
We never want it to assume anything.
(此句尚無繁中翻譯)
46:25.305–46:28.683
We always want to make sure that we are on the same page.
(此句尚無繁中翻譯)
46:28.683–46:33.466
And so, let's say I have a command over here going, and I want to build an architecture.
(此句尚無繁中翻譯)
46:33.466–46:37.350
I want to build some kind of a an intricate architecture.
(此句尚無繁中翻譯)
46:37.360–46:41.641
And, you know, I I want to make sure that we built out an architecture.
(此句尚無繁中翻譯)
46:41.641–46:49.603
I may not know exactly how far I want to go, exactly all the details, but I want to make sure that Codex is on the same page.
(此句尚無繁中翻譯)
46:49.603–47:02.470
So, I can say something like, "Come up with an architecture that will allow me to create both web and mobile and desktop versions of the app.
(此句尚無繁中翻譯)
47:02.480–47:06.109
Ensure it is fast and robust.
(此句尚無繁中翻譯)
47:06.109–47:06.735
Okay?
(此句尚無繁中翻譯)
47:06.735–47:13.054
I'm here in plan mode, and typically with this kind of prompt, it's not clear what I want.
(此句尚無繁中翻譯)
47:13.054–47:14.657
I don't even know what I want.
(此句尚無繁中翻譯)
47:14.657–47:19.567
I want Codex to figure it out, but I want Codex to come back to me and confirm with me.
(此句尚無繁中翻譯)
47:19.567–47:24.292
And so, if we execute this prompt, hopefully it's going to ask me some follow-up questions.
(此句尚無繁中翻譯)
47:24.292–47:24.921
Let's see.
(此句尚無繁中翻譯)
47:24.921–47:35.006
And so, as expected, Codex came back with a question, "Which cross-platform strategy should the architecture optimize for?" And there are two questions, okay?
(此句尚無繁中翻譯)
47:35.006–47:40.866
Do we want shared core native shells, and you can click here, and you can get a little detail.
(此句尚無繁中翻譯)
47:40.866–47:45.976
You share TypeScript domain logic with separate Expo mobile, etc.
(此句尚無繁中翻譯)
47:45.976–47:51.849
Do we want a one universal app, or do we want web first wrappers, right?
(此句尚無繁中翻譯)
47:51.849–48:00.698
Because I asked for a cross-platform product, but there's many ways of doing it, and there's many trade-offs with each approach.
(此句尚無繁中翻譯)
48:00.698–48:06.341
And so, it came back to me, and it wants to clarify one universal app, this or that.
(此句尚無繁中翻譯)
48:06.341–48:07.807
So, I'm going to say this one.
(此句尚無繁中翻譯)
48:07.807–48:09.801
I'm going to I'm going to go with recommended.
(此句尚無繁中翻譯)
48:09.801–48:14.517
And now, it wants to know what should the app support for data and reliability.
(此句尚無繁中翻譯)
48:14.517–48:19.389
Offline first cloud sync, cloud only real-time, or local only.
(此句尚無繁中翻譯)
48:19.389–48:24.141
And you can click and you can hover over the little I to get more details.
(此句尚無繁中翻譯)
48:24.141–48:28.634
Users can can work offline and sync across devices.
(此句尚無繁中翻譯)
48:28.634–48:33.657
Cloud only, simpler shared back and live updates, but weaker offline behavior.
(此句尚無繁中翻譯)
48:33.657–48:36.023
Now, here you can also tell Codex something else.
(此句尚無繁中翻譯)
48:36.023–48:38.910
You can say, "Well, I want this, this, this, this."
(此句尚無繁中翻譯)
48:38.920–48:39.380
Right?
(此句尚無繁中翻譯)
48:39.380–48:44.716
Or, you can press escape, and you can ask Codex to explain the question.
(此句尚無繁中翻譯)
48:44.716–48:50.270
I can say something like this, "Explain the last question in simple terms."
(此句尚無繁中翻譯)
48:50.280–48:50.573
Okay?
(此句尚無繁中翻譯)
48:50.573–48:52.742
I don't need to answer it right away.
(此句尚無繁中翻譯)
48:52.742–48:55.858
I can get Codex to kind of walk me through it, right?
(此句尚無繁中翻譯)
48:55.858–48:56.995
Explain the last question.
(此句尚無繁中翻譯)
48:56.995–48:58.108
Let's see what it says.
(此句尚無繁中翻譯)
48:58.108–49:00.430
I was asking two choices.
(此句尚無繁中翻譯)
49:00.440–49:02.050
How should data work?
(此句尚無繁中翻譯)
49:02.050–49:07.062
My recommendation, shared code and native shells plus offline first cloud sync.
(此句尚無繁中翻譯)
49:07.062–49:09.229
If you want this to become a serious app.
(此句尚無繁中翻譯)
49:09.229–49:10.690
So, it tells you these things.
(此句尚無繁中翻譯)
49:10.690–49:14.937
And so, you don't need to pick a pick a choice or tell it something else.
(此句尚無繁中翻譯)
49:14.937–49:19.950
You can close that, and you can ask Codex to clarify.
(此句尚無繁中翻譯)
49:19.960–49:23.874
And now, what we can do is ask me those questions again.
(此句尚無繁中翻譯)
49:23.874–49:26.604
You can do that, or you can simply answer it here.
(此句尚無繁中翻譯)
49:26.604–49:27.248
It doesn't matter.
(此句尚無繁中翻譯)
49:27.248–49:29.918
So, if you do that, it's going to come back with that question here again.
(此句尚無繁中翻譯)
49:29.918–49:31.171
And here are the questions.
(此句尚無繁中翻譯)
49:31.171–49:37.225
I'm going to say this, and now I want to say this because I I I understood what it was asking me.
(此句尚無繁中翻譯)
49:37.225–49:37.738
Got it.
(此句尚無繁中翻譯)
49:37.738–49:45.870
Your choices are that means the architecture should prioritize a shared TypeScript app a brand used by this, this, this, this.
(此句尚無繁中翻譯)
49:45.880–49:46.614
And that's good.
(此句尚無繁中翻譯)
49:46.614–49:49.906
And now, I can exit the plan mode, and I can say, "Go ahead and do it.
(此句尚無繁中翻譯)
49:49.906–49:53.830
Go and implement this." Something like this or something more specific.
(此句尚無繁中翻譯)
49:53.840–50:05.310
And so, plan mode is something that I use all the time, and you should definitely make it an integral part of your workflow as well.
(此句尚無繁中翻譯)
50:05.320–50:08.910
Now, I want to talk to you about some advanced Codex workflow techniques.
(此句尚無繁中翻譯)
50:08.920–50:16.149
These are the little tips and tricks that I use all the time and will greatly help you when using Codex to to build apps and solve problems.
(此句尚無繁中翻譯)
50:16.149–50:21.550
One thing I do all the time is asking Codex to create a handoff before I start a new thread.
(此句尚無繁中翻譯)
50:21.560–50:31.208
This is useful when a thread has gotten long, when the context has been compacted, or when I want to move from planning to implementation with a cleaner workspace.
(此句尚無繁中翻譯)
50:31.208–50:33.694
A good handoff is not a vague summary.
(此句尚無繁中翻譯)
50:33.694–50:42.976
I want the current state, the files that changed, the commands that were run, what still needs to happen, and any risks or open decisions.
(此句尚無繁中翻譯)
50:42.976–50:50.135
That way, the next Codex thread can pick up the work without rereading the entire conversation or repeating mistakes.
(此句尚無繁中翻譯)
50:50.135–50:53.630
And there are two main reasons that you may want to do that.
(此句尚無繁中翻譯)
50:53.630–50:59.975
The first reason is that after a while, this conversation here, this it starts to degrade.
(此句尚無繁中翻譯)
50:59.975–51:06.096
As you keep typing new prompts, and as the model answers, the convo starts to degrade.
(此句尚無繁中翻譯)
51:06.096–51:12.178
Now, Codex tells you that it automatically compacts its context, and that is true.
(此句尚無繁中翻譯)
51:12.178–51:16.230
You do not need to start a new convo every time.
(此句尚無繁中翻譯)
51:16.230–51:18.726
It it does automatically compact it.
(此句尚無繁中翻譯)
51:18.726–51:29.190
But, you're going to notice that as your conversations get long and you keep asking questions and it keeps answering, quality of the responses will degrade.
(此句尚無繁中翻譯)
51:29.200–51:43.270
And moreover, you know, your conversation is going to get fairly long, and that might, you know, degrade the performance of the app itself. right there is a good use case to create a brand new convo using the handoff as the
(此句尚無繁中翻譯)
51:43.280–51:44.216
starting point.
(此句尚無繁中翻譯)
51:44.216–51:55.073
Another really, really good reason to create a new convo with a handoff is when you're trying to solve a problem but the model is not getting you the solution that you want.
(此句尚無繁中翻譯)
51:55.073–52:03.882
And so if you're trying to solve a particular problem and you've prompted the model a couple of ways and it's trying it's giving you answers but those answers are not ideal.
(此句尚無繁中翻譯)
52:03.882–52:05.989
It doesn't give you the right algorithm.
(此句尚無繁中翻譯)
52:05.989–52:07.861
It doesn't give you the right solution.
(此句尚無繁中翻譯)
52:07.861–52:12.907
There's a high chance that each additional prompt is not going to get you closer to a solution.
(此句尚無繁中翻譯)
52:12.907–52:25.870
So when you experience something like that the best thing that you can do would be starting over by creating a new conversation and giving the model a handoff with the things that it has done and the things that that are not working
(此句尚無繁中翻譯)
52:25.880–52:32.226
and where you are right now and telling the model as part of that handoff prompt to work on a different solution.
(此句尚無繁中翻譯)
52:32.226–52:40.270
And because AI is is can be fairly random in some ways, creating a new conversation usually give you a different solution.
(此句尚無繁中翻譯)
52:40.280–52:41.925
That solution might actually work.
(此句尚無繁中翻譯)
52:41.925–52:49.164
Now there are various ways to create this handoff prompt that's going to give you a handoff for a new conversation.
(此句尚無繁中翻譯)
52:49.164–52:53.394
One of the simplest ways would be by typing something like this.
(此句尚無繁中翻譯)
52:53.394–52:59.870
Okay, this is a very very simple prompt that still delivers a fairly high quality handoff.
(此句尚無繁中翻譯)
52:59.880–53:06.412
Okay, so you can type create a detailed handoff prompt that I can use for a new Codex convo.
(此句尚無繁中翻譯)
53:06.412–53:06.800
Okay.
(此句尚無繁中翻譯)
53:06.800–53:11.674
So let's go ahead and send this and see what what answer we get.
(此句尚無繁中翻譯)
53:11.674–53:11.964
Right.
(此句尚無繁中翻譯)
53:11.964–53:13.585
And this is the response we got.
(此句尚無繁中翻譯)
53:13.585–53:18.030
I want to design a fast robust cross platform project management app.
(此句尚無繁中翻譯)
53:18.040–53:22.120
So it's essentially summarizing everything that has happened in the convo, right?
(此句尚無繁中翻譯)
53:22.120–53:23.412
This is the context.
(此句尚無繁中翻譯)
53:23.412–53:24.812
This is the product direction.
(此句尚無繁中翻譯)
53:24.812–53:26.728
This is the architecture preference.
(此句尚無繁中翻譯)
53:26.728–53:31.708
Please produce a detailed architecture plan covering all this important, right?
(此句尚無繁中翻譯)
53:31.708–53:32.769
Also some constraints.
(此句尚無繁中翻譯)
53:32.769–53:38.687
And so what you can do is you can copy that and then you can go ahead and create a brand new convo.
(此句尚無繁中翻譯)
53:38.687–53:41.901
For instance, you can click here and you can simply paste it.
(此句尚無繁中翻譯)
53:41.901–53:44.217
Okay, well you you don't want to delete that.
(此句尚無繁中翻譯)
53:44.217–53:45.961
You want to delete like the top.
(此句尚無繁中翻譯)
53:45.961–53:47.459
You want to delete that.
(此句尚無繁中翻譯)
53:47.459–53:55.104
And when you paste it, that's going to create a conversation and the model can simply continue where the other conversation.
(此句尚無繁中翻譯)
53:55.104–53:56.626
That is one way to do it.
(此句尚無繁中翻譯)
53:56.626–54:01.911
Another way to do it is by giving it a more detailed handoff prompt.
(此句尚無繁中翻譯)
54:01.911–54:06.390
So, let's go back here and let's go ahead and give it a slightly different prompt.
(此句尚無繁中翻譯)
54:06.400–54:09.593
Create a clean handoff for a new Codex thread.
(此句尚無繁中翻譯)
54:09.593–54:10.830
Include all of this.
(此句尚無繁中翻譯)
54:10.830–54:12.477
Do not make any changes.
(此句尚無繁中翻譯)
54:12.477–54:18.522
So, this prompt is slightly more detailed and you can bet that it's going to give you a higher quality handoff.
(此句尚無繁中翻譯)
54:18.522–54:26.223
Okay, so let's go ahead and run this and then we can compare the two handoffs and see which one is more detailed.
(此句尚無繁中翻譯)
54:26.223–54:28.782
Now, take a look at this handoff right here.
(此句尚無繁中翻譯)
54:28.782–54:34.234
Look at how much more detailed this handoff versus this handoff right here.
(此句尚無繁中翻譯)
54:34.234–54:39.126
Now, this handoff would definitely work, but this handoff would work even better.
(此句尚無繁中翻譯)
54:39.126–54:42.041
Going to result in a higher quality conversation.
(此句尚無繁中翻譯)
54:42.041–54:56.990
Okay, so given an option, you can certainly use a prompt such as this, but it's a lot better to use something like this that's more detailed and it's going to save you a lot of time in the long run.
(此句尚無繁中翻譯)
54:57.000–55:01.605
The next practical habit is using Git as a checkpoint system.
(此句尚無繁中翻譯)
55:01.605–55:06.550
Before I let Codex do meaningful work, I want to know whether the current state is clean.
(此句尚無繁中翻譯)
55:06.560–55:11.950
After each milestone, I want a diff that is small enough to review and explain.
(此句尚無繁中翻譯)
55:11.960–55:17.746
That is what keeps an agentic workflow from turning into one giant mystery edit.
(此句尚無繁中翻譯)
55:17.746–55:22.326
The useful trick is to make Codex summarize the diff in plain English.
(此句尚無繁中翻譯)
55:22.326–55:33.939
I do not only want to know what files change, I want to know why they changed, whether each change belongs to the task, and whether anything looks unrelated before I accept it or move on.
(此句尚無繁中翻譯)
55:33.939–55:42.990
So, when you are working in Codex, you do not want to be just creating edits without recording what the edit is all about.
(此句尚無繁中翻譯)
55:43.000–55:48.782
And in software development, you want to be using a source control system, such as Git.
(此句尚無繁中翻譯)
55:48.782–55:56.190
We have here a convo where we were building an app, and in this particular instance, we did not use Git.
(此句尚無繁中翻譯)
55:56.200–56:01.752
And so, I do not know, I have no way to check which changes were made where.
(此句尚無繁中翻譯)
56:01.752–56:04.317
I have no way to revert the changes.
(此句尚無繁中翻譯)
56:04.317–56:08.115
I have no way to see what the actual change represents.
(此句尚無繁中翻譯)
56:08.115–56:14.232
And if working in, you know, bigger teams, I do not know who was the person responsible for the change.
(此句尚無繁中翻譯)
56:14.232–56:16.980
Now, in this convo, we have another problem, okay?
(此句尚無繁中翻譯)
56:16.980–56:19.368
The current working directory is missing.
(此句尚無繁中翻譯)
56:19.368–56:32.477
And so, in this case, what we can do is we can take a handoff prompt, and we can create a brand new project, insert that handoff prompt, start a new convo, and then enabled Git, and set up so that we have Git control.
(此句尚無繁中翻譯)
56:32.477–56:33.799
So, I'm going to go over here.
(此句尚無繁中翻譯)
56:33.799–56:35.506
I'm just going to do start from scratch.
(此句尚無繁中翻譯)
56:35.506–56:39.810
I'm going to paste this handoff prompt to start a brand new convo.
(此句尚無繁中翻譯)
56:39.810–56:45.473
And I'm going to preface it by telling it to create a Git repository.
(此句尚無繁中翻譯)
56:45.473–56:51.934
Create a Git repo if it doesn't exist, and do an initial commit with the code.
(此句尚無繁中翻譯)
56:51.934–56:53.775
So, I'm going to run that.
(此句尚無繁中翻譯)
56:53.775–57:00.070
And the idea is we are going to initialize Git if needed, and then commit the current code as is.
(此句尚無繁中翻譯)
57:00.080–57:00.552
All right.
(此句尚無繁中翻譯)
57:00.552–57:06.750
So, what it did was it initialized a Git repo in this directory, and made an initial commit.
(此句尚無繁中翻譯)
57:06.760–57:08.990
Initial architecture plan here, okay?
(此句尚無繁中翻譯)
57:09.000–57:10.784
The workspace was empty when I inspected.
(此句尚無繁中翻譯)
57:10.784–57:11.897
There was nothing there.
(此句尚無繁中翻譯)
57:11.897–57:16.160
We just created a brand new project, and it essentially created an architecture.
(此句尚無繁中翻譯)
57:16.160–57:23.430
And so, at this point, we have here a Git repo, which means that each additional change will be automatically tracked.
(此句尚無繁中翻譯)
57:23.440–57:32.832
So, for instance, I can say something like, "Make the smallest possible change, a route that displays 'Hello, world.'" Okay?
(此句尚無繁中翻譯)
57:32.832–57:34.258
Let's go ahead and run that.
(此句尚無繁中翻譯)
57:34.258–57:36.343
So, it now created this index.html.
(此句尚無繁中翻譯)
57:36.343–57:39.203
We're going to open it, and it says hello world.
(此句尚無繁中翻譯)
57:39.203–57:44.852
And so, now what we can do is we can say check the Git status.
(此句尚無繁中翻譯)
57:44.852–57:49.270
And obviously, this file is not going to be in our Git, right?
(此句尚無繁中翻譯)
57:49.270–57:52.310
You see this is not tracked, an untracked file.
(此句尚無繁中翻譯)
57:52.320–57:57.349
So, what we want is we want to commit index.html as initial commit.
(此句尚無繁中翻譯)
57:57.349–58:02.402
Because in Git, you can have files that are tracked, and also files that are not tracked.
(此句尚無繁中翻譯)
58:02.402–58:05.690
The files that are not tracked are the files you don't really care about, right?
(此句尚無繁中翻譯)
58:05.690–58:08.139
You don't You don't really need to store them in Git.
(此句尚無繁中翻譯)
58:08.139–58:15.321
These could be like media files, or generated files, code generated files that that can always be regenerated.
(此句尚無繁中翻譯)
58:15.321–58:19.218
But for your actual code, you always want to be tracking them, right?
(此句尚無繁中翻譯)
58:19.218–58:25.437
So, we we have this commit, and now this files is going to be tracked, and it's going to be committed as well.
(此句尚無繁中翻譯)
58:25.437–58:25.726
Okay?
(此句尚無繁中翻譯)
58:25.726–58:28.899
So, now it says committed as initial commit, right?
(此句尚無繁中翻譯)
58:28.899–58:32.108
We have this It's now on main, which is the a type of branch.
(此句尚無繁中翻譯)
58:32.108–58:36.881
And so, now if we go into changes, you can see that we can select a branch here.
(此句尚無繁中翻譯)
58:36.881–58:39.528
And as you can see here, it says no file changes yet.
(此句尚無繁中翻譯)
58:39.528–58:44.301
And that is because we have not made any changes since tracking that file.
(此句尚無繁中翻譯)
58:44.301–58:50.013
So, what I'm going to do now is that make index.html output hello James.
(此句尚無繁中翻譯)
58:50.013–58:52.950
That has updated, and now it says hello James.
(此句尚無繁中翻譯)
58:52.960–58:54.944
And now what we can do is we can commit it.
(此句尚無繁中翻譯)
58:54.944–58:56.527
Commit index.html.
(此句尚無繁中翻譯)
58:56.527–59:03.089
And now if we type give me Git status, it's going to tell you that it's not It hasn't been committed, right?
(此句尚無繁中翻譯)
59:03.089–59:06.214
It's modified, and it's tracked, but it hasn't been committed.
(此句尚無繁中翻譯)
59:06.214–59:06.481
Okay?
(此句尚無繁中翻譯)
59:06.481–59:09.103
It has been modified and uncommitted, right?
(此句尚無繁中翻譯)
59:09.103–59:11.621
You see this M, which means this has been modified.
(此句尚無繁中翻譯)
59:11.621–59:15.270
So, we're going to do commit index.html.
(此句尚無繁中翻譯)
59:15.280–59:18.753
And it will also generate a default message.
(此句尚無繁中翻譯)
59:18.753–59:20.232
Here it has committed it.
(此句尚無繁中翻譯)
59:20.232–59:26.558
We can click here, and we can click select review, and you can select the the of change you want to see.
(此句尚無繁中翻譯)
59:26.558–59:30.580
You can see on stage, stage, branch, or last turn.
(此句尚無繁中翻譯)
59:30.580–59:34.949
And when you click on last turn, you can see what was changed, okay?
(此句尚無繁中翻譯)
59:34.949–59:37.732
Because we are we are using source control.
(此句尚無繁中翻譯)
59:37.732–59:39.404
We can see the stuff that was changed.
(此句尚無繁中翻譯)
59:39.404–59:42.434
As you can see, this is the one line that was changed.
(此句尚無繁中翻譯)
59:42.434–59:46.143
Red means it was deleted, and green means it was inserted.
(此句尚無繁中翻譯)
59:46.143–59:48.792
So, this was deleted, and this was inserted.
(此句尚無繁中翻譯)
59:48.792–59:52.710
We basically changed the message that it says from Hello World to Hello James.
(此句尚無繁中翻譯)
59:52.720–59:55.965
And so, Git is very very important.
(此句尚無繁中翻譯)
59:55.965–59:58.923
If you're working on any kind of project, right?
(此句尚無繁中翻譯)
59:58.923–1:00:10.350
Anything beyond something super simple, you want to create a repo, and you want to implement source control into your workflow.
(此句尚無繁中翻譯)
1:00:10.360–1:00:16.390
One advanced trick that becomes more useful as projects get bigger is working with Git work trees.
(此句尚無繁中翻譯)
1:00:16.390–1:00:22.599
A work tree is a separate working copy of the same repo connected to a different branch.
(此句尚無繁中翻譯)
1:00:22.599–1:00:31.870
The practical benefit is that you can keep one version of the app stable while trying a risky feature, new eye direction, or refactor somewhere else.
(此句尚無繁中翻譯)
1:00:31.880–1:00:34.073
This matters a lot with the genetic coding.
(此句尚無繁中翻譯)
1:00:34.073–1:00:45.270
If you want to try two approaches in parallel, or or keep a clean version ready for recording while another code expert keeps building, a work tree gives you that separation.
(此句尚無繁中翻譯)
1:00:45.280–1:00:50.034
Now, what's nice about work trees is that they give you parallelism.
(此句尚無繁中翻譯)
1:00:50.034–1:01:04.489
So, if you are working on multiple features in your app, maybe you're using sub agents or something else, it's important that no two processes work on the same file at the same time, because that's going to create corruption.
(此句尚無繁中翻譯)
1:01:04.489–1:01:12.107
And so, what you typically end up doing is you create a work tree for a specific feature, and you work on that work tree.
(此句尚無繁中翻譯)
1:01:12.107–1:01:16.864
And when you're done, you merge the changes back onto your main tree.
(此句尚無繁中翻譯)
1:01:16.864–1:01:19.790
Now, that doesn't mean you can only create one work tree.
(此句尚無繁中翻譯)
1:01:19.800–1:01:34.310
You can create multiple work trees, as many as you want, and you can also work on the same feature because after one worktree is done, it's going to merge to main, and if there's a conflict, it's going to resolve that conflict, and then
(此句尚無繁中翻譯)
1:01:34.320–1:01:47.390
another worktree, when it is done, it's going to also merge into your main branch where your development is happening, and if there's a conflict because they ended up working on the same feature, it will also resolve that
(此句尚無繁中翻譯)
1:01:47.400–1:01:49.350
conflict so that there's no corruption.
(此句尚無繁中翻譯)
1:01:49.360–1:01:52.367
Now, this is a feature I use all the time in big projects.
(此句尚無繁中翻譯)
1:01:52.367–1:01:55.029
Now, let's say I'm working on this app over here.
(此句尚無繁中翻譯)
1:01:55.029–1:02:04.691
You can ask Codox to work in main without creating any worktrees, or I can ask it to create a new worktree while it makes changes.
(此句尚無繁中翻譯)
1:02:04.691–1:02:07.052
So, let's continue what we were doing.
(此句尚無繁中翻譯)
1:02:07.052–1:02:11.674
So, let's say I want to change this index.html, and I wanted to say something else.
(此句尚無繁中翻譯)
1:02:11.674–1:02:21.397
So, I'm going to go ahead and tell it, "Make index.html output hello, plan." But this time, we want to make sure that it works in a different worktree.
(此句尚無繁中翻譯)
1:02:21.397–1:02:35.276
So, what I'm going to do is I'm going to say, "Work in a new worktree, and then merge, clean up after you're done, okay?" So, we're going to go ahead and run this, and now it's not going to modify the file on our main branch.
(此句尚無繁中翻譯)
1:02:35.276–1:02:40.968
It's going to branch out, do the work, and then come back and merge the changes back in.
(此句尚無繁中翻譯)
1:02:40.968–1:02:44.094
And so, as you can see here, there's more stuff happening.
(此句尚無繁中翻譯)
1:02:44.094–1:02:52.724
I'll make this in a separate Git worktree, commit there, fast forward merge changes to main, and then remove the worktree and delete the branch.
(此句尚無繁中翻譯)
1:02:52.724–1:03:06.710
And that's exactly what it did, except it did it very, very quickly because this was a, you know, a very small change, but you saw it doing all that, and before you know it, it did all that, made the change, merged everything back,
(此句尚無繁中翻譯)
1:03:06.720–1:03:08.038
and deleted the worktree.
(此句尚無繁中翻譯)
1:03:08.038–1:03:10.754
And so, that was a very, very small change.
(此句尚無繁中翻譯)
1:03:10.754–1:03:18.114
Now, another thing that you can do is you can click here, and you can fork this whole convo in a separate worktree, right?
(此句尚無繁中翻譯)
1:03:18.114–1:03:22.962
So, if I click over here, that will fork it into a separate work tree.
(此句尚無繁中翻譯)
1:03:22.962–1:03:27.097
And here you can see we're working in a separate work tree here, okay?
(此句尚無繁中翻譯)
1:03:27.097–1:03:39.078
So, now as we're doing work, we don't need to constantly tell Cortex, "Hey, you know, create a new work tree, clean up, and do all this when you're done." We can continue working and then merge our changes.
(此句尚無繁中翻譯)
1:03:39.078–1:03:44.494
So, for instance, I can say something like to say, "Hello, USA." I can simply do that.
(此句尚無繁中翻譯)
1:03:44.494–1:03:49.204
I don't need to tell it to work in a separate work tree because we are isolated here, okay?
(此句尚無繁中翻譯)
1:03:49.204–1:03:51.470
So, here's the file, we can open it.
(此句尚無繁中翻譯)
1:03:51.470–1:03:52.590
Hello, USA here.
(此句尚無繁中翻譯)
1:03:52.600–1:03:58.412
And so, at this point, we have merged the work tree change into main and cleaned up the temporary work tree, right?
(此句尚無繁中翻譯)
1:03:58.412–1:04:02.787
Index now displays Hello, USA, and we no longer have this temporary work tree.
(此句尚無繁中翻譯)
1:04:02.787–1:04:07.243
We've done everything that we needed to do separate from the main branch and then we merge.
(此句尚無繁中翻譯)
1:04:07.243–1:04:15.332
And as far as we are concerned, this convo is now finished because it's tied to the old work tree, but we've did everything we needed to do.
(此句尚無繁中翻譯)
1:04:15.332–1:04:22.769
We've updated the files, we merged back into main, and so now we can start a brand new convo to work on a different feature.
(此句尚無繁中翻譯)
1:04:22.769–1:04:26.150
And so, this is really nice for feature isolation.
(此句尚無繁中翻譯)
1:04:26.160–1:04:36.510
Create a new work tree, work there, merge back into main, and then simply click here to archive this conversation.
(此句尚無繁中翻譯)
1:04:36.520–1:04:40.744
Another advanced trick is using sub-agents for parallel work.
(此句尚無繁中翻譯)
1:04:40.744–1:04:45.499
The idea is not to throw a whole project at a bunch of agents and hope it works.
(此句尚無繁中翻譯)
1:04:45.499–1:04:47.950
The useful version is much more controlled.
(此句尚無繁中翻譯)
1:04:47.960–1:04:56.458
An agent explores the code base, another works on a clearly bounded part of the UI, another checks tests, or reviews the result.
(此句尚無繁中翻譯)
1:04:56.458–1:04:57.713
The key is ownership.
(此句尚無繁中翻譯)
1:04:57.713–1:05:04.281
If you use sub-agents, you want each one to have a specific job, clear file area, and a clear output.
(此句尚無繁中翻譯)
1:05:04.281–1:05:08.999
That keeps the work parallel without turning it into a merge mess.
(此句尚無繁中翻譯)
1:05:08.999–1:05:17.868
Sub-agents are best when the tasks are independent enough to run side by side, but still simple enough to integrate at the end.
(此句尚無繁中翻譯)
1:05:17.868–1:05:23.399
Now, sub-agents is another really cool feature that will help speed up your workflows.
(此句尚無繁中翻譯)
1:05:23.399–1:05:32.288
And this is something that I use all the time, especially in big repos, in big codebases, to do multiple tasks in parallel.
(此句尚無繁中翻譯)
1:05:32.288–1:05:35.923
All right, so here I have a very, very simple Kanban app.
(此句尚無繁中翻譯)
1:05:35.923–1:05:38.231
If I click over here, I have this.
(此句尚無繁中翻譯)
1:05:38.231–1:05:42.018
I can drag and drop. create new tasks, etc., etc.
(此句尚無繁中翻譯)
1:05:42.018–1:05:56.350
And so, what I want to know is if I'm going to be building more and more features, complex stuff, new functionality, I want to use sub-agents to help me kind of make sense of it, you know, and help me build it in the most efficient way
(此句尚無繁中翻譯)
1:05:56.360–1:05:56.779
possible.
(此句尚無繁中翻譯)
1:05:56.779–1:05:59.024
And so, I'm going to paste this prompt here.
(此句尚無繁中翻譯)
1:05:59.024–1:06:02.281
Plan how to split this feature across sub-agents, right?
(此句尚無繁中翻譯)
1:06:02.281–1:06:03.469
Do not edit files yet.
(此句尚無繁中翻譯)
1:06:03.469–1:06:04.022
Recommend.
(此句尚無繁中翻譯)
1:06:04.022–1:06:06.263
We're going to jump into plan mode.
(此句尚無繁中翻譯)
1:06:06.263–1:06:08.553
Preface this with the feature.
(此句尚無繁中翻譯)
1:06:08.553–1:06:13.315
Add to party apps, such as make.com, Zapier, etc.
(此句尚無繁中翻譯)
1:06:13.315–1:06:15.420
And so, I'm going to I'm going to leave it at this.
(此句尚無繁中翻譯)
1:06:15.420–1:06:17.124
And I'm going to go ahead and run this.
(此句尚無繁中翻譯)
1:06:17.124–1:06:18.893
And so, let's go ahead and run this.
(此句尚無繁中翻譯)
1:06:18.893–1:06:20.414
And here we have the plan.
(此句尚無繁中翻譯)
1:06:20.414–1:06:25.390
The safest split is for the main thread to own architecture, shared data contracts.
(此句尚無繁中翻譯)
1:06:25.400–1:06:34.286
Sub-agents can work on isolated feature areas inside index.html, but they must not all edit the same broad sections at once.
(此句尚無繁中翻譯)
1:06:34.286–1:06:37.083
Okay, so we have main thread responsibilities.
(此句尚無繁中翻譯)
1:06:37.083–1:06:39.568
And then we have sub-agent delegation.
(此句尚無繁中翻譯)
1:06:39.568–1:06:44.304
Integration settings, integration data model, web hook event dispatcher.
(此句尚無繁中翻譯)
1:06:44.304–1:06:53.342
So, I'm going to copy this plan, and then I'm going to preface it by telling it spawn sub-agents right away to help design the third-party API functionality.
(此句尚無繁中翻譯)
1:06:53.342–1:06:54.721
Let's go ahead and run this.
(此句尚無繁中翻譯)
1:06:54.721–1:07:03.214
Right away, it's telling me, "I'll spawn the four-focused sub-agents and keep the main thread responsible for the final." So, as you can see, it's spawning them.
(此句尚無繁中翻譯)
1:07:03.214–1:07:05.200
And each sub-agent gets a prompt.
(此句尚無繁中翻譯)
1:07:05.200–1:07:08.270
It's basically like me creating a new conversation.
(此句尚無繁中翻譯)
1:07:08.280–1:07:15.663
Your sub agent one integration, your sub agent two integration data model, your sub agent three, and they're working independently.
(此句尚無繁中翻譯)
1:07:15.663–1:07:18.555
And here it tells you all four sub agents are running.
(此句尚無繁中翻譯)
1:07:18.555–1:07:23.770
While they work, I'll inspect the current partial edit, and you can see these background agents here.
(此句尚無繁中翻譯)
1:07:23.770–1:07:24.074
Okay?
(此句尚無繁中翻譯)
1:07:24.074–1:07:25.797
So, they're working in parallel.
(此句尚無繁中翻譯)
1:07:25.797–1:07:27.507
They're working on their own thing.
(此句尚無繁中翻譯)
1:07:27.507–1:07:30.950
They own different pieces of the app, and they're kind of working.
(此句尚無繁中翻譯)
1:07:30.960–1:07:34.554
And when they're done, they come back to this main agent, right?
(此句尚無繁中翻譯)
1:07:34.554–1:07:37.365
This combo here, and tell it what happened, right?
(此句尚無繁中翻譯)
1:07:37.365–1:07:38.874
They come back with the result.
(此句尚無繁中翻譯)
1:07:38.874–1:07:42.641
And so, now it says the persistent sub agent returned a cleaner data shape.
(此句尚無繁中翻譯)
1:07:42.641–1:07:46.529
And here you can actually click on any one of these and see what's happening.
(此句尚無繁中翻譯)
1:07:46.529–1:07:51.161
You can click here, you can come back, you can click on this one, and see what it's doing.
(此句尚無繁中翻譯)
1:07:51.161–1:07:52.496
So, this one is finished.
(此句尚無繁中翻譯)
1:07:52.496–1:07:53.496
Some are finished.
(此句尚無繁中翻譯)
1:07:53.496–1:07:54.631
How about this one?
(此句尚無繁中翻譯)
1:07:54.631–1:07:55.995
This one is also finished.
(此句尚無繁中翻譯)
1:07:55.995–1:07:57.338
And so, that's how it works.
(此句尚無繁中翻譯)
1:07:57.338–1:08:01.093
And when they finish, they come back, and then it decides what to do later.
(此句尚無繁中翻譯)
1:08:01.093–1:08:04.333
Maybe it's going to respond, and maybe it's going to spawn something else.
(此句尚無繁中翻譯)
1:08:04.333–1:08:05.269
Maybe it's done.
(此句尚無繁中翻譯)
1:08:05.269–1:08:07.008
They did what they needed to do.
(此句尚無繁中翻譯)
1:08:07.008–1:08:11.569
They finished their isolated task, and their services are no longer needed.
(此句尚無繁中翻譯)
1:08:11.569–1:08:14.949
And again, sub agent is something that I use all the time.
(此句尚無繁中翻譯)
1:08:14.949–1:08:26.135
I use it all the time, especially in big repos, because they help speed up the work by isolating different areas, different responsibility clusters, to different agents.
(此句尚無繁中翻譯)
1:08:26.135–1:08:31.309
And that's a huge productivity boost.
(此句尚無繁中翻譯)
1:08:31.319–1:08:40.621
Now, in this section, we're going to bring all of the previous sections together by giving Codex project instructions in an agents.md file.
(此句尚無繁中翻譯)
1:08:40.621–1:08:47.057
This is where you can write down the rules you want Codex to follow every time it works in a specific repo.
(此句尚無繁中翻譯)
1:08:47.057–1:08:56.502
Which commands to run, which folders matter, which patterns to preserve, how to verify changes, and when to use work trees or sub agents.
(此句尚無繁中翻譯)
1:08:56.502–1:09:01.822
This is useful because you do not want to repeat the same project rules in every prompt.
(此句尚無繁中翻譯)
1:09:01.822–1:09:17.100
If this project should always run a specific check, use a specific design system, avoid certain files, create work trees for risky experiments, or split large tasks into sub-agents, those instructions belong in agents.md.
(此句尚無繁中翻譯)
1:09:17.100–1:09:22.278
It turns your preferences into reusable project context.
(此句尚無繁中翻譯)
1:09:22.278–1:09:28.250
And here's a prompt that you can use, which is going to draft agents.md for this project.
(此句尚無繁中翻譯)
1:09:28.250–1:09:34.837
Do not write the file yet include the project purpose, the main folders, work tree, sub-agents, stuff like that.
(此句尚無繁中翻譯)
1:09:34.837–1:09:36.617
So, we're going to jump into plan mode.
(此句尚無繁中翻譯)
1:09:36.617–1:09:38.947
We're going to go ahead and run that.
(此句尚無繁中翻譯)
1:09:38.947–1:09:44.036
And here's the draft for this agents.md tailored to the current project, right?
(此句尚無繁中翻譯)
1:09:44.036–1:09:49.075
Project purpose, main folders, verification steps after changes.
(此句尚無繁中翻譯)
1:09:49.075–1:09:53.470
Serve the app locally, coding and design patterns to preserve.
(此句尚無繁中翻譯)
1:09:53.470–1:09:55.832
When codex should use a work tree.
(此句尚無繁中翻譯)
1:09:55.832–1:09:58.510
Use a separate work tree when these happen.
(此句尚無繁中翻譯)
1:09:58.520–1:10:00.674
When codex should use sub-agents.
(此句尚無繁中翻譯)
1:10:00.674–1:10:06.295
Use sub-agents when work can be split into clearly separate ownership areas such as these.
(此句尚無繁中翻譯)
1:10:06.295–1:10:09.407
What codex should avoid changing without asking?
(此句尚無繁中翻譯)
1:10:09.407–1:10:10.117
All of this.
(此句尚無繁中翻譯)
1:10:10.117–1:10:22.865
Now, the beautiful thing about this agents.md file is that you no longer have to worry about, you know, asking codex to spawn sub-agents or create separate work trees.
(此句尚無繁中翻譯)
1:10:22.865–1:10:24.492
It will be automatic.
(此句尚無繁中翻譯)
1:10:24.492–1:10:28.755
It's like saving you from typing those prompts every single time.
(此句尚無繁中翻譯)
1:10:28.755–1:10:34.110
So, if you want to add a feature, well, you don't need to tell it, "Hey, create a new work tree."
(此句尚無繁中翻譯)
1:10:34.120–1:10:36.366
Or make sure you spawn sub-agents.
(此句尚無繁中翻譯)
1:10:36.366–1:10:37.823
It's going to be automatic.
(此句尚無繁中翻譯)
1:10:37.823–1:10:44.140
And so, at this point, you want to review this proposal here, and you want to save this as agents.md.
(此句尚無繁中翻譯)
1:10:44.140–1:10:49.958
So, I'm going to say, "Save it as agents." So, now it's saved it as agents.md.
(此句尚無繁中翻譯)
1:10:49.958–1:10:54.230
You You can click here, and you can see the whole file right here.
(此句尚無繁中翻譯)
1:10:54.240–1:10:58.561
And this file will be used only for this specific project.
(此句尚無繁中翻譯)
1:10:58.561–1:11:00.137
They're based on a repo.
(此句尚無繁中翻譯)
1:11:00.137–1:11:06.499
So now for my next prompt, if it's a simple change, it's not going to create a work tree probably.
(此句尚無繁中翻譯)
1:11:06.499–1:11:15.150
And it will also not spawn sub-agents, but if it's a more complex change, it should probably create a work tree and maybe even spawn sub-agents.
(此句尚無繁中翻譯)
1:11:15.150–1:11:17.223
So let's go ahead and see if this works.
(此句尚無繁中翻譯)
1:11:17.223–1:11:28.986
So now, let's go ahead and ask it make a simple change that that changes the title for the main index.html to awesome Kanban app.
(此句尚無繁中翻譯)
1:11:28.986–1:11:31.298
Okay, I'm going to go ahead and run it directly.
(此句尚無繁中翻譯)
1:11:31.298–1:11:34.130
So now the title is awesome Kanban app.
(此句尚無繁中翻譯)
1:11:34.130–1:11:52.270
Okay, but if we ask it something more complex, like, you know, figure out a third-party, you know, integration, design, you know, support API calls, or support MCP, or anything like that, it should probably use sub-agents to figure it out and
(此句尚無繁中翻譯)
1:11:52.280–1:11:54.758
implement the changes in its own work tree.
(此句尚無繁中翻譯)
1:11:54.758–1:11:56.472
So let's see if this works.
(此句尚無繁中翻譯)
1:11:56.472–1:12:03.824
Add a robust API functionality for handling outgoing API calls and incoming webhooks.
(此句尚無繁中翻譯)
1:12:03.824–1:12:08.235
Okay, I'm going to jump into plan mode to see if it has any questions for me.
(此句尚無繁中翻譯)
1:12:08.235–1:12:14.404
See how it says agents.mdx explicitly says not to add a backend or proxy without asking.
(此句尚無繁中翻譯)
1:12:14.404–1:12:16.250
Okay, so it did consult this.
(此句尚無繁中翻譯)
1:12:16.250–1:12:18.052
So we're going to add a backend.
(此句尚無繁中翻譯)
1:12:18.052–1:12:26.207
We're going to create tasks and let's see if it's going to create a work tree automatically and maybe even use sub-agents.
(此句尚無繁中翻譯)
1:12:26.207–1:12:30.783
Another question, should the new backend become the source of truth for Kanban tasks?
(此句尚無繁中翻譯)
1:12:30.783–1:12:32.861
Yes, let's just go with the recommended.
(此句尚無繁中翻譯)
1:12:32.861–1:12:41.406
Okay, we're going to expand this plan and we're going to see if it's going to be using a work tree or sub-agents for any of these things.
(此句尚無繁中翻譯)
1:12:41.406–1:12:45.272
Okay, so I do not see it's going to be using sub-agents.
(此句尚無繁中翻譯)
1:12:45.272–1:12:45.768
Update.
(此句尚無繁中翻譯)
1:12:45.768–1:12:53.068
So before we run it, let's ask it, do you plan on using a work tree or sub-agents for this task.
(此句尚無繁中翻譯)
1:12:53.068–1:12:53.837
There you go.
(此句尚無繁中翻譯)
1:12:53.837–1:13:04.070
Yes, for implementation I'd use a work tree because this changes the project from a static only app into a node server app with API routes and persistent states.
(此句尚無繁中翻譯)
1:13:04.080–1:13:08.173
I'd also use subagents, but only for bounded design review tasks.
(此句尚無繁中翻譯)
1:13:08.173–1:13:19.225
And so it's telling you right there that it will be using a work tree and it will be using subagents, and you can bet that this would never happen if we didn't have this agents.md file.
(此句尚無繁中翻譯)
1:13:19.225–1:13:21.722
And so agents.md is super important.
(此句尚無繁中翻譯)
1:13:21.722–1:13:27.383
It's going to save you a lot of time because it basically codifies repeatable tasks.
(此句尚無繁中翻譯)
1:13:27.383–1:13:34.910
So you never have to re-prompt the same thing over and over again.
(此句尚無繁中翻譯)
1:13:34.920–1:13:39.249
Now, before we build real apps, there is one security habit you want to establish early.
(此句尚無繁中翻譯)
1:13:39.249–1:13:43.791
Codex can help inspect configuration, but we should be careful with secrets.
(此句尚無繁中翻譯)
1:13:43.791–1:13:52.037
An environment variable might be safe and public, like a front-end URL, or it might be private, like an API key or deploy token.
(此句尚無繁中翻譯)
1:13:52.037–1:13:57.504
These should not be casually pasted into a prompt or committed into the repo.
(此句尚無繁中翻譯)
1:13:57.504–1:14:02.736
The other important thing is that local config and deployment config are not the same thing.
(此句尚無繁中翻譯)
1:14:02.736–1:14:09.749
A local.env file helps the app run on my machine, but Vercel does not automatically copy that file into production.
(此句尚無繁中翻譯)
1:14:09.749–1:14:15.458
For a deployed app, the required variables need to exist in the deployment environment, too.
(此句尚無繁中翻譯)
1:14:15.458–1:14:26.203
So the right workflow is to ask Codex to identify what variables are needed, classify them as public or private, and then advise you where each one needs to be configured.
(此句尚無繁中翻譯)
1:14:26.203–1:14:31.631
Now, let's say we're building on this app, and we are adding external services.
(此句尚無繁中翻譯)
1:14:31.631–1:14:38.070
So one of those services might be something like OpenAI, or another service could be Open Router.
(此句尚無繁中翻譯)
1:14:38.080–1:14:51.853
Well, every time we connect to external services, we need to connect them using an API key, and those API keys are needed for those services to track how much usage we have so that they can bill us accordingly.
(此句尚無繁中翻譯)
1:14:51.853–1:15:05.910
And so in your app, you need to be storing those API keys because when you're going to be making those requests, regardless whether that's an API token or some kind of deployment token or pretty much anything else, you need to be very, very careful
(此句尚無繁中翻譯)
1:15:05.920–1:15:07.760
how you are storing them.
(此句尚無繁中翻譯)
1:15:07.760–1:15:12.133
And so in this app, let's say we want to use OpenAI here.
(此句尚無繁中翻譯)
1:15:12.133–1:15:12.586
Here.
(此句尚無繁中翻譯)
1:15:12.586–1:15:17.231
So I'm going to say API stack and use the following key.
(此句尚無繁中翻譯)
1:15:17.231–1:15:20.270
And let's say we give it a sample API key.
(此句尚無繁中翻譯)
1:15:20.280–1:15:22.575
Sample API key as a sample.
(此句尚無繁中翻譯)
1:15:22.575–1:15:24.583
We're going to jump into plan mode.
(此句尚無繁中翻譯)
1:15:24.583–1:15:27.052
We're going to select this API stack only.
(此句尚無繁中翻譯)
1:15:27.052–1:15:29.036
We're going to be doing native fetch.
(此句尚無繁中翻譯)
1:15:29.036–1:15:29.531
All right.
(此句尚無繁中翻譯)
1:15:29.531–1:15:33.294
So it went ahead and created our first API stack here.
(此句尚無繁中翻譯)
1:15:33.294–1:15:37.057
And right here it mentions this file where it stores this key.
(此句尚無繁中翻譯)
1:15:37.057–1:15:40.902
And so if you want to use a real key, you never want to paste it in chat.
(此句尚無繁中翻譯)
1:15:40.902–1:15:44.641
What you want to do is you want to open this file and modify it directly.
(此句尚無繁中翻譯)
1:15:44.641–1:15:46.020
So that's what we're going to do.
(此句尚無繁中翻譯)
1:15:46.020–1:15:50.011
We're going to open this in the editor here and I'm going to paste this key right here.
(此句尚無繁中翻譯)
1:15:50.011–1:15:52.359
And this right here is my actual key.
(此句尚無繁中翻譯)
1:15:52.359–1:15:59.530
And so now I have an OpenAI, have an API stack and I have a real key in this file here, okay?
(此句尚無繁中翻譯)
1:15:59.530–1:16:09.801
And now what I need to do is I need to run a check and ensure that we are storing the keys the right way and, you know, they're going to be deployed correctly and all that.
(此句尚無繁中翻譯)
1:16:09.801–1:16:16.445
And so I have this prompt to do just that and it says here inspect this project for environment variables and deployment config.
(此句尚無繁中翻譯)
1:16:16.445–1:16:19.746
Do not print secret values and then tell me all of these things.
(此句尚無繁中翻譯)
1:16:19.746–1:16:20.875
So we're going to run this.
(此句尚無繁中翻譯)
1:16:20.875–1:16:29.335
So now it's telling us that environment inspection required environment variables required only for post OpenAI front end variables, right?
(此句尚無繁中翻譯)
1:16:29.335–1:16:35.386
We don't have any public because, you know, sometimes your app can have both private keys and public keys, right?
(此句尚無繁中翻譯)
1:16:35.386–1:16:42.968
So if you're using something like Superbase, Superbase has an anon key or a secret key or they call it something else now.
(此句尚無繁中翻譯)
1:16:42.968–1:16:48.668
And the idea is the public key can be made available, but it has very, very strict permissions.
(此句尚無繁中翻譯)
1:16:48.668–1:16:57.832
Whereas something like your OpenAI API key or your open router API key or something of that sort needs to be very, very secret, right?
(此句尚無繁中翻譯)
1:16:57.832–1:17:02.312
Because with that key, you can make a lot of calls and do a lot of things.
(此句尚無繁中翻譯)
1:17:02.312–1:17:04.550
And so here it says we have a private key.
(此句尚無繁中翻譯)
1:17:04.560–1:17:07.616
OpenAI PK is private and must stay server-side.
(此句尚無繁中翻譯)
1:17:07.616–1:17:09.606
It is used here, needed locally.
(此句尚無繁中翻譯)
1:17:09.606–1:17:17.983
Hosted service config or cell or another node capable host config as a private server environment variables, port, etc., etc.
(此句尚無繁中翻譯)
1:17:17.983–1:17:21.122
Okay, dot env examples cuz currently untracked.
(此句尚無繁中翻譯)
1:17:21.122–1:17:25.796
So, what we have safest next step before deploying, replace it with only this.
(此句尚無繁中翻譯)
1:17:25.796–1:17:31.005
Only config the real key in the deployment provider's private environment variable settings.
(此句尚無繁中翻譯)
1:17:31.005–1:17:31.452
Okay.
(此句尚無繁中翻譯)
1:17:31.452–1:17:40.588
So, I want to store the key locally for testing, and I want to ensure that it will be deployed also later.
(此句尚無繁中翻譯)
1:17:40.588–1:17:45.131
And so we want that key locally so that we can test, but we also want it to deploy it.
(此句尚無繁中翻譯)
1:17:45.131–1:17:51.435
And that means we need to create a couple of files, one for local settings and one for deployment settings.
(此句尚無繁中翻譯)
1:17:51.435–1:17:57.380
And it's telling us which is the wrong file for local secret because examples are usually committed.
(此句尚無繁中翻譯)
1:17:57.380–1:17:59.843
So let's say we're doing a Vercel deploy.
(此句尚無繁中翻譯)
1:17:59.843–1:18:01.149
We're going to switch that.
(此句尚無繁中翻譯)
1:18:01.149–1:18:04.775
And there we have it, store the real key locally in an untracked.
(此句尚無繁中翻譯)
1:18:04.775–1:18:05.120
Right?
(此句尚無繁中翻譯)
1:18:05.120–1:18:08.393
We need to make sure that this is never committed to Git.
(此句尚無繁中翻譯)
1:18:08.393–1:18:09.597
It needs to be untracked.
(此句尚無繁中翻譯)
1:18:09.597–1:18:12.890
So we're going to expand this, submit this.
(此句尚無繁中翻譯)
1:18:12.890–1:18:14.370
Do not use public.
(此句尚無繁中翻譯)
1:18:14.370–1:18:16.190
These are not public keys.
(此句尚無繁中翻譯)
1:18:16.200–1:18:19.771
Replace dot env example with create dot env.
(此句尚無繁中翻譯)
1:18:19.771–1:18:22.911
Okay, so it's it's going to be creating this dot env.
(此句尚無繁中翻譯)
1:18:22.911–1:18:25.560
The secret is now ignored in dot env.
(此句尚無繁中翻譯)
1:18:25.560–1:18:32.006
And then I'm updating readme and agents to make the local and Vercel setup unambiguous.
(此句尚無繁中翻譯)
1:18:32.006–1:18:35.351
And that way we have the local key stored for local testing.
(此句尚無繁中翻譯)
1:18:35.351–1:18:45.459
It's never going to be committed into Git and then we'll be able to send that key, also deploy that key on Vercel because Vercel is going to be running our app.
(此句尚無繁中翻譯)
1:18:45.459–1:18:47.135
It needs access to that key as well.
(此句尚無繁中翻譯)
1:18:47.135–1:18:48.190
It needs to be secret.
(此句尚無繁中翻譯)
1:18:48.200–1:18:51.102
Okay, implemented the local Vercel key setup.
(此句尚無繁中翻譯)
1:18:51.102–1:19:03.150
And so in this point we've made the the secret key management and not just secret key, any kind of key management is part of our workflow and we can be assured that we have the key for local stuff and we also going to be
(此句尚無繁中翻譯)
1:19:03.160–1:19:12.310
deploying the key correctly for production stuff, regardless what kind of host you're using.
(此句尚無繁中翻譯)
1:19:12.320–1:19:21.345
Now, when you're developing an app, you're going to be writing code for the core stuff, but a lot of things that your app will be doing will be done by existing code.
(此句尚無繁中翻譯)
1:19:21.345–1:19:24.510
You're not going to be building your app from scratch, right?
(此句尚無繁中翻譯)
1:19:24.520–1:19:29.197
You're going to be using existing libraries, existing frameworks, stuff like that.
(此句尚無繁中翻譯)
1:19:29.197–1:19:34.576
And those are called dependencies and that is because your app depends on them to function.
(此句尚無繁中翻譯)
1:19:34.576–1:19:37.738
Without those things, your app will not function.
(此句尚無繁中翻譯)
1:19:37.738–1:19:43.164
And you need to ensure that you have a process for managing these dependencies.
(此句尚無繁中翻譯)
1:19:43.164–1:19:50.148
And I have here a prompt that you can use that will help you inspect this project before adding any dependencies.
(此句尚無繁中翻譯)
1:19:50.148–1:19:51.706
Do not install anything yet.
(此句尚無繁中翻譯)
1:19:51.706–1:19:52.833
Tell me all of this.
(此句尚無繁中翻譯)
1:19:52.833–1:19:54.911
And so let's go ahead and run this prompt.
(此句尚無繁中翻譯)
1:19:54.911–1:19:57.030
Right, and this is what it came back with.
(此句尚無繁中翻譯)
1:19:57.040–1:19:59.155
Dependency project inspection.
(此句尚無繁中翻譯)
1:19:59.155–1:20:01.090
Framework and package manager.
(此句尚無繁中翻譯)
1:20:01.090–1:20:02.410
Framework non-detected.
(此句尚無繁中翻譯)
1:20:02.410–1:20:07.792
This appears to be a plain static JavaScript app served by a custom node server.
(此句尚無繁中翻譯)
1:20:07.792–1:20:12.655
Now, of course, this will definitely not be the case when it comes to your real apps.
(此句尚無繁中翻譯)
1:20:12.655–1:20:19.198
You're going to be using some kind of framework, something that will make your app behave like a real app.
(此句尚無繁中翻譯)
1:20:19.198–1:20:21.597
Here we just have a very, very plain app.
(此句尚無繁中翻譯)
1:20:21.597–1:20:23.910
Package manager non-detected.
(此句尚無繁中翻譯)
1:20:23.920–1:20:25.105
Oh, none of this.
(此句尚無繁中翻譯)
1:20:25.105–1:20:29.446
And of course, when you're going to be building your app, you're going to be having all this as well.
(此句尚無繁中翻譯)
1:20:29.446–1:20:30.765
Available scripts.
(此句尚無繁中翻譯)
1:20:30.765–1:20:36.230
No NPM scripts exist because there's no package manager, because there's no manager, because there's no package.json.
(此句尚無繁中翻譯)
1:20:36.240–1:20:40.308
Current documented run command, we just have this very, very basic.
(此句尚無繁中翻譯)
1:20:40.308–1:20:43.388
Definitely not the case when it comes to production apps.
(此句尚無繁中翻譯)
1:20:43.388–1:20:45.637
OpenAI local env run command.
(此句尚無繁中翻譯)
1:20:45.637–1:20:48.769
So, we have this relevant install dependency.
(此句尚無繁中翻譯)
1:20:48.769–1:20:51.978
So, we do have some basic node built-ins.
(此句尚無繁中翻譯)
1:20:51.978–1:20:55.382
All of these OpenAI calls native fetch, okay?
(此句尚無繁中翻譯)
1:20:55.382–1:20:56.581
So, it's native.
(此句尚無繁中翻譯)
1:20:56.581–1:21:00.766
It's not using the OpenAI SDK, which would have been a dependency.
(此句尚無繁中翻譯)
1:21:00.766–1:21:03.708
Can the task be completed without adding a package?
(此句尚無繁中翻譯)
1:21:03.708–1:21:10.870
Yes, for the current OpenAI API stack and local serving, the project already calls OpenAI via native fetch.
(此句尚無繁中翻譯)
1:21:10.880–1:21:14.816
If a new package is recommended, no package is recommended right now.
(此句尚無繁中翻譯)
1:21:14.816–1:21:26.551
A package could be recommended later if we use Express, Fastify, we start using the official SDK, .env files likely to change if proceeding, right?
(此句尚無繁中翻譯)
1:21:26.551–1:21:30.738
API behavior, OpenAI calls, front end, etc., etc.
(此句尚無繁中翻譯)
1:21:30.738–1:21:35.230
And so, dependencies are important, and you want to limit your dependencies.
(此句尚無繁中翻譯)
1:21:35.240–1:21:39.204
You don't want the system to just add dependencies blindly.
(此句尚無繁中翻譯)
1:21:39.204–1:21:44.724
And so, this is going to be super useful as you're building your app so that you can streamline it.
(此句尚無繁中翻譯)
1:21:44.724–1:21:52.103
Because as I was just building this simple app, Codex asked me whether I want to use OpenAI SDK or native fetch.
(此句尚無繁中翻譯)
1:21:52.103–1:21:55.353
And you always want to err on the side of native stuff.
(此句尚無繁中翻譯)
1:21:55.353–1:21:59.595
If you can avoid a dependency or an SDK, that would be the right move.
(此句尚無繁中翻譯)
1:21:59.595–1:22:01.237
And that's exactly what I did here.
(此句尚無繁中翻譯)
1:22:01.237–1:22:02.524
I just used native, right?
(此句尚無繁中翻譯)
1:22:02.524–1:22:06.564
I could have used an SDK, but I decided I'm just going to keep it as simple as possible.
(此句尚無繁中翻譯)
1:22:06.564–1:22:08.414
And that's really the goal here.
(此句尚無繁中翻譯)
1:22:08.414–1:22:21.252
And this prompt and making this part of your workflow is going to enable you to keep your app streamlined so that you have less dependencies, less chance for something to go wrong, less bloat, etc., etc.
(此句尚無繁中翻譯)
1:22:21.252–1:22:24.959
So, definitely add this to your app building workflow.
(此句尚無繁中翻譯)
1:22:24.959–1:22:34.910
And then ensure that Codex knows about it by making this a part of your agent's MD or a separate step.
(此句尚無繁中翻譯)
1:22:34.920–1:22:40.881
Now that the Cortex foundation is clear, we are going to start with something intentionally small.
(此句尚無繁中翻譯)
1:22:40.881–1:22:43.988
The first step is called Habit Card.
(此句尚無繁中翻譯)
1:22:43.988–1:22:53.385
And it is a tiny habit tracker where users can add habits, check them off for the day, and see a simple streak or count.
(此句尚無繁中翻譯)
1:22:53.385–1:23:02.950
This is a great starter project because the result is visual, easy to check, and small enough that every step stays clear.
(此句尚無繁中翻譯)
1:23:02.960–1:23:18.423
Cortex can plan the app, build the UI, show us the file changes, open the browser, polish the result, and get the front end ready to deploy without also introducing back end complexity.
(此句尚無繁中翻譯)
1:23:18.423–1:23:24.710
Habit Card gives us the core app building pieces without much product complexity.
(此句尚無繁中翻譯)
1:23:24.720–1:23:33.453
A form, a list, a daily check-in state, simple feedback, and later local storage persistence.
(此句尚無繁中翻譯)
1:23:33.453–1:23:40.169
It does not need authentication, payments, APIs, or a real database at first.
(此句尚無繁中翻譯)
1:23:40.169–1:23:48.022
This first app is about getting comfortable with the full Cortex loop on something we can understand immediately.
(此句尚無繁中翻譯)
1:23:48.022–1:23:57.982
Now, here in Cortex, the first thing that you want to do is you want to click here, and you can select start from scratch, but I like to have it set to a specific folder.
(此句尚無繁中翻譯)
1:23:57.982–1:24:03.780
So, I'm going to click on use an existing folder, and I have here a folder prepared called demos.
(此句尚無繁中翻譯)
1:24:03.780–1:24:11.710
I'm going to open this here, and now we have a new project that has been associated with a specific folder.
(此句尚無繁中翻譯)
1:24:11.720–1:24:16.962
And here we can start a brand new And here we can start a brand new conversation for the app that we are building.
(此句尚無繁中翻譯)
1:24:16.962–1:24:23.381
Now, anytime I start building a brand new app, I always want to create a visual architecture.
(此句尚無繁中翻譯)
1:24:23.381–1:24:32.605
Being a visual person, this gives me an understanding of the scope of an app, how the app looks, the user flow, and stuff like that.
(此句尚無繁中翻譯)
1:24:32.605–1:24:38.400
And we can actually use Codex to create that visual architecture for us.
(此句尚無繁中翻譯)
1:24:38.400–1:24:52.192
Now, I have here a prepared prompt that creates this visual architecture, and we want to ensure that we use the built-in image generation that we have as well as Chat GPT to do it.
(此句尚無繁中翻譯)
1:24:52.192–1:24:56.811
So, I'm going to press forward slash, and I'm going to search for Imagen.
(此句尚無繁中翻譯)
1:24:56.811–1:25:01.321
Okay, and then we can say something like use Imagen for the following.
(此句尚無繁中翻譯)
1:25:01.321–1:25:05.936
And I'm going to go jump into plan mode, and I'm going to go ahead and and execute it.
(此句尚無繁中翻譯)
1:25:05.936–1:25:15.285
Okay, and it came back with a habit card architecture diagram, and here it says create one raster infographic using this.
(此句尚無繁中翻譯)
1:25:15.285–1:25:16.444
So, everything looks good.
(此句尚無繁中翻譯)
1:25:16.444–1:25:19.470
There there's some diagram content, visual direction.
(此句尚無繁中翻譯)
1:25:19.480–1:25:21.272
That's a wide composition.
(此句尚無繁中翻譯)
1:25:21.272–1:25:22.030
Looks good.
(此句尚無繁中翻譯)
1:25:22.040–1:25:24.270
We're going to say yes, implement this.
(此句尚無繁中翻譯)
1:25:24.280–1:25:26.162
Okay, and that is our habit card.
(此句尚無繁中翻譯)
1:25:26.162–1:25:28.314
That is our visual interface.
(此句尚無繁中翻譯)
1:25:28.314–1:25:32.382
And right away, I can see what this app is all about, right?
(此句尚無繁中翻譯)
1:25:32.382–1:25:39.086
We have add habit, we have habit list, we have today check-in, and we have a streak count.
(此句尚無繁中翻譯)
1:25:39.086–1:25:44.350
Then we have an empty state, we have local storage later, and we have the Versel deploy.
(此句尚無繁中翻譯)
1:25:44.360–1:25:52.045
And so, this is a very, very simplified visual architecture, but it is very, very important.
(此句尚無繁中翻譯)
1:25:52.045–1:26:01.184
I want to see right away what I'm dealing with, what I'm working with, how many pages, you know, how complex is the app, how simple is the app.
(此句尚無繁中翻譯)
1:26:01.184–1:26:04.756
I see that this is not going to be, you know, a very complex app.
(此句尚無繁中翻譯)
1:26:04.756–1:26:10.190
It's going to be a fairly simple app, but we do have some interesting bits here, right?
(此句尚無繁中翻譯)
1:26:10.200–1:26:14.954
This empty state, we have some local storage, we have a Versel deploy.
(此句尚無繁中翻譯)
1:26:14.954–1:26:19.102
And so, it's a fairly simple app, but still a fairly workable app.
(此句尚無繁中翻譯)
1:26:19.102–1:26:22.777
Now, the next thing that I like to do is create the entity architecture.
(此句尚無繁中翻譯)
1:26:22.777–1:26:28.305
And this is where we're going to be mapping the small set of entities behind the app.
(此句尚無繁中翻譯)
1:26:28.305–1:26:41.540
So, even though the first version is front end only, it is useful to name the habit, the daily check-in, and the streak count summary before we add a local storage later.
(此句尚無繁中翻譯)
1:26:41.540–1:26:44.278
And this right here is the entity diagram.
(此句尚無繁中翻譯)
1:26:44.278–1:26:47.925
And I'm just going to say use ImageGen for below.
(此句尚無繁中翻譯)
1:26:47.925–1:26:50.037
Going to go ahead and run that.
(此句尚無繁中翻譯)
1:26:50.037–1:26:51.870
And I can run it directly.
(此句尚無繁中翻譯)
1:26:51.880–1:26:56.687
I don't really need to run it in plan mode because it's just generating a diagram.
(此句尚無繁中翻譯)
1:26:56.687–1:27:05.737
I'm not asking it a complex, ambiguous coding question or giving it a an ambiguous coding instruction.
(此句尚無繁中翻譯)
1:27:05.737–1:27:08.258
And here is our entity architecture.
(此句尚無繁中翻譯)
1:27:08.258–1:27:18.270
And unlike the visual architecture that we've generated previously, here we're actually seeing the entities that will later become the actual storage schema.
(此句尚無繁中翻譯)
1:27:18.280–1:27:18.608
Okay?
(此句尚無繁中翻譯)
1:27:18.608–1:27:26.650
So, we have the habit, we have a habit check-in, we have a streak summary, and then local storage as the back end.
(此句尚無繁中翻譯)
1:27:26.650–1:27:30.393
So, no back end, everything is stored locally with local storage.
(此句尚無繁中翻譯)
1:27:30.393–1:27:39.005
And this is also very, very useful because unlike the visual diagram here, I want to see the actual schema.
(此句尚無繁中翻譯)
1:27:39.005–1:27:48.894
I want to see what kind of, you know, elements or what kind of, you know, tables we might need to translate this app schema into.
(此句尚無繁中翻譯)
1:27:48.894–1:27:51.590
And as you can see, this is fairly simple.
(此句尚無繁中翻譯)
1:27:51.600–1:27:54.430
Habit, habit check-in, streak summary.
(此句尚無繁中翻譯)
1:27:54.440–1:28:01.398
We have these three main functions here, these three main features that were translated into entities.
(此句尚無繁中翻譯)
1:28:01.398–1:28:01.733
Okay?
(此句尚無繁中翻譯)
1:28:01.733–1:28:08.133
And then we have And for each entity, we have things like name, created at date, completed count.
(此句尚無繁中翻譯)
1:28:08.133–1:28:13.430
Now, at this point, we have both the visual architecture as well as the entity architecture.
(此句尚無繁中翻譯)
1:28:13.430–1:28:21.907
And this is something that I like to do for pretty much every single app that I build because I want to get an idea what I'm really dealing with, right?
(此句尚無繁中翻譯)
1:28:21.907–1:28:26.383
I want to have an understanding of the the scope of the app.
(此句尚無繁中翻譯)
1:28:26.383–1:28:29.138
And right now I can see exactly where we are.
(此句尚無繁中翻譯)
1:28:29.138–1:28:31.547
I can see that this is a fairly simple app.
(此句尚無繁中翻譯)
1:28:31.547–1:28:33.324
I can see the entities.
(此句尚無繁中翻譯)
1:28:33.324–1:28:35.460
I I I see the app building.
(此句尚無繁中翻譯)
1:28:35.460–1:28:37.014
I see the future of the app.
(此句尚無繁中翻譯)
1:28:37.014–1:28:38.628
I see the app coming together.
(此句尚無繁中翻譯)
1:28:38.628–1:28:48.790
Now, the next thing that we want to do is we want to use the plan mode to ask Codex what stack makes sense for this first app.
(此句尚無繁中翻譯)
1:28:48.800–1:28:55.490
The important part is that Codex should recommend the simplest path before it edits any files.
(此句尚無繁中翻譯)
1:28:55.490–1:28:59.271
And as you might have guessed, we are going to be doing this in plan mode.
(此句尚無繁中翻譯)
1:28:59.271–1:28:59.787
All right?
(此句尚無繁中翻譯)
1:28:59.787–1:29:01.988
And here's the prompt that we're going to be using.
(此句尚無繁中翻譯)
1:29:01.988–1:29:03.435
Do not edit files yet.
(此句尚無繁中翻譯)
1:29:03.435–1:29:09.123
Inspect the current project and recommend the simplest stack for Habit Card, right?
(此句尚無繁中翻譯)
1:29:09.123–1:29:23.443
And we ask it what what it should come back with, and we're going to press shift tab to enable the plan mode, of course, because we want it to come back to us if it needs to and ask any clarifying questions.
(此句尚無繁中翻譯)
1:29:23.443–1:29:29.110
We need it to clarify everything before we go deeper into the building the app.
(此句尚無繁中翻譯)
1:29:29.120–1:29:30.992
Okay, I'm going to go ahead and execute this.
(此句尚無繁中翻譯)
1:29:30.992–1:29:33.372
And let's see what it comes back with.
(此句尚無繁中翻譯)
1:29:33.372–1:29:38.230
And in this case, it did not come back with any clarifying questions.
(此句尚無繁中翻譯)
1:29:38.240–1:29:38.639
Okay?
(此句尚無繁中翻譯)
1:29:38.639–1:29:40.552
So, it's writing a plan.
(此句尚無繁中翻譯)
1:29:40.552–1:29:45.017
And the recommended front end stack is going to be React TypeScript, right?
(此句尚無繁中翻譯)
1:29:45.017–1:29:49.396
It wants to use Tailwind CSS for fast simple styling.
(此句尚無繁中翻譯)
1:29:49.396–1:29:51.481
This is the testing library.
(此句尚無繁中翻譯)
1:29:51.481–1:29:52.739
No React Router.
(此句尚無繁中翻譯)
1:29:52.739–1:29:55.317
It's a simple single screen app.
(此句尚無繁中翻譯)
1:29:55.317–1:29:57.230
No global state library.
(此句尚無繁中翻譯)
1:29:57.240–1:29:57.612
Okay?
(此句尚無繁中翻譯)
1:29:57.612–1:29:58.949
Back end decision.
(此句尚無繁中翻譯)
1:29:58.949–1:30:01.652
No back end is needed for the first version, right?
(此句尚無繁中翻譯)
1:30:01.652–1:30:03.187
And that's what we told it.
(此句尚無繁中翻譯)
1:30:03.187–1:30:06.663
We said bias toward a front end only implementation first.
(此句尚無繁中翻譯)
1:30:06.663–1:30:09.635
And then it's also going to use browser verification.
(此句尚無繁中翻譯)
1:30:09.635–1:30:12.423
Okay, open the app in the browser, verify all this.
(此句尚無繁中翻譯)
1:30:12.423–1:30:15.176
Okay, so let's go ahead and and run this.
(此句尚無繁中翻譯)
1:30:15.176–1:30:23.830
All right, so it worked for about 10 minutes and it has implemented the habit card as a front-end only React TypeScript app.
(此句尚無繁中翻譯)
1:30:23.840–1:30:25.652
This is where it is and this is what it did, right?
(此句尚無繁中翻譯)
1:30:25.652–1:30:27.207
It built the app shell and did, right?
(此句尚無繁中翻譯)
1:30:27.207–1:30:35.795
It built the app shell and UI, habit logic, local storage, components for adding form for the add form, list card, and empty state.
(此句尚無繁中翻譯)
1:30:35.795–1:30:42.957
Tests for app flow logic and storage, and verification passed nine tests, production build succeeded.
(此句尚無繁中翻譯)
1:30:42.957–1:30:47.331
And it also gave us a dev server that is running the app.
(此句尚無繁中翻譯)
1:30:47.331–1:30:56.159
And so this dev server is running on my machine right now and this allows us to quickly test things without needing to deploy and test there.
(此句尚無繁中翻譯)
1:30:56.159–1:31:09.161
And on the right-hand side we have this card that is always available and it shows us things like artifacts, background terminal, and basically things that were created as part of this conversation.
(此句尚無繁中翻譯)
1:31:09.161–1:31:13.753
Okay, so we have the images that were generated, we have the index.html for the app.
(此句尚無繁中翻譯)
1:31:13.753–1:31:16.821
We have the background terminal that is running here.
(此句尚無繁中翻譯)
1:31:16.821–1:31:23.003
And so I can click here and that's going to go ahead and and go to the server that's running our app.
(此句尚無繁中翻譯)
1:31:23.003–1:31:23.927
So let's do that.
(此句尚無繁中翻譯)
1:31:23.927–1:31:25.316
That's going to go ahead and open.
(此句尚無繁中翻譯)
1:31:25.316–1:31:29.320
It's also going to open the browser right here in the right-hand pane.
(此句尚無繁中翻譯)
1:31:29.320–1:31:35.352
Now, before we had we had no right-hand pane, but if you click here, you can see that it opens up here right there.
(此句尚無繁中翻譯)
1:31:35.352–1:31:38.416
Another thing that you can do is you can open the browser directly.
(此句尚無繁中翻譯)
1:31:38.416–1:31:42.282
This is the front page here and I can add a habit, habit one.
(此句尚無繁中翻譯)
1:31:42.282–1:31:44.900
I can click here and we have a habit here.
(此句尚無繁中翻譯)
1:31:44.900–1:31:46.299
I can add another we have a habit here.
(此句尚無繁中翻譯)
1:31:46.299–1:31:49.039
I can add another habit, habit two or maybe gym.
(此句尚無繁中翻譯)
1:31:49.039–1:31:51.682
And it's creating these these habits here.
(此句尚無繁中翻譯)
1:31:51.682–1:31:54.038
So I can check it off and that is done.
(此句尚無繁中翻譯)
1:31:54.038–1:31:54.835
Check it off.
(此句尚無繁中翻譯)
1:31:54.835–1:31:57.082
And so it's a very very simple app.
(此句尚無繁中翻譯)
1:31:57.082–1:32:05.420
And if you want to see the actual files that were created as part of this, you can simply right click here and open in finder.
(此句尚無繁中翻譯)
1:32:05.420–1:32:08.653
And this is the React app that was created for this here.
(此句尚無繁中翻譯)
1:32:08.653–1:32:13.981
Once the UI works, we'll add a small persistence step with local storage.
(此句尚無繁中翻譯)
1:32:13.981–1:32:18.025
Habits and today's check-ins can persist after refresh.
(此句尚無繁中翻譯)
1:32:18.025–1:32:23.851
So, the app starts to feel real without introducing a backend yet.
(此句尚無繁中翻譯)
1:32:23.851–1:32:26.038
And this is the prompt that we're going to be using.
(此句尚無繁中翻譯)
1:32:26.038–1:32:31.120
Upgrade habit card so habits and today's check-ins persist with local storage.
(此句尚無繁中翻譯)
1:32:31.120–1:32:35.030
I'm going to jump into the plan mode here just in case.
(此句尚無繁中翻譯)
1:32:35.040–1:32:36.790
And I'm going to go ahead and run this.
(此句尚無繁中翻譯)
1:32:36.800–1:32:45.305
Now, it's actually telling us that inspection shows that habit card already implements the requested front-end only local storage persistence.
(此句尚無繁中翻譯)
1:32:45.305–1:32:45.726
Okay?
(此句尚無繁中翻譯)
1:32:45.726–1:32:48.350
So, no file edits are needed for this upgrade.
(此句尚無繁中翻譯)
1:32:48.360–1:32:52.129
So, we must have done this in one of the previous prompts.
(此句尚無繁中翻譯)
1:32:52.129–1:32:55.750
But, if we hadn't done this, then we would run this prompt.
(此句尚無繁中翻譯)
1:32:55.760–1:32:57.230
But, still, let's go ahead and run it.
(此句尚無繁中翻譯)
1:32:57.240–1:33:05.270
And now it tells us that persistence works through this storage using these keys and a lot of other details here.
(此句尚無繁中翻譯)
1:33:05.280–1:33:05.811
Okay?
(此句尚無繁中翻譯)
1:33:05.811–1:33:10.587
So, we can reload this and now we have something called local storage.
(此句尚無繁中翻譯)
1:33:10.587–1:33:17.734
And what this means is that this app does not have a backend, but this stuff is going to be stored on my browser.
(此句尚無繁中翻譯)
1:33:17.734–1:33:18.168
Okay?
(此句尚無繁中翻譯)
1:33:18.168–1:33:22.437
So, if I'm using this instance, it's going to be stored on this browser.
(此句尚無繁中翻譯)
1:33:22.437–1:33:26.189
If I run it in a different browser, then it's not going to have the data.
(此句尚無繁中翻譯)
1:33:26.189–1:33:30.483
So, whatever I do in that new browser is going to have fresh data.
(此句尚無繁中翻譯)
1:33:30.483–1:33:35.894
And so, this is a way to create, you know, storage just for testing me.
(此句尚無繁中翻譯)
1:33:35.894–1:33:41.036
I mean, you can use this in production as well for certain apps, for certain situations.
(此句尚無繁中翻譯)
1:33:41.036–1:33:48.357
It does have its place, but it's very, very limiting compared to something like Supabase or something of that sort.
(此句尚無繁中翻譯)
1:33:48.357–1:33:53.019
And so, we can delete all this, we can do all that, we can start.
(此句尚無繁中翻譯)
1:33:53.019–1:34:09.630
And if I copy this, run this app, and I load this app, there's nothing there because I'm using a brand new browser instance, and I can create, I can do, I can check off, I can do this, I can do all that, but if I go back to CodeX, there's nothing here,
(此句尚無繁中翻譯)
1:34:09.640–1:34:10.005
right?
(此句尚無繁中翻譯)
1:34:10.005–1:34:23.345
It's not syncing, it's not using my account, and it's not using a unified back-end, so that no matter which browser I use, it will still store the data and keep track of everything.
(此句尚無繁中翻譯)
1:34:23.345–1:34:24.721
That is not happening.
(此句尚無繁中翻譯)
1:34:24.721–1:34:28.369
Once the app works locally, it's time to deploy it.
(此句尚無繁中翻譯)
1:34:28.369–1:34:37.811
Even though Habit Card is simple, this is the first moment where CodeX helps move something from local code to a real-life URL.
(此句尚無繁中翻譯)
1:34:37.811–1:34:41.106
And so, CodeX can do the whole deployment process.
(此句尚無繁中翻譯)
1:34:41.106–1:34:52.542
It can run the local checks, prepare the projects, connect or create the Vercel project, deploy the front-end, and then verify that the live page actually loads.
(此句尚無繁中翻譯)
1:34:52.542–1:34:56.905
And additionally, you want that first deployment to feel very concrete.
(此句尚無繁中翻譯)
1:34:56.905–1:35:00.350
We're not just writing code and hoping it works.
(此句尚無繁中翻譯)
1:35:00.360–1:35:09.530
We're taking a small app, shipping it, opening the deployed URL, and checking the result like we would with a real project.
(此句尚無繁中翻譯)
1:35:09.530–1:35:12.815
And here is my Vercel deployment prompt.
(此句尚無繁中翻譯)
1:35:12.815–1:35:20.132
Prepare Habit Card for deployment on Vercel, and verify it works as a small front-end only app.
(此句尚無繁中翻譯)
1:35:20.132–1:35:23.696
So, at this point, we are just preparing it for deployment.
(此句尚無繁中翻譯)
1:35:23.696–1:35:34.570
We're not yet deploying it, but still, this is an important step because this will ensure that once we do deploy it, that it will work without any issues.
(此句尚無繁中翻譯)
1:35:34.570–1:35:44.590
I'm going to go jump into the plan mode, and remember, we do have that Vercel plugin enabled, and so it should use it automatically with no issues.
(此句尚無繁中翻譯)
1:35:44.600–1:35:46.350
I'm going to go ahead and execute this.
(此句尚無繁中翻譯)
1:35:46.360–1:35:49.983
All right, so it went ahead and created a Vercel deployment plan.
(此句尚無繁中翻譯)
1:35:49.983–1:35:55.916
Okay, Habit Card is already a suitable for a front-end only for sale deployment, okay?
(此句尚無繁中翻譯)
1:35:55.916–1:36:00.334
And this is what it's going to do, and here is the deployment implementation.
(此句尚無繁中翻譯)
1:36:00.334–1:36:10.230
Keep the app front-end only, do not add Convex, which is a back-end APIs or database server functions, or external services, none of functions, or external services, none of that.
(此句尚無繁中翻譯)
1:36:10.240–1:36:16.755
And local storage persistence is expected to be local to each browser and deployment origin.
(此句尚無繁中翻譯)
1:36:16.755–1:36:20.067
Data will not sync across devices or URLs, okay?
(此句尚無繁中翻譯)
1:36:20.067–1:36:22.969
Let's go ahead and implement this plan.
(此句尚無繁中翻譯)
1:36:22.969–1:36:29.180
And 3 minutes later, it tells us that deployed Habit Card to Vercel and verified it live, okay?
(此句尚無繁中翻譯)
1:36:29.180–1:36:31.226
So, this is the live URL.
(此句尚無繁中翻譯)
1:36:31.226–1:36:38.011
We can click here, and that's going to open our Habit Card app running on the web, right?
(此句尚無繁中翻譯)
1:36:38.011–1:36:39.495
Accessible to everybody.
(此句尚無繁中翻譯)
1:36:39.495–1:36:42.572
And this again uses local storage, okay?
(此句尚無繁中翻譯)
1:36:42.572–1:36:50.208
So, we can do that over here, and of course, you know, it's not going to be available in another instance because it's all stored locally.
(此句尚無繁中翻譯)
1:36:50.208–1:37:05.769
And so, at this point, we designed, architected, built, tested, and then deployed a very, very simple web app that uses local storage as our back-end, and this proved the whole cycle for us.
(此句尚無繁中翻譯)
1:37:05.769–1:37:25.350
Now, in the next several modules, we're going to be doing the same, but with more complex apps, slowly adding things like authentication, back-end, and other important components that you need for a real production app.
(此句尚無繁中翻譯)
1:37:25.360–1:37:33.938
The second app we'll be building will be a mini team voting app where people submit lunch or snack ideas and vote on the winner.
(此句尚無繁中翻譯)
1:37:33.938–1:37:38.903
It's a bit more complex with more features, but still fairly simple overall.
(此句尚無繁中翻譯)
1:37:38.903–1:37:48.550
Snack Vote has a submit option form, a snack option list, vote buttons, a live leaderboard, and a winner card.
(此句尚無繁中翻譯)
1:37:48.560–1:37:55.749
This app will serve as a bridge between a simple front end and the larger marketplace app we'll build right after this.
(此句尚無繁中翻譯)
1:37:55.749–1:38:06.471
Instead of jumping straight into complex entities such as customers, bookings, and permissions, we can first learn the back end pattern on a much smaller app.
(此句尚無繁中翻譯)
1:38:06.471–1:38:10.409
Snack Vote only needs snack options and votes.
(此句尚無繁中翻譯)
1:38:10.409–1:38:17.379
Someone can submit an option, other people can vote, and the leaderboard updates as the vote counts change.
(此句尚無繁中翻譯)
1:38:17.379–1:38:25.168
That gives us enough structure to understand live back end data without making the product itself hard to follow.
(此句尚無繁中翻譯)
1:38:25.168–1:38:30.628
As always, in this first step, we'll be mapping the Snack Vote interface visually.
(此句尚無繁中翻譯)
1:38:30.628–1:38:34.350
The app should be simple enough to understand immediately.
(此句尚無繁中翻譯)
1:38:34.360–1:38:45.446
Create or join a voting room, submit a snack option, vote once, watch the leaderboard update, and see a leaderboard update, and see a deadline-driven winner state.
(此句尚無繁中翻譯)
1:38:45.446–1:38:51.588
Now, here in Codex, we're going to come here, and we're going to create a new project from an existing folder.
(此句尚無繁中翻譯)
1:38:51.588–1:38:52.950
We're going to click over here.
(此句尚無繁中翻譯)
1:38:52.960–1:38:54.904
Here, we're going to create a new folder.
(此句尚無繁中翻譯)
1:38:54.904–1:38:58.476
I'm going to type Snack Vote, and we're going to click open.
(此句尚無繁中翻譯)
1:38:58.476–1:39:02.802
And now, we have a brand new project configured here in Codex.
(此句尚無繁中翻譯)
1:39:02.802–1:39:06.089
And here's our prompt for the visual architecture.
(此句尚無繁中翻譯)
1:39:06.089–1:39:12.249
We want to preface that we want to use this image, and we're going to jump into plan mode and execute this.
(此句尚無繁中翻譯)
1:39:12.249–1:39:13.390
And that looks good.
(此句尚無繁中翻譯)
1:39:13.400–1:39:15.150
We're going to go ahead and expand that.
(此句尚無繁中翻譯)
1:39:15.160–1:39:16.656
Go ahead and implement that.
(此句尚無繁中翻譯)
1:39:16.656–1:39:19.704
And here's our Snack Vote visual architecture.
(此句尚無繁中翻譯)
1:39:19.704–1:39:21.679
Look at this beautiful diagram.
(此句尚無繁中翻譯)
1:39:21.679–1:39:24.081
So, you can create or join a room.
(此句尚無繁中翻譯)
1:39:24.081–1:39:29.150
In the current room, you're going to be seeing this, members and the time left.
(此句尚無繁中翻譯)
1:39:29.150–1:39:31.494
You can You have here a snack list.
(此句尚無繁中翻譯)
1:39:31.494–1:39:34.230
You have your your voting buttons.
(此句尚無繁中翻譯)
1:39:34.240–1:39:38.782
You have a live leaderboard, and you have a closed winner state.
(此句尚無繁中翻譯)
1:39:38.782–1:39:46.714
Okay, with some voting deadlines here, here as well, and then we also have our Vercel deploy.
(此句尚無繁中翻譯)
1:39:46.714–1:39:54.110
And so this looks like a fairly fun app with a lot of things going on, and so I can't wait to implement this.
(此句尚無繁中翻譯)
1:39:54.120–1:39:57.924
And we're also going to be adding more and more features as we go along.
(此句尚無繁中翻譯)
1:39:57.924–1:40:04.070
Next, I want to go ahead and create an entity diagram, an entity architecture diagram.
(此句尚無繁中翻譯)
1:40:04.080–1:40:05.334
So here's our prompt.
(此句尚無繁中翻譯)
1:40:05.334–1:40:09.213
We're going to do this, and we're going to go ahead and execute that.
(此句尚無繁中翻譯)
1:40:09.213–1:40:11.158
And here's our entity diagram.
(此句尚無繁中翻譯)
1:40:11.158–1:40:17.073
Okay, so a room contains multiple snack options and has one voting session, right?
(此句尚無繁中翻譯)
1:40:17.073–1:40:21.623
We have the voting room, many snack options, and many votes, right?
(此句尚無繁中翻譯)
1:40:21.623–1:40:31.514
We have We have here some winner logic, the winner logic snack option with the highest vote count when now is greater than or equal to closes at, right?
(此句尚無繁中翻譯)
1:40:31.514–1:40:39.030
So after the deadline, we have here a legend, and here we have a sample kind of workflow, a pipeline.
(此句尚無繁中翻譯)
1:40:39.040–1:40:41.709
Build the UI first, connect it to Convex.
(此句尚無繁中翻譯)
1:40:41.709–1:40:52.364
Later, Convex is going to be our backend, and we are going to be leveraging things like real-time updates, persistence, and live vote counts.
(此句尚無繁中翻譯)
1:40:52.364–1:41:07.550
And so now that we've generated a visual architecture diagram, as well as our entity diagram, the next thing that we want to do is we want to ask Codex for some stack recommendations, because there are lots of ways that we
(此句尚無繁中翻譯)
1:41:07.560–1:41:12.885
can build out this app, and we want Codex to tell us the best options for this specific app.
(此句尚無繁中翻譯)
1:41:12.885–1:41:17.723
Here's the prompt that we're going to be using, and I'm going to switch into plan mode here.
(此句尚無繁中翻譯)
1:41:17.723–1:41:25.466
And it's telling us do not edit files yet, inspect the current project, and recommend the simplest stack for Snack Poll.
(此句尚無繁中翻譯)
1:41:25.466–1:41:27.504
And here's the plan that it came back with.
(此句尚無繁中翻譯)
1:41:27.504–1:41:29.396
Here we have the stack recommendation.
(此句尚無繁中翻譯)
1:41:29.396–1:41:32.955
We're going to be using React, TypeScript, Tailwind.
(此句尚無繁中翻譯)
1:41:32.955–1:41:39.317
And here it says backend later Convex with TypeScript server functions and generated client types.
(此句尚無繁中翻譯)
1:41:39.317–1:41:55.830
And so, for the most part, uh this is very, very similar, if not the exact same architecture stack that we use for the first app, except we're going to be adding more and more features, and also connecting a back end for the first time
(此句尚無繁中翻譯)
1:41:55.840–1:41:57.088
in this tutorial.
(此句尚無繁中翻譯)
1:41:57.088–1:42:06.250
Now, here, instead of clicking submit, I'm going to give it another prompt, and this prompt is going to start building the app, writing the code.
(此句尚無繁中翻譯)
1:42:06.250–1:42:14.308
And here's the prompt, "Implement the first working Snack Vote UI without a database or persistence, okay?
(此句尚無繁中翻譯)
1:42:14.308–1:42:23.030
Inspect the current project first, then build the smallest useful Snack Vote UI." And there's some verification steps as well.
(此句尚無繁中翻譯)
1:42:23.040–1:42:32.002
And we also explicitly tell it to not use convex, local storage, or an API, nothing of that, just keep it to these specs right here.
(此句尚無繁中翻譯)
1:42:32.002–1:42:33.963
And we also have some verification.
(此句尚無繁中翻譯)
1:42:33.963–1:42:38.724
So, I'm going to go ahead and run this in plan mode, in case it wants to ask me something.
(此句尚無繁中翻譯)
1:42:38.724–1:42:50.131
So, it doesn't have any questions for us, and that is because in this specific conversation, we already fleshed out, you know, things like the architecture, the stack, and all of that stuff.
(此句尚無繁中翻譯)
1:42:50.131–1:42:54.142
And so, it kind of knows what it needs to do to build out this app.
(此句尚無繁中翻譯)
1:42:54.142–1:43:00.100
So, we're going to say, "Yes, implement this." because this is the step where we actually want the code written.
(此句尚無繁中翻譯)
1:43:00.100–1:43:07.860
All right, so this has completed, and it says here, "Implemented the first working UI-only Snack Vote app here.
(此句尚無繁中翻譯)
1:43:07.860–1:43:09.748
Created all of this.
(此句尚無繁中翻譯)
1:43:09.748–1:43:10.954
What works?
(此句尚無繁中翻譯)
1:43:10.954–1:43:12.995
Verification completed.
(此句尚無繁中翻譯)
1:43:12.995–1:43:15.070
Still needs attention later."
(此句尚無繁中翻譯)
1:43:15.080–1:43:18.617
Okay, all of these things, and we'll talk about that a little bit later.
(此句尚無繁中翻譯)
1:43:18.617–1:43:20.792
And so, now we have a web preview.
(此句尚無繁中翻譯)
1:43:20.792–1:43:27.300
So, we can click on open, and that's going to go ahead and open it right here in our built-in browser here.
(此句尚無繁中翻譯)
1:43:27.300–1:43:28.993
This is our app right here.
(此句尚無繁中翻譯)
1:43:28.993–1:43:31.508
And so, we have snack and lunch options.
(此句尚無繁中翻譯)
1:43:31.508–1:43:41.790
We can create, we can submit an option, add sample snacks, click here, and we have these snack options here with some votes here.
(此句尚無繁中翻譯)
1:43:41.800–1:43:43.179
Leaderboard, right?
(此句尚無繁中翻譯)
1:43:43.179–1:43:44.630
So, this is winning.
(此句尚無繁中翻譯)
1:43:44.640–1:43:48.471
Winner state, current winner leader, spicy ramen bowls.
(此句尚無繁中翻譯)
1:43:48.471–1:43:52.717
And so, if I vote on falafel wraps, uh wraps, six.
(此句尚無繁中翻譯)
1:43:52.717–1:43:53.246
Right?
(此句尚無繁中翻譯)
1:43:53.246–1:43:54.526
So, now it's six.
(此句尚無繁中翻譯)
1:43:54.526–1:43:55.918
I can keep voting.
(此句尚無繁中翻譯)
1:43:55.918–1:43:59.754
And that's a problem right away, and it's in memory.
(此句尚無繁中翻譯)
1:43:59.754–1:44:03.474
And one person can vote multiple times, which is an issue.
(此句尚無繁中翻譯)
1:44:03.474–1:44:07.815
We're going to fix that a little bit later, but I can also add a snack.
(此句尚無繁中翻譯)
1:44:07.815–1:44:09.335
Let's say sushi.
(此句尚無繁中翻譯)
1:44:09.335–1:44:10.617
I don't know, sushi.
(此句尚無繁中翻譯)
1:44:10.617–1:44:14.017
Add this, and we have sushi, and I can also vote on that.
(此句尚無繁中翻譯)
1:44:14.017–1:44:19.630
So, it's a big big issue, but for the most part, the logic works, the UI works.
(此句尚無繁中翻譯)
1:44:19.640–1:44:25.946
Now, once the snack vote UI exists, we're going to replace the mock snack data with real Convex data.
(此句尚無繁中翻譯)
1:44:25.946–1:44:33.424
And for those of you that that are not familiar, Convex is a back end that we're going to be using in this tutorial.
(此句尚無繁中翻譯)
1:44:33.424–1:44:35.807
It's an awesome back end, super fast.
(此句尚無繁中翻譯)
1:44:35.807–1:44:42.670
And if you want to learn more information, I actually did a dedicated video on it that you can find right there.
(此句尚無繁中翻譯)
1:44:42.680–1:44:52.392
And so, once we add Convex, our app will stop being a static interface and start behaving like a real database back product.
(此句尚無繁中翻譯)
1:44:52.392–1:44:54.523
And the path is very very simple.
(此句尚無繁中翻譯)
1:44:54.523–1:45:07.322
Code X creates the Convex schema, adds a query, adds mutations, connects it to the UI, and then we verify the result in both the browser and the Convex dashboard.
(此句尚無繁中翻譯)
1:45:07.322–1:45:12.660
And so, when we submit an option in the app, it should be written back to Convex.
(此句尚無繁中翻譯)
1:45:12.660–1:45:17.870
When we look inside the Convex dashboard, that snack option should be there.
(此句尚無繁中翻譯)
1:45:17.870–1:45:30.110
And when someone votes, the UI should update live so that we can see the front end and back end working together instead of treating the back end like a black box.
(此句尚無繁中翻譯)
1:45:30.120–1:45:34.470
And when you head over to convex.dev, you can learn more about this back end.
(此句尚無繁中翻譯)
1:45:34.480–1:45:36.470
And this is a great, great back end.
(此句尚無繁中翻譯)
1:45:36.480–1:45:41.464
It's very, very fast, and it works really great with agents, right?
(此句尚無繁中翻譯)
1:45:41.464–1:45:44.386
So, the back end building blocks for your agents, okay?
(此句尚無繁中翻譯)
1:45:44.386–1:45:47.438
So, I'm going to go ahead and log in to my free account.
(此句尚無繁中翻譯)
1:45:47.438–1:45:48.766
I'm using the free plan.
(此句尚無繁中翻譯)
1:45:48.766–1:45:50.233
I'm not paying for anything.
(此句尚無繁中翻譯)
1:45:50.233–1:45:54.006
And this is also an open-source back end, so you can also self-host it if you want.
(此句尚無繁中翻譯)
1:45:54.006–1:45:55.576
So, I'm going to go ahead and log in.
(此句尚無繁中翻譯)
1:45:55.576–1:45:57.057
All right, so here I am logged in.
(此句尚無繁中翻譯)
1:45:57.057–1:45:59.859
And as you can see, I have here two projects.
(此句尚無繁中翻譯)
1:45:59.859–1:46:06.887
Now, our app is going to automatically create a brand new project for its data, for its functions, for everything.
(此句尚無繁中翻譯)
1:46:06.887–1:46:12.030
And here back in Codex, we're going to paste a new prompt that looks something like this.
(此句尚無繁中翻譯)
1:46:12.040–1:46:19.835
Upgrade Snack Votes to Snack Options, and Votes are stored in Convex instead of local in-memory state.
(此句尚無繁中翻譯)
1:46:19.835–1:46:26.473
Now, if I press command, comma, and go to MCP Servers, you can see that I do not have the Convex MCP server.
(此句尚無繁中翻譯)
1:46:26.473–1:46:30.296
And that is because we're not going to be connecting to Convex via MCP.
(此句尚無繁中翻譯)
1:46:30.296–1:46:39.310
We're actually going to be connecting to it using a much simpler method, and that is the CLI, which stands for command line interface.
(此句尚無繁中翻譯)
1:46:39.320–1:46:45.634
And actually, before I run this prompt, we're going to check to make sure that we have a connection.
(此句尚無繁中翻譯)
1:46:45.634–1:46:54.550
Can you first check that we have the Convex CLI installed, and if not, do install it.
(此句尚無繁中翻譯)
1:46:54.560–1:46:55.905
I'm going to go ahead and run it.
(此句尚無繁中翻譯)
1:46:55.905–1:47:01.630
Now, I already have Convex CLI installed, but you can just tell Codex to install it.
(此句尚無繁中翻譯)
1:47:01.640–1:47:02.410
It's that easy.
(此句尚無繁中翻譯)
1:47:02.410–1:47:11.707
And so, it's telling me that NPX, which is a package manager, could fetch Convex temporarily, but the project does not have it installed.
(此句尚無繁中翻譯)
1:47:11.707–1:47:16.903
I'm installing Convex into the project now as a dev dependency, okay?
(此句尚無繁中翻譯)
1:47:16.903–1:47:19.144
Convex is installed locally now, okay?
(此句尚無繁中翻譯)
1:47:19.144–1:47:20.884
I'll verify the CLI results.
(此句尚無繁中翻譯)
1:47:20.884–1:47:26.861
And so, you don't need to read lots and lots of documentation, figure out how to connect to it.
(此句尚無繁中翻譯)
1:47:26.861–1:47:29.409
You just tell Codex that you want to connect to it.
(此句尚無繁中翻譯)
1:47:29.409–1:47:30.431
It's that easy.
(此句尚無繁中翻譯)
1:47:30.431–1:47:34.070
So, Convex CLI is installed locally in the project now.
(此句尚無繁中翻譯)
1:47:34.080–1:47:36.590
Okay, so now we can paste the prompt.
(此句尚無繁中翻譯)
1:47:36.600–1:47:42.531
Upgrade snack votes so snack options and votes are stored in Convex instead of local in-memory state.
(此句尚無繁中翻譯)
1:47:42.531–1:47:46.323
So, I'm going to go ahead and do this and let's go into plan mode.
(此句尚無繁中翻譯)
1:47:46.323–1:47:49.757
See if it wants to ask me something or clarify something.
(此句尚無繁中翻譯)
1:47:49.757–1:47:53.095
And so, it's telling me one material set of choices to open.
(此句尚無繁中翻譯)
1:47:53.095–1:47:55.304
There's no existing Convex folder.
(此句尚無繁中翻譯)
1:47:55.304–1:47:58.859
So, this app is not linked to a Convex deployment yet.
(此句尚無繁中翻譯)
1:47:58.859–1:47:59.676
And that is correct.
(此句尚無繁中翻譯)
1:47:59.676–1:48:01.342
And that's what we want to do next.
(此句尚無繁中翻譯)
1:48:01.342–1:48:07.902
And now it's asking me which Convex backend should snack vote use for this first backed version.
(此句尚無繁中翻譯)
1:48:07.902–1:48:09.745
We want to create a new one, right?
(此句尚無繁中翻譯)
1:48:09.745–1:48:12.459
So, we're going to go with the recommended option.
(此句尚無繁中翻譯)
1:48:12.459–1:48:20.634
All right, and now we have a new plan to upgrade the existing app from in-memory snack options to live Convex data.
(此句尚無繁中翻譯)
1:48:20.634–1:48:21.110
Okay?
(此句尚無繁中翻譯)
1:48:21.120–1:48:29.574
So, it's going to do everything and it's going to essentially configure the backend to be Convex, set up the schema, set up the data, everything.
(此句尚無繁中翻譯)
1:48:29.574–1:48:36.175
And once it's done, we should be able to go to Convex and see a brand new project here automatically created.
(此句尚無繁中翻譯)
1:48:36.175–1:48:37.849
So, I'm going to hit submit here.
(此句尚無繁中翻譯)
1:48:37.849–1:48:45.354
All right, so it says it has created a fresh cloud project and synced the backend function successfully.
(此句尚無繁中翻譯)
1:48:45.354–1:48:49.916
And now you see this cursor, it's testing out the UI.
(此句尚無繁中翻譯)
1:48:49.916–1:48:53.354
And so, right now it's not running, so it should start it out.
(此句尚無繁中翻譯)
1:48:53.354–1:48:58.710
And here it says the existing browser tab was sitting on the browser error, so it has restarted it.
(此句尚無繁中翻譯)
1:48:58.720–1:49:03.879
And if we jump into Convex, you can see that we have a new project created.
(此句尚無繁中翻譯)
1:49:03.879–1:49:08.756
Now, I did authenticate this account with Codex, so it knows that this is my account.
(此句尚無繁中翻譯)
1:49:08.756–1:49:13.144
And so, if we click over here, we should see some initial stuff happening, right?
(此句尚無繁中翻譯)
1:49:13.144–1:49:16.430
There's some data, functions, and it's not done yet, right?
(此句尚無繁中翻譯)
1:49:16.440–1:49:17.816
It's still working.
(此句尚無繁中翻譯)
1:49:17.816–1:49:21.470
And while it's working, we can see what has been done.
(此句尚無繁中翻譯)
1:49:21.480–1:49:22.848
And it's actually typing it.
(此句尚無繁中翻譯)
1:49:22.848–1:49:23.609
Look at that.
(此句尚無繁中翻譯)
1:49:23.609–1:49:24.919
Key press input.
(此句尚無繁中翻譯)
1:49:24.919–1:49:26.310
It's creating it.
(此句尚無繁中翻譯)
1:49:26.320–1:49:27.646
It's testing it right here.
(此句尚無繁中翻譯)
1:49:27.646–1:49:29.408
You can actually see it happening.
(此句尚無繁中翻譯)
1:49:29.408–1:49:33.788
This snack was submitted through the browser and appeared from Convex.
(此句尚無繁中翻譯)
1:49:33.788–1:49:35.430
I'm voting on it.
(此句尚無繁中翻譯)
1:49:35.440–1:49:38.650
There is this testing all the flows, which is pretty cool.
(此句尚無繁中翻譯)
1:49:38.650–1:49:50.884
All right, now it's telling us implemented the Convex back snack vote upgrade, changed all of this, what changed, verification, edge cases handled, and it is running.
(此句尚無繁中翻譯)
1:49:50.884–1:49:52.802
So, we can test it out ourselves.
(此句尚無繁中翻譯)
1:49:52.802–1:49:54.713
And so, here's the app.
(此句尚無繁中翻譯)
1:49:54.713–1:49:57.036
And now it's Convex here's the app.
(此句尚無繁中翻譯)
1:49:57.036–1:49:57.750
And now it's Convex backed.
(此句尚無繁中翻譯)
1:49:57.760–1:50:01.692
And so, now if we head to Convex, we should see the data.
(此句尚無繁中翻譯)
1:50:01.692–1:50:05.310
So, as you can see, snack options, this has a vote of one.
(此句尚無繁中翻譯)
1:50:05.320–1:50:07.884
This is the snack tools, vote one.
(此句尚無繁中翻譯)
1:50:07.884–1:50:11.634
And if we increase the vote, it should be two, and it's automatic.
(此句尚無繁中翻譯)
1:50:11.634–1:50:13.011
It's absolutely two, and it's automatic.
(此句尚無繁中翻譯)
1:50:13.011–1:50:13.630
It's absolutely automatic.
(此句尚無繁中翻譯)
1:50:13.640–1:50:14.744
Three, it's three.
(此句尚無繁中翻譯)
1:50:14.744–1:50:16.643
It does not need to do anything.
(此句尚無繁中翻譯)
1:50:16.643–1:50:21.150
And we can create a new snack option, let's say sushi, submit.
(此句尚無繁中翻譯)
1:50:21.160–1:50:23.860
And if we come over here, we see sushi, zero votes.
(此句尚無繁中翻譯)
1:50:23.860–1:50:25.312
Now it's winning.
(此句尚無繁中翻譯)
1:50:25.312–1:50:30.561
And so, this is essentially the same app, except it's Convex backed.
(此句尚無繁中翻譯)
1:50:30.561–1:50:32.675
And we also have functions.
(此句尚無繁中翻譯)
1:50:32.675–1:50:37.767
And with Convex, you need to create functions to access your data.
(此句尚無繁中翻譯)
1:50:37.767–1:50:41.296
It's not like with other systems where it's automatic.
(此句尚無繁中翻譯)
1:50:41.296–1:50:45.870
Here you need list, you need submit, you need a vote, you need functions.
(此句尚無繁中翻譯)
1:50:45.880–1:50:52.127
And so, the snack options table or document has three functions.
(此句尚無繁中翻譯)
1:50:52.127–1:50:57.910
No files, no schedules, and there's some logs here, so that you can see things are here, so that you can see things are happening.
(此句尚無繁中翻譯)
1:50:57.920–1:51:01.079
>> Okay, so this was a fairly successful migration.
(此句尚無繁中翻譯)
1:51:01.079–1:51:06.250
We went to no back end to a Convex back end very, very quickly.
(此句尚無繁中翻譯)
1:51:06.250–1:51:12.334
Now that snack vote has real Convex data, we can make it feel more like a shared group app.
(此句尚無繁中翻譯)
1:51:12.334–1:51:21.597
Instead of one global snackboard, users can create or join a simple voting room like Friday lunch or team snacks.
(此句尚無繁中翻譯)
1:51:21.597–1:51:28.835
Each room should own its own snack options, votes, leaderboard, and winner state.
(此句尚無繁中翻譯)
1:51:28.835–1:51:36.266
This keeps the app more interesting while teaching a clean back-end concept, scoped data.
(此句尚無繁中翻譯)
1:51:36.266–1:51:41.400
We still do not need accounts, permissions, invites, or admin tools.
(此句尚無繁中翻譯)
1:51:41.400–1:51:44.230
And here's the prompt that we're going to be using.
(此句尚無繁中翻譯)
1:51:44.240–1:51:49.274
Upgrade snack vote so voting happens inside simple rooms.
(此句尚無繁中翻譯)
1:51:49.274–1:51:52.236
And I'm going to run this in a plan mode.
(此句尚無繁中翻譯)
1:51:52.236–1:51:55.070
All right, so it came back with a plan for us.
(此句尚無繁中翻譯)
1:51:55.070–1:51:58.350
This is the room-based snack vote upgrade.
(此句尚無繁中翻譯)
1:51:58.360–1:52:03.510
Upgrade the current Convex back app from one global snackboard to simple rooms.
(此句尚無繁中翻譯)
1:52:03.520–1:52:04.842
Can I expand that?
(此句尚無繁中翻譯)
1:52:04.842–1:52:06.310
Yes, implement that.
(此句尚無繁中翻譯)
1:52:06.320–1:52:10.710
Now, as it's running, I am seeing an error message here.
(此句尚無繁中翻譯)
1:52:10.720–1:52:14.430
Did you forget to run NPX Convex dev?
(此句尚無繁中翻譯)
1:52:14.440–1:52:20.378
Okay, so let's see if it's able to catch that and solve it before the next prompt.
(此句尚無繁中翻譯)
1:52:20.378–1:52:21.096
It is done.
(此句尚無繁中翻譯)
1:52:21.096–1:52:24.221
So, it has implemented room-based snack vote.
(此句尚無繁中翻譯)
1:52:24.221–1:52:29.167
This is what it changed, files, things, verification limits.
(此句尚無繁中翻譯)
1:52:29.167–1:52:30.599
Okay, very important.
(此句尚無繁中翻譯)
1:52:30.599–1:52:32.757
Limits is actually very, very useful.
(此句尚無繁中翻譯)
1:52:32.757–1:52:37.719
No auth, ownership, invites, or duplicate vote guard yet.
(此句尚無繁中翻譯)
1:52:37.719–1:52:40.168
And we'll fix some of these a little later.
(此句尚無繁中翻譯)
1:52:40.168–1:52:41.703
Room selection, room codes.
(此句尚無繁中翻譯)
1:52:41.703–1:52:43.162
Okay, so how does this work?
(此句尚無繁中翻譯)
1:52:43.162–1:52:44.667
Let's go ahead and refresh this.
(此句尚無繁中翻譯)
1:52:44.667–1:52:49.869
All right, so we can create or join a room, and there are some rooms over here.
(此句尚無繁中翻譯)
1:52:49.869–1:52:54.452
So, let's say we type Friday lunch, and so now we've switched the room.
(此句尚無繁中翻譯)
1:52:54.452–1:52:56.830
Okay, current room Friday lunch.
(此句尚無繁中翻譯)
1:52:56.840–1:52:59.228
And now we can do the same thing.
(此句尚無繁中翻譯)
1:52:59.228–1:53:01.124
We're now in in the scope.
(此句尚無繁中翻譯)
1:53:01.124–1:53:03.476
It's all about scoping now, right?
(此句尚無繁中翻譯)
1:53:03.476–1:53:08.884
And so this is a specific room, and I can say, I don't know, submit.
(此句尚無繁中翻譯)
1:53:08.884–1:53:10.867
There we have it in this room.
(此句尚無繁中翻譯)
1:53:10.867–1:53:15.250
And now if I switch a room, let's say I switch to launch ideas.
(此句尚無繁中翻譯)
1:53:15.250–1:53:16.822
So now it's brand new.
(此句尚無繁中翻譯)
1:53:16.822–1:53:18.825
There's nothing nothing there.
(此句尚無繁中翻譯)
1:53:18.825–1:53:22.008
And I can say something like I don't know, tacos.
(此句尚無繁中翻譯)
1:53:22.008–1:53:23.587
And now we have tacos here.
(此句尚無繁中翻譯)
1:53:23.587–1:53:26.517
And if we go into Codex, we should see that.
(此句尚無繁中翻譯)
1:53:26.517–1:53:30.830
So we have voting rooms here, and we have different ideas here.
(此句尚無繁中翻譯)
1:53:30.840–1:53:35.684
And now if we go into snack options, we can see that they belong to a specific room.
(此句尚無繁中翻譯)
1:53:35.684–1:53:36.710
We have the room IDs.
(此句尚無繁中翻譯)
1:53:36.710–1:53:41.730
These are the same same room that we have a bunch of different room IDs there.
(此句尚無繁中翻譯)
1:53:41.730–1:53:47.702
Probably some of them created by Codex as part of testing, like lunch ideas.
(此句尚無繁中翻譯)
1:53:47.702–1:53:49.600
Oh, no, I created lunch ideas.
(此句尚無繁中翻譯)
1:53:49.600–1:53:53.203
These ones were created by Codex, these three rooms.
(此句尚無繁中翻譯)
1:53:53.203–1:53:55.035
And we can remove them.
(此句尚無繁中翻譯)
1:53:55.035–1:53:58.020
I can select these, and we can delete these.
(此句尚無繁中翻譯)
1:53:58.020–1:54:02.940
And if we go into functions, we can see that for snack options, it's the same pre-functions.
(此句尚無繁中翻譯)
1:54:02.940–1:54:08.708
But for voting room, we have get, create, or join, bunch of other functions that we have.
(此句尚無繁中翻譯)
1:54:08.708–1:54:10.771
And And so it pretty much did everything.
(此句尚無繁中翻譯)
1:54:10.771–1:54:18.392
It created the functions, it created the schema, it even, you know, created some test data while it was testing.
(此句尚無繁中翻譯)
1:54:18.392–1:54:24.121
We'll add one simple rule that makes the voting feel like a real product.
(此句尚無繁中翻譯)
1:54:24.121–1:54:30.434
After all, a person should not be able to spam the same room with repeated votes.
(此句尚無繁中翻譯)
1:54:30.434–1:54:33.589
And that is because we still do not have real authentication.
(此句尚無繁中翻譯)
1:54:33.589–1:54:39.153
And so for this tutorial, a local or session-based voter identity is enough.
(此句尚無繁中翻譯)
1:54:39.153–1:54:42.359
And that's what we're going to be doing right now.
(此句尚無繁中翻譯)
1:54:42.359–1:54:44.069
And here's my next prompt.
(此句尚無繁中翻譯)
1:54:44.069–1:54:50.947
We're going to upgrade snack votes, so each person can only have one active vote per room.
(此句尚無繁中翻譯)
1:54:50.947–1:54:52.622
Jump into plan mode.
(此句尚無繁中翻譯)
1:54:52.622–1:54:53.427
Run that.
(此句尚無繁中翻譯)
1:54:53.427–1:54:55.027
So here's the plan.
(此句尚無繁中翻譯)
1:54:55.027–1:54:57.163
One active vote per room.
(此句尚無繁中翻譯)
1:54:57.163–1:55:00.270
Add a lightweight session-based voting rule.
(此句尚無繁中翻譯)
1:55:00.280–1:55:09.392
Each browser session gets a session ID and Convex stores one active vote per room ID and session ID, right?
(此句尚無繁中翻譯)
1:55:09.392–1:55:11.163
So, this needs to be unique.
(此句尚無繁中翻譯)
1:55:11.163–1:55:16.091
So, if I voted in that room, my session ID was used to vote.
(此句尚無繁中翻譯)
1:55:16.091–1:55:17.950
And so, this needs to be unique.
(此句尚無繁中翻譯)
1:55:17.960–1:55:22.080
So, for that room, my session can only happen twice.
(此句尚無繁中翻譯)
1:55:22.080–1:55:26.190
If there's a chance for a repeat, it's not going to count it.
(此句尚無繁中翻譯)
1:55:26.200–1:55:31.470
Yeah, I can vote in other rooms, but per session per room can only happen once.
(此句尚無繁中翻譯)
1:55:31.480–1:55:32.894
We're going to expand this.
(此句尚無繁中翻譯)
1:55:32.894–1:55:33.470
Looks good.
(此句尚無繁中翻譯)
1:55:33.480–1:55:34.672
And submit this.
(此句尚無繁中翻譯)
1:55:34.672–1:55:35.790
So, it is done.
(此句尚無繁中翻譯)
1:55:35.800–1:55:39.270
Implemented one active vote per room.
(此句尚無繁中翻譯)
1:55:39.280–1:55:40.676
Okay, change this.
(此句尚無繁中翻譯)
1:55:40.676–1:55:41.685
What changed?
(此句尚無繁中翻譯)
1:55:41.685–1:55:43.900
And it added this get my vote.
(此句尚無繁中翻譯)
1:55:43.900–1:55:45.488
Added votes with table.
(此句尚無繁中翻譯)
1:55:45.488–1:55:47.645
So, let's go ahead and try this out.
(此句尚無繁中翻譯)
1:55:47.645–1:55:48.566
Open this here.
(此句尚無繁中翻譯)
1:55:48.566–1:55:51.968
So, let's say I go to another room, friend Friday lunch.
(此句尚無繁中翻譯)
1:55:51.968–1:55:54.390
I switch that room and I have my burrito.
(此句尚無繁中翻譯)
1:55:54.400–1:55:55.866
So, I'm going to vote for this.
(此句尚無繁中翻譯)
1:55:55.866–1:55:57.956
I just voted and I can't vote again.
(此句尚無繁中翻譯)
1:55:57.956–1:55:58.763
You see that?
(此句尚無繁中翻譯)
1:55:58.763–1:56:08.953
I can't vote again because if I go to Convex and I go into data and I go into votes, I should see a session ID with room ID.
(此句尚無繁中翻譯)
1:56:08.953–1:56:14.270
So, let me go ahead and delete all of these so that we can see which one is mine.
(此句尚無繁中翻譯)
1:56:14.280–1:56:15.561
And so, now I can vote again.
(此句尚無繁中翻譯)
1:56:15.561–1:56:16.673
You see it's back up.
(此句尚無繁中翻譯)
1:56:16.673–1:56:18.507
It's it's it's uh reactive.
(此句尚無繁中翻譯)
1:56:18.507–1:56:20.430
I'm going to hit vote.
(此句尚無繁中翻譯)
1:56:20.440–1:56:24.028
And now you see room ID and session ID.
(此句尚無繁中翻譯)
1:56:24.028–1:56:28.051
These two, if they can only appear once in this table.
(此句尚無繁中翻譯)
1:56:28.051–1:56:35.604
And so, obviously now it's knows that my session ID and I'm trying to vote for this one and that's not going to work because I'm in this room.
(此句尚無繁中翻譯)
1:56:35.604–1:56:37.794
I'm in this room here, Friday lunch.
(此句尚無繁中翻譯)
1:56:37.794–1:56:39.630
Friday lunch right there.
(此句尚無繁中翻譯)
1:56:39.640–1:56:44.021
Now, if I switch rooms, let's so let's say I go to another room.
(此句尚無繁中翻譯)
1:56:44.021–1:56:46.470
Let's say I go into Sunday brunch.
(此句尚無繁中翻譯)
1:56:46.470–1:56:48.227
Now, I can vote, right?
(此句尚無繁中翻譯)
1:56:48.227–1:56:49.454
I can vote for anything.
(此句尚無繁中翻譯)
1:56:49.454–1:56:50.751
I can say tacos.
(此句尚無繁中翻譯)
1:56:50.751–1:56:51.472
Submit.
(此句尚無繁中翻譯)
1:56:51.472–1:56:53.121
I can vote here.
(此句尚無繁中翻譯)
1:56:53.121–1:56:55.036
And let's say I create another one.
(此句尚無繁中翻譯)
1:56:55.036–1:56:56.381
I I change my vote.
(此句尚無繁中翻譯)
1:56:56.381–1:57:02.602
Yes, I can switch votes, but I cannot pad, you know, with multiple votes an item.
(此句尚無繁中翻譯)
1:57:02.602–1:57:05.854
And so, if I go back here, now there are two options, right?
(此句尚無繁中翻譯)
1:57:05.854–1:57:12.179
Two different rooms, same session ID, but I cannot vote in the same room more than once.
(此句尚無繁中翻譯)
1:57:12.179–1:57:14.717
So, this works really, really nice.
(此句尚無繁中翻譯)
1:57:14.717–1:57:21.382
And finally, we'll add a deadline, so each room has a moment when voting closes.
(此句尚無繁中翻譯)
1:57:21.382–1:57:24.903
Before the deadline, people can submit and vote.
(此句尚無繁中翻譯)
1:57:24.903–1:57:31.918
After the deadline, voting locks and the app shows the winner or a simple tie state.
(此句尚無繁中翻譯)
1:57:31.918–1:57:37.308
This adds time-based product state without becoming a scheduling system.
(此句尚無繁中翻譯)
1:57:37.308–1:57:49.310
It is still a small group decision app, but now it shows how front-end UI and back-end data can derive open, closed, winner, and tie states from one field.
(此句尚無繁中翻譯)
1:57:49.320–1:57:51.583
And here's the prompt that we're going to be using.
(此句尚無繁中翻譯)
1:57:51.583–1:57:54.594
I'm going to switch into plan mode, run this.
(此句尚無繁中翻譯)
1:57:54.594–1:57:56.936
Oh, it needs a product decision.
(此句尚無繁中翻譯)
1:57:56.936–1:58:02.635
Okay, how should users set a room deadline in this small tutorial version?
(此句尚無繁中翻譯)
1:58:02.635–1:58:12.765
Quick durations, okay, add simple buttons like 1 minute, 5 minutes, 15 minutes when creating opening a room, date time input, or fixed default.
(此句尚無繁中翻譯)
1:58:12.765–1:58:14.630
Let's do quick durations.
(此句尚無繁中翻譯)
1:58:14.640–1:58:15.673
That sounds good.
(此句尚無繁中翻譯)
1:58:15.673–1:58:16.950
Let's implement this.
(此句尚無繁中翻譯)
1:58:16.960–1:58:18.228
And it is complete.
(此句尚無繁中翻譯)
1:58:18.228–1:58:20.486
Implemented simple voting deadlines.
(此句尚無繁中翻譯)
1:58:20.486–1:58:22.178
This is what was changed.
(此句尚無繁中翻譯)
1:58:22.178–1:58:28.413
Added quick deadline choices, no deadline, 1 minute, 5 minutes, 15 minutes.
(此句尚無繁中翻譯)
1:58:28.413–1:58:32.225
All of this, and let's go ahead and see how this works.
(此句尚無繁中翻譯)
1:58:32.225–1:58:33.841
All right, so here we are.
(此句尚無繁中翻譯)
1:58:33.841–1:58:39.614
And let's go ahead and create a room, Friday lunch, and let's say it's 5 minutes.
(此句尚無繁中翻譯)
1:58:39.614–1:58:41.831
Select 5 minutes, open the room.
(此句尚無繁中翻譯)
1:58:41.831–1:58:43.464
This still says no deadline.
(此句尚無繁中翻譯)
1:58:43.464–1:58:44.750
Let's try another room.
(此句尚無繁中翻譯)
1:58:44.750–1:58:46.562
Let's say Sunday brunch.
(此句尚無繁中翻譯)
1:58:46.562–1:58:48.409
I can select no deadline.
(此句尚無繁中翻譯)
1:58:48.409–1:58:49.674
I can do 15 minutes.
(此句尚無繁中翻譯)
1:58:49.674–1:58:51.333
Let's Let's 15 minutes.
(此句尚無繁中翻譯)
1:58:51.333–1:58:53.079
See, it says no deadline.
(此句尚無繁中翻譯)
1:58:53.079–1:58:54.258
Okay, that's a bug.
(此句尚無繁中翻譯)
1:58:54.258–1:58:55.620
That's definitely a bug.
(此句尚無繁中翻譯)
1:58:55.620–1:58:57.967
So, let's see if it's able to fix it.
(此句尚無繁中翻譯)
1:58:57.967–1:59:03.870
That's the first bug that has happened to us as far as I that has happened to us as far as I remember.
(此句尚無繁中翻譯)
1:59:03.880–1:59:15.327
And so, we're going to say created tried creating a room and selecting a deadline, but it ended up creating a room with no deadline.
(此句尚無繁中翻譯)
1:59:15.327–1:59:18.331
And we don't really need plan mode for this.
(此句尚無繁中翻譯)
1:59:18.331–1:59:21.870
There's no, you know, clarifying questions here.
(此句尚無繁中翻譯)
1:59:21.880–1:59:23.179
It's a simple bug.
(此句尚無繁中翻譯)
1:59:23.179–1:59:25.695
And we don't really want it to clarify.
(此句尚無繁中翻譯)
1:59:25.695–1:59:27.196
We we know what the bug is.
(此句尚無繁中翻譯)
1:59:27.196–1:59:28.517
We just want it to fix it.
(此句尚無繁中翻譯)
1:59:28.517–1:59:31.069
So, there's really no ambiguity there.
(此句尚無繁中翻譯)
1:59:31.069–1:59:34.865
It's like It's like I'm not looking to negotiate with Codex.
(此句尚無繁中翻譯)
1:59:34.865–1:59:38.390
I know this is a bug and I want it to fix it, right?
(此句尚無繁中翻譯)
1:59:38.400–1:59:39.702
There's no other ways.
(此句尚無繁中翻譯)
1:59:39.702–1:59:41.704
There's nothing else happening.
(此句尚無繁中翻譯)
1:59:41.704–1:59:49.633
Unless I'm wrong, and in that case, it's going to tell me that I'm wrong, that it works, but there's no other paths here as far as I'm concerned.
(此句尚無繁中翻譯)
1:59:49.633–1:59:57.638
Now, sometimes Codex would output something like this and it tries to go into plan mode.
(此句尚無繁中翻譯)
1:59:57.638–2:00:04.299
And so, right now it thinks it's in plan mode, but it's it actually is not in plan mode.
(此句尚無繁中翻譯)
2:00:04.299–2:00:13.007
And so, if I say something like do it, it's going to complain that that I did not uh leave the plan mode while I'm not in the plan mode.
(此句尚無繁中翻譯)
2:00:13.007–2:00:21.532
So, this is a bug that I have been experiencing from time to time and it's annoying, but it's it's easily fixable.
(此句尚無繁中翻譯)
2:00:21.532–2:00:26.670
You see, it says I can't edit files because this thread is in plan mode, but we're not in plan mode.
(此句尚無繁中翻譯)
2:00:26.680–2:00:31.043
And so, the solution is to go into plan mode and type something.
(此句尚無繁中翻譯)
2:00:31.043–2:00:32.150
Okay, fix it.
(此句尚無繁中翻譯)
2:00:32.160–2:00:35.409
And then it's going to say something like, well, you know, I can't do it.
(此句尚無繁中翻譯)
2:00:35.409–2:00:36.195
I'm in plan mode.
(此句尚無繁中翻譯)
2:00:36.195–2:00:37.911
And then you can leave plan mode.
(此句尚無繁中翻譯)
2:00:37.911–2:00:39.550
And now it understands it.
(此句尚無繁中翻譯)
2:00:39.560–2:00:41.340
You see, now it's correct.
(此句尚無繁中翻譯)
2:00:41.340–2:00:48.790
Fixed the bug where it's selecting a deadline and opening an existing no deadline room still leaves the room with no deadline.
(此句尚無繁中翻譯)
2:00:48.800–2:00:50.140
So, we're going to submit this.
(此句尚無繁中翻譯)
2:00:50.140–2:00:50.722
All right.
(此句尚無繁中翻譯)
2:00:50.722–2:01:00.941
So, it looks like it fixed it and here it says in the browser, I created a no deadline room, reopened it with 15 minutes, and it showed open plus closes in, etc.
(此句尚無繁中翻譯)
2:01:00.941–2:01:06.736
So, let's go ahead and test this out ourselves to ensure that it does really work.
(此句尚無繁中翻譯)
2:01:06.736–2:01:12.299
So, we have this and let's do Friday lunch and we said 15 minutes.
(此句尚無繁中翻譯)
2:01:12.299–2:01:13.548
And now it shows it.
(此句尚無繁中翻譯)
2:01:13.548–2:01:17.017
And let's say 1 minute room one, 1 minute.
(此句尚無繁中翻譯)
2:01:17.017–2:01:17.989
There we go.
(此句尚無繁中翻譯)
2:01:17.989–2:01:18.753
1 minute.
(此句尚無繁中翻譯)
2:01:18.753–2:01:24.210
And let's try no deadline room two, select no deadline, open no deadline.
(此句尚無繁中翻譯)
2:01:24.210–2:01:24.636
Okay.
(此句尚無繁中翻譯)
2:01:24.636–2:01:28.526
So, this looks like this was finally fixed.
(此句尚無繁中翻譯)
2:01:28.526–2:01:43.941
Now, once SnackVote has rooms, session-based voting, and a deadline, we are ready to deploy the front-end app with Vercel and verify that the deployed app points to the right back-end environment.
(此句尚無繁中翻譯)
2:01:43.941–2:01:47.430
And this will round up this specific app build.
(此句尚無繁中翻譯)
2:01:47.440–2:01:56.377
And here's our prompt, prepare SnackVote for deployment on Vercel and verify it works with the Convex back-end, okay?
(此句尚無繁中翻譯)
2:01:56.377–2:01:59.426
I'm just going to do it in plan mode, run that.
(此句尚無繁中翻譯)
2:01:59.426–2:02:01.988
Here it's being very, very clever.
(此句尚無繁中翻譯)
2:02:01.988–2:02:12.630
One important deployment decision remains, whether the Vercel app should use the existing Convex dev deployment or it should promote it to production, okay?
(此句尚無繁中翻譯)
2:02:12.640–2:02:17.910
And this is really, really cool because this is something that I wanted to cover once this was done.
(此句尚無繁中翻譯)
2:02:17.920–2:02:24.830
So, if we go into Convex and you click over here, you can see all your deployments, your different deployments.
(此句尚無繁中翻譯)
2:02:24.840–2:02:30.070
So, so we we are currently under development deployment, under development cloud.
(此句尚無繁中翻譯)
2:02:30.080–2:02:34.888
We can also have a production deployment, preview deployments, other deployments, stuff like that.
(此句尚無繁中翻譯)
2:02:34.888–2:02:44.290
So, ideally, once we deploy it with Vercel, we want it to use the production Convex, and that's what we're going to select, because this makes sense.
(此句尚無繁中翻譯)
2:02:44.290–2:02:48.710
Production deployment uses the production Convex.
(此句尚無繁中翻譯)
2:02:48.720–2:02:51.785
Development deployment uses the development Convex.
(此句尚無繁中翻譯)
2:02:51.785–2:03:00.262
And this is our plan prepare snack vote for a production result deploy connected to the Convex production backend.
(此句尚無繁中翻譯)
2:03:00.262–2:03:02.002
We're going to hit submit.
(此句尚無繁中翻譯)
2:03:02.002–2:03:05.277
And it's going to create a production.
(此句尚無繁中翻譯)
2:03:05.277–2:03:06.974
In fact, they already did it, right?
(此句尚無繁中翻譯)
2:03:06.974–2:03:12.865
We can switch to this and it's going to have a production environment here created for us.
(此句尚無繁中翻譯)
2:03:12.865–2:03:13.417
All right.
(此句尚無繁中翻譯)
2:03:13.417–2:03:19.508
So, it has deployed snack vote to Vercel and verified it against Convex production, okay?
(此句尚無繁中翻譯)
2:03:19.508–2:03:22.942
So, this is the live URL, what we're seeing here.
(此句尚無繁中翻譯)
2:03:22.942–2:03:25.719
Deployment URL and the Convex backend.
(此句尚無繁中翻譯)
2:03:25.719–2:03:32.256
Okay, and if we go into Convex, you can see that it's currently pointing to the production URL here.
(此句尚無繁中翻譯)
2:03:32.256–2:03:34.723
And we have everything here in production, right?
(此句尚無繁中翻譯)
2:03:34.723–2:03:39.663
So, we have the dev instance pointing to the dev deployment in Convex.
(此句尚無繁中翻譯)
2:03:39.663–2:03:46.068
And the production instance in Vercel pointing to the production instance here in Convex.
(此句尚無繁中翻譯)
2:03:46.068–2:03:48.265
So, we have all the same functions.
(此句尚無繁中翻譯)
2:03:48.265–2:03:49.800
We have all the same data.
(此句尚無繁中翻譯)
2:03:49.800–2:03:51.078
Everything is there.
(此句尚無繁中翻譯)
2:03:51.078–2:03:56.927
The data might be a little different, but the schema is exactly the same and it works, right?
(此句尚無繁中翻譯)
2:03:56.927–2:04:01.590
So, we can create a room, whatever new room, 1 minute, open it.
(此句尚無繁中翻譯)
2:04:01.600–2:04:05.163
And now 59 seconds, 58 seconds, looks good.
(此句尚無繁中翻譯)
2:04:05.163–2:04:08.576
We can create another room, room three, no deadline.
(此句尚無繁中翻譯)
2:04:08.576–2:04:10.050
And that has no deadline.
(此句尚無繁中翻譯)
2:04:10.050–2:04:11.545
So, I'm currently in this room.
(此句尚無繁中翻譯)
2:04:11.545–2:04:13.405
I can create a food option.
(此句尚無繁中翻譯)
2:04:13.405–2:04:14.153
I can vote.
(此句尚無繁中翻譯)
2:04:14.153–2:04:15.804
I can't vote anymore.
(此句尚無繁中翻譯)
2:04:15.804–2:04:17.613
One active vote per room.
(此句尚無繁中翻譯)
2:04:17.613–2:04:19.350
This is the leaderboard.
(此句尚無繁中翻譯)
2:04:19.360–2:04:21.564
So, it looks really good.
(此句尚無繁中翻譯)
2:04:21.564–2:04:35.622
And this time we've actually built a fairly cool and a fun app along with a backend that uses several different deployments depending on where the app is is running.
(此句尚無繁中翻譯)
2:04:35.622–2:04:44.937
So, for local deployment, we have the local, the dev convex deployment, and for the production Vercel deployment, we're using the production convex deployment, okay?
(此句尚無繁中翻譯)
2:04:44.937–2:04:48.870
So, this was a slightly more complex app.
(此句尚無繁中翻譯)
2:04:48.880–2:04:54.422
But, there's still one more app that I want to build, and this app is going to be the most complex of them all.
(此句尚無繁中翻譯)
2:04:54.422–2:05:09.830
It's going to bring a lot of these things that we've been talking about so far together, and also we're going to be introducing some new functionality, new features, and a lot of really cool features, and a lot of really cool things.
(此句尚無繁中翻譯)
2:05:09.840–2:05:14.022
Now, for this last app in the course, we're going to be building FlexHelp.
(此句尚無繁中翻譯)
2:05:14.022–2:05:26.561
And this is where we take the workflow from the first two smaller apps and apply it to a more realistic product, a two-sided marketplace where helpers offer fixers services and customers book them.
(此句尚無繁中翻譯)
2:05:26.561–2:05:30.403
The important thing is that we will still build it in controlled steps.
(此句尚無繁中翻譯)
2:05:30.403–2:05:33.897
We're not going to ask Codex to build the whole marketplace at once.
(此句尚無繁中翻譯)
2:05:33.897–2:05:39.250
We are going to architect the design, and build the UI, then add feature by feature.
(此句尚無繁中翻譯)
2:05:39.250–2:05:44.123
And last but not least, we're going to be deploying the app, making it available to anyone.
(此句尚無繁中翻譯)
2:05:44.123–2:05:48.757
As always, our first step will be creating the visual architecture.
(此句尚無繁中翻譯)
2:05:48.757–2:05:58.480
This gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
(此句尚無繁中翻譯)
2:05:58.480–2:06:02.941
Now, here in Codex, we're going to click here, and we're going to create a brand new project.
(此句尚無繁中翻譯)
2:06:02.941–2:06:07.948
Now, I like to start it from an existing folder, and I'm going to create a new folder.
(此句尚無繁中翻譯)
2:06:07.948–2:06:08.590
FlexHelp.
(此句尚無繁中翻譯)
2:06:08.600–2:06:11.089
I'm going to hit create, and I'm going to click open.
(此句尚無繁中翻譯)
2:06:11.089–2:06:13.405
And that creates a brand new project.
(此句尚無繁中翻譯)
2:06:13.405–2:06:21.586
Now, the first thing that we're going to be doing is we're going to be building a visual architecture, the same thing that we did for the previous two apps.
(此句尚無繁中翻譯)
2:06:21.586–2:06:32.710
And this is important because this gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
(此句尚無繁中翻譯)
2:06:32.720–2:06:38.354
And here's the prompt that I'm going to be using and I want to specify that we want to use ImageGen.
(此句尚無繁中翻譯)
2:06:38.354–2:06:41.702
We're going to jump into plan mode and we're going to run this.
(此句尚無繁中翻譯)
2:06:41.702–2:06:44.807
And here we have the Flex Help Visual Architecture.
(此句尚無繁中翻譯)
2:06:44.807–2:06:46.349
And here's a better view.
(此句尚無繁中翻譯)
2:06:46.349–2:06:54.655
And so here we have the customer, we have the shared marketplace screens, and we have the helper, which are the two sides of this marketplace.
(此句尚無繁中翻譯)
2:06:54.655–2:06:57.502
We also have the Convex and the Versel here.
(此句尚無繁中翻譯)
2:06:57.502–2:07:03.953
On the customer side, we have browse services, get the service detail, and then send a booking request.
(此句尚無繁中翻譯)
2:07:03.953–2:07:07.836
The helper side, we have the helper dashboard and the status updates.
(此句尚無繁中翻譯)
2:07:07.836–2:07:14.583
And on the shared marketplace screens, we have explore the marketplace, my bookings, and booking details.
(此句尚無繁中翻譯)
2:07:14.583–2:07:19.847
So right off the bat, this app is a bit more complex than the previous apps that we were building.
(此句尚無繁中翻譯)
2:07:19.847–2:07:27.866
And that's really the goal, to finish off with a more complex, but also a more realistic, more production-ready app.
(此句尚無繁中翻譯)
2:07:27.866–2:07:29.693
Next, we'll map the core entities.
(此句尚無繁中翻譯)
2:07:29.693–2:07:40.784
And this is where the product becomes more tangible because we can actually see the real objects in the app before Codex starts writing the schema for code.
(此句尚無繁中翻譯)
2:07:40.784–2:07:42.302
And here's our prompt.
(此句尚無繁中翻譯)
2:07:42.302–2:07:45.029
We want to preface this with this ImageGen.
(此句尚無繁中翻譯)
2:07:45.029–2:07:47.603
All right, and here's our entity architecture.
(此句尚無繁中翻譯)
2:07:47.603–2:07:52.043
Okay, so we have the user, that could be a customer or a helper profile.
(此句尚無繁中翻譯)
2:07:52.043–2:07:59.575
We have the booking here, booking status, service, category, review, and all of that backed with Convex data.
(此句尚無繁中翻譯)
2:07:59.575–2:08:05.729
So at this point, we have a better idea of how the final app is going to look.
(此句尚無繁中翻譯)
2:08:05.729–2:08:10.161
I see that we need a user entity and that could be a customer or a helper profile.
(此句尚無繁中翻譯)
2:08:10.161–2:08:16.829
And I see that booking is super important because everybody needs to have access to booking, both customers and helpers.
(此句尚無繁中翻譯)
2:08:16.829–2:08:34.550
Booking status, service, category, and so right away I see that this is a fairly sophisticated app, but I can see that it's not a super complex or like a super complicated app that you know has a ton of different entities, has lots of things happening.
(此句尚無繁中翻譯)
2:08:34.560–2:08:44.750
But still, as we are developing this app, we might be adding various entities and so that will increase the complexity as the development can continues.
(此句尚無繁中翻譯)
2:08:44.750–2:08:59.670
Now, the next step is before we start actually building the app is we want to ask Codex to recommend the simplest stack for FlexHelp based on what we need to build based on what we've told it so far.
(此句尚無繁中翻譯)
2:08:59.670–2:09:05.755
This keeps the technology choices tied to the product instead of starting with tools first.
(此句尚無繁中翻譯)
2:09:05.755–2:09:13.489
And this is super important because we want to start with the blueprint before any code has been written.
(此句尚無繁中翻譯)
2:09:13.489–2:09:15.267
And here's the prompt to do that.
(此句尚無繁中翻譯)
2:09:15.267–2:09:18.060
Do not edit any files and spec everything.
(此句尚無繁中翻譯)
2:09:18.060–2:09:26.264
And I'm going to be running this in plan mode so that I can decide whether I want to accept its recommendations or just leave it in the conversation.
(此句尚無繁中翻譯)
2:09:26.264–2:09:27.510
Going to run this here.
(此句尚無繁中翻譯)
2:09:27.520–2:09:29.287
This is what it's suggesting.
(此句尚無繁中翻譯)
2:09:29.287–2:09:31.175
The workspace is currently empty.
(此句尚無繁中翻譯)
2:09:31.175–2:09:41.206
The simplest course-friendly stack is React, TypeScript, Convex for backend data, off, Tailwind for UI, and Vercel for hosting.
(此句尚無繁中翻譯)
2:09:41.206–2:09:44.473
Okay, and this is exactly what we've been doing so far.
(此句尚無繁中翻譯)
2:09:44.473–2:09:47.310
And and here it's listing some primary routes.
(此句尚無繁中翻譯)
2:09:47.320–2:09:51.567
Services, bookings, customer bookings, helper, helper services.
(此句尚無繁中翻譯)
2:09:51.567–2:10:01.432
Here we have the data flow, the auth recommendations, UI and component approach, Vercel deployment path, staged build plan, everything.
(此句尚無繁中翻譯)
2:10:01.432–2:10:01.701
Okay?
(此句尚無繁中翻譯)
2:10:01.701–2:10:06.417
So, I'm going to exit out because this was only a read-only plan mode.
(此句尚無繁中翻譯)
2:10:06.417–2:10:06.666
Okay?
(此句尚無繁中翻譯)
2:10:06.666–2:10:11.545
I don't want it to do anything just yet because that's what we're going to be doing in the next step.
(此句尚無繁中翻譯)
2:10:11.545–2:10:20.859
Now, from the visual architecture, the entity map, and the stack recommendation, we have a pretty good idea of how the FlexHelp app is evolving.
(此句尚無繁中翻譯)
2:10:20.859–2:10:29.115
The next thing that we want to do is we want to get Codex to take a first pass at turning that plan into a static product UI.
(此句尚無繁中翻譯)
2:10:29.115–2:10:32.550
Now, this first version does not need any back-end data.
(此句尚無繁中翻譯)
2:10:32.560–2:10:39.058
The goal is to see how far Codex can get from the architecture alone to viable UI mock-ups.
(此句尚無繁中翻譯)
2:10:39.058–2:10:41.553
And this is the prompt that I'm going to be using.
(此句尚無繁中翻譯)
2:10:41.553–2:10:47.366
Build the first static FlexHelp UI design from the existing architecture and stack direction.
(此句尚無繁中翻譯)
2:10:47.366–2:10:49.161
We're going to stay in the plan mode.
(此句尚無繁中翻譯)
2:10:49.161–2:10:51.017
Going to go ahead and execute that.
(此句尚無繁中翻譯)
2:10:51.017–2:10:53.110
And let's see how well it does.
(此句尚無繁中翻譯)
2:10:53.120–2:10:55.212
And here's the plan that it came up with.
(此句尚無繁中翻譯)
2:10:55.212–2:11:00.658
Okay, the goal is a polished visual prototype that matches the FlexHelp architecture.
(此句尚無繁中翻譯)
2:11:00.658–2:11:04.317
Okay, and here it lists some details about the architecture.
(此句尚無繁中翻譯)
2:11:04.317–2:11:07.463
And let's go ahead and run this prompt.
(此句尚無繁中翻譯)
2:11:07.463–2:11:09.270
So, it finished working.
(此句尚無繁中翻譯)
2:11:09.280–2:11:12.082
And let's go ahead and see what we have here.
(此句尚無繁中翻譯)
2:11:12.082–2:11:13.891
Okay, so this is our app.
(此句尚無繁中翻譯)
2:11:13.891–2:11:16.019
And this is kind of how it looks like.
(此句尚無繁中翻譯)
2:11:16.019–2:11:17.661
Okay, book practical help.
(此句尚無繁中翻譯)
2:11:17.661–2:11:20.011
And we have some active requests.
(此句尚無繁中翻譯)
2:11:20.011–2:11:22.928
We have booking entry, helper dashboard.
(此句尚無繁中翻譯)
2:11:22.928–2:11:23.979
We have this.
(此句尚無繁中翻譯)
2:11:23.979–2:11:25.030
Look at this.
(此句尚無繁中翻譯)
2:11:25.040–2:11:26.353
It even works.
(此句尚無繁中翻譯)
2:11:26.353–2:11:31.590
Service detail, a small plumbing repair, helper dashboard shell.
(此句尚無繁中翻譯)
2:11:31.600–2:11:34.270
And so, this UI doesn't look too bad.
(此句尚無繁中翻譯)
2:11:34.280–2:11:39.151
But there's something that you need to know when you design UI with Codex.
(此句尚無繁中翻譯)
2:11:39.151–2:11:43.872
They all look pretty much the same or at least very, very similar.
(此句尚無繁中翻譯)
2:11:43.872–2:11:50.158
And that is because Codex is not really an expert when it comes to designing pages.
(此句尚無繁中翻譯)
2:11:50.158–2:11:54.066
It's great for coding, for solving all kinds of problems.
(此句尚無繁中翻譯)
2:11:54.066–2:11:58.950
But for actually designing stuff, it's not the most ideal tool.
(此句尚無繁中翻譯)
2:11:58.960–2:12:01.893
There are a lot of other tools that do it a lot better.
(此句尚無繁中翻譯)
2:12:01.893–2:12:17.608
And so, during this specific app build, I want to bring in another tool and show you how we can have a more specialized tool actually design the UI and then bring that UI back into Codex and get Codex to kind of implement it. okay?
(此句尚無繁中翻譯)
2:12:17.608–2:12:21.518
Now, when it comes to UI designs, there's lots of cool tools.
(此句尚無繁中翻譯)
2:12:21.518–2:12:29.698
There's Google Stitch, there's Figma, and there's also a tool that I really like to use, and it is called FlutterFlow Designer.
(此句尚無繁中翻譯)
2:12:29.698–2:12:34.495
It's a very very lightweight tool, and it works really great with Codex.
(此句尚無繁中翻譯)
2:12:34.495–2:12:40.510
And so, if you head over to designer.flutterflow.io, you're going to be on this page here.
(此句尚無繁中翻譯)
2:12:40.520–2:12:47.350
And you can use the web app version here, but what I really like to do is I like to use their desktop app, okay?
(此句尚無繁中翻譯)
2:12:47.360–2:12:53.011
Here's the desktop app, and what's nice about the desktop app is that you have this app integrations.
(此句尚無繁中翻譯)
2:12:53.011–2:13:00.101
So, if you click over here, you can connect designer to external agents and IDEs.
(此句尚無繁中翻譯)
2:13:00.101–2:13:03.202
So, Claude Code, Gemini CLI, and Codex.
(此句尚無繁中翻譯)
2:13:03.202–2:13:04.718
And so, I have this set up.
(此句尚無繁中翻譯)
2:13:04.718–2:13:06.767
So, all you need to do is click here.
(此句尚無繁中翻譯)
2:13:06.767–2:13:08.134
Now it's installed.
(此句尚無繁中翻譯)
2:13:08.134–2:13:13.755
And now, this app here is going to serve as an MCP server, okay?
(此句尚無繁中翻譯)
2:13:13.755–2:13:23.540
Because if I go to Codex here, and I press command comma, and I go into MCP servers, I also have this FlutterFlow Designer configured here.
(此句尚無繁中翻譯)
2:13:23.540–2:13:26.976
And if you want to set this up, you can simply ask Codex to do it.
(此句尚無繁中翻譯)
2:13:26.976–2:13:36.948
It's going to research, it's going to figure out, and it's going to eventually set it up for you so that you can have this FlutterFlow Designer as one of your MCP servers here, okay?
(此句尚無繁中翻譯)
2:13:36.948–2:13:52.203
So, now that we have this set up, what we want to do is we want to go into this designer, and we want to click a new design, and here you can enter a prompt ask it to design any kind of app UI for you, whether it is a mobile app or desktop app.
(此句尚無繁中翻譯)
2:13:52.203–2:13:57.070
They also have, you know, explore styles feature, or you can have an instant generation.
(此句尚無繁中翻譯)
2:13:57.080–2:14:00.790
Now, what you don't want to do is you do not want to type this prompt directly.
(此句尚無繁中翻譯)
2:14:00.800–2:14:08.630
You want to ask Codex to generate a prompt for you since it knows a lot more about the app that you can input here.
(此句尚無繁中翻譯)
2:14:08.640–2:14:16.369
And this is the same workflow regardless of whether you're using this tool, Google Stage, or pretty much any other tool out there.
(此句尚無繁中翻譯)
2:14:16.369–2:14:20.785
And so, we're going to go ahead and we're going to grab a prompt to do just that.
(此句尚無繁中翻譯)
2:14:20.785–2:14:22.621
And here's a prompt that we can use.
(此句尚無繁中翻譯)
2:14:22.621–2:14:25.885
Create a polished FlutterFlow designer concept for FlexHelp.
(此句尚無繁中翻譯)
2:14:25.885–2:14:31.299
FlexHelp is a two-sided marketplace, and we are telling it what kind of screens to design.
(此句尚無繁中翻譯)
2:14:31.299–2:14:33.185
We give it some design requirements.
(此句尚無繁中翻譯)
2:14:33.185–2:14:36.415
We give give it some guardrails, stuff like that.
(此句尚無繁中翻譯)
2:14:36.415–2:14:45.932
And so, we're going to input this prompt, and here we're going to stay on the explore styles, and that way we can have different styles show up, and we can decide which one we like better.
(此句尚無繁中翻譯)
2:14:45.932–2:14:49.480
So, I'm going to go ahead and run this, and here are the designs.
(此句尚無繁中翻譯)
2:14:49.480–2:14:52.052
So, as you can see, they're all very different.
(此句尚無繁中翻譯)
2:14:52.052–2:15:02.504
We have this, we have this, we have this, we have these ones, so and you got to admit that in my view, these look a lot better than what Codex did, right?
(此句尚無繁中翻譯)
2:15:02.504–2:15:04.262
So, this is what Codex did.
(此句尚無繁中翻譯)
2:15:04.262–2:15:09.863
In my view, these designs are a lot more interesting than Codex's design.
(此句尚無繁中翻譯)
2:15:09.863–2:15:10.150
Okay?
(此句尚無繁中翻譯)
2:15:10.150–2:15:12.527
So, I don't know which one you guys like.
(此句尚無繁中翻譯)
2:15:12.527–2:15:14.136
This is a classical one.
(此句尚無繁中翻譯)
2:15:14.136–2:15:15.116
This is nice.
(此句尚無繁中翻譯)
2:15:15.116–2:15:16.191
Let's take a look.
(此句尚無繁中翻譯)
2:15:16.191–2:15:18.030
Let's go ahead and use this classical one.
(此句尚無繁中翻譯)
2:15:18.030–2:15:23.984
So, I'm going to say use this style, and it's going to use this style, and then it's going to generate all the pages that we need.
(此句尚無繁中翻譯)
2:15:23.984–2:15:26.221
So, here we have seven pages that we need.
(此句尚無繁中翻譯)
2:15:26.221–2:15:27.758
So, now we have all the pages.
(此句尚無繁中翻譯)
2:15:27.758–2:15:41.627
Here we have customer home, we have service details, really nice page, booking request form, customer booking status, we even have a map, helper dashboard, helper request management, and a user profile.
(此句尚無繁中翻譯)
2:15:41.627–2:15:50.470
The next thing that we want to do is we want to tell Codex to fetch these designs and implement them, bake them into our app.
(此句尚無繁中翻譯)
2:15:50.480–2:15:51.654
And so, let's take a look.
(此句尚無繁中翻譯)
2:15:51.654–2:15:55.245
So, this is called FlexHelp Marketplace, the name of the project here.
(此句尚無繁中翻譯)
2:15:55.245–2:15:58.202
And so, now what we're going to do is we're going to go back to Codex.
(此句尚無繁中翻譯)
2:15:58.202–2:16:12.750
We're going to close out this section here, and we're going to give it a prompt that's going to ask it to connect to FlutterFlow designer, look at that specific project and grab those designs and then bake them into our app
(此句尚無繁中翻譯)
2:16:12.760–2:16:13.440
right here.
(此句尚無繁中翻譯)
2:16:13.440–2:16:15.815
And I have a prompt here to do just that.
(此句尚無繁中翻譯)
2:16:15.815–2:16:16.990
So, here's the prompt.
(此句尚無繁中翻譯)
2:16:17.000–2:16:21.905
Update the Flex sub static UI to match the approved FlutterFlow Designer reference.
(此句尚無繁中翻譯)
2:16:21.905–2:16:29.021
So, this is the main prompt, but we also need to ensure that we tell it that we want to use the FlutterFlow Designer MCP.
(此句尚無繁中翻譯)
2:16:29.021–2:16:36.278
Use FlutterFlow Designer MCP and then project is because there are multiple projects.
(此句尚無繁中翻譯)
2:16:36.278–2:16:38.197
We want to copy this project here.
(此句尚無繁中翻譯)
2:16:38.197–2:16:38.486
This.
(此句尚無繁中翻譯)
2:16:38.486–2:16:42.541
And we're going to go into plan mode just to make sure that everything is good.
(此句尚無繁中翻譯)
2:16:42.541–2:16:43.596
And I'm going to run that.
(此句尚無繁中翻譯)
2:16:43.596–2:16:51.732
And here it says, "Next, I'm opening a Designer MCP session." And once it does that, you can see you can actually see the agent working.
(此句尚無繁中翻譯)
2:16:51.732–2:16:58.600
This is our agent, our client cuz Codex is acting as an MCP client connecting to this MCP server.
(此句尚無繁中翻譯)
2:16:58.600–2:17:01.368
And as you can see, it's it's analyzing this page.
(此句尚無繁中翻譯)
2:17:01.368–2:17:04.597
And you can see this little Codex icon here.
(此句尚無繁中翻譯)
2:17:04.597–2:17:16.621
And you can see it says here, "One active agent." It's studying the designs and then it's going to pull the designs back here and build an actual UI using those designs.
(此句尚無繁中翻譯)
2:17:16.621–2:17:23.612
And the goal here is to ensure that it builds a pixel-perfect or at least as close as possible to what we see here.
(此句尚無繁中翻譯)
2:17:23.612–2:17:23.929
Okay?
(此句尚無繁中翻譯)
2:17:23.929–2:17:25.774
So, let's see what it's doing.
(此句尚無繁中翻譯)
2:17:25.774–2:17:27.830
So, now it came back with a plan.
(此句尚無繁中翻譯)
2:17:27.840–2:17:34.356
Update the existing React static UI to visually follow the approved FlutterFlow Designer reference.
(此句尚無繁中翻譯)
2:17:34.356–2:17:39.917
So, here it's it has five pages, but over here we actually have more.
(此句尚無繁中翻譯)
2:17:39.917–2:17:41.511
We have seven pages.
(此句尚無繁中翻譯)
2:17:41.511–2:17:48.205
So, I don't know if I if it missed it or that I did not it was it wasn't part of the prompt or some mix-up.
(此句尚無繁中翻譯)
2:17:48.205–2:17:52.168
So, we want to make sure that it captures all the seven pages.
(此句尚無繁中翻譯)
2:17:52.168–2:17:58.659
Ensure that it captures all the seven pages from FlutterFlow Designer project.
(此句尚無繁中翻譯)
2:17:58.659–2:17:59.045
Okay?
(此句尚無繁中翻譯)
2:17:59.045–2:18:06.854
And still in the plan mode just to make sure we get this right because our app ideally should should have all of these pages.
(此句尚無繁中翻譯)
2:18:06.854–2:18:11.526
User profile, helper, request management, helper dashboard, etc. etc.
(此句尚無繁中翻譯)
2:18:11.526–2:18:13.148
All of these make sense.
(此句尚無繁中翻譯)
2:18:13.148–2:18:19.589
Okay, so it went ahead and it updated it and it's going to add static page components for all seven pages.
(此句尚無繁中翻譯)
2:18:19.599–2:18:20.504
Okay, submit this.
(此句尚無繁中翻譯)
2:18:20.504–2:18:25.517
All right, so it has implemented the seven page designer reference update.
(此句尚無繁中翻譯)
2:18:25.517–2:18:27.557
Let's go ahead and see how it looks.
(此句尚無繁中翻譯)
2:18:27.557–2:18:30.202
All right, so this looks a lot better in my opinion.
(此句尚無繁中翻譯)
2:18:30.202–2:18:32.270
All right, we have settings.
(此句尚無繁中翻譯)
2:18:32.270–2:18:34.908
We do have the CH customer home.
(此句尚無繁中翻譯)
2:18:34.908–2:18:36.319
Do we even see that?
(此句尚無繁中翻譯)
2:18:36.319–2:18:37.847
I don't even see that here.
(此句尚無繁中翻譯)
2:18:37.847–2:18:42.051
But this customer home service details, click on book.
(此句尚無繁中翻譯)
2:18:42.051–2:18:44.720
So this menu we need to kind of remove this.
(此句尚無繁中翻譯)
2:18:44.720–2:18:46.300
So let me go ahead and sell it.
(此句尚無繁中翻譯)
2:18:46.300–2:18:48.424
What are those abbreviations?
(此句尚無繁中翻譯)
2:18:48.424–2:18:49.039
Let's see.
(此句尚無繁中翻譯)
2:18:49.039–2:18:50.532
Do they need to be there?
(此句尚無繁中翻譯)
2:18:50.532–2:18:52.117
Let's see what it says.
(此句尚無繁中翻譯)
2:18:52.117–2:18:57.611
But it looks a lot cleaner than than the original UI, at least to my eyes.
(此句尚無繁中翻譯)
2:18:57.611–2:19:02.541
And now we're doing a little bit of tweaking, clean-up plan.
(此句尚無繁中翻譯)
2:19:02.541–2:19:08.047
Okay, they were placeholder text icons used to mimic the nav icon column.
(此句尚無繁中翻譯)
2:19:08.047–2:19:13.112
So we need to remove that and we should probably remove any other placeholder icons.
(此句尚無繁中翻譯)
2:19:13.112–2:19:15.163
But right now it looks fairly clean.
(此句尚無繁中翻譯)
2:19:15.163–2:19:17.127
Static preview, what is that?
(此句尚無繁中翻譯)
2:19:17.127–2:19:19.041
This this also needs to be removed.
(此句尚無繁中翻譯)
2:19:19.041–2:19:27.399
So we're going to actually tell it check for any placeholders and see if you can match what it should be on the design.
(此句尚無繁中翻譯)
2:19:27.399–2:19:33.015
Pull pull the design elements and re-replace these placeholders with with the actual design.
(此句尚無繁中翻譯)
2:19:33.015–2:19:34.629
All right, so it has fixed it.
(此句尚無繁中翻譯)
2:19:34.639–2:19:36.083
Now it looks a lot better.
(此句尚無繁中翻譯)
2:19:36.083–2:19:38.258
We still see some other static preview.
(此句尚無繁中翻譯)
2:19:38.258–2:19:38.950
That's okay.
(此句尚無繁中翻譯)
2:19:38.960–2:19:43.168
Let's see if they go away once we have real data being fed.
(此句尚無繁中翻譯)
2:19:43.168–2:19:48.133
So once we're happy with the UI, we can start designing the backend.
(此句尚無繁中翻譯)
2:19:48.133–2:19:52.318
Data model should match the screens that we actually have here.
(此句尚無繁中翻譯)
2:19:52.318–2:20:01.292
And so for FlexHelp, the first schema to support service browsing, helper profiles, booking creation, and helper status updates.
(此句尚無繁中翻譯)
2:20:01.292–2:20:03.544
Anything beyond that can wait.
(此句尚無繁中翻譯)
2:20:03.544–2:20:09.190
And here's a prompt that we can use to connect our app to Convex, okay?
(此句尚無繁中翻譯)
2:20:09.200–2:20:12.157
We're going to be using Convex for this app as well.
(此句尚無繁中翻譯)
2:20:12.157–2:20:17.673
So, we have here connect let's help UI to live Convex service and helper data.
(此句尚無繁中翻譯)
2:20:17.673–2:20:20.012
Let's go ahead and keep it in plan mode.
(此句尚無繁中翻譯)
2:20:20.012–2:20:21.573
All right, so this is our plan.
(此句尚無繁中翻譯)
2:20:21.573–2:20:24.110
This is the Convex read path plan.
(此句尚無繁中翻譯)
2:20:24.120–2:20:30.717
Connect the customer facing marketplace UI to Convex for the first database back read path.
(此句尚無繁中翻譯)
2:20:30.717–2:20:33.458
The repo currently has no Convex setup.
(此句尚無繁中翻譯)
2:20:33.458–2:20:36.838
So, add Convex from from scratch, etc., etc.
(此句尚無繁中翻譯)
2:20:36.838–2:20:39.030
And we have Convex here running.
(此句尚無繁中翻譯)
2:20:39.030–2:20:40.609
We have these three projects.
(此句尚無繁中翻譯)
2:20:40.609–2:20:46.967
One that was created for the other app that we did, and so we're going to be creating another project for this app as well.
(此句尚無繁中翻譯)
2:20:46.967–2:20:52.985
All right, so it has implemented the first Convex back read path for the customer marketplace.
(此句尚無繁中翻譯)
2:20:52.985–2:20:55.030
And these are the files that has changed.
(此句尚無繁中翻譯)
2:20:55.040–2:20:56.341
This is what's connected.
(此句尚無繁中翻譯)
2:20:56.341–2:21:02.589
And if we jump into our Convex dashboard, we can see we have a brand new project here that wasn't there before.
(此句尚無繁中翻譯)
2:21:02.589–2:21:08.818
And if we jump here, we should see that we have a deployment here on my own machine.
(此句尚無繁中翻譯)
2:21:08.818–2:21:13.739
This is a local deployment that Convex is running on, right?
(此句尚無繁中翻譯)
2:21:13.739–2:21:16.516
This is not on Convex, it's on my own machine.
(此句尚無繁中翻譯)
2:21:16.516–2:21:18.649
And we also have a production, right?
(此句尚無繁中翻譯)
2:21:18.649–2:21:25.165
So, with this deployment here, you go into data, we can see that we have categories, we have helper profiles.
(此句尚無繁中翻譯)
2:21:25.165–2:21:26.548
We also have services.
(此句尚無繁中翻譯)
2:21:26.548–2:21:29.216
And then we have a bunch of functions, right?
(此句尚無繁中翻譯)
2:21:29.216–2:21:33.030
Marketplace list, and then we have seed, creating seed data.
(此句尚無繁中翻譯)
2:21:33.040–2:21:36.789
Now, if you go into production, we may not see anything there, right?
(此句尚無繁中翻譯)
2:21:36.789–2:21:40.346
There's nothing there because we haven't deployed this app to production.
(此句尚無繁中翻譯)
2:21:40.346–2:21:43.510
There's no need for a production deployment.
(此句尚無繁中翻譯)
2:21:43.520–2:21:51.922
Now, if we jump back to Codex and we refresh the app, this is now data that it's pulling from my local Convex deployment, okay?
(此句尚無繁中翻譯)
2:21:51.922–2:21:53.192
So, we have here Marcus.
(此句尚無繁中翻譯)
2:21:53.192–2:21:55.976
If you go back here, we should see Marcus, right?
(此句尚無繁中翻譯)
2:21:55.976–2:21:57.888
Helper profiles, there's Marcus.
(此句尚無繁中翻譯)
2:21:57.888–2:22:02.455
And if I change Marcus, if I edit name and I change, let's say, Marcus, right?
(此句尚無繁中翻譯)
2:22:02.455–2:22:05.910
And I go back here, now it's automatically Marcus E here.
(此句尚無繁中翻譯)
2:22:05.920–2:22:07.188
Automatically updates.
(此句尚無繁中翻譯)
2:22:07.188–2:22:09.397
If I change that to James, guess what?
(此句尚無繁中翻譯)
2:22:09.397–2:22:10.563
Now it says James S.
(此句尚無繁中翻譯)
2:22:10.563–2:22:16.019
So, as you can see, this is now linked to our local Convex instance on my machine.
(此句尚無繁中翻譯)
2:22:16.019–2:22:17.542
Both of these are on my machine.
(此句尚無繁中翻譯)
2:22:17.542–2:22:24.237
Now, the next thing that I want to do is I want to build out the booking flow, because that's the key in this app, right?
(此句尚無繁中翻譯)
2:22:24.237–2:22:26.767
The ability to book these services.
(此句尚無繁中翻譯)
2:22:26.767–2:22:28.613
And I have a prompt here as well.
(此句尚無繁中翻譯)
2:22:28.613–2:22:31.056
We're going to be using this prompt right here.
(此句尚無繁中翻譯)
2:22:31.056–2:22:34.190
Okay, add the customer booking flow to FlexHelp.
(此句尚無繁中翻譯)
2:22:34.200–2:22:38.109
Inspect all of this, and I'm going to set this to plan mode.
(此句尚無繁中翻譯)
2:22:38.109–2:22:39.935
And let's go ahead and run that.
(此句尚無繁中翻譯)
2:22:39.935–2:22:40.790
That's our plan.
(此句尚無繁中翻譯)
2:22:40.800–2:22:48.291
We're going to be adding the first customer-side booking creation path on top of the existing Convex back service listing.
(此句尚無繁中翻譯)
2:22:48.291–2:22:49.845
And there's some information there.
(此句尚無繁中翻譯)
2:22:49.845–2:22:51.336
We're going to implement this plan.
(此句尚無繁中翻譯)
2:22:51.336–2:22:55.810
All right, so it has implemented the customer booking creation path.
(此句尚無繁中翻譯)
2:22:55.810–2:22:57.651
And it also tested it out.
(此句尚無繁中翻譯)
2:22:57.651–2:23:01.298
As you can see, there's also a booking here as well.
(此句尚無繁中翻譯)
2:23:01.298–2:23:03.350
So, let's go ahead and see if this works.
(此句尚無繁中翻譯)
2:23:03.360–2:23:05.595
All right, so let's say I want to book James.
(此句尚無繁中翻譯)
2:23:05.595–2:23:06.753
Click over here.
(此句尚無繁中翻譯)
2:23:06.753–2:23:11.160
So, I can't quite pick anything here, but I can do request to book.
(此句尚無繁中翻譯)
2:23:11.160–2:23:12.630
Send booking request.
(此句尚無繁中翻譯)
2:23:12.640–2:23:13.905
And I need an address.
(此句尚無繁中翻譯)
2:23:13.905–2:23:16.122
Okay, so let's say do, I don't know.
(此句尚無繁中翻譯)
2:23:16.122–2:23:18.149
We need auto-complete here as well.
(此句尚無繁中翻譯)
2:23:18.149–2:23:19.634
Fill in every field.
(此句尚無繁中翻譯)
2:23:19.634–2:23:20.081
Okay.
(此句尚無繁中翻譯)
2:23:20.081–2:23:21.870
Okay, so task, task.
(此句尚無繁中翻譯)
2:23:21.880–2:23:24.390
Okay, this I cannot fill every field.
(此句尚無繁中翻譯)
2:23:24.400–2:23:28.110
Okay, customer, schedule, say 10:00 a.m.
(此句尚無繁中翻譯)
2:23:28.120–2:23:33.063
And this obviously needs to be, you know, like a calendar picker, that kind of thing.
(此句尚無繁中翻譯)
2:23:33.063–2:23:34.996
Okay, and now we have the booking request.
(此句尚無繁中翻譯)
2:23:34.996–2:23:38.160
And I can click on view bookings, and I see my bookings.
(此句尚無繁中翻譯)
2:23:38.160–2:23:42.553
Okay, so this was done by the Codex while it was testing.
(此句尚無繁中翻譯)
2:23:42.553–2:23:49.230
So, now if we jump into Codex, we should see on my local instance here, we should see bookings.
(此句尚無繁中翻譯)
2:23:49.240–2:23:51.083
And we see two bookings, okay?
(此句尚無繁中翻譯)
2:23:51.083–2:23:51.681
Right here.
(此句尚無繁中翻譯)
2:23:51.681–2:23:53.596
So, the booking flow seems to work.
(此句尚無繁中翻譯)
2:23:53.596–2:23:59.470
There are some rough edges here and there that we need to fix, but for the most part, it is coming together.
(此句尚無繁中翻譯)
2:23:59.480–2:24:04.547
Now, once customers can create bookings, helpers need a place to see and manage them.
(此句尚無繁中翻譯)
2:24:04.547–2:24:11.697
The helper dashboard should show incoming requests and make it obvious what action the helper can take next.
(此句尚無繁中翻譯)
2:24:11.697–2:24:16.510
At the simplest level, the helper should be able to accept or decline a request.
(此句尚無繁中翻譯)
2:24:16.520–2:24:22.901
After accepting, the helper should be able to move the job into progress and then mark it completed.
(此句尚無繁中翻譯)
2:24:22.901–2:24:27.232
Those status changes are what turn the app into a workflow.
(此句尚無繁中翻譯)
2:24:27.232–2:24:31.060
This is also a good place to show the power of live data.
(此句尚無繁中翻譯)
2:24:31.060–2:24:36.506
When a status changes, the UI should update and the Convex row should change.
(此句尚無繁中翻譯)
2:24:36.506–2:24:39.950
That gives us a real end-to-end marketplace loop.
(此句尚無繁中翻譯)
2:24:39.960–2:24:44.291
Customer request, helper action, back end state, and UI update.
(此句尚無繁中翻譯)
2:24:44.291–2:24:46.790
And this is the prompt that we're going to be using.
(此句尚無繁中翻譯)
2:24:46.800–2:24:52.119
Add the helper dashboard workflow for viewing booking requests and updating booking status.
(此句尚無繁中翻譯)
2:24:52.119–2:24:57.255
Okay, I'm going to switch into plan mode and we're going to go ahead and send this.
(此句尚無繁中翻譯)
2:24:57.255–2:25:03.203
So, it's asking me that how should the helper workflow handle the existing requested booking status?
(此句尚無繁中翻譯)
2:25:03.203–2:25:05.471
Keep requested, this is recommended.
(此句尚無繁中翻譯)
2:25:05.471–2:25:10.544
Preserve existing created bookings, show it as pending in the UI, or rename to pending.
(此句尚無繁中翻譯)
2:25:10.544–2:25:13.947
Change the stored initial status to pending and require a small data.
(此句尚無繁中翻譯)
2:25:13.947–2:25:15.689
So, we don't want any migration.
(此句尚無繁中翻譯)
2:25:15.689–2:25:18.402
We just want to go with the easiest option.
(此句尚無繁中翻譯)
2:25:18.402–2:25:23.686
And then, how should the helper request visibility work before auth is added?
(此句尚無繁中翻譯)
2:25:23.686–2:25:24.927
Helper selected.
(此句尚無繁中翻譯)
2:25:24.927–2:25:32.310
This is add a simple static helper switcher filter, so each helper sees bookings for their Convex helper profile only.
(此句尚無繁中翻譯)
2:25:32.320–2:25:34.675
Simplest UI and back end, but less realistic.
(此句尚無繁中翻譯)
2:25:34.675–2:25:36.790
So, we want helper selected.
(此句尚無繁中翻譯)
2:25:36.800–2:25:38.221
Okay, we're going to select that.
(此句尚無繁中翻譯)
2:25:38.221–2:25:39.962
All right, there's the plan.
(此句尚無繁中翻譯)
2:25:39.962–2:25:44.750
Add the first helper-facing workflow on top of existing convex booking creation pack.
(此句尚無繁中翻譯)
2:25:44.760–2:25:46.032
We're going to submit this.
(此句尚無繁中翻譯)
2:25:46.032–2:25:47.049
Here is our progress.
(此句尚無繁中翻譯)
2:25:47.049–2:25:51.298
All right, so he just implemented the helper booking status workflow.
(此句尚無繁中翻譯)
2:25:51.298–2:25:52.775
And these are the files that changed.
(此句尚無繁中翻譯)
2:25:52.775–2:25:53.811
This is what it did.
(此句尚無繁中翻譯)
2:25:53.811–2:25:58.148
So it updated it through pending, accepted, in progress, completed.
(此句尚無繁中翻譯)
2:25:58.148–2:26:01.808
It viewed it under helper James created booking this.
(此句尚無繁中翻譯)
2:26:01.808–2:26:02.720
So it did all that.
(此句尚無繁中翻譯)
2:26:02.720–2:26:03.495
It did some tests.
(此句尚無繁中翻譯)
2:26:03.495–2:26:04.727
Let's go ahead and open it.
(此句尚無繁中翻譯)
2:26:04.727–2:26:06.315
And let's see what we can do.
(此句尚無繁中翻譯)
2:26:06.315–2:26:08.911
So this is the helper booking status.
(此句尚無繁中翻譯)
2:26:08.911–2:26:12.993
I'm going to helper dashboard have my incoming requests, right?
(此句尚無繁中翻譯)
2:26:12.993–2:26:16.650
So I can accept it, I can start it, and I can complete it.
(此句尚無繁中翻譯)
2:26:16.650–2:26:17.038
Okay?
(此句尚無繁中翻譯)
2:26:17.038–2:26:19.398
So that's the piece that is working.
(此句尚無繁中翻譯)
2:26:19.398–2:26:20.550
I can also cancel it.
(此句尚無繁中翻譯)
2:26:20.560–2:26:21.954
And that is canceled.
(此句尚無繁中翻譯)
2:26:21.954–2:26:22.884
And that's it.
(此句尚無繁中翻譯)
2:26:22.884–2:26:24.108
I can't come back to it.
(此句尚無繁中翻譯)
2:26:24.108–2:26:25.130
I can't do anything.
(此句尚無繁中翻譯)
2:26:25.130–2:26:27.017
Here we have recent activity, right?
(此句尚無繁中翻譯)
2:26:27.017–2:26:28.550
Completed, completed, canceled.
(此句尚無繁中翻譯)
2:26:28.560–2:26:31.710
And this is the one that did 148 116.
(此句尚無繁中翻譯)
2:26:31.720–2:26:33.950
This is the one that it has completed.
(此句尚無繁中翻譯)
2:26:33.960–2:26:35.443
This seems to work, right?
(此句尚無繁中翻譯)
2:26:35.443–2:26:38.081
And we have canceled, we have completed.
(此句尚無繁中翻譯)
2:26:38.081–2:26:41.405
Even a simple marketplace has different responsibilities.
(此句尚無繁中翻譯)
2:26:41.405–2:26:44.821
Customers create booking requests and view their own bookings.
(此句尚無繁中翻譯)
2:26:44.821–2:26:48.990
Helpers manage requests that belong to them or are available to them.
(此句尚無繁中翻譯)
2:26:49.000–2:26:55.022
Admin or system logic may handle category alteration or platform level controls later.
(此句尚無繁中翻譯)
2:26:55.022–2:26:58.556
The key point is that these rules should not only live in the UI.
(此句尚無繁中翻譯)
2:26:58.556–2:27:05.371
Back-end functions need to enforce ownership and permissions because the UI can always be bypassed.
(此句尚無繁中翻譯)
2:27:05.371–2:27:10.770
This is where Codex needs to think carefully instead of just adding buttons.
(此句尚無繁中翻譯)
2:27:10.770–2:27:16.750
And so now what we want to do is we want to add the roles off and the access boundary layer.
(此句尚無繁中翻譯)
2:27:16.760–2:27:18.731
And here's the prompt to do that.
(此句尚無繁中翻譯)
2:27:18.731–2:27:25.286
Add the first practical roles off and access boundary layer around the existing flex help workflows, okay?
(此句尚無繁中翻譯)
2:27:25.286–2:27:27.816
So we're going to go definitely in the plan mode.
(此句尚無繁中翻譯)
2:27:27.816–2:27:30.270
We're going to run this and see what it says.
(此句尚無繁中翻譯)
2:27:30.280–2:27:32.001
And so it has a question for us.
(此句尚無繁中翻譯)
2:27:32.001–2:27:36.767
Which identity approach should this plan should this step plan for?
(此句尚無繁中翻譯)
2:27:36.767–2:27:37.945
Demo sessions.
(此句尚無繁中翻譯)
2:27:37.945–2:27:50.974
Add Convex back demo users and for Convex or add real Convex or sign and sign up more production shape but larger and currently beta or this clerk use third-party or provider.
(此句尚無繁中翻譯)
2:27:50.974–2:27:57.129
Let's go with Convex or how should customer helper roles be represented for or version one?
(此句尚無繁中翻譯)
2:27:57.129–2:27:58.642
Role plus profile.
(此句尚無繁中翻譯)
2:27:58.642–2:27:59.805
So what is this?
(此句尚無繁中翻譯)
2:27:59.805–2:28:05.936
Each demo user has customer helper both and helpers linked to one helper profile for request.
(此句尚無繁中翻譯)
2:28:05.936–2:28:07.090
Separate accounts.
(此句尚無繁中翻譯)
2:28:07.090–2:28:10.405
Customer and helper are always separate demo users.
(此句尚無繁中翻譯)
2:28:10.405–2:28:13.055
Simpler boundaries but less flexible.
(此句尚無繁中翻譯)
2:28:13.055–2:28:19.241
And sometimes when I'm not sure but I want the system to come up with a really solid answer.
(此句尚無繁中翻譯)
2:28:19.241–2:28:20.916
This is what I usually type.
(此句尚無繁中翻譯)
2:28:20.916–2:28:26.294
For the second question, what's the most durable long-term option?
(此句尚無繁中翻譯)
2:28:26.294–2:28:28.652
Okay, that's the key here, durable.
(此句尚無繁中翻譯)
2:28:28.652–2:28:30.085
Now let's see what it says.
(此句尚無繁中翻譯)
2:28:30.085–2:28:33.914
The most durable long-term option is role plus profile.
(此句尚無繁中翻譯)
2:28:33.914–2:28:34.552
Perfect.
(此句尚無繁中翻譯)
2:28:34.552–2:28:35.218
That's it.
(此句尚無繁中翻譯)
2:28:35.218–2:28:39.561
And for the first question, choose demo sessions for the for this core step.
(此句尚無繁中翻譯)
2:28:39.561–2:28:42.735
Okay, so let's go ahead with demo sessions, okay?
(此句尚無繁中翻譯)
2:28:42.735–2:28:46.395
So do demo sessions and role plus profile.
(此句尚無繁中翻譯)
2:28:46.395–2:28:48.992
Let's just go with the recommendations.
(此句尚無繁中翻譯)
2:28:48.992–2:28:49.667
Expand it.
(此句尚無繁中翻譯)
2:28:49.667–2:28:54.265
All right, so now you can see that Codex is testing everything, right?
(此句尚無繁中翻譯)
2:28:54.265–2:28:58.962
It's testing on the UI in the browser and you see this cursor right here.
(此句尚無繁中翻譯)
2:28:58.962–2:29:06.466
The browser flow now confirms a customer created book booking appears for the linked helper and can be moved into in progress.
(此句尚無繁中翻譯)
2:29:06.466–2:29:13.003
All right, so it has finished and it has implemented the demo roles and access boundary layer over here, okay?
(此句尚無繁中翻譯)
2:29:13.003–2:29:15.830
So marketplace browsing stays public.
(此句尚無繁中翻譯)
2:29:15.840–2:29:19.971
Booking creation requires a customer or both demo user.
(此句尚無繁中翻譯)
2:29:19.971–2:29:25.107
Customer booking status only shows bookings owned by the signed-in customer.
(此句尚無繁中翻譯)
2:29:25.107–2:29:33.210
Helper request status updates require a helper or both demo user with a linked helper ID helper profile ID.
(此句尚無繁中翻譯)
2:29:33.210–2:29:38.590
And so, remaining limitation, this is still tutorial demo auth, not production authentication.
(此句尚無繁中翻譯)
2:29:38.600–2:29:46.392
Real Convex auth or Clerk can replace demo session issuance later while keeping the same role profile access model.
(此句尚無繁中翻譯)
2:29:46.392–2:29:50.473
And so, this should give us some uh role separation, right?
(此句尚無繁中翻譯)
2:29:50.473–2:29:52.515
Some kind of authentication on the backend.
(此句尚無繁中翻譯)
2:29:52.515–2:29:57.518
And here, if we jump into Convex, you can see we now have users over here, right?
(此句尚無繁中翻譯)
2:29:57.518–2:29:59.779
These are the users, and there's a role.
(此句尚無繁中翻譯)
2:29:59.779–2:30:04.091
So, you can be either both, or you can be a helper, or you can be a customer.
(此句尚無繁中翻譯)
2:30:04.091–2:30:08.966
And depending on which role you're you're in, you can do various operations.
(此句尚無繁中翻譯)
2:30:08.966–2:30:16.146
Here we have sessions, we have various services, we also have functions that also handle these roles.
(此句尚無繁中翻譯)
2:30:16.146–2:30:24.204
So, you can list demo users, you can start demo session, viewer list for helper, list for customer, etc., etc.
(此句尚無繁中翻譯)
2:30:24.204–2:30:29.187
And these functions, they are meant to work with specific roles, right?
(此句尚無繁中翻譯)
2:30:29.187–2:30:32.797
So, that authentic- -ation is is baked in into these functions.
(此句尚無繁中翻譯)
2:30:32.797–2:30:39.510
Now, when something breaks, the wrong move is to immediately ask Codex to rewrite a whole section.
(此句尚無繁中翻譯)
2:30:39.520–2:30:48.692
The better move is to give it the error, ask it to inspect the relevant files, and make it explain the likely cause before changing anything.
(此句尚無繁中翻譯)
2:30:48.692–2:30:59.291
That debugging loop is the same whether the problem is a browser error, a build failure, a Convex function error, or a UI state that does not make sense.
(此句尚無繁中翻譯)
2:30:59.291–2:31:04.368
Observe the issue, diagnose it, patch it narrowly, and verify the fix.
(此句尚無繁中翻譯)
2:31:04.368–2:31:13.950
And so, let's give it a prompt that will deal with this sort of issue regarding debugging, polish, verification, stuff like that.
(此句尚無繁中翻譯)
2:31:13.960–2:31:15.907
We're going to be using this prompt over here.
(此句尚無繁中翻譯)
2:31:15.907–2:31:20.430
Debug, polish, and verify the existing flex help product workflow.
(此句尚無繁中翻譯)
2:31:20.440–2:31:30.310
Inspect the current app first, then identify this is smallest set of fixes and polish improvements needed to make the current workflow feel credible.
(此句尚無繁中翻譯)
2:31:30.320–2:31:32.084
Let's jump into plan mode.
(此句尚無繁中翻譯)
2:31:32.084–2:31:40.004
Right away, it tells us that I see a few concrete polish fix candidates already and it lists some here, okay?
(此句尚無繁中翻譯)
2:31:40.004–2:31:44.038
And so, the build passes and both local servers are responding.
(此句尚無繁中翻譯)
2:31:44.038–2:31:48.150
So, it's using an in-app browser now for a quick workflow probe.
(此句尚無繁中翻譯)
2:31:48.160–2:31:52.983
So, the plan targets actual UI issues rather than guesses, okay?
(此句尚無繁中翻譯)
2:31:52.983–2:31:55.163
So, let's wait to see what it finds.
(此句尚無繁中翻譯)
2:31:55.163–2:31:57.705
And this is the plan that it came up with.
(此句尚無繁中翻譯)
2:31:57.705–2:32:04.674
Tighten the existing customer helper Convex and demo app workflows without adding new product scope, okay?
(此句尚無繁中翻譯)
2:32:04.674–2:32:09.679
So, it lists a bunch of things and we want to quickly scan assumptions.
(此句尚無繁中翻譯)
2:32:09.679–2:32:14.372
No new marketplace features will be added, no payments, nothing, okay?
(此句尚無繁中翻譯)
2:32:14.372–2:32:17.345
That stays and here's some key changes.
(此句尚無繁中翻譯)
2:32:17.345–2:32:19.131
You can kind of scan through that.
(此句尚無繁中翻譯)
2:32:19.131–2:32:20.522
Let's go ahead and submit this.
(此句尚無繁中翻譯)
2:32:20.522–2:32:25.175
Right, so it is done and it has implemented the debug polish task.
(此句尚無繁中翻譯)
2:32:25.175–2:32:27.818
And it actually fixed a lot of interesting things.
(此句尚無繁中翻譯)
2:32:27.818–2:32:35.834
It fixed some placeholders, it did some testing, it switched to different accounts, actually cleaned up a lot of cool stuff.
(此句尚無繁中翻譯)
2:32:35.834–2:32:50.424
So, if we take a look here, we can see that we can book, we can request a book, we can describe the task, we can fill all of this out, send, add the preferred date, and now it's showing in that I'm signed in as the customer, right?
(此句尚無繁中翻譯)
2:32:50.424–2:32:51.946
And I can switch a demo user.
(此句尚無繁中翻譯)
2:32:51.946–2:32:55.870
Now, I'm signed in as the helper and now I'm signed in as both.
(此句尚無繁中翻譯)
2:32:55.880–2:33:00.294
Customer access, choose a customer demo user to create a booking request.
(此句尚無繁中翻譯)
2:33:00.294–2:33:03.870
So, it's coming along really, really nicely.
(此句尚無繁中翻譯)
2:33:03.880–2:33:06.670
And the final build step is deployment.
(此句尚無繁中翻譯)
2:33:06.680–2:33:16.180
The app is not done until the front end is live, connected to the intended Convex back end, and smoke tested through the real product workflow.
(此句尚無繁中翻譯)
2:33:16.180–2:33:19.944
So, let's go ahead and grab this prompt and let's go ahead and paste it.
(此句尚無繁中翻譯)
2:33:19.944–2:33:27.135
So, deploy the existing Flex app with Vercel and smoke test the connected Convex backend, okay?
(此句尚無繁中翻譯)
2:33:27.135–2:33:31.587
We're going to jump into plan mode so that it can prepare everything, plan everything out.
(此句尚無繁中翻譯)
2:33:31.587–2:33:38.230
One thing that I want to tell it that I didn't tell it, and I'm going to do that right now, is I want to make sure it uses the Vercel package.
(此句尚無繁中翻譯)
2:33:38.240–2:33:40.874
Use the Vercel Vercel plugin.
(此句尚無繁中翻譯)
2:33:40.874–2:33:50.010
And I'm going to press command enter so that it steers the conversation because we want the model to ensure that it catches that, right?
(此句尚無繁中翻譯)
2:33:50.010–2:33:52.003
That we want to use the Vercel plugin.
(此句尚無繁中翻譯)
2:33:52.003–2:33:56.376
Which Convex environment should the deployed Vercel app use for the smoke test?
(此句尚無繁中翻譯)
2:33:56.376–2:33:57.659
We want to use production.
(此句尚無繁中翻譯)
2:33:57.659–2:34:00.354
And where should the front end be deployed?
(此句尚無繁中翻譯)
2:34:00.354–2:34:01.710
New personal project.
(此句尚無繁中翻譯)
2:34:01.720–2:34:02.240
Exactly.
(此句尚無繁中翻譯)
2:34:02.240–2:34:04.060
This is a brand new project.
(此句尚無繁中翻譯)
2:34:04.060–2:34:05.910
We already have a bunch of projects, right?
(此句尚無繁中翻譯)
2:34:05.920–2:34:08.241
So, if we go over here, we have this project.
(此句尚無繁中翻譯)
2:34:08.241–2:34:10.394
Actually, we should have used the existing project.
(此句尚無繁中翻譯)
2:34:10.394–2:34:13.504
We already have this project, but I think it's going to create a new project.
(此句尚無繁中翻譯)
2:34:13.504–2:34:15.292
Let's see if we can tell it.
(此句尚無繁中翻譯)
2:34:15.292–2:34:17.077
I'm going to copy that.
(此句尚無繁中翻譯)
2:34:17.077–2:34:18.900
See if we can use the existing project.
(此句尚無繁中翻譯)
2:34:18.900–2:34:20.628
No need to create a new project.
(此句尚無繁中翻譯)
2:34:20.628–2:34:21.503
And let me check.
(此句尚無繁中翻譯)
2:34:21.503–2:34:24.182
So, this is actually plan mode, so we're okay.
(此句尚無繁中翻譯)
2:34:24.182–2:34:25.834
Okay, implement this.
(此句尚無繁中翻譯)
2:34:25.834–2:34:27.990
And here it's going to create a production.
(此句尚無繁中翻譯)
2:34:28.000–2:34:30.654
So, if we go over here, remember we're using this.
(此句尚無繁中翻譯)
2:34:30.654–2:34:33.088
We also have a production deployment set up.
(此句尚無繁中翻譯)
2:34:33.088–2:34:35.480
So, it's going to be using the production deployment.
(此句尚無繁中翻譯)
2:34:35.480–2:34:40.531
So, we should see data and tables and functions and all that good stuff as part of this deployment.
(此句尚無繁中翻譯)
2:34:40.531–2:34:44.989
Production Convex is now seeded and responding with services and demo users.
(此句尚無繁中翻譯)
2:34:44.989–2:34:47.482
So, if you go over here, we have everything now.
(此句尚無繁中翻譯)
2:34:47.482–2:34:48.030
Look at this.
(此句尚無繁中翻譯)
2:34:48.040–2:34:49.491
Sessions, services.
(此句尚無繁中翻譯)
2:34:49.491–2:34:50.790
We have the data.
(此句尚無繁中翻譯)
2:34:50.800–2:35:04.520
All right, so looks like it has deployed it, and now it's doing a couple of smoke tests to make sure that everything works in production because now it's in production and it's also using the production Convex deployment, right?
(此句尚無繁中翻譯)
2:35:04.520–2:35:09.407
So, we need to test things again because, you know, it's using new environments now.
(此句尚無繁中翻譯)
2:35:09.407–2:35:11.015
All right, and it is done.
(此句尚無繁中翻譯)
2:35:11.015–2:35:12.177
Deployed FlexHelp.
(此句尚無繁中翻譯)
2:35:12.177–2:35:13.346
This is the URL.
(此句尚無繁中翻譯)
2:35:13.346–2:35:16.264
This is the Vercel project deployment ID.
(此句尚無繁中翻譯)
2:35:16.264–2:35:18.325
Everything is live now, okay?
(此句尚無繁中翻譯)
2:35:18.325–2:35:21.644
And you can access it as well at this URL, okay?
(此句尚無繁中翻譯)
2:35:21.644–2:35:28.582
So, we have customer home, and I'm signed in as one of these demo users, customer or helper, right?
(此句尚無繁中翻譯)
2:35:28.582–2:35:36.574
I can go into helper dashboard, and let's say I go I sign in as a customer, and I go into customer home, but I can't click here, right?
(此句尚無繁中翻譯)
2:35:36.574–2:35:37.946
This is helper access, right?
(此句尚無繁中翻譯)
2:35:37.946–2:35:39.325
Remember the roles, right?
(此句尚無繁中翻譯)
2:35:39.325–2:35:41.096
It's it's being handled here.
(此句尚無繁中翻譯)
2:35:41.096–2:35:46.145
And so, now as a customer, I want to book professional seasonal garden cleanup.
(此句尚無繁中翻譯)
2:35:46.145–2:35:54.804
I'm going to book this, request to book, I'm going to fill all of this out, 10:00 a.m., 2 hours, it's fixed address, send booking.
(此句尚無繁中翻譯)
2:35:54.804–2:35:59.699
Okay, so with booking request submitted, your request was saved, view my bookings.
(此句尚無繁中翻譯)
2:35:59.699–2:36:08.121
So, we have all of these pending, and so now I'm going to log in as Marcus, and Marcus is going to go into helper dashboard, and now he sees the booking.
(此句尚無繁中翻譯)
2:36:08.121–2:36:11.492
And I'm going to say accept or complete, it's completed.
(此句尚無繁中翻譯)
2:36:11.492–2:36:21.597
Now, if I come back as Anders again, and I go into customer's home, booking request for maybe summary, right here, customer booking status.
(此句尚無繁中翻譯)
2:36:21.597–2:36:23.116
Okay, there we go, completed.
(此句尚無繁中翻譯)
2:36:23.116–2:36:24.439
And here we see completed.
(此句尚無繁中翻譯)
2:36:24.439–2:36:25.670
This one is completed.
(此句尚無繁中翻譯)
2:36:25.680–2:36:28.486
Actually, this one, for Marcus, it has been completed.
(此句尚無繁中翻譯)
2:36:28.486–2:36:30.289
And then there's some more requests here.
(此句尚無繁中翻譯)
2:36:30.289–2:36:31.486
So, the flow is working.
(此句尚無繁中翻譯)
2:36:31.486–2:36:33.310
The flow is working perfectly.
(此句尚無繁中翻譯)
2:36:33.320–2:36:45.638
Of course, there are so many other things that we can do, we can use real auth, we can change the page, we can update things, but right now, the core of the app works perfectly.
(此句尚無繁中翻譯)
2:36:45.638–2:37:01.950
And just as a little bonus, when you reach this stage, there's more things that you can do, but one thing that, you know, right away that you can ask Codex to do would be something like suggest top five high impact, low effort features,
(此句尚無繁中翻譯)
2:37:01.960–2:37:02.760
functionalities.
(此句尚無繁中翻譯)
2:37:02.760–2:37:12.587
And I'm going to switch into plan mode, and we want to see if there is some high amp impact features that we can add that do not require a lot of effort.
(此句尚無繁中翻譯)
2:37:12.587–2:37:18.056
And here they are, top five high impact, low effort next features I prioritize.
(此句尚無繁中翻譯)
2:37:18.056–2:37:23.911
Functional marketplace search, booking detail view, customer cancel pending requests, etc., etc.
(此句尚無繁中翻譯)
2:37:23.911–2:37:40.988
And if you don't want to implement these right now, what I like to do is save this list as dots.todo.md as a markdown file and prioritize each item on a scale of one to five, one being urgent.
(此句尚無繁中翻譯)
2:37:40.988–2:37:47.515
And so that way I have a constantly evolving list of things that I can build in the future.
(此句尚無繁中翻譯)
2:37:47.515–2:37:53.032
So I do not need to ask Codex all the time constantly, you know, you know, to to suggest new features.
(此句尚無繁中翻譯)
2:37:53.032–2:38:04.253
And I'm going to say submit and that's going to go create this dots directory as well and this todo.md, which is the file that I usually keep to store new features.
(此句尚無繁中翻譯)
2:38:04.253–2:38:15.811
And now we can open this file and say, "Codex, so this is priority one, two, three, four, five." So now we have a an app that is live, that is on the internet, that we have built, that works.
(此句尚無繁中翻譯)
2:38:15.811–2:38:24.233
This workflow, this main workflow works as expected, but of course, there's so many things that you can do to improve this app.
(此句尚無繁中翻譯)
2:38:24.233–2:38:41.030
And in some of the later videos, I'm going to be showing you some more advanced Codex techniques that you can use to make your apps even better and more robust because I've been using Codex for a while now and I have some advanced tips and tricks that I'd
(此句尚無繁中翻譯)
2:38:41.040–2:38:42.906
like to share you in some of the future videos.
(此句尚無繁中翻譯)
2:38:42.906–2:38:48.132
And so I really hope that you enjoyed this mega Codex tutorial.
(此句尚無繁中翻譯)
2:38:48.132–2:39:03.030
Now, if you want to go ahead and build this app or modify this app or whatnot, I'm going to be leaving all my prompts, every single prompt that I used to build this app inside of our amazing Patreon community and you can check it out and
(此句尚無繁中翻譯)
2:39:03.040–2:39:03.794
hopefully join.
(此句尚無繁中翻譯)
2:39:03.794–2:39:09.591
There are lots of great people there and of course, support this channel, and support my work.
(此句尚無繁中翻譯)
2:39:09.591–2:39:15.000
And so, like this video, leave a comment, and check out our amazing Patreon community.
(此句尚無繁中翻譯)

影片筆記:The ULTIMATE Beginner’s Guide to OpenAI Codex (3-Hour Course)

處理狀態

已完成語音辨識與逐字時間軸。自動摘要階段未在時間預算內完成,因此先發布可用版本;可於後續從現有逐字稿補做摘要,不需重新辨識影片。

來源

https://www.youtube.com/watch?v=lmGX79cumyw

完整逐字稿

In this video, we're going to do a comprehensive Codex tutorial.
I want to show you not just what Codex is, but how to actually use it as a serious app building agent.
We'll start with the foundations, how Codex works, how the Mac app and the CLI fit together, how to choose models and thinking modes, how threads and contexts work, and how to use tools like the browser, terminal, files, and external systems.
Then, we'll turn that foundation into a real workflow.
We'll use Codex to plan, architect, design, implement, debug, and ultimately deploy a production-ready app from scratch.
By the end, you should understand the full Codex workflow well enough to take your app idea, break it into manageable steps, and use Codex to build it with much more confidence.
Now, when you Google for Codex, you're going to land on this website here.
And here, you can learn more about Codex, and you can also download the app.
Now, as you can see, it says here download for macOS.
That is because I have macOS.
If you're running Windows, you're going to have a button that says download for Windows.
So, it does support macOS and Windows.
And when you scroll down, you can see the main screenshot that kind of gives you a general overview, general idea of what this app looks like, okay?
And you can kind of scroll down, you can learn more about it.
Or we can jump into my Codex instance here, and I can give you a quick overview.
So, on the left-hand side, we have things like starting a new chat, search, various plugins, automations.
Just below that, we have our main organization, right?
And this is where you can organize your projects, okay?
And the idea here is that anytime you have a project, you want to click here, and you want to either start it from scratch or you use an existing folder because these are not organized just logically.
They're actually linked to folders on your disk, okay?
And so, everything that you see here represents actual folders.
Now, inside of these folders, we have some items here.
Now, these are not files, and they do not represent anything on the disk.
These are actually conversations, right?
And you can think of them as, you know, similar to what you might have in Chat GPT, okay?
So, if you're working on this project, you can create a new conversation simply by, you know, clicking here or pressing command and and telling it what you want to happen.
Now, in the center pane over here, this is where you're going to be communicating, right?
So, if we scroll back up, this was my initial prompt here.
I want to build a very, very simple web app that arranges items as a Trello Kanban board style, etc.
And then I have this interaction here, right?
It does something, I ask it to do something else, etc., etc.
Now, just below that is where you're going to be entering your prompt, okay?
So, you're going to be selecting the model, uh the different reasoning, and we're going to be covering all that, but this is the main text box for the model.
Now, on the right-hand side, there's a lot of interesting things happening here that a lot of people are not really aware of, okay?
And a lot of people are not really like using it.
And And you need to understand to leverage this whole app experience, right?
So, right here, we have this little card that displays a little bit of information about this specific conversation, right?
So, we have branch details, we have some artifacts, right?
And these are the data that happened as a result of this convo, right?
And so, if I go to another conversation, we might have different artifacts, right?
And you can think of an artifact as a side effect of, you know, of your conversation, okay?
So, if you've created a readme file, you're going to see it here.
If you did a web search, you're going to see it here.
Now, one of the more interesting things happens when you click this button and open the right-hand pane.
And here, you can see all kinds of interesting things, right?
So, for instance, if I click this button, I can have a side chat, or I can have a browser.
Now, the browser feature is actually very, very powerful, because I can simply open this up here, and as I'm developing this app, it's going to give me a URL that I can open here in this browser, and that will allow me quick iteration, because I'll be able to
see exactly how the app looks as I'm developing it.
And we're going to be doing all of that in more detail a little bit later in this tutorial.
First, let's talk about Codex.
The easiest way to understand Codex is that it starts from the same basic idea as ChatGPT, but it is connected to your actual working environment.
So, instead of only answering questions, it can inspect files, edit code, run commands, use the browser, test the app, and help move a project forward.
The difference matters a lot.
ChatGPT is great when I want an explanation, a rewrite, a brainstorm, or a quick answer.
Codex is what I use when I want work to happen inside a real project.
It can do many of the same reasoning tasks as ChatGPT, but it can also act on the project directly.
That is why I keep ChatGPT mostly for pure informational questions, and I keep Coda for work threads.
So, my project context stays focused and clean.
There are two main ways to use Coda.
The first is through the CLI, which is best when you already live in the terminal and want to run quick repo tasks, scripts, lightweight edits, or developer style iterations.
The second is the Mac app, which is usually better for visual app building work.
If I want to see the browser preview, inspect file changes, manage a longer project, approve permissions, review artifacts, or teach the workflow on screen, the Mac app gives me a much clearer workspace.
And that is why I highly prefer to use the Mac app, and that is what I recommend you use as well.
Inside the Mac app, the main pieces to understand are the project or the workspace, the thread area, the model selector, the thinking mode selector, file changes, terminal output, browser preview, artifacts, permissions, and the review flow.
Once those pieces make sense, Coda stops feeling like a chat box and starts feeling like an app building environment.
The project pane is where you open or switch between projects.
The thread area is where the conversation and task history lives.
The file change view shows what Coda wants to edit before those changes are accepted.
The terminal output shows commands, builds, errors, and verification steps.
The browser preview is where you can inspect the running app is where you can inspect the running app visually.
Together, these pieces make Coda feel less like a chat bot and more like a working development environment.
Permission flow is also important.
Cortex should never feel like a black box that silently changes everything.
As soon as it finishes running commands, editing files, or taking an action that matters, you can always inspect what it's doing, approve the right actions, and keep control over the project.
The next thing to understand is that Cortex is not just one fixed experience.
There are a few workflow decisions you make each time you use it, and the first one is which model to use.
In practice, I usually default to the latest strongest model unless I have a clear reason not to.
Because most app building tasks benefit from better reasoning.
Here's a rough guide to picking the correct model for your specific task.
So, for architecture, back-end design, multi-step implementation, difficult debugging, or final review passes, I want a stronger model, such as GPT-5.5.
For small copy tweaks, simple UI polish, short refactors, or low-risk tasks, a faster, a lighter model can be a better tool.
And here's where you can use an older model, or a mini, or a nano version of the current latest model.
For example, if I'm asking Cortex to rename a button, tighten some copy, or adjust spacing on one component, I do not need to overthink the model choice.
But if I'm asking Cortex to design the Convex schema, think through permissions, restructure several files, or debug a problem that spans front-end and back-end code, That is where I want the strongest model That is where I want the strongest model available.
The more expensive the mistake, the more I want to slow down and use the better reasoning setup.
The next important decision is the reasoning mode.
This controls how much time and effort Cortex spends thinking through the task before and during the work.
This decision is a little more nuanced than model choice because every reasoning mode has a place.
Low thinking is useful for quick, obvious tasks where the risk is small.
Medium is good for normal app building work, first pass UI normal app building work, first pass UI implementation, straightforward debugging, and routine feature work.
High is what I use when the decision is more expensive.
Architecture, convex data model design, authentication, permissions, hard bugs, multi-file changes, and the final review.
My default for serious app building work is usually a strong model with high thinking because that gives me the best balance between speed and the best balance between speed and quality.
But, the practical lesson is simple.
Match the model and thinking mode to the risk of the decision.
If the task is small and reversible, keep it fast.
If the task affects the structure of the app, slow the model down and let it reason.
Now, as you're working on your project and you're in this conversation project and you're in this conversation view, you can enter your prompts here, and just below, you can select various things.
Now, first of all, you have your contacts window here, right?
Here you can see how much of the context you have used.
Now, Korax says that it automatically compacts its contacts.
And yeah, you can do that, but over time, it's not going to be as effective.
And so, you always want to be starting new conversations anytime you're working on something new that requires a context switch, okay?
Next, we have here the all-important model selector, okay?
So, if I click over here, I have it automatically set to GPT-5.5, which is the newest model as of the time of recording this video, okay?
You can also switch it to some of the older models as well, but I see no reason to do that because this model has been very, very capable.
We also have things like speed, standard versus fast.
Fast is 1 and 1/2 times faster, but it also uses more of your usage, okay?
So, depending on which plan you're at, you may want to stay on standard.
I mostly keep it on standard unless, you know, I'm in a hurry and I want to switch it on fast.
Next, we have intelligence, right?
Now, this is very, very important.
By default, I keep this on high.
I found that to be a good balance between speed and quality because as you go towards lower intelligence, the model is going to be faster, but you're going to be giving up quality, right?
You're going to be giving up intelligence.
On the other hand, as you go into higher and higher intelligence, the model is going to be slower, but it's going to be thinking more, right?
It's kind of like a person, right?
You can ask a person a question, and that person may think more, think through something longer, right?
You know how people say, "Let me sleep or let me sleep on it." Or let me think it over, right?
The longer you think, the more the more you figure something out, and the the the the the higher chance you're going to arrive at the correct answer, at least for you.
You're going to think through all the possibilities, whereas the first answer might be wrong, and usually is because you haven't thought everything through.
And it's the exact same thing here, right?
If you set something too low, and you're working through something fairly complex, well, the model is not going to think it through.
It's going to give you an answer that well, it's an answer, but it might not be the ideal answer, okay?
On the other hand, with extra high, you know, the model is going to think longer, but it may not be necessary in a lot of situations.
And so, I typically keep it on high, sometimes medium, very rarely low, and also very rarely extra high, unless I'm working through something that the model has trouble with high.
You know, the situations where extra high really proven itself over high, it hasn't been that many.
And so, for the most part, I keep it on high, sometimes I also switch it back to medium.
And as you start to use Codex more and more, and as you begin building more and more apps with it, and you'll be able to better judge which thinking mode to better judge which thinking mode to select.
Now, before we go deeper into the workflow, I want to quickly talk about pricing and plans because this is one of the first practical questions people have with Codex.
For most people learning Codex, the important question is not what is the most expensive plan.
The question is, what do I actually need for the kind of work I'm doing?
If you're learning, testing prompts, and building smaller projects, you can usually start with the normal Chat GPT plan access available to you.
If you're doing heavier app builds, longer agent runs, team workflows, or professional coding work, then plan limits, credits, and business options start to matter more.
Now, here I am on OpenAI's Codex pricing page.
And if you scroll down, you can see the prices that are available at the time of filming this video, right?
So, we have the free plan, and this allows you to explore Codex capabilities on quick coding tasks.
We have the gold plan, which is $8 a month, and you can use Codex for lightweight coding tasks.
We have the plus plan, which is fairly popular, 20 bucks a month, and here you can finally start to actually do something meaningful, right?
Something like, you know, building a part of an app, or building some scripts.
And they say this can power a few focused coding sessions each week.
Next, we have the pro plan, right?
And so, here you can choose whether you want the 5x or the 20x higher rate limits than plus, and this is $100 a month.
I'm actually using the pro plan 20x.
Okay, so I'm paying 200 bucks a month, and at this level, I am at a point where I pretty much never reach any limits.
And that means I can build, you know, multiple projects at once, and use Codex for all kinds of tasks, and still not reach limits.
And so, during the time where I'm when I'm, you know, building heavy apps and and doing some serious work, I might get close, right?
But I never really get to the limit.
You need to decide which plan is right for you.
Now, from what I understand, plus plan is very, very popular.
And so, what I would do is I would obviously, you know, try the free plan, try to see how that goes, and, you know, obviously, you know, if you do anything serious or remotely serious, you're probably, you know, you're going to run out run out of
this plan.
And so, the next logical step is to try out the plus plan.
The plus plan is where a lot of people start and it gives you a reference point as to, you know, the amount of work that you're doing, how much can this plan actually cover the amount of work you're doing.
Because the fact of the matter is there people that work on very heavy projects and, you know, there they work on big repos, right?
Lots and lots of code base.
They run out of their plan very, very quickly.
But if you're working on a smaller projects, you're not using the fast mode.
So for instance, you're not coming here and you're changing you're not changing speed because I'm using the fast mode from time to time and that, you know, increases the usage as well.
So if you're on standard and you're using maybe medium often, right?
You're not really using high that much and you're almost never using extra high, you can get a lot of mileage out of this plus plan.
And when this plus plan starts to run out, you know, you're you're starting to notice some tight limits, you may want to switch to a higher plan, okay?
Such as the pro 5x or 20x.
Now you can also ask Codex to help you choose the right Codex plan for your specific use case.
For instance, you can use this prompt here, help me choose the right Codex plan for my use case, okay?
Use only current official OpenAI pricing and help center information.
And I'm going to go ahead and run this and see what it says.
All right, then this is what we got back.
As of this day, ChatGPT plan is that include Codex, okay?
So this is the practical read.
Free, try Codex on quick tasks.
Go lightweight coding tasks.
Plus a few focus coding sessions each week, okay?
And this is exactly what I just told you from that official page.
And so if you scroll down, you can see how Codex usage and credits work.
You can learn you can read this.
Best fit for your use case, okay?
For learning Codex and building small to medium apps, ChatGPT plus is the sensible default.
If your current plan is Plus, I would not upgrade until you actually hit Codex limits often enough that the friction matters.
Okay, when heavier or business plans make sense, what to verify live before deciding?
And so, a sensible thing to do would be to try Codex Plus and see if that's enough for your specific use case.
If you're not a heavy Codex user, if you just want to experiment, it should be more than enough.
And then you can decide whether you want to upgrade to the higher tier plans.
Now, before we move into the app building workflow, I want to take a moment to talk about some of the things Codex does that can greatly increase your productivity.
These are features I use all the time across different projects.
Skills, plugins, automations, and MCP along with its tools and connectors.
The best way to think about all that is skills tell Codex how to do a workflow, plugins package capabilities, automations let work happen later, and MCP tools and connectors give Codex controlled access to outside systems.
Once those pieces make sense, Codex feels less like a code editor and more like a project agent.
First, let's talk about one of my favorite features that I use pretty much all the time, skills.
Skills are reusable instructions for how Codex should do a workflow.
They're not external tools by themselves.
They're more like local playbooks that tell Codex the style, process, output format, and validation steps for a specific kind of work.
For example, this course uses skills for explainers, Notion editing, video timelines, and other repeatable production tasks.
Instead of explaining the same rules every time, I can point Codex to the skill and it knows the house style, the workflow, and the mistakes to avoid.
The rule is simple.
Anything that gets used over and over again becomes a skill.
That matters because a lot of real work is not just about getting an answer.
It's about getting an answer in the right format, following the right process, and producing something consistent with the rest of the project.
All right, so here I am in my Codex instance here, and I want to show you some things that you can do with skills.
So, I have here a conversation for an app that I was building.
And if I press the the forward slash, you can see that I have many options here, right?
I can do many, many things.
And as you can see for skills, I have lots and lots of skills.
I have tons and tons of skills over there.
And skills allow me to package a repeatable process.
You can think of it as a function that does something.
It gets some input and it produces an output.
And the goal is to produce consistent output as you've done before.
And so, as an example, let's say if I'm working in this convo here, right?
And I asked the model to do something for me.
So, here I have I want to build a very simple web app that arranges items as a Trello Kanban board style, okay?
And it comes up with this.
Now, right here can package that as a skill.
Now, what do I want to package as a skill?
Well, I want to package, for instance, maybe creating the architecture.
So, I can say something like package the architecture step as a skill, and then I just give it a name of the skill.
Sample arch stack.
Okay?
And that's going to create a repeatable skill that will allow me to generate an architecture for any kind of project that I may be working in the future.
So, I'm going to go ahead and jump into the plan mode in case the model wants to confirm something or clarify something.
And I'm going to go ahead and execute this.
And let's see what happens.
Now, it came back to me and it wants me to answer a question.
Should the sample arch stack package this as a general architecture planning skill or specifically as the Kanban Trello app architecture, right?
So, we want it to be a general app architecture.
So, I'm going to go ahead and save this.
And now it came back with a plan, okay?
Create the reusable Codex skill named sample arch stack under wherever it's storing those skills.
The skill will guide Codex through the architecture step for simple app ideas.
And it's going to package that step into a reusable process.
All right.
And now it tells me that created the skill app.
It contains skill.md and then It contains skill.md and then agents.for.openai.yaml.
Validation passed, etc. etc.
And now what I can do is I can enter a prompt and I can say use this skill for a brand new project management app and it should use this skill to create an architecture stack for this kind of app.
So, it wants to know for the brand new project management app, what should the version one data model support?
We're just going to do local only.
And here it came back with a plan.
Brand new local only project management app architecture, right?
That's the purpose of the skill, okay?
We're going to expand this and it's coming up with this architecture, right?
App shape, data state model, component architecture, test plan, etc.
etc.
And we can say yes and it's going to go ahead and implement all that.
And so, this is actually a fairly valuable skill because that is exactly what you want to be doing in those initial stages when you're building an app, as you're going to see a little bit later.
But, by having the skill, we do not need to explain all of that over and over again.
So, as you're building more and more apps, you can simply reuse this skill from now on.
Now, before moving further, I also want to explain a few terms that can sound similar at first, plugins, automations, and MCP.
They all expand what Codex can do, but they are not the same thing.
Plugins are packaged capabilities or workflows that make Codex better at a specific kind of make Codex better at a specific kind of work.
For example, a Notion plugin can help Codex read and update Notion pages.
A Vercel plugin can help with deploys and project settings.
A Hyperframes plugin can help create explainers, and browser or document tools can help Codex inspect apps or work with files.
The simple way to think about plugins is this.
They give Codex a more specialized tool set for a specific job.
Codex still needs the right context and the right instruction, but the plugin gives it a cleaner way to operate inside that workflow.
Automations are different.
A plugin gives Codex a different.
A plugin gives Codex a capability, but an automation gives Codex a time-based job or follow-up behavior.
That might be a reminder, a recurring check, a scheduled review, or a request to come back to a thread later and continue the work.
This is useful because not every task needs to happen immediately.
Sometimes, you might want Codex to check something again tomorrow, remind you to review an outline, monitor whether a deployment is still working, or wake this thread back up when you need it to continue.
Automations turn Codex from a one-time assistant into something that can help manage longer-running work.
The important distinction is simple.
Plugins are about what Codex can do, and automations are about when Codex should do it.
All right, so here I am back in Codex, and I want to show you how plugins work, right?
So, if you click over here on plugins, you can see all the plugins that you have here, okay?
And so, it it tells you that make Codex work your way, and if you scroll down, you can see all the different plugins, right?
So, you can click on the plugin, and you can learn more about it, right?
So, for instance, this spreadsheets allows you to create and edit spreadsheet files, right?
You can use this plugin to create a spreadsheet to analyze this company's financial, etc., etc., right?
Create, edit, inspect, render, verify, and export Excel SX, CSV, and TSV spreadsheets locally.
Use spreadsheets when the durable output or target is a spreadsheet workbook, etc., etc.
So, this includes the skill, right?
So, you can think of package as kind of an umbrella that includes a skill, but it also gives Codex an ability to to connect to external systems, right?
It's kind of this higher-level structure, okay?
Whereas a skill is a very, very specific thing.
It's a specific piece of instruction.
Essentially, a specific prompt.
A plugin is this umbrella that contains a skill, right?
So, you can have that.
One plugin that I use all the time is Notion.
So, if we click over here, you can see that this actually includes a lot more interesting things, right?
Notion workflows for specs, research, meetings, and knowledge capture, right?
So, you can specify this, and then you can give it a prompt.
And if you scroll down, you can see that it includes the Notion app, the knowledge capture.
These are skills.
This is an app.
Okay, so this allows it to connect to an external system, right?
So, if I click over here, I can manage this in ChatGPT as well, because it's an external app.
And this right here, these are skills, right?
I can open that, and that's going to open the skill right here, right?
This is This is how the skill is actually stored.
And I can also turn it off or turn it on, depending on if I want that skill enabled or not.
Now, this is a plugin that I use all the time, right?
I use Notion for my planning, for, you know, writing stuff, scheduling stuff like that.
It's the brain of my workflow, essentially.
And then I installed this pre-built Notion plugin, and the first time I ran it, it authenticated against my Notion workspace, right?
Connected to my Notion account.
And from then on, I can simply say, "Hey, you know, use this Notion spec to do this, or to do that, or, you know, edit this document, edit that document." And it's able to go out and edit the right documents, and essentially make Notion an extension of
Codex.
That's kind of the purpose of a skill, to make something an extension of Codex.
Right?
And that's the main idea with all of this, right?
Another really cool one is, like, for instance, Google Calendar is another one, right?
Instead of connecting to Notion, or in addition to connecting to Notion, you can also connect to Google Calendar.
I personally do not use Google Calendar, I use Notion, so I do not have this skill set up.
Another really useful skill that you're definitely going to be using if you're building apps is Vercel, right?
Vercel, or maybe something like Netlify for deploying your apps, right?
I use Vercel when demoing apps.
And by having this package installed, it can figure out how to deploy, how to check deployment, how to do everything without me needing to actually understand how all of that works, without me needing to go to to Vercel and read their docs and
understand how to deploy and all of that.
I simply install this skill and then I you know, I click here and now I can say, you know, Vercel, order this repo for Vercel deployment risk.
Or Vercel, which Vercel tools fit fit this app app best.
Or Vercel, deploy this app, right?
And if you scroll down, you can see that this has this app and then it has all of these skills.
All of these different skills.
Look at this.
It has a ton a ton of skills.
Vercel CLI, Vercel agent, all of these.
And obviously, these skills are not just for deploying, right?
Because we also have payments.
We have best practices.
We have all of these other ones.
So, these skills essentially map to different parts of Vercel, to different features of Vercel.
We're not just talking about, you know, deploying your app, because this could be just a skill, deployment, right?
This could be one skill that I may need.
I I may not need all of these other skills.
But why not?
You know, Codex will figure out which skill it needs to consult, you know, according to the prompt that I give it.
So, it doesn't you know, it's not a big deal to have all of these enabled if I'm using Vercel.
And like I said, this allows me to basically bring Vercel into my Codex workflow.
That's the beauty of these plugins, okay?
And that's the same idea with all of these plugins.
You're essentially bringing an external system and letting Codex manage it for you.
Now, automations work very, very differently.
So, if you click on automations here, you can see that automations, they allow you to automate work by setting up scheduled chats, okay?
And you can learn more here.
Now, if you click on any of these automations, you can see exactly how they're going to be working.
So, if I click on something like summarize yesterday's Git activity for standup, you can see that it wants to create an automation for me, okay?
And what exactly is it trying to do?
Well, it's essentially trying to create a essentially trying to create a conversation that will be repeatable, okay?
So, it creates this automation.
This is the name of the automation, right?
This is the prompt.
This right here is the prompt.
And the prompt is summarize yesterday's Git activity for standup, grounding rules, etc., etc.
We can select a work tree.
We can select a project here.
And then we can select the time where it's going to run over and over again, right?
So, with this kind of automation, you may want to run it on weekdays at 9:00 a.m.
But, you can also select it, make it hourly, daily, weekly, etc., etc.
And you can also change the time, obviously.
Now, here you can change the model, and here you can change the reasoning level.
Now, with this kind of automation, you don't really need a high reasoning.
Medium is going to be just fine.
And after you're done, you can simply click create, and now you're going to have an automation that will run every weekday at 9:00 a.m.
running this prompt.
And And remember, this is a special prompt.
Here, you're asking it to consult Git activity.
And so, the idea is you may have, you know, Git connected via a plugin or something else, and it's going to connect to your Git environment, and then figure something out for you.
And that's going to run every weekday at 9:00 a.m., right?
So, instead of you needing to, you know, jump into Codox first thing weekday morning and execute this prompt manually, you can create an automation to do just that.
If you scroll down, you can see some other automations here.
You have incidents, you have code quality, right?
Maybe you want to run a code quality check every 24 hours.
Well, you can click here daily at 9:00 a.m., right?
Scan recent commits since the last run or last 24 hours for likely bugs and propose minimal fixes.
Okay, that's another very, very useful automation, right?
Repo maintenance.
You have here growth and exploration, right?
Click here from recent PRs and reviews, suggest next skills to deepen.
This is great, right?
So, automations, they could be used for pretty much anything, right?
And they are, you know, it doesn't really matter what kind of niche you're in.
You don't need to be in software development or project management or anything like that.
You can be a writer, right?
You want a status.
You're writing maybe 1,000 words every day.
You know, you can have an automation that checks for spelling, grammar errors that you may have done, and then it may suggest some fixes and also another automation that gives you more ideas, you know, to break through writer's block.
And that can run every morning at 9:00 or 10:00 a.m., okay?
And so, automations are very, very useful if you need some kind of a repeatable structure in your workflows.
And I want to talk a little bit about MCP.
So, MCP or model context protocol is very, very important, okay?
So, if you press command comma or you go into settings over here, you're going to be on this screen.
And if you choose MCP servers, you're going to see all your MCP servers that you have here configured, and you can also see whether they're enabled or not.
Now, an MCP server is basically a server.
It's a remote system that your Codex instance can connect to.
So, as you can see, I have a bunch of MCP servers here that do all kinds of interesting things.
For instance, I have here a Stitch MCP server configured.
I have here a Superbase MCP server.
I also have, you know, Flow Upload Designer, Flow Base, a bunch of apps that support MCP.
And when you connect to them, Codex is acting like an MCP client.
So, you have that same client-server paradigm.
Now, why would you want to use an MCP server to connect to something like Superbase or something else?
Well, the reason is very simple.
You want Codex to do all the administration, all the work for you, right?
So, if you're building an app using something like Superbase, and we're going to touch upon that a little bit later in the video, you can set up Superbase yourself.
You can configure all of that.
That takes time, but it's, you know, it's very, very doable.
Or, you can simply configure a Superbase MCP server in your Codex instance.
And that will allow Codex to use that MCP server to essentially manage this remote server, this tool, this app for you.
And as you're going to see a little bit later in this tutorial, this is very, very helpful to us because it saves a lot of time and it enables things that we couldn't really do before because now Codex understands One Piece and via MCP
it can get more contacts and create a much more robust app for you or a tool for you or anything else, a system, if you will, because now it can connect to other remote systems and essentially consult that data with the data we
already have, such as the code or things it has been working on, and figure out a unified solution.
And this is extremely helpful to us, okay?
And so, there's a couple of ways that you can add a server.
You can click here, and you can fill all of this manually.
Or, you can simply tell Codex, "Set up and activate a Supabase MCP server." It's going to figure out how to do that.
It's going to search for it.
It's going to figure out the specs, and it's going to set it up for you.
And the same thing for all of these other ones.
Now, after setting up the MCP server, you can simply tell Codex to use it.
So, I can say something like, "Use the Supabase MCP server to query data, or check how many tables we have, or pretty much anything else." And it's going to go ahead and connect to your Supabase instance in this example via the configured MCP server.
Now that we have laid the foundation, and before we start building the real app, let's talk about the ideal Codex workflow.
What is the best way to approach it?
Before we begin building our app, you want to establish the workflow that you're going to use again and again.
The loop is simple.
Inspect, plan, edit, verify, and report.
That sounds basic, but it is the difference between using Codex as a random code generator and using Codex as a controlled build partner.
The mistake a lot of people make is that they jump straight to "Build this app." or "Fix this problem." without giving the agent a clean process.
That can work for small tasks, but it breaks down quickly on real projects.
For a serious build, you want Codex to understand the repo first, explain the plan, make a focused change, verify the result, and then report back in a way that you can re-review.
A good Codex prompt is not just a request.
It is a small project brief.
The better the prompt is, the easier it is for Codex to understand the current state, choose the right amount of work, and verify the result.
The basic structure is simple.
Explain the goal, give the relevant context, define what should change, define what should not change, and tell Codex how to verify the work.
If the task is risky or unclear, ask Codex to inspect first and make a plan before editing.
For instance, instead of saying "Build the app," I would say, "Inspect the project first, do not edit yet, identify the existing structure, propose the smallest first version, list the files you expect to touch, and explain
how you will verify." That gives Codex a much cleaner job.
For implementation prompts, I want the request to be specific enough that Codex can act, but not so over-specified that I accidentally force the wrong solution.
I usually describe the outcome I want, the constraints I care about, and the checks that need to pass.
Then Codex can use the actual project context to choose the cleanest path.
As part of this workflow, I want to introduce you to one of the most important Codex features, plan mode.
Plan mode is a superpower that I use for 80 to 90% of my prompts.
There are two main benefits to using the plan mode.
First, it's a form of brainstorming where the model cannot change or alter your files.
Second, it's a way for the model to clarify your requests by asking follow-up questions.
This is especially useful when the request is under specified.
If I say, "Build the booking flow." there are a lot of hidden decisions inside that request.
What fields does the form need?
What status should the booking start with?
Where should the booking appear for the helper?
What should happen after submission?
Plan mode gives Codex a chance to surface those questions before it edits the app.
I also use plan mode as a quality filter.
If the plan is vague, too large, or misses something important, I know the implementation will probably be messy.
If the plan is specific, scoped, and easy to verify, then the actual coding step becomes much safer.
So, you want to use plan mode initially while brainstorming and also as you enhance your app because it gives the model a chance to ask follow-up questions to ensure there's no misunderstanding.
Now, if you're working with an existing repo, the first step should always be to inspect.
Codex should understand the files, the app structure, the current state, and the goal before changing anything.
Then it should plan the work in a way that is small enough to review.
Only then, once Codex is fully in sync with your goals, should it make the actual edits and write code.
Once the code is written, it should verify the code with the browser, terminal, using tests, or the build output.
And finally, it should report what changed and what still needs attention.
Verification is the part I want to emphasize.
A task is not finished just because Codex wrote code.
For UI work, I want to see the browser.
For back-end work, I want to see the function call, the dashboard row, or the test results.
For deployment work, I want the live URL and a real smoke test.
That habit keeps the workflow grounded in evidence instead of trusting that the code is probably fine.
Additionally, you always want to break big tasks into smaller one.
Instead of asking Codex to build the whole marketplace as one prompt, you want to ask it to plan the app, build the first UI shell, wire one initial database backed version, add the booking flow, add the helper dashboard,
and so on.
Each step has a clear target and a clear way to check whether it worked.
A good Codex task should usually fit into one reviewable outcome.
Create the first static marketplace homepage is reviewable.
Wire service listings from Convex is reviewable.
Add booking creation and verify the booking row appears is reviewable.
Build the whole app is not reviewable because there are too many decisions happening at once.
So, the workflow is not just a technical process.
It is also a way to stay in control.
We let Codex do meaningful work, but we keep the work divided into chunks where we can understand the change, approve the direction, and catch problems before they spread.
And so, here I am back in Codex, and you can enable plan mode by pressing shift tab, and here you have plan mode.
Or, you can click here and toggle this.
I typically just use shift tab cuz it's a lot easier and it's a lot faster.
And then, whenever I'm in plan mode, I can start brainstorming.
And not only that, it's useful because Codex will not make changes whenever it's in plan mode, and it also gives Codex to come back to you with follow-up clarifying questions, and I find that super super helpful because we always want to make sure that
Codex knows exactly what it's doing.
We Codex knows exactly what it's doing.
We never the last thing that we want is for Codex to assume something.
We never want it to assume anything.
We always want to make sure that we are on the same page.
And so, let's say I have a command over here going, and I want to build an architecture.
I want to build some kind of a an intricate architecture.
And, you know, I I want to make sure that we built out an architecture.
I may not know exactly how far I want to go, exactly all the details, but I want to make sure that Codex is on the same page.
So, I can say something like, "Come up with an architecture that will allow me to create both web and mobile and desktop versions of the app.
Ensure it is fast and robust.
Okay?
I'm here in plan mode, and typically with this kind of prompt, it's not clear what I want.
I don't even know what I want.
I want Codex to figure it out, but I want Codex to come back to me and confirm with me.
And so, if we execute this prompt, hopefully it's going to ask me some follow-up questions.
Let's see.
And so, as expected, Codex came back with a question, "Which cross-platform strategy should the architecture optimize for?" And there are two questions, okay?
Do we want shared core native shells, and you can click here, and you can get a little detail.
You share TypeScript domain logic with separate Expo mobile, etc.
Do we want a one universal app, or do we want web first wrappers, right?
Because I asked for a cross-platform product, but there's many ways of doing it, and there's many trade-offs with each approach.
And so, it came back to me, and it wants to clarify one universal app, this or that.
So, I'm going to say this one.
I'm going to I'm going to go with recommended.
And now, it wants to know what should the app support for data and reliability.
Offline first cloud sync, cloud only real-time, or local only.
And you can click and you can hover over the little I to get more details.
Users can can work offline and sync across devices.
Cloud only, simpler shared back and live updates, but weaker offline behavior.
Now, here you can also tell Codex something else.
You can say, "Well, I want this, this, this, this."
Right?
Or, you can press escape, and you can ask Codex to explain the question.
I can say something like this, "Explain the last question in simple terms."
Okay?
I don't need to answer it right away.
I can get Codex to kind of walk me through it, right?
Explain the last question.
Let's see what it says.
I was asking two choices.
How should data work?
My recommendation, shared code and native shells plus offline first cloud sync.
If you want this to become a serious app.
So, it tells you these things.
And so, you don't need to pick a pick a choice or tell it something else.
You can close that, and you can ask Codex to clarify.
And now, what we can do is ask me those questions again.
You can do that, or you can simply answer it here.
It doesn't matter.
So, if you do that, it's going to come back with that question here again.
And here are the questions.
I'm going to say this, and now I want to say this because I I I understood what it was asking me.
Got it.
Your choices are that means the architecture should prioritize a shared TypeScript app a brand used by this, this, this, this.
And that's good.
And now, I can exit the plan mode, and I can say, "Go ahead and do it.
Go and implement this." Something like this or something more specific.
And so, plan mode is something that I use all the time, and you should definitely make it an integral part of your workflow as well.
Now, I want to talk to you about some advanced Codex workflow techniques.
These are the little tips and tricks that I use all the time and will greatly help you when using Codex to to build apps and solve problems.
One thing I do all the time is asking Codex to create a handoff before I start a new thread.
This is useful when a thread has gotten long, when the context has been compacted, or when I want to move from planning to implementation with a cleaner workspace.
A good handoff is not a vague summary.
I want the current state, the files that changed, the commands that were run, what still needs to happen, and any risks or open decisions.
That way, the next Codex thread can pick up the work without rereading the entire conversation or repeating mistakes.
And there are two main reasons that you may want to do that.
The first reason is that after a while, this conversation here, this it starts to degrade.
As you keep typing new prompts, and as the model answers, the convo starts to degrade.
Now, Codex tells you that it automatically compacts its context, and that is true.
You do not need to start a new convo every time.
It it does automatically compact it.
But, you're going to notice that as your conversations get long and you keep asking questions and it keeps answering, quality of the responses will degrade.
And moreover, you know, your conversation is going to get fairly long, and that might, you know, degrade the performance of the app itself. right there is a good use case to create a brand new convo using the handoff as the
starting point.
Another really, really good reason to create a new convo with a handoff is when you're trying to solve a problem but the model is not getting you the solution that you want.
And so if you're trying to solve a particular problem and you've prompted the model a couple of ways and it's trying it's giving you answers but those answers are not ideal.
It doesn't give you the right algorithm.
It doesn't give you the right solution.
There's a high chance that each additional prompt is not going to get you closer to a solution.
So when you experience something like that the best thing that you can do would be starting over by creating a new conversation and giving the model a handoff with the things that it has done and the things that that are not working
and where you are right now and telling the model as part of that handoff prompt to work on a different solution.
And because AI is is can be fairly random in some ways, creating a new conversation usually give you a different solution.
That solution might actually work.
Now there are various ways to create this handoff prompt that's going to give you a handoff for a new conversation.
One of the simplest ways would be by typing something like this.
Okay, this is a very very simple prompt that still delivers a fairly high quality handoff.
Okay, so you can type create a detailed handoff prompt that I can use for a new Codex convo.
Okay.
So let's go ahead and send this and see what what answer we get.
Right.
And this is the response we got.
I want to design a fast robust cross platform project management app.
So it's essentially summarizing everything that has happened in the convo, right?
This is the context.
This is the product direction.
This is the architecture preference.
Please produce a detailed architecture plan covering all this important, right?
Also some constraints.
And so what you can do is you can copy that and then you can go ahead and create a brand new convo.
For instance, you can click here and you can simply paste it.
Okay, well you you don't want to delete that.
You want to delete like the top.
You want to delete that.
And when you paste it, that's going to create a conversation and the model can simply continue where the other conversation.
That is one way to do it.
Another way to do it is by giving it a more detailed handoff prompt.
So, let's go back here and let's go ahead and give it a slightly different prompt.
Create a clean handoff for a new Codex thread.
Include all of this.
Do not make any changes.
So, this prompt is slightly more detailed and you can bet that it's going to give you a higher quality handoff.
Okay, so let's go ahead and run this and then we can compare the two handoffs and see which one is more detailed.
Now, take a look at this handoff right here.
Look at how much more detailed this handoff versus this handoff right here.
Now, this handoff would definitely work, but this handoff would work even better.
Going to result in a higher quality conversation.
Okay, so given an option, you can certainly use a prompt such as this, but it's a lot better to use something like this that's more detailed and it's going to save you a lot of time in the long run.
The next practical habit is using Git as a checkpoint system.
Before I let Codex do meaningful work, I want to know whether the current state is clean.
After each milestone, I want a diff that is small enough to review and explain.
That is what keeps an agentic workflow from turning into one giant mystery edit.
The useful trick is to make Codex summarize the diff in plain English.
I do not only want to know what files change, I want to know why they changed, whether each change belongs to the task, and whether anything looks unrelated before I accept it or move on.
So, when you are working in Codex, you do not want to be just creating edits without recording what the edit is all about.
And in software development, you want to be using a source control system, such as Git.
We have here a convo where we were building an app, and in this particular instance, we did not use Git.
And so, I do not know, I have no way to check which changes were made where.
I have no way to revert the changes.
I have no way to see what the actual change represents.
And if working in, you know, bigger teams, I do not know who was the person responsible for the change.
Now, in this convo, we have another problem, okay?
The current working directory is missing.
And so, in this case, what we can do is we can take a handoff prompt, and we can create a brand new project, insert that handoff prompt, start a new convo, and then enabled Git, and set up so that we have Git control.
So, I'm going to go over here.
I'm just going to do start from scratch.
I'm going to paste this handoff prompt to start a brand new convo.
And I'm going to preface it by telling it to create a Git repository.
Create a Git repo if it doesn't exist, and do an initial commit with the code.
So, I'm going to run that.
And the idea is we are going to initialize Git if needed, and then commit the current code as is.
All right.
So, what it did was it initialized a Git repo in this directory, and made an initial commit.
Initial architecture plan here, okay?
The workspace was empty when I inspected.
There was nothing there.
We just created a brand new project, and it essentially created an architecture.
And so, at this point, we have here a Git repo, which means that each additional change will be automatically tracked.
So, for instance, I can say something like, "Make the smallest possible change, a route that displays 'Hello, world.'" Okay?
Let's go ahead and run that.
So, it now created this index.html.
We're going to open it, and it says hello world.
And so, now what we can do is we can say check the Git status.
And obviously, this file is not going to be in our Git, right?
You see this is not tracked, an untracked file.
So, what we want is we want to commit index.html as initial commit.
Because in Git, you can have files that are tracked, and also files that are not tracked.
The files that are not tracked are the files you don't really care about, right?
You don't You don't really need to store them in Git.
These could be like media files, or generated files, code generated files that that can always be regenerated.
But for your actual code, you always want to be tracking them, right?
So, we we have this commit, and now this files is going to be tracked, and it's going to be committed as well.
Okay?
So, now it says committed as initial commit, right?
We have this It's now on main, which is the a type of branch.
And so, now if we go into changes, you can see that we can select a branch here.
And as you can see here, it says no file changes yet.
And that is because we have not made any changes since tracking that file.
So, what I'm going to do now is that make index.html output hello James.
That has updated, and now it says hello James.
And now what we can do is we can commit it.
Commit index.html.
And now if we type give me Git status, it's going to tell you that it's not It hasn't been committed, right?
It's modified, and it's tracked, but it hasn't been committed.
Okay?
It has been modified and uncommitted, right?
You see this M, which means this has been modified.
So, we're going to do commit index.html.
And it will also generate a default message.
Here it has committed it.
We can click here, and we can click select review, and you can select the the of change you want to see.
You can see on stage, stage, branch, or last turn.
And when you click on last turn, you can see what was changed, okay?
Because we are we are using source control.
We can see the stuff that was changed.
As you can see, this is the one line that was changed.
Red means it was deleted, and green means it was inserted.
So, this was deleted, and this was inserted.
We basically changed the message that it says from Hello World to Hello James.
And so, Git is very very important.
If you're working on any kind of project, right?
Anything beyond something super simple, you want to create a repo, and you want to implement source control into your workflow.
One advanced trick that becomes more useful as projects get bigger is working with Git work trees.
A work tree is a separate working copy of the same repo connected to a different branch.
The practical benefit is that you can keep one version of the app stable while trying a risky feature, new eye direction, or refactor somewhere else.
This matters a lot with the genetic coding.
If you want to try two approaches in parallel, or or keep a clean version ready for recording while another code expert keeps building, a work tree gives you that separation.
Now, what's nice about work trees is that they give you parallelism.
So, if you are working on multiple features in your app, maybe you're using sub agents or something else, it's important that no two processes work on the same file at the same time, because that's going to create corruption.
And so, what you typically end up doing is you create a work tree for a specific feature, and you work on that work tree.
And when you're done, you merge the changes back onto your main tree.
Now, that doesn't mean you can only create one work tree.
You can create multiple work trees, as many as you want, and you can also work on the same feature because after one worktree is done, it's going to merge to main, and if there's a conflict, it's going to resolve that conflict, and then
another worktree, when it is done, it's going to also merge into your main branch where your development is happening, and if there's a conflict because they ended up working on the same feature, it will also resolve that
conflict so that there's no corruption.
Now, this is a feature I use all the time in big projects.
Now, let's say I'm working on this app over here.
You can ask Codox to work in main without creating any worktrees, or I can ask it to create a new worktree while it makes changes.
So, let's continue what we were doing.
So, let's say I want to change this index.html, and I wanted to say something else.
So, I'm going to go ahead and tell it, "Make index.html output hello, plan." But this time, we want to make sure that it works in a different worktree.
So, what I'm going to do is I'm going to say, "Work in a new worktree, and then merge, clean up after you're done, okay?" So, we're going to go ahead and run this, and now it's not going to modify the file on our main branch.
It's going to branch out, do the work, and then come back and merge the changes back in.
And so, as you can see here, there's more stuff happening.
I'll make this in a separate Git worktree, commit there, fast forward merge changes to main, and then remove the worktree and delete the branch.
And that's exactly what it did, except it did it very, very quickly because this was a, you know, a very small change, but you saw it doing all that, and before you know it, it did all that, made the change, merged everything back,
and deleted the worktree.
And so, that was a very, very small change.
Now, another thing that you can do is you can click here, and you can fork this whole convo in a separate worktree, right?
So, if I click over here, that will fork it into a separate work tree.
And here you can see we're working in a separate work tree here, okay?
So, now as we're doing work, we don't need to constantly tell Cortex, "Hey, you know, create a new work tree, clean up, and do all this when you're done." We can continue working and then merge our changes.
So, for instance, I can say something like to say, "Hello, USA." I can simply do that.
I don't need to tell it to work in a separate work tree because we are isolated here, okay?
So, here's the file, we can open it.
Hello, USA here.
And so, at this point, we have merged the work tree change into main and cleaned up the temporary work tree, right?
Index now displays Hello, USA, and we no longer have this temporary work tree.
We've done everything that we needed to do separate from the main branch and then we merge.
And as far as we are concerned, this convo is now finished because it's tied to the old work tree, but we've did everything we needed to do.
We've updated the files, we merged back into main, and so now we can start a brand new convo to work on a different feature.
And so, this is really nice for feature isolation.
Create a new work tree, work there, merge back into main, and then simply click here to archive this conversation.
Another advanced trick is using sub-agents for parallel work.
The idea is not to throw a whole project at a bunch of agents and hope it works.
The useful version is much more controlled.
An agent explores the code base, another works on a clearly bounded part of the UI, another checks tests, or reviews the result.
The key is ownership.
If you use sub-agents, you want each one to have a specific job, clear file area, and a clear output.
That keeps the work parallel without turning it into a merge mess.
Sub-agents are best when the tasks are independent enough to run side by side, but still simple enough to integrate at the end.
Now, sub-agents is another really cool feature that will help speed up your workflows.
And this is something that I use all the time, especially in big repos, in big codebases, to do multiple tasks in parallel.
All right, so here I have a very, very simple Kanban app.
If I click over here, I have this.
I can drag and drop. create new tasks, etc., etc.
And so, what I want to know is if I'm going to be building more and more features, complex stuff, new functionality, I want to use sub-agents to help me kind of make sense of it, you know, and help me build it in the most efficient way
possible.
And so, I'm going to paste this prompt here.
Plan how to split this feature across sub-agents, right?
Do not edit files yet.
Recommend.
We're going to jump into plan mode.
Preface this with the feature.
Add to party apps, such as make.com, Zapier, etc.
And so, I'm going to I'm going to leave it at this.
And I'm going to go ahead and run this.
And so, let's go ahead and run this.
And here we have the plan.
The safest split is for the main thread to own architecture, shared data contracts.
Sub-agents can work on isolated feature areas inside index.html, but they must not all edit the same broad sections at once.
Okay, so we have main thread responsibilities.
And then we have sub-agent delegation.
Integration settings, integration data model, web hook event dispatcher.
So, I'm going to copy this plan, and then I'm going to preface it by telling it spawn sub-agents right away to help design the third-party API functionality.
Let's go ahead and run this.
Right away, it's telling me, "I'll spawn the four-focused sub-agents and keep the main thread responsible for the final." So, as you can see, it's spawning them.
And each sub-agent gets a prompt.
It's basically like me creating a new conversation.
Your sub agent one integration, your sub agent two integration data model, your sub agent three, and they're working independently.
And here it tells you all four sub agents are running.
While they work, I'll inspect the current partial edit, and you can see these background agents here.
Okay?
So, they're working in parallel.
They're working on their own thing.
They own different pieces of the app, and they're kind of working.
And when they're done, they come back to this main agent, right?
This combo here, and tell it what happened, right?
They come back with the result.
And so, now it says the persistent sub agent returned a cleaner data shape.
And here you can actually click on any one of these and see what's happening.
You can click here, you can come back, you can click on this one, and see what it's doing.
So, this one is finished.
Some are finished.
How about this one?
This one is also finished.
And so, that's how it works.
And when they finish, they come back, and then it decides what to do later.
Maybe it's going to respond, and maybe it's going to spawn something else.
Maybe it's done.
They did what they needed to do.
They finished their isolated task, and their services are no longer needed.
And again, sub agent is something that I use all the time.
I use it all the time, especially in big repos, because they help speed up the work by isolating different areas, different responsibility clusters, to different agents.
And that's a huge productivity boost.
Now, in this section, we're going to bring all of the previous sections together by giving Codex project instructions in an agents.md file.
This is where you can write down the rules you want Codex to follow every time it works in a specific repo.
Which commands to run, which folders matter, which patterns to preserve, how to verify changes, and when to use work trees or sub agents.
This is useful because you do not want to repeat the same project rules in every prompt.
If this project should always run a specific check, use a specific design system, avoid certain files, create work trees for risky experiments, or split large tasks into sub-agents, those instructions belong in agents.md.
It turns your preferences into reusable project context.
And here's a prompt that you can use, which is going to draft agents.md for this project.
Do not write the file yet include the project purpose, the main folders, work tree, sub-agents, stuff like that.
So, we're going to jump into plan mode.
We're going to go ahead and run that.
And here's the draft for this agents.md tailored to the current project, right?
Project purpose, main folders, verification steps after changes.
Serve the app locally, coding and design patterns to preserve.
When codex should use a work tree.
Use a separate work tree when these happen.
When codex should use sub-agents.
Use sub-agents when work can be split into clearly separate ownership areas such as these.
What codex should avoid changing without asking?
All of this.
Now, the beautiful thing about this agents.md file is that you no longer have to worry about, you know, asking codex to spawn sub-agents or create separate work trees.
It will be automatic.
It's like saving you from typing those prompts every single time.
So, if you want to add a feature, well, you don't need to tell it, "Hey, create a new work tree."
Or make sure you spawn sub-agents.
It's going to be automatic.
And so, at this point, you want to review this proposal here, and you want to save this as agents.md.
So, I'm going to say, "Save it as agents." So, now it's saved it as agents.md.
You You can click here, and you can see the whole file right here.
And this file will be used only for this specific project.
They're based on a repo.
So now for my next prompt, if it's a simple change, it's not going to create a work tree probably.
And it will also not spawn sub-agents, but if it's a more complex change, it should probably create a work tree and maybe even spawn sub-agents.
So let's go ahead and see if this works.
So now, let's go ahead and ask it make a simple change that that changes the title for the main index.html to awesome Kanban app.
Okay, I'm going to go ahead and run it directly.
So now the title is awesome Kanban app.
Okay, but if we ask it something more complex, like, you know, figure out a third-party, you know, integration, design, you know, support API calls, or support MCP, or anything like that, it should probably use sub-agents to figure it out and
implement the changes in its own work tree.
So let's see if this works.
Add a robust API functionality for handling outgoing API calls and incoming webhooks.
Okay, I'm going to jump into plan mode to see if it has any questions for me.
See how it says agents.mdx explicitly says not to add a backend or proxy without asking.
Okay, so it did consult this.
So we're going to add a backend.
We're going to create tasks and let's see if it's going to create a work tree automatically and maybe even use sub-agents.
Another question, should the new backend become the source of truth for Kanban tasks?
Yes, let's just go with the recommended.
Okay, we're going to expand this plan and we're going to see if it's going to be using a work tree or sub-agents for any of these things.
Okay, so I do not see it's going to be using sub-agents.
Update.
So before we run it, let's ask it, do you plan on using a work tree or sub-agents for this task.
There you go.
Yes, for implementation I'd use a work tree because this changes the project from a static only app into a node server app with API routes and persistent states.
I'd also use subagents, but only for bounded design review tasks.
And so it's telling you right there that it will be using a work tree and it will be using subagents, and you can bet that this would never happen if we didn't have this agents.md file.
And so agents.md is super important.
It's going to save you a lot of time because it basically codifies repeatable tasks.
So you never have to re-prompt the same thing over and over again.
Now, before we build real apps, there is one security habit you want to establish early.
Codex can help inspect configuration, but we should be careful with secrets.
An environment variable might be safe and public, like a front-end URL, or it might be private, like an API key or deploy token.
These should not be casually pasted into a prompt or committed into the repo.
The other important thing is that local config and deployment config are not the same thing.
A local.env file helps the app run on my machine, but Vercel does not automatically copy that file into production.
For a deployed app, the required variables need to exist in the deployment environment, too.
So the right workflow is to ask Codex to identify what variables are needed, classify them as public or private, and then advise you where each one needs to be configured.
Now, let's say we're building on this app, and we are adding external services.
So one of those services might be something like OpenAI, or another service could be Open Router.
Well, every time we connect to external services, we need to connect them using an API key, and those API keys are needed for those services to track how much usage we have so that they can bill us accordingly.
And so in your app, you need to be storing those API keys because when you're going to be making those requests, regardless whether that's an API token or some kind of deployment token or pretty much anything else, you need to be very, very careful
how you are storing them.
And so in this app, let's say we want to use OpenAI here.
Here.
So I'm going to say API stack and use the following key.
And let's say we give it a sample API key.
Sample API key as a sample.
We're going to jump into plan mode.
We're going to select this API stack only.
We're going to be doing native fetch.
All right.
So it went ahead and created our first API stack here.
And right here it mentions this file where it stores this key.
And so if you want to use a real key, you never want to paste it in chat.
What you want to do is you want to open this file and modify it directly.
So that's what we're going to do.
We're going to open this in the editor here and I'm going to paste this key right here.
And this right here is my actual key.
And so now I have an OpenAI, have an API stack and I have a real key in this file here, okay?
And now what I need to do is I need to run a check and ensure that we are storing the keys the right way and, you know, they're going to be deployed correctly and all that.
And so I have this prompt to do just that and it says here inspect this project for environment variables and deployment config.
Do not print secret values and then tell me all of these things.
So we're going to run this.
So now it's telling us that environment inspection required environment variables required only for post OpenAI front end variables, right?
We don't have any public because, you know, sometimes your app can have both private keys and public keys, right?
So if you're using something like Superbase, Superbase has an anon key or a secret key or they call it something else now.
And the idea is the public key can be made available, but it has very, very strict permissions.
Whereas something like your OpenAI API key or your open router API key or something of that sort needs to be very, very secret, right?
Because with that key, you can make a lot of calls and do a lot of things.
And so here it says we have a private key.
OpenAI PK is private and must stay server-side.
It is used here, needed locally.
Hosted service config or cell or another node capable host config as a private server environment variables, port, etc., etc.
Okay, dot env examples cuz currently untracked.
So, what we have safest next step before deploying, replace it with only this.
Only config the real key in the deployment provider's private environment variable settings.
Okay.
So, I want to store the key locally for testing, and I want to ensure that it will be deployed also later.
And so we want that key locally so that we can test, but we also want it to deploy it.
And that means we need to create a couple of files, one for local settings and one for deployment settings.
And it's telling us which is the wrong file for local secret because examples are usually committed.
So let's say we're doing a Vercel deploy.
We're going to switch that.
And there we have it, store the real key locally in an untracked.
Right?
We need to make sure that this is never committed to Git.
It needs to be untracked.
So we're going to expand this, submit this.
Do not use public.
These are not public keys.
Replace dot env example with create dot env.
Okay, so it's it's going to be creating this dot env.
The secret is now ignored in dot env.
And then I'm updating readme and agents to make the local and Vercel setup unambiguous.
And that way we have the local key stored for local testing.
It's never going to be committed into Git and then we'll be able to send that key, also deploy that key on Vercel because Vercel is going to be running our app.
It needs access to that key as well.
It needs to be secret.
Okay, implemented the local Vercel key setup.
And so in this point we've made the the secret key management and not just secret key, any kind of key management is part of our workflow and we can be assured that we have the key for local stuff and we also going to be
deploying the key correctly for production stuff, regardless what kind of host you're using.
Now, when you're developing an app, you're going to be writing code for the core stuff, but a lot of things that your app will be doing will be done by existing code.
You're not going to be building your app from scratch, right?
You're going to be using existing libraries, existing frameworks, stuff like that.
And those are called dependencies and that is because your app depends on them to function.
Without those things, your app will not function.
And you need to ensure that you have a process for managing these dependencies.
And I have here a prompt that you can use that will help you inspect this project before adding any dependencies.
Do not install anything yet.
Tell me all of this.
And so let's go ahead and run this prompt.
Right, and this is what it came back with.
Dependency project inspection.
Framework and package manager.
Framework non-detected.
This appears to be a plain static JavaScript app served by a custom node server.
Now, of course, this will definitely not be the case when it comes to your real apps.
You're going to be using some kind of framework, something that will make your app behave like a real app.
Here we just have a very, very plain app.
Package manager non-detected.
Oh, none of this.
And of course, when you're going to be building your app, you're going to be having all this as well.
Available scripts.
No NPM scripts exist because there's no package manager, because there's no manager, because there's no package.json.
Current documented run command, we just have this very, very basic.
Definitely not the case when it comes to production apps.
OpenAI local env run command.
So, we have this relevant install dependency.
So, we do have some basic node built-ins.
All of these OpenAI calls native fetch, okay?
So, it's native.
It's not using the OpenAI SDK, which would have been a dependency.
Can the task be completed without adding a package?
Yes, for the current OpenAI API stack and local serving, the project already calls OpenAI via native fetch.
If a new package is recommended, no package is recommended right now.
A package could be recommended later if we use Express, Fastify, we start using the official SDK, .env files likely to change if proceeding, right?
API behavior, OpenAI calls, front end, etc., etc.
And so, dependencies are important, and you want to limit your dependencies.
You don't want the system to just add dependencies blindly.
And so, this is going to be super useful as you're building your app so that you can streamline it.
Because as I was just building this simple app, Codex asked me whether I want to use OpenAI SDK or native fetch.
And you always want to err on the side of native stuff.
If you can avoid a dependency or an SDK, that would be the right move.
And that's exactly what I did here.
I just used native, right?
I could have used an SDK, but I decided I'm just going to keep it as simple as possible.
And that's really the goal here.
And this prompt and making this part of your workflow is going to enable you to keep your app streamlined so that you have less dependencies, less chance for something to go wrong, less bloat, etc., etc.
So, definitely add this to your app building workflow.
And then ensure that Codex knows about it by making this a part of your agent's MD or a separate step.
Now that the Cortex foundation is clear, we are going to start with something intentionally small.
The first step is called Habit Card.
And it is a tiny habit tracker where users can add habits, check them off for the day, and see a simple streak or count.
This is a great starter project because the result is visual, easy to check, and small enough that every step stays clear.
Cortex can plan the app, build the UI, show us the file changes, open the browser, polish the result, and get the front end ready to deploy without also introducing back end complexity.
Habit Card gives us the core app building pieces without much product complexity.
A form, a list, a daily check-in state, simple feedback, and later local storage persistence.
It does not need authentication, payments, APIs, or a real database at first.
This first app is about getting comfortable with the full Cortex loop on something we can understand immediately.
Now, here in Cortex, the first thing that you want to do is you want to click here, and you can select start from scratch, but I like to have it set to a specific folder.
So, I'm going to click on use an existing folder, and I have here a folder prepared called demos.
I'm going to open this here, and now we have a new project that has been associated with a specific folder.
And here we can start a brand new And here we can start a brand new conversation for the app that we are building.
Now, anytime I start building a brand new app, I always want to create a visual architecture.
Being a visual person, this gives me an understanding of the scope of an app, how the app looks, the user flow, and stuff like that.
And we can actually use Codex to create that visual architecture for us.
Now, I have here a prepared prompt that creates this visual architecture, and we want to ensure that we use the built-in image generation that we have as well as Chat GPT to do it.
So, I'm going to press forward slash, and I'm going to search for Imagen.
Okay, and then we can say something like use Imagen for the following.
And I'm going to go jump into plan mode, and I'm going to go ahead and and execute it.
Okay, and it came back with a habit card architecture diagram, and here it says create one raster infographic using this.
So, everything looks good.
There there's some diagram content, visual direction.
That's a wide composition.
Looks good.
We're going to say yes, implement this.
Okay, and that is our habit card.
That is our visual interface.
And right away, I can see what this app is all about, right?
We have add habit, we have habit list, we have today check-in, and we have a streak count.
Then we have an empty state, we have local storage later, and we have the Versel deploy.
And so, this is a very, very simplified visual architecture, but it is very, very important.
I want to see right away what I'm dealing with, what I'm working with, how many pages, you know, how complex is the app, how simple is the app.
I see that this is not going to be, you know, a very complex app.
It's going to be a fairly simple app, but we do have some interesting bits here, right?
This empty state, we have some local storage, we have a Versel deploy.
And so, it's a fairly simple app, but still a fairly workable app.
Now, the next thing that I like to do is create the entity architecture.
And this is where we're going to be mapping the small set of entities behind the app.
So, even though the first version is front end only, it is useful to name the habit, the daily check-in, and the streak count summary before we add a local storage later.
And this right here is the entity diagram.
And I'm just going to say use ImageGen for below.
Going to go ahead and run that.
And I can run it directly.
I don't really need to run it in plan mode because it's just generating a diagram.
I'm not asking it a complex, ambiguous coding question or giving it a an ambiguous coding instruction.
And here is our entity architecture.
And unlike the visual architecture that we've generated previously, here we're actually seeing the entities that will later become the actual storage schema.
Okay?
So, we have the habit, we have a habit check-in, we have a streak summary, and then local storage as the back end.
So, no back end, everything is stored locally with local storage.
And this is also very, very useful because unlike the visual diagram here, I want to see the actual schema.
I want to see what kind of, you know, elements or what kind of, you know, tables we might need to translate this app schema into.
And as you can see, this is fairly simple.
Habit, habit check-in, streak summary.
We have these three main functions here, these three main features that were translated into entities.
Okay?
And then we have And for each entity, we have things like name, created at date, completed count.
Now, at this point, we have both the visual architecture as well as the entity architecture.
And this is something that I like to do for pretty much every single app that I build because I want to get an idea what I'm really dealing with, right?
I want to have an understanding of the the scope of the app.
And right now I can see exactly where we are.
I can see that this is a fairly simple app.
I can see the entities.
I I I see the app building.
I see the future of the app.
I see the app coming together.
Now, the next thing that we want to do is we want to use the plan mode to ask Codex what stack makes sense for this first app.
The important part is that Codex should recommend the simplest path before it edits any files.
And as you might have guessed, we are going to be doing this in plan mode.
All right?
And here's the prompt that we're going to be using.
Do not edit files yet.
Inspect the current project and recommend the simplest stack for Habit Card, right?
And we ask it what what it should come back with, and we're going to press shift tab to enable the plan mode, of course, because we want it to come back to us if it needs to and ask any clarifying questions.
We need it to clarify everything before we go deeper into the building the app.
Okay, I'm going to go ahead and execute this.
And let's see what it comes back with.
And in this case, it did not come back with any clarifying questions.
Okay?
So, it's writing a plan.
And the recommended front end stack is going to be React TypeScript, right?
It wants to use Tailwind CSS for fast simple styling.
This is the testing library.
No React Router.
It's a simple single screen app.
No global state library.
Okay?
Back end decision.
No back end is needed for the first version, right?
And that's what we told it.
We said bias toward a front end only implementation first.
And then it's also going to use browser verification.
Okay, open the app in the browser, verify all this.
Okay, so let's go ahead and and run this.
All right, so it worked for about 10 minutes and it has implemented the habit card as a front-end only React TypeScript app.
This is where it is and this is what it did, right?
It built the app shell and did, right?
It built the app shell and UI, habit logic, local storage, components for adding form for the add form, list card, and empty state.
Tests for app flow logic and storage, and verification passed nine tests, production build succeeded.
And it also gave us a dev server that is running the app.
And so this dev server is running on my machine right now and this allows us to quickly test things without needing to deploy and test there.
And on the right-hand side we have this card that is always available and it shows us things like artifacts, background terminal, and basically things that were created as part of this conversation.
Okay, so we have the images that were generated, we have the index.html for the app.
We have the background terminal that is running here.
And so I can click here and that's going to go ahead and and go to the server that's running our app.
So let's do that.
That's going to go ahead and open.
It's also going to open the browser right here in the right-hand pane.
Now, before we had we had no right-hand pane, but if you click here, you can see that it opens up here right there.
Another thing that you can do is you can open the browser directly.
This is the front page here and I can add a habit, habit one.
I can click here and we have a habit here.
I can add another we have a habit here.
I can add another habit, habit two or maybe gym.
And it's creating these these habits here.
So I can check it off and that is done.
Check it off.
And so it's a very very simple app.
And if you want to see the actual files that were created as part of this, you can simply right click here and open in finder.
And this is the React app that was created for this here.
Once the UI works, we'll add a small persistence step with local storage.
Habits and today's check-ins can persist after refresh.
So, the app starts to feel real without introducing a backend yet.
And this is the prompt that we're going to be using.
Upgrade habit card so habits and today's check-ins persist with local storage.
I'm going to jump into the plan mode here just in case.
And I'm going to go ahead and run this.
Now, it's actually telling us that inspection shows that habit card already implements the requested front-end only local storage persistence.
Okay?
So, no file edits are needed for this upgrade.
So, we must have done this in one of the previous prompts.
But, if we hadn't done this, then we would run this prompt.
But, still, let's go ahead and run it.
And now it tells us that persistence works through this storage using these keys and a lot of other details here.
Okay?
So, we can reload this and now we have something called local storage.
And what this means is that this app does not have a backend, but this stuff is going to be stored on my browser.
Okay?
So, if I'm using this instance, it's going to be stored on this browser.
If I run it in a different browser, then it's not going to have the data.
So, whatever I do in that new browser is going to have fresh data.
And so, this is a way to create, you know, storage just for testing me.
I mean, you can use this in production as well for certain apps, for certain situations.
It does have its place, but it's very, very limiting compared to something like Supabase or something of that sort.
And so, we can delete all this, we can do all that, we can start.
And if I copy this, run this app, and I load this app, there's nothing there because I'm using a brand new browser instance, and I can create, I can do, I can check off, I can do this, I can do all that, but if I go back to CodeX, there's nothing here,
right?
It's not syncing, it's not using my account, and it's not using a unified back-end, so that no matter which browser I use, it will still store the data and keep track of everything.
That is not happening.
Once the app works locally, it's time to deploy it.
Even though Habit Card is simple, this is the first moment where CodeX helps move something from local code to a real-life URL.
And so, CodeX can do the whole deployment process.
It can run the local checks, prepare the projects, connect or create the Vercel project, deploy the front-end, and then verify that the live page actually loads.
And additionally, you want that first deployment to feel very concrete.
We're not just writing code and hoping it works.
We're taking a small app, shipping it, opening the deployed URL, and checking the result like we would with a real project.
And here is my Vercel deployment prompt.
Prepare Habit Card for deployment on Vercel, and verify it works as a small front-end only app.
So, at this point, we are just preparing it for deployment.
We're not yet deploying it, but still, this is an important step because this will ensure that once we do deploy it, that it will work without any issues.
I'm going to go jump into the plan mode, and remember, we do have that Vercel plugin enabled, and so it should use it automatically with no issues.
I'm going to go ahead and execute this.
All right, so it went ahead and created a Vercel deployment plan.
Okay, Habit Card is already a suitable for a front-end only for sale deployment, okay?
And this is what it's going to do, and here is the deployment implementation.
Keep the app front-end only, do not add Convex, which is a back-end APIs or database server functions, or external services, none of functions, or external services, none of that.
And local storage persistence is expected to be local to each browser and deployment origin.
Data will not sync across devices or URLs, okay?
Let's go ahead and implement this plan.
And 3 minutes later, it tells us that deployed Habit Card to Vercel and verified it live, okay?
So, this is the live URL.
We can click here, and that's going to open our Habit Card app running on the web, right?
Accessible to everybody.
And this again uses local storage, okay?
So, we can do that over here, and of course, you know, it's not going to be available in another instance because it's all stored locally.
And so, at this point, we designed, architected, built, tested, and then deployed a very, very simple web app that uses local storage as our back-end, and this proved the whole cycle for us.
Now, in the next several modules, we're going to be doing the same, but with more complex apps, slowly adding things like authentication, back-end, and other important components that you need for a real production app.
The second app we'll be building will be a mini team voting app where people submit lunch or snack ideas and vote on the winner.
It's a bit more complex with more features, but still fairly simple overall.
Snack Vote has a submit option form, a snack option list, vote buttons, a live leaderboard, and a winner card.
This app will serve as a bridge between a simple front end and the larger marketplace app we'll build right after this.
Instead of jumping straight into complex entities such as customers, bookings, and permissions, we can first learn the back end pattern on a much smaller app.
Snack Vote only needs snack options and votes.
Someone can submit an option, other people can vote, and the leaderboard updates as the vote counts change.
That gives us enough structure to understand live back end data without making the product itself hard to follow.
As always, in this first step, we'll be mapping the Snack Vote interface visually.
The app should be simple enough to understand immediately.
Create or join a voting room, submit a snack option, vote once, watch the leaderboard update, and see a leaderboard update, and see a deadline-driven winner state.
Now, here in Codex, we're going to come here, and we're going to create a new project from an existing folder.
We're going to click over here.
Here, we're going to create a new folder.
I'm going to type Snack Vote, and we're going to click open.
And now, we have a brand new project configured here in Codex.
And here's our prompt for the visual architecture.
We want to preface that we want to use this image, and we're going to jump into plan mode and execute this.
And that looks good.
We're going to go ahead and expand that.
Go ahead and implement that.
And here's our Snack Vote visual architecture.
Look at this beautiful diagram.
So, you can create or join a room.
In the current room, you're going to be seeing this, members and the time left.
You can You have here a snack list.
You have your your voting buttons.
You have a live leaderboard, and you have a closed winner state.
Okay, with some voting deadlines here, here as well, and then we also have our Vercel deploy.
And so this looks like a fairly fun app with a lot of things going on, and so I can't wait to implement this.
And we're also going to be adding more and more features as we go along.
Next, I want to go ahead and create an entity diagram, an entity architecture diagram.
So here's our prompt.
We're going to do this, and we're going to go ahead and execute that.
And here's our entity diagram.
Okay, so a room contains multiple snack options and has one voting session, right?
We have the voting room, many snack options, and many votes, right?
We have We have here some winner logic, the winner logic snack option with the highest vote count when now is greater than or equal to closes at, right?
So after the deadline, we have here a legend, and here we have a sample kind of workflow, a pipeline.
Build the UI first, connect it to Convex.
Later, Convex is going to be our backend, and we are going to be leveraging things like real-time updates, persistence, and live vote counts.
And so now that we've generated a visual architecture diagram, as well as our entity diagram, the next thing that we want to do is we want to ask Codex for some stack recommendations, because there are lots of ways that we
can build out this app, and we want Codex to tell us the best options for this specific app.
Here's the prompt that we're going to be using, and I'm going to switch into plan mode here.
And it's telling us do not edit files yet, inspect the current project, and recommend the simplest stack for Snack Poll.
And here's the plan that it came back with.
Here we have the stack recommendation.
We're going to be using React, TypeScript, Tailwind.
And here it says backend later Convex with TypeScript server functions and generated client types.
And so, for the most part, uh this is very, very similar, if not the exact same architecture stack that we use for the first app, except we're going to be adding more and more features, and also connecting a back end for the first time
in this tutorial.
Now, here, instead of clicking submit, I'm going to give it another prompt, and this prompt is going to start building the app, writing the code.
And here's the prompt, "Implement the first working Snack Vote UI without a database or persistence, okay?
Inspect the current project first, then build the smallest useful Snack Vote UI." And there's some verification steps as well.
And we also explicitly tell it to not use convex, local storage, or an API, nothing of that, just keep it to these specs right here.
And we also have some verification.
So, I'm going to go ahead and run this in plan mode, in case it wants to ask me something.
So, it doesn't have any questions for us, and that is because in this specific conversation, we already fleshed out, you know, things like the architecture, the stack, and all of that stuff.
And so, it kind of knows what it needs to do to build out this app.
So, we're going to say, "Yes, implement this." because this is the step where we actually want the code written.
All right, so this has completed, and it says here, "Implemented the first working UI-only Snack Vote app here.
Created all of this.
What works?
Verification completed.
Still needs attention later."
Okay, all of these things, and we'll talk about that a little bit later.
And so, now we have a web preview.
So, we can click on open, and that's going to go ahead and open it right here in our built-in browser here.
This is our app right here.
And so, we have snack and lunch options.
We can create, we can submit an option, add sample snacks, click here, and we have these snack options here with some votes here.
Leaderboard, right?
So, this is winning.
Winner state, current winner leader, spicy ramen bowls.
And so, if I vote on falafel wraps, uh wraps, six.
Right?
So, now it's six.
I can keep voting.
And that's a problem right away, and it's in memory.
And one person can vote multiple times, which is an issue.
We're going to fix that a little bit later, but I can also add a snack.
Let's say sushi.
I don't know, sushi.
Add this, and we have sushi, and I can also vote on that.
So, it's a big big issue, but for the most part, the logic works, the UI works.
Now, once the snack vote UI exists, we're going to replace the mock snack data with real Convex data.
And for those of you that that are not familiar, Convex is a back end that we're going to be using in this tutorial.
It's an awesome back end, super fast.
And if you want to learn more information, I actually did a dedicated video on it that you can find right there.
And so, once we add Convex, our app will stop being a static interface and start behaving like a real database back product.
And the path is very very simple.
Code X creates the Convex schema, adds a query, adds mutations, connects it to the UI, and then we verify the result in both the browser and the Convex dashboard.
And so, when we submit an option in the app, it should be written back to Convex.
When we look inside the Convex dashboard, that snack option should be there.
And when someone votes, the UI should update live so that we can see the front end and back end working together instead of treating the back end like a black box.
And when you head over to convex.dev, you can learn more about this back end.
And this is a great, great back end.
It's very, very fast, and it works really great with agents, right?
So, the back end building blocks for your agents, okay?
So, I'm going to go ahead and log in to my free account.
I'm using the free plan.
I'm not paying for anything.
And this is also an open-source back end, so you can also self-host it if you want.
So, I'm going to go ahead and log in.
All right, so here I am logged in.
And as you can see, I have here two projects.
Now, our app is going to automatically create a brand new project for its data, for its functions, for everything.
And here back in Codex, we're going to paste a new prompt that looks something like this.
Upgrade Snack Votes to Snack Options, and Votes are stored in Convex instead of local in-memory state.
Now, if I press command, comma, and go to MCP Servers, you can see that I do not have the Convex MCP server.
And that is because we're not going to be connecting to Convex via MCP.
We're actually going to be connecting to it using a much simpler method, and that is the CLI, which stands for command line interface.
And actually, before I run this prompt, we're going to check to make sure that we have a connection.
Can you first check that we have the Convex CLI installed, and if not, do install it.
I'm going to go ahead and run it.
Now, I already have Convex CLI installed, but you can just tell Codex to install it.
It's that easy.
And so, it's telling me that NPX, which is a package manager, could fetch Convex temporarily, but the project does not have it installed.
I'm installing Convex into the project now as a dev dependency, okay?
Convex is installed locally now, okay?
I'll verify the CLI results.
And so, you don't need to read lots and lots of documentation, figure out how to connect to it.
You just tell Codex that you want to connect to it.
It's that easy.
So, Convex CLI is installed locally in the project now.
Okay, so now we can paste the prompt.
Upgrade snack votes so snack options and votes are stored in Convex instead of local in-memory state.
So, I'm going to go ahead and do this and let's go into plan mode.
See if it wants to ask me something or clarify something.
And so, it's telling me one material set of choices to open.
There's no existing Convex folder.
So, this app is not linked to a Convex deployment yet.
And that is correct.
And that's what we want to do next.
And now it's asking me which Convex backend should snack vote use for this first backed version.
We want to create a new one, right?
So, we're going to go with the recommended option.
All right, and now we have a new plan to upgrade the existing app from in-memory snack options to live Convex data.
Okay?
So, it's going to do everything and it's going to essentially configure the backend to be Convex, set up the schema, set up the data, everything.
And once it's done, we should be able to go to Convex and see a brand new project here automatically created.
So, I'm going to hit submit here.
All right, so it says it has created a fresh cloud project and synced the backend function successfully.
And now you see this cursor, it's testing out the UI.
And so, right now it's not running, so it should start it out.
And here it says the existing browser tab was sitting on the browser error, so it has restarted it.
And if we jump into Convex, you can see that we have a new project created.
Now, I did authenticate this account with Codex, so it knows that this is my account.
And so, if we click over here, we should see some initial stuff happening, right?
There's some data, functions, and it's not done yet, right?
It's still working.
And while it's working, we can see what has been done.
And it's actually typing it.
Look at that.
Key press input.
It's creating it.
It's testing it right here.
You can actually see it happening.
This snack was submitted through the browser and appeared from Convex.
I'm voting on it.
There is this testing all the flows, which is pretty cool.
All right, now it's telling us implemented the Convex back snack vote upgrade, changed all of this, what changed, verification, edge cases handled, and it is running.
So, we can test it out ourselves.
And so, here's the app.
And now it's Convex here's the app.
And now it's Convex backed.
And so, now if we head to Convex, we should see the data.
So, as you can see, snack options, this has a vote of one.
This is the snack tools, vote one.
And if we increase the vote, it should be two, and it's automatic.
It's absolutely two, and it's automatic.
It's absolutely automatic.
Three, it's three.
It does not need to do anything.
And we can create a new snack option, let's say sushi, submit.
And if we come over here, we see sushi, zero votes.
Now it's winning.
And so, this is essentially the same app, except it's Convex backed.
And we also have functions.
And with Convex, you need to create functions to access your data.
It's not like with other systems where it's automatic.
Here you need list, you need submit, you need a vote, you need functions.
And so, the snack options table or document has three functions.
No files, no schedules, and there's some logs here, so that you can see things are here, so that you can see things are happening.

> Okay, so this was a fairly successful migration.

We went to no back end to a Convex back end very, very quickly.
Now that snack vote has real Convex data, we can make it feel more like a shared group app.
Instead of one global snackboard, users can create or join a simple voting room like Friday lunch or team snacks.
Each room should own its own snack options, votes, leaderboard, and winner state.
This keeps the app more interesting while teaching a clean back-end concept, scoped data.
We still do not need accounts, permissions, invites, or admin tools.
And here's the prompt that we're going to be using.
Upgrade snack vote so voting happens inside simple rooms.
And I'm going to run this in a plan mode.
All right, so it came back with a plan for us.
This is the room-based snack vote upgrade.
Upgrade the current Convex back app from one global snackboard to simple rooms.
Can I expand that?
Yes, implement that.
Now, as it's running, I am seeing an error message here.
Did you forget to run NPX Convex dev?
Okay, so let's see if it's able to catch that and solve it before the next prompt.
It is done.
So, it has implemented room-based snack vote.
This is what it changed, files, things, verification limits.
Okay, very important.
Limits is actually very, very useful.
No auth, ownership, invites, or duplicate vote guard yet.
And we'll fix some of these a little later.
Room selection, room codes.
Okay, so how does this work?
Let's go ahead and refresh this.
All right, so we can create or join a room, and there are some rooms over here.
So, let's say we type Friday lunch, and so now we've switched the room.
Okay, current room Friday lunch.
And now we can do the same thing.
We're now in in the scope.
It's all about scoping now, right?
And so this is a specific room, and I can say, I don't know, submit.
There we have it in this room.
And now if I switch a room, let's say I switch to launch ideas.
So now it's brand new.
There's nothing nothing there.
And I can say something like I don't know, tacos.
And now we have tacos here.
And if we go into Codex, we should see that.
So we have voting rooms here, and we have different ideas here.
And now if we go into snack options, we can see that they belong to a specific room.
We have the room IDs.
These are the same same room that we have a bunch of different room IDs there.
Probably some of them created by Codex as part of testing, like lunch ideas.
Oh, no, I created lunch ideas.
These ones were created by Codex, these three rooms.
And we can remove them.
I can select these, and we can delete these.
And if we go into functions, we can see that for snack options, it's the same pre-functions.
But for voting room, we have get, create, or join, bunch of other functions that we have.
And And so it pretty much did everything.
It created the functions, it created the schema, it even, you know, created some test data while it was testing.
We'll add one simple rule that makes the voting feel like a real product.
After all, a person should not be able to spam the same room with repeated votes.
And that is because we still do not have real authentication.
And so for this tutorial, a local or session-based voter identity is enough.
And that's what we're going to be doing right now.
And here's my next prompt.
We're going to upgrade snack votes, so each person can only have one active vote per room.
Jump into plan mode.
Run that.
So here's the plan.
One active vote per room.
Add a lightweight session-based voting rule.
Each browser session gets a session ID and Convex stores one active vote per room ID and session ID, right?
So, this needs to be unique.
So, if I voted in that room, my session ID was used to vote.
And so, this needs to be unique.
So, for that room, my session can only happen twice.
If there's a chance for a repeat, it's not going to count it.
Yeah, I can vote in other rooms, but per session per room can only happen once.
We're going to expand this.
Looks good.
And submit this.
So, it is done.
Implemented one active vote per room.
Okay, change this.
What changed?
And it added this get my vote.
Added votes with table.
So, let's go ahead and try this out.
Open this here.
So, let's say I go to another room, friend Friday lunch.
I switch that room and I have my burrito.
So, I'm going to vote for this.
I just voted and I can't vote again.
You see that?
I can't vote again because if I go to Convex and I go into data and I go into votes, I should see a session ID with room ID.
So, let me go ahead and delete all of these so that we can see which one is mine.
And so, now I can vote again.
You see it's back up.
It's it's it's uh reactive.
I'm going to hit vote.
And now you see room ID and session ID.
These two, if they can only appear once in this table.
And so, obviously now it's knows that my session ID and I'm trying to vote for this one and that's not going to work because I'm in this room.
I'm in this room here, Friday lunch.
Friday lunch right there.
Now, if I switch rooms, let's so let's say I go to another room.
Let's say I go into Sunday brunch.
Now, I can vote, right?
I can vote for anything.
I can say tacos.
Submit.
I can vote here.
And let's say I create another one.
I I change my vote.
Yes, I can switch votes, but I cannot pad, you know, with multiple votes an item.
And so, if I go back here, now there are two options, right?
Two different rooms, same session ID, but I cannot vote in the same room more than once.
So, this works really, really nice.
And finally, we'll add a deadline, so each room has a moment when voting closes.
Before the deadline, people can submit and vote.
After the deadline, voting locks and the app shows the winner or a simple tie state.
This adds time-based product state without becoming a scheduling system.
It is still a small group decision app, but now it shows how front-end UI and back-end data can derive open, closed, winner, and tie states from one field.
And here's the prompt that we're going to be using.
I'm going to switch into plan mode, run this.
Oh, it needs a product decision.
Okay, how should users set a room deadline in this small tutorial version?
Quick durations, okay, add simple buttons like 1 minute, 5 minutes, 15 minutes when creating opening a room, date time input, or fixed default.
Let's do quick durations.
That sounds good.
Let's implement this.
And it is complete.
Implemented simple voting deadlines.
This is what was changed.
Added quick deadline choices, no deadline, 1 minute, 5 minutes, 15 minutes.
All of this, and let's go ahead and see how this works.
All right, so here we are.
And let's go ahead and create a room, Friday lunch, and let's say it's 5 minutes.
Select 5 minutes, open the room.
This still says no deadline.
Let's try another room.
Let's say Sunday brunch.
I can select no deadline.
I can do 15 minutes.
Let's Let's 15 minutes.
See, it says no deadline.
Okay, that's a bug.
That's definitely a bug.
So, let's see if it's able to fix it.
That's the first bug that has happened to us as far as I that has happened to us as far as I remember.
And so, we're going to say created tried creating a room and selecting a deadline, but it ended up creating a room with no deadline.
And we don't really need plan mode for this.
There's no, you know, clarifying questions here.
It's a simple bug.
And we don't really want it to clarify.
We we know what the bug is.
We just want it to fix it.
So, there's really no ambiguity there.
It's like It's like I'm not looking to negotiate with Codex.
I know this is a bug and I want it to fix it, right?
There's no other ways.
There's nothing else happening.
Unless I'm wrong, and in that case, it's going to tell me that I'm wrong, that it works, but there's no other paths here as far as I'm concerned.
Now, sometimes Codex would output something like this and it tries to go into plan mode.
And so, right now it thinks it's in plan mode, but it's it actually is not in plan mode.
And so, if I say something like do it, it's going to complain that that I did not uh leave the plan mode while I'm not in the plan mode.
So, this is a bug that I have been experiencing from time to time and it's annoying, but it's it's easily fixable.
You see, it says I can't edit files because this thread is in plan mode, but we're not in plan mode.
And so, the solution is to go into plan mode and type something.
Okay, fix it.
And then it's going to say something like, well, you know, I can't do it.
I'm in plan mode.
And then you can leave plan mode.
And now it understands it.
You see, now it's correct.
Fixed the bug where it's selecting a deadline and opening an existing no deadline room still leaves the room with no deadline.
So, we're going to submit this.
All right.
So, it looks like it fixed it and here it says in the browser, I created a no deadline room, reopened it with 15 minutes, and it showed open plus closes in, etc.
So, let's go ahead and test this out ourselves to ensure that it does really work.
So, we have this and let's do Friday lunch and we said 15 minutes.
And now it shows it.
And let's say 1 minute room one, 1 minute.
There we go.
1 minute.
And let's try no deadline room two, select no deadline, open no deadline.
Okay.
So, this looks like this was finally fixed.
Now, once SnackVote has rooms, session-based voting, and a deadline, we are ready to deploy the front-end app with Vercel and verify that the deployed app points to the right back-end environment.
And this will round up this specific app build.
And here's our prompt, prepare SnackVote for deployment on Vercel and verify it works with the Convex back-end, okay?
I'm just going to do it in plan mode, run that.
Here it's being very, very clever.
One important deployment decision remains, whether the Vercel app should use the existing Convex dev deployment or it should promote it to production, okay?
And this is really, really cool because this is something that I wanted to cover once this was done.
So, if we go into Convex and you click over here, you can see all your deployments, your different deployments.
So, so we we are currently under development deployment, under development cloud.
We can also have a production deployment, preview deployments, other deployments, stuff like that.
So, ideally, once we deploy it with Vercel, we want it to use the production Convex, and that's what we're going to select, because this makes sense.
Production deployment uses the production Convex.
Development deployment uses the development Convex.
And this is our plan prepare snack vote for a production result deploy connected to the Convex production backend.
We're going to hit submit.
And it's going to create a production.
In fact, they already did it, right?
We can switch to this and it's going to have a production environment here created for us.
All right.
So, it has deployed snack vote to Vercel and verified it against Convex production, okay?
So, this is the live URL, what we're seeing here.
Deployment URL and the Convex backend.
Okay, and if we go into Convex, you can see that it's currently pointing to the production URL here.
And we have everything here in production, right?
So, we have the dev instance pointing to the dev deployment in Convex.
And the production instance in Vercel pointing to the production instance here in Convex.
So, we have all the same functions.
We have all the same data.
Everything is there.
The data might be a little different, but the schema is exactly the same and it works, right?
So, we can create a room, whatever new room, 1 minute, open it.
And now 59 seconds, 58 seconds, looks good.
We can create another room, room three, no deadline.
And that has no deadline.
So, I'm currently in this room.
I can create a food option.
I can vote.
I can't vote anymore.
One active vote per room.
This is the leaderboard.
So, it looks really good.
And this time we've actually built a fairly cool and a fun app along with a backend that uses several different deployments depending on where the app is is running.
So, for local deployment, we have the local, the dev convex deployment, and for the production Vercel deployment, we're using the production convex deployment, okay?
So, this was a slightly more complex app.
But, there's still one more app that I want to build, and this app is going to be the most complex of them all.
It's going to bring a lot of these things that we've been talking about so far together, and also we're going to be introducing some new functionality, new features, and a lot of really cool features, and a lot of really cool things.
Now, for this last app in the course, we're going to be building FlexHelp.
And this is where we take the workflow from the first two smaller apps and apply it to a more realistic product, a two-sided marketplace where helpers offer fixers services and customers book them.
The important thing is that we will still build it in controlled steps.
We're not going to ask Codex to build the whole marketplace at once.
We are going to architect the design, and build the UI, then add feature by feature.
And last but not least, we're going to be deploying the app, making it available to anyone.
As always, our first step will be creating the visual architecture.
This gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
Now, here in Codex, we're going to click here, and we're going to create a brand new project.
Now, I like to start it from an existing folder, and I'm going to create a new folder.
FlexHelp.
I'm going to hit create, and I'm going to click open.
And that creates a brand new project.
Now, the first thing that we're going to be doing is we're going to be building a visual architecture, the same thing that we did for the previous two apps.
And this is important because this gives us the shape of the product, the customer flow, the helper flow, the main screens, and the path from browsing a service to booking help.
And here's the prompt that I'm going to be using and I want to specify that we want to use ImageGen.
We're going to jump into plan mode and we're going to run this.
And here we have the Flex Help Visual Architecture.
And here's a better view.
And so here we have the customer, we have the shared marketplace screens, and we have the helper, which are the two sides of this marketplace.
We also have the Convex and the Versel here.
On the customer side, we have browse services, get the service detail, and then send a booking request.
The helper side, we have the helper dashboard and the status updates.
And on the shared marketplace screens, we have explore the marketplace, my bookings, and booking details.
So right off the bat, this app is a bit more complex than the previous apps that we were building.
And that's really the goal, to finish off with a more complex, but also a more realistic, more production-ready app.
Next, we'll map the core entities.
And this is where the product becomes more tangible because we can actually see the real objects in the app before Codex starts writing the schema for code.
And here's our prompt.
We want to preface this with this ImageGen.
All right, and here's our entity architecture.
Okay, so we have the user, that could be a customer or a helper profile.
We have the booking here, booking status, service, category, review, and all of that backed with Convex data.
So at this point, we have a better idea of how the final app is going to look.
I see that we need a user entity and that could be a customer or a helper profile.
And I see that booking is super important because everybody needs to have access to booking, both customers and helpers.
Booking status, service, category, and so right away I see that this is a fairly sophisticated app, but I can see that it's not a super complex or like a super complicated app that you know has a ton of different entities, has lots of things happening.
But still, as we are developing this app, we might be adding various entities and so that will increase the complexity as the development can continues.
Now, the next step is before we start actually building the app is we want to ask Codex to recommend the simplest stack for FlexHelp based on what we need to build based on what we've told it so far.
This keeps the technology choices tied to the product instead of starting with tools first.
And this is super important because we want to start with the blueprint before any code has been written.
And here's the prompt to do that.
Do not edit any files and spec everything.
And I'm going to be running this in plan mode so that I can decide whether I want to accept its recommendations or just leave it in the conversation.
Going to run this here.
This is what it's suggesting.
The workspace is currently empty.
The simplest course-friendly stack is React, TypeScript, Convex for backend data, off, Tailwind for UI, and Vercel for hosting.
Okay, and this is exactly what we've been doing so far.
And and here it's listing some primary routes.
Services, bookings, customer bookings, helper, helper services.
Here we have the data flow, the auth recommendations, UI and component approach, Vercel deployment path, staged build plan, everything.
Okay?
So, I'm going to exit out because this was only a read-only plan mode.
Okay?
I don't want it to do anything just yet because that's what we're going to be doing in the next step.
Now, from the visual architecture, the entity map, and the stack recommendation, we have a pretty good idea of how the FlexHelp app is evolving.
The next thing that we want to do is we want to get Codex to take a first pass at turning that plan into a static product UI.
Now, this first version does not need any back-end data.
The goal is to see how far Codex can get from the architecture alone to viable UI mock-ups.
And this is the prompt that I'm going to be using.
Build the first static FlexHelp UI design from the existing architecture and stack direction.
We're going to stay in the plan mode.
Going to go ahead and execute that.
And let's see how well it does.
And here's the plan that it came up with.
Okay, the goal is a polished visual prototype that matches the FlexHelp architecture.
Okay, and here it lists some details about the architecture.
And let's go ahead and run this prompt.
So, it finished working.
And let's go ahead and see what we have here.
Okay, so this is our app.
And this is kind of how it looks like.
Okay, book practical help.
And we have some active requests.
We have booking entry, helper dashboard.
We have this.
Look at this.
It even works.
Service detail, a small plumbing repair, helper dashboard shell.
And so, this UI doesn't look too bad.
But there's something that you need to know when you design UI with Codex.
They all look pretty much the same or at least very, very similar.
And that is because Codex is not really an expert when it comes to designing pages.
It's great for coding, for solving all kinds of problems.
But for actually designing stuff, it's not the most ideal tool.
There are a lot of other tools that do it a lot better.
And so, during this specific app build, I want to bring in another tool and show you how we can have a more specialized tool actually design the UI and then bring that UI back into Codex and get Codex to kind of implement it. okay?
Now, when it comes to UI designs, there's lots of cool tools.
There's Google Stitch, there's Figma, and there's also a tool that I really like to use, and it is called FlutterFlow Designer.
It's a very very lightweight tool, and it works really great with Codex.
And so, if you head over to designer.flutterflow.io, you're going to be on this page here.
And you can use the web app version here, but what I really like to do is I like to use their desktop app, okay?
Here's the desktop app, and what's nice about the desktop app is that you have this app integrations.
So, if you click over here, you can connect designer to external agents and IDEs.
So, Claude Code, Gemini CLI, and Codex.
And so, I have this set up.
So, all you need to do is click here.
Now it's installed.
And now, this app here is going to serve as an MCP server, okay?
Because if I go to Codex here, and I press command comma, and I go into MCP servers, I also have this FlutterFlow Designer configured here.
And if you want to set this up, you can simply ask Codex to do it.
It's going to research, it's going to figure out, and it's going to eventually set it up for you so that you can have this FlutterFlow Designer as one of your MCP servers here, okay?
So, now that we have this set up, what we want to do is we want to go into this designer, and we want to click a new design, and here you can enter a prompt ask it to design any kind of app UI for you, whether it is a mobile app or desktop app.
They also have, you know, explore styles feature, or you can have an instant generation.
Now, what you don't want to do is you do not want to type this prompt directly.
You want to ask Codex to generate a prompt for you since it knows a lot more about the app that you can input here.
And this is the same workflow regardless of whether you're using this tool, Google Stage, or pretty much any other tool out there.
And so, we're going to go ahead and we're going to grab a prompt to do just that.
And here's a prompt that we can use.
Create a polished FlutterFlow designer concept for FlexHelp.
FlexHelp is a two-sided marketplace, and we are telling it what kind of screens to design.
We give it some design requirements.
We give give it some guardrails, stuff like that.
And so, we're going to input this prompt, and here we're going to stay on the explore styles, and that way we can have different styles show up, and we can decide which one we like better.
So, I'm going to go ahead and run this, and here are the designs.
So, as you can see, they're all very different.
We have this, we have this, we have this, we have these ones, so and you got to admit that in my view, these look a lot better than what Codex did, right?
So, this is what Codex did.
In my view, these designs are a lot more interesting than Codex's design.
Okay?
So, I don't know which one you guys like.
This is a classical one.
This is nice.
Let's take a look.
Let's go ahead and use this classical one.
So, I'm going to say use this style, and it's going to use this style, and then it's going to generate all the pages that we need.
So, here we have seven pages that we need.
So, now we have all the pages.
Here we have customer home, we have service details, really nice page, booking request form, customer booking status, we even have a map, helper dashboard, helper request management, and a user profile.
The next thing that we want to do is we want to tell Codex to fetch these designs and implement them, bake them into our app.
And so, let's take a look.
So, this is called FlexHelp Marketplace, the name of the project here.
And so, now what we're going to do is we're going to go back to Codex.
We're going to close out this section here, and we're going to give it a prompt that's going to ask it to connect to FlutterFlow designer, look at that specific project and grab those designs and then bake them into our app
right here.
And I have a prompt here to do just that.
So, here's the prompt.
Update the Flex sub static UI to match the approved FlutterFlow Designer reference.
So, this is the main prompt, but we also need to ensure that we tell it that we want to use the FlutterFlow Designer MCP.
Use FlutterFlow Designer MCP and then project is because there are multiple projects.
We want to copy this project here.
This.
And we're going to go into plan mode just to make sure that everything is good.
And I'm going to run that.
And here it says, "Next, I'm opening a Designer MCP session." And once it does that, you can see you can actually see the agent working.
This is our agent, our client cuz Codex is acting as an MCP client connecting to this MCP server.
And as you can see, it's it's analyzing this page.
And you can see this little Codex icon here.
And you can see it says here, "One active agent." It's studying the designs and then it's going to pull the designs back here and build an actual UI using those designs.
And the goal here is to ensure that it builds a pixel-perfect or at least as close as possible to what we see here.
Okay?
So, let's see what it's doing.
So, now it came back with a plan.
Update the existing React static UI to visually follow the approved FlutterFlow Designer reference.
So, here it's it has five pages, but over here we actually have more.
We have seven pages.
So, I don't know if I if it missed it or that I did not it was it wasn't part of the prompt or some mix-up.
So, we want to make sure that it captures all the seven pages.
Ensure that it captures all the seven pages from FlutterFlow Designer project.
Okay?
And still in the plan mode just to make sure we get this right because our app ideally should should have all of these pages.
User profile, helper, request management, helper dashboard, etc. etc.
All of these make sense.
Okay, so it went ahead and it updated it and it's going to add static page components for all seven pages.
Okay, submit this.
All right, so it has implemented the seven page designer reference update.
Let's go ahead and see how it looks.
All right, so this looks a lot better in my opinion.
All right, we have settings.
We do have the CH customer home.
Do we even see that?
I don't even see that here.
But this customer home service details, click on book.
So this menu we need to kind of remove this.
So let me go ahead and sell it.
What are those abbreviations?
Let's see.
Do they need to be there?
Let's see what it says.
But it looks a lot cleaner than than the original UI, at least to my eyes.
And now we're doing a little bit of tweaking, clean-up plan.
Okay, they were placeholder text icons used to mimic the nav icon column.
So we need to remove that and we should probably remove any other placeholder icons.
But right now it looks fairly clean.
Static preview, what is that?
This this also needs to be removed.
So we're going to actually tell it check for any placeholders and see if you can match what it should be on the design.
Pull pull the design elements and re-replace these placeholders with with the actual design.
All right, so it has fixed it.
Now it looks a lot better.
We still see some other static preview.
That's okay.
Let's see if they go away once we have real data being fed.
So once we're happy with the UI, we can start designing the backend.
Data model should match the screens that we actually have here.
And so for FlexHelp, the first schema to support service browsing, helper profiles, booking creation, and helper status updates.
Anything beyond that can wait.
And here's a prompt that we can use to connect our app to Convex, okay?
We're going to be using Convex for this app as well.
So, we have here connect let's help UI to live Convex service and helper data.
Let's go ahead and keep it in plan mode.
All right, so this is our plan.
This is the Convex read path plan.
Connect the customer facing marketplace UI to Convex for the first database back read path.
The repo currently has no Convex setup.
So, add Convex from from scratch, etc., etc.
And we have Convex here running.
We have these three projects.
One that was created for the other app that we did, and so we're going to be creating another project for this app as well.
All right, so it has implemented the first Convex back read path for the customer marketplace.
And these are the files that has changed.
This is what's connected.
And if we jump into our Convex dashboard, we can see we have a brand new project here that wasn't there before.
And if we jump here, we should see that we have a deployment here on my own machine.
This is a local deployment that Convex is running on, right?
This is not on Convex, it's on my own machine.
And we also have a production, right?
So, with this deployment here, you go into data, we can see that we have categories, we have helper profiles.
We also have services.
And then we have a bunch of functions, right?
Marketplace list, and then we have seed, creating seed data.
Now, if you go into production, we may not see anything there, right?
There's nothing there because we haven't deployed this app to production.
There's no need for a production deployment.
Now, if we jump back to Codex and we refresh the app, this is now data that it's pulling from my local Convex deployment, okay?
So, we have here Marcus.
If you go back here, we should see Marcus, right?
Helper profiles, there's Marcus.
And if I change Marcus, if I edit name and I change, let's say, Marcus, right?
And I go back here, now it's automatically Marcus E here.
Automatically updates.
If I change that to James, guess what?
Now it says James S.
So, as you can see, this is now linked to our local Convex instance on my machine.
Both of these are on my machine.
Now, the next thing that I want to do is I want to build out the booking flow, because that's the key in this app, right?
The ability to book these services.
And I have a prompt here as well.
We're going to be using this prompt right here.
Okay, add the customer booking flow to FlexHelp.
Inspect all of this, and I'm going to set this to plan mode.
And let's go ahead and run that.
That's our plan.
We're going to be adding the first customer-side booking creation path on top of the existing Convex back service listing.
And there's some information there.
We're going to implement this plan.
All right, so it has implemented the customer booking creation path.
And it also tested it out.
As you can see, there's also a booking here as well.
So, let's go ahead and see if this works.
All right, so let's say I want to book James.
Click over here.
So, I can't quite pick anything here, but I can do request to book.
Send booking request.
And I need an address.
Okay, so let's say do, I don't know.
We need auto-complete here as well.
Fill in every field.
Okay.
Okay, so task, task.
Okay, this I cannot fill every field.
Okay, customer, schedule, say 10:00 a.m.
And this obviously needs to be, you know, like a calendar picker, that kind of thing.
Okay, and now we have the booking request.
And I can click on view bookings, and I see my bookings.
Okay, so this was done by the Codex while it was testing.
So, now if we jump into Codex, we should see on my local instance here, we should see bookings.
And we see two bookings, okay?
Right here.
So, the booking flow seems to work.
There are some rough edges here and there that we need to fix, but for the most part, it is coming together.
Now, once customers can create bookings, helpers need a place to see and manage them.
The helper dashboard should show incoming requests and make it obvious what action the helper can take next.
At the simplest level, the helper should be able to accept or decline a request.
After accepting, the helper should be able to move the job into progress and then mark it completed.
Those status changes are what turn the app into a workflow.
This is also a good place to show the power of live data.
When a status changes, the UI should update and the Convex row should change.
That gives us a real end-to-end marketplace loop.
Customer request, helper action, back end state, and UI update.
And this is the prompt that we're going to be using.
Add the helper dashboard workflow for viewing booking requests and updating booking status.
Okay, I'm going to switch into plan mode and we're going to go ahead and send this.
So, it's asking me that how should the helper workflow handle the existing requested booking status?
Keep requested, this is recommended.
Preserve existing created bookings, show it as pending in the UI, or rename to pending.
Change the stored initial status to pending and require a small data.
So, we don't want any migration.
We just want to go with the easiest option.
And then, how should the helper request visibility work before auth is added?
Helper selected.
This is add a simple static helper switcher filter, so each helper sees bookings for their Convex helper profile only.
Simplest UI and back end, but less realistic.
So, we want helper selected.
Okay, we're going to select that.
All right, there's the plan.
Add the first helper-facing workflow on top of existing convex booking creation pack.
We're going to submit this.
Here is our progress.
All right, so he just implemented the helper booking status workflow.
And these are the files that changed.
This is what it did.
So it updated it through pending, accepted, in progress, completed.
It viewed it under helper James created booking this.
So it did all that.
It did some tests.
Let's go ahead and open it.
And let's see what we can do.
So this is the helper booking status.
I'm going to helper dashboard have my incoming requests, right?
So I can accept it, I can start it, and I can complete it.
Okay?
So that's the piece that is working.
I can also cancel it.
And that is canceled.
And that's it.
I can't come back to it.
I can't do anything.
Here we have recent activity, right?
Completed, completed, canceled.
And this is the one that did 148 116.
This is the one that it has completed.
This seems to work, right?
And we have canceled, we have completed.
Even a simple marketplace has different responsibilities.
Customers create booking requests and view their own bookings.
Helpers manage requests that belong to them or are available to them.
Admin or system logic may handle category alteration or platform level controls later.
The key point is that these rules should not only live in the UI.
Back-end functions need to enforce ownership and permissions because the UI can always be bypassed.
This is where Codex needs to think carefully instead of just adding buttons.
And so now what we want to do is we want to add the roles off and the access boundary layer.
And here's the prompt to do that.
Add the first practical roles off and access boundary layer around the existing flex help workflows, okay?
So we're going to go definitely in the plan mode.
We're going to run this and see what it says.
And so it has a question for us.
Which identity approach should this plan should this step plan for?
Demo sessions.
Add Convex back demo users and for Convex or add real Convex or sign and sign up more production shape but larger and currently beta or this clerk use third-party or provider.
Let's go with Convex or how should customer helper roles be represented for or version one?
Role plus profile.
So what is this?
Each demo user has customer helper both and helpers linked to one helper profile for request.
Separate accounts.
Customer and helper are always separate demo users.
Simpler boundaries but less flexible.
And sometimes when I'm not sure but I want the system to come up with a really solid answer.
This is what I usually type.
For the second question, what's the most durable long-term option?
Okay, that's the key here, durable.
Now let's see what it says.
The most durable long-term option is role plus profile.
Perfect.
That's it.
And for the first question, choose demo sessions for the for this core step.
Okay, so let's go ahead with demo sessions, okay?
So do demo sessions and role plus profile.
Let's just go with the recommendations.
Expand it.
All right, so now you can see that Codex is testing everything, right?
It's testing on the UI in the browser and you see this cursor right here.
The browser flow now confirms a customer created book booking appears for the linked helper and can be moved into in progress.
All right, so it has finished and it has implemented the demo roles and access boundary layer over here, okay?
So marketplace browsing stays public.
Booking creation requires a customer or both demo user.
Customer booking status only shows bookings owned by the signed-in customer.
Helper request status updates require a helper or both demo user with a linked helper ID helper profile ID.
And so, remaining limitation, this is still tutorial demo auth, not production authentication.
Real Convex auth or Clerk can replace demo session issuance later while keeping the same role profile access model.
And so, this should give us some uh role separation, right?
Some kind of authentication on the backend.
And here, if we jump into Convex, you can see we now have users over here, right?
These are the users, and there's a role.
So, you can be either both, or you can be a helper, or you can be a customer.
And depending on which role you're you're in, you can do various operations.
Here we have sessions, we have various services, we also have functions that also handle these roles.
So, you can list demo users, you can start demo session, viewer list for helper, list for customer, etc., etc.
And these functions, they are meant to work with specific roles, right?
So, that authentic- -ation is is baked in into these functions.
Now, when something breaks, the wrong move is to immediately ask Codex to rewrite a whole section.
The better move is to give it the error, ask it to inspect the relevant files, and make it explain the likely cause before changing anything.
That debugging loop is the same whether the problem is a browser error, a build failure, a Convex function error, or a UI state that does not make sense.
Observe the issue, diagnose it, patch it narrowly, and verify the fix.
And so, let's give it a prompt that will deal with this sort of issue regarding debugging, polish, verification, stuff like that.
We're going to be using this prompt over here.
Debug, polish, and verify the existing flex help product workflow.
Inspect the current app first, then identify this is smallest set of fixes and polish improvements needed to make the current workflow feel credible.
Let's jump into plan mode.
Right away, it tells us that I see a few concrete polish fix candidates already and it lists some here, okay?
And so, the build passes and both local servers are responding.
So, it's using an in-app browser now for a quick workflow probe.
So, the plan targets actual UI issues rather than guesses, okay?
So, let's wait to see what it finds.
And this is the plan that it came up with.
Tighten the existing customer helper Convex and demo app workflows without adding new product scope, okay?
So, it lists a bunch of things and we want to quickly scan assumptions.
No new marketplace features will be added, no payments, nothing, okay?
That stays and here's some key changes.
You can kind of scan through that.
Let's go ahead and submit this.
Right, so it is done and it has implemented the debug polish task.
And it actually fixed a lot of interesting things.
It fixed some placeholders, it did some testing, it switched to different accounts, actually cleaned up a lot of cool stuff.
So, if we take a look here, we can see that we can book, we can request a book, we can describe the task, we can fill all of this out, send, add the preferred date, and now it's showing in that I'm signed in as the customer, right?
And I can switch a demo user.
Now, I'm signed in as the helper and now I'm signed in as both.
Customer access, choose a customer demo user to create a booking request.
So, it's coming along really, really nicely.
And the final build step is deployment.
The app is not done until the front end is live, connected to the intended Convex back end, and smoke tested through the real product workflow.
So, let's go ahead and grab this prompt and let's go ahead and paste it.
So, deploy the existing Flex app with Vercel and smoke test the connected Convex backend, okay?
We're going to jump into plan mode so that it can prepare everything, plan everything out.
One thing that I want to tell it that I didn't tell it, and I'm going to do that right now, is I want to make sure it uses the Vercel package.
Use the Vercel Vercel plugin.
And I'm going to press command enter so that it steers the conversation because we want the model to ensure that it catches that, right?
That we want to use the Vercel plugin.
Which Convex environment should the deployed Vercel app use for the smoke test?
We want to use production.
And where should the front end be deployed?
New personal project.
Exactly.
This is a brand new project.
We already have a bunch of projects, right?
So, if we go over here, we have this project.
Actually, we should have used the existing project.
We already have this project, but I think it's going to create a new project.
Let's see if we can tell it.
I'm going to copy that.
See if we can use the existing project.
No need to create a new project.
And let me check.
So, this is actually plan mode, so we're okay.
Okay, implement this.
And here it's going to create a production.
So, if we go over here, remember we're using this.
We also have a production deployment set up.
So, it's going to be using the production deployment.
So, we should see data and tables and functions and all that good stuff as part of this deployment.
Production Convex is now seeded and responding with services and demo users.
So, if you go over here, we have everything now.
Look at this.
Sessions, services.
We have the data.
All right, so looks like it has deployed it, and now it's doing a couple of smoke tests to make sure that everything works in production because now it's in production and it's also using the production Convex deployment, right?
So, we need to test things again because, you know, it's using new environments now.
All right, and it is done.
Deployed FlexHelp.
This is the URL.
This is the Vercel project deployment ID.
Everything is live now, okay?
And you can access it as well at this URL, okay?
So, we have customer home, and I'm signed in as one of these demo users, customer or helper, right?
I can go into helper dashboard, and let's say I go I sign in as a customer, and I go into customer home, but I can't click here, right?
This is helper access, right?
Remember the roles, right?
It's it's being handled here.
And so, now as a customer, I want to book professional seasonal garden cleanup.
I'm going to book this, request to book, I'm going to fill all of this out, 10:00 a.m., 2 hours, it's fixed address, send booking.
Okay, so with booking request submitted, your request was saved, view my bookings.
So, we have all of these pending, and so now I'm going to log in as Marcus, and Marcus is going to go into helper dashboard, and now he sees the booking.
And I'm going to say accept or complete, it's completed.
Now, if I come back as Anders again, and I go into customer's home, booking request for maybe summary, right here, customer booking status.
Okay, there we go, completed.
And here we see completed.
This one is completed.
Actually, this one, for Marcus, it has been completed.
And then there's some more requests here.
So, the flow is working.
The flow is working perfectly.
Of course, there are so many other things that we can do, we can use real auth, we can change the page, we can update things, but right now, the core of the app works perfectly.
And just as a little bonus, when you reach this stage, there's more things that you can do, but one thing that, you know, right away that you can ask Codex to do would be something like suggest top five high impact, low effort features,
functionalities.
And I'm going to switch into plan mode, and we want to see if there is some high amp impact features that we can add that do not require a lot of effort.
And here they are, top five high impact, low effort next features I prioritize.
Functional marketplace search, booking detail view, customer cancel pending requests, etc., etc.
And if you don't want to implement these right now, what I like to do is save this list as dots.todo.md as a markdown file and prioritize each item on a scale of one to five, one being urgent.
And so that way I have a constantly evolving list of things that I can build in the future.
So I do not need to ask Codex all the time constantly, you know, you know, to to suggest new features.
And I'm going to say submit and that's going to go create this dots directory as well and this todo.md, which is the file that I usually keep to store new features.
And now we can open this file and say, "Codex, so this is priority one, two, three, four, five." So now we have a an app that is live, that is on the internet, that we have built, that works.
This workflow, this main workflow works as expected, but of course, there's so many things that you can do to improve this app.
And in some of the later videos, I'm going to be showing you some more advanced Codex techniques that you can use to make your apps even better and more robust because I've been using Codex for a while now and I have some advanced tips and tricks that I'd
like to share you in some of the future videos.
And so I really hope that you enjoyed this mega Codex tutorial.
Now, if you want to go ahead and build this app or modify this app or whatnot, I'm going to be leaving all my prompts, every single prompt that I used to build this app inside of our amazing Patreon community and you can check it out and
hopefully join.
There are lots of great people there and of course, support this channel, and support my work.
And so, like this video, leave a comment, and check out our amazing Patreon community.

尚未產生學習筆記

請在 Telegram 指令最後加上「學習」,例如:videonote 網址 英文 雙語 學習