Vibe Code a Full-stack App Effectively - complete tutorial & workflow
By Wasp
Summary
Topics Covered
- Full Video
Full Transcript
Hey people. So there's a lot of talk about vibe coding apps and there's, you know, a lot of hype and there's also some skepticism around it, whether you can really make complex apps or not. So
I kind of set out to see if that's possible. And I'm going to walk you
possible. And I'm going to walk you through how I built a fullfeatured full stack uh collaborative envelope
budgeting app with um a few tools with including cursor and using Gemini 2.0. 0
I'm sorry 2.5 Pro to do it and I want to do this to kind of give you a realistic uh view into what that looks like and if it's possible and I will say it is
possible um you need to have some coding knowledge of course and the more you have and the more you understand your project uh files the better um but yeah
uh this is going to be a long form video and there will be timestamps so you can jump around to the sections that are uh interesting to you or you can follow along completely. Um I'll have the repo
along completely. Um I'll have the repo up so that you can start at the same point that I'm starting at and use the same prompts that I'll be using more or
less. And yeah, so um let's just get
less. And yeah, so um let's just get right into it. Um like I said, the goal of this video is to be a realistic view of a complete walkthrough of vibe coding a fullfeatured fullstack web app. And I
found a pretty decent approach to vibe coding with cursor in Gemini 2.5 Pro, which I'd refer to more as this guide coding because we're creating really um
detailed plans, implementation plans, and we're going through them very carefully and building on top of simple uh vertically sliced full stack features
and building on top of them um over time in complexity. So we start simple and
in complexity. So we start simple and then we get more and more complex. Um,
we're going to do a collaborative envelope budgeting app because this is something that, um, a lot of people said that they would like to have. They don't
want to pay for. There's similar
solutions that are like 10 bucks a month. And you can build this yourself.
month. And you can build this yourself.
Um, you know, just run it locally or host it uh somewhere just for yourself and and your roommates or your partner and collaborate on your budget. So, it's
pretty cool um app to have kind of in your arsenal. And yeah, it's something
your arsenal. And yeah, it's something that's just complex enough that um wouldn't be easy to do um that I'm sorry, it's complex enough that like
when you're using these tools and using AI to actually make the app, it's impressive enough, but it's not too complex that it's going to take um get
really crazy and maybe um uh be harder to do than you might have expected. So
the basic approach that we're going to use is we're going to start with a strong basis. So we're going to start
strong basis. So we're going to start with a strong template and the template that I'm using here is um shad CN admin.
So these are UI components that are built and specifically for an admin dashboard. And this gives us a great
dashboard. And this gives us a great start for um building an budgeting app, right? So we have lots of numbers,
right? So we have lots of numbers, calculations, the monthly budget, the different envelopes, things like that.
So this is what the template looks like when you when you get it. And it's
simply UI. So front end stuff. There's
no backend. There's no functionality here. You can't do anything. This is
here. You can't do anything. This is
just dummy data. Um but it looks really nice. So great, we've got all these UI
nice. So great, we've got all these UI components that we can use. And I've put these into a Wasp project. And WASP is a full stack framework with batteries
included. And just by defining some
included. And just by defining some things in an um in a main config file like for example authentication, you get full stack authentication managed for you by Wasp uh without having to write a
ton of code. And this makes it really easy as well for the LLM to code these features for you and to create these features for you. So, I've got this Shad
CN admin template um in a Wasp project and this has really helped jumpstart and guide the coding process. So, yeah, um I spent a few days
process. So, yeah, um I spent a few days getting this process down before trying this now on stream and um it was working
surprisingly well. So um yeah, starting
surprisingly well. So um yeah, starting with the template um I've also created all the rules for AI files which previously if you've been using cursor
it was all packed into one cursor rules file um but now they've switched to this um these MDC files and um so I've got both here in the project. Uh you can choose which one you want to use.
They're going to deprecate the cursor rules file. So the um separate rules
rules file. So the um separate rules within MDC files is actually um the way you should go. Uh so yeah, like I've got these um uh files all set out that have
all the rules and they're pretty extensive. So this also a big help um
extensive. So this also a big help um having that down. Um so that's already done for us. And from here we're going to create and revise a product requirement doc which is like a really
nice description of how the app should uh be behave and and function. And then
from that we're going to generate the plan and we're going to use the vertical slice pattern like I said before which is we've got a full stack app. So we
have features that go across the entire stack from the client to the database layer and we're going to develop one of these full stack features at a time.
Start with simp um low on the complexity and scale up. And we're going to constantly ask LLM to test our assumptions. We're going to ask it to
assumptions. We're going to ask it to you know think about different solutions before choosing the best one and implementing it. And that's basically
implementing it. And that's basically it. So, um yeah, let's go ahead and uh
it. So, um yeah, let's go ahead and uh get started. Um I have some prompts that
get started. Um I have some prompts that I prepared here. So, I'm just going to copy copy this um initial prompt real quick. And
quick. And um I will read it off to you so that um you don't have to read it all. But let's
go first to set up a new chat. And like
I said, I'm using Gemini 2.5 Pro. I
found that this has been really great um for uh yeah vibe coding. Um Gemini seems to really get what what's going on and what needs to be done and doesn't um
always just agree with you, which I like.
So yeah, before we do that though, let's just jump through the project um real quick and I'll show you what we've already got. So we've got all these components, the shad CN admin
components in the components library along with some config and context for the app. Then we got these features
the app. Then we got these features here. So they correspond obviously to
here. So they correspond obviously to the features in the app which are dashboard tasks, apps and stuff like that. So when I see things like the
that. So when I see things like the tasks already, I already think like, okay, this will be great for transactions for putting in transactions
um that uh correspond to um uh yeah, expenses or income, right? That will be good for this budgeting app. So yeah,
you see we have a really good starting point here. That's about it. Um besides
point here. That's about it. Um besides
that, we have the main.wisp file, which is the central config file. I said um that yeah is where you it's a a a central point where you can describe
your app with um things like o your client and server config uh your roots and your backend um uh operations which
are like uh fetches and mutations. So by
defining them here and then importing the function that um uh it refers to you don't have to uh manage and configure
the entire server. Wasp will do that for you. Um the roots and the authorization
you. Um the roots and the authorization things like that authentication it will take care of all this stuff for you and even give you some um pre-built components and other things like that.
So it's really great for um speeding up the process and removing a lot of boiler plate. So, that's pretty much the
plate. So, that's pretty much the project in a nutshell. Um, so yeah, let's get coding. Um, I'm going to paste
the first prompt in. And um, I wish it showed it here. Is there a way we can get it to show? Maybe I can right click it.
H, so it doesn't show it. So, I'll read it from the note.
Um, so the goal of uh, sorry, here it is. I want to create a collaborative
is. I want to create a collaborative envelope budgeting app with the current template project I'm in which uses Wasp and Shad CNN UI components. It's an
admin dashboard. So, it'll know about WASP already because I have a whole cursor rule about what WASP is, the Wasp docs, how it works, stuff like that.
Also, project conventions, how I want things to basically be done, as well as troubleshooting, like if you run into these errors, this is what you should probably do. So it's going to have a
probably do. So it's going to have a good understanding of of how Wasp works and what the common issues might be be around it. So go back to the
around it. So go back to the prompt.
Um leveraging Wasp full stack features such such as off let's build this app based on the following specifications. Users have one budget
specifications. Users have one budget profile they use. Users can invite others to collaborate on the budget with them via their email. Transactions can
be individually entered manually or bulk implemented via CSV files from their bank. Bulk import shouldn't assume a
bank. Bulk import shouldn't assume a certain CSV file format but rather map the headers of the file to a set of predefined values within the app like
date, description, value type. And um
this is just like if you get a file a CSV from one bank, it might be way different than another. So we basically want certain information. We want the date, description, the value, and
whether it's an expense or an income, right? Um, and so we're going to map
right? Um, and so we're going to map whatever values from that CSV when we import it, we're going to map those to those values that we set in the app. Uh,
new features should be styled and created using the demo features in the source features uh, directory as examples. And we want to use this
examples. And we want to use this modified vertical slice implementation approach that's suitable for LLM assisted coding. I do this a lot. I
assisted coding. I do this a lot. I
often ask it like hey is this great for LLM assisted coding I don't know if it helpful or not but it seems to work for me with this in mind I want you to first evaluate the project template think
about few possible PRD approaches before landing on the best one so provide reasoning why this would be the best approach remember we're using Wasp the full stack framework with batteries
included that can do some of the heavy lift lifting for us and we don't need to create an enterprise level app it will be for personal use we want to use the vertical slice implementation approach.
So we can start with the basic implementations of features first and add on complexity from there. And one
thing I forgot to mention before we start, we want to actually start the app. And because this is a full stack
app. And because this is a full stack app with a postgrad database running locally, we um have to install Wasp, which you can you can get the install
script um from wasp.sh.
wasp.sh.
And I'll show it real quick.
we go to getting started. You'll see
there's a install script there. You're
going to paste that into your terminal and run it. You'll get Wasp uh um installed. And then you'll want to have
installed. And then you'll want to have Docker I have Docker Desktop installed and running. And then with that, I can
and running. And then with that, I can run Wasp DB start. And this starts a Postgress database that's connected to our app right away. And we leave that running. And we open a new terminal
running. And we open a new terminal window. And we're going to run wasp
window. And we're going to run wasp db migrate dev just to initialize the database. But I've already done that. So
database. But I've already done that. So
I'm going to run wasp start. Whoops.
Wasp tart. Wasp start. Um it says use nvm uh node version 20. So nvm use 20.
If you run into that, make sure you have nvm installed and you can switch between um node versions. So let's we're using node version 20 now. and I can run wasp
start. Okay, now it's building the
start. Okay, now it's building the SDK, compiling the app, and then from there, h it does look like I need to
um uh to migrate the database. So, I was wrong. So, let's do wasp db migrate dev.
wrong. So, let's do wasp db migrate dev.
Okay. And we've got the app running. And let's tell it here's I've
running. And let's tell it here's I've copy and pasted the prompt. It put it up there. So I'll just say please implement
there. So I'll just say please implement the PRD as [Music] described. And we're
described. And we're off. And you'll see it does a lot of
off. And you'll see it does a lot of thinking in the background. and it's
going to give um a lot of stuff that I can't read fast enough. But I'm just going to go ahead and accept a lot of the um changes that it makes. And we'll
just deal with problems as they arise.
Hopefully stuff's work works. We'll
check it out as we go. Uh you can see it's creating um a plan that will or a PRD that talks about
um let's see. Ah, so it has a proposed
see. Ah, so it has a proposed implementation plan, but it didn't write it to to the the disk. Um, and what I
want to do here first is create a AI folder. And I'm just going to put the
folder. And I'm just going to put the plan MD and empty PRDMD in there. And
I'm going to say now it's given me this uh these phases. Um, it's a proposed
phases. Um, it's a proposed implementation plan. Phase one, phase
implementation plan. Phase one, phase two, phase three. And it asks, shall we proceed with phase one? Sure. Let's
proceed with phase one. Write the PRD to the PRD. MD file.
one. Write the PRD to the PRD. MD file.
And I got that just by writing at and then searching PRD.MD. And let's see what it does for us. I'm going to switch to agent mode so that it uh makes changes for us. That's probably
why it didn't do it before. It might
have been in ask mode still. Cool. So now we see it applying
still. Cool. So now we see it applying changes. Cool. And they're over
changes. Cool. And they're over here. So core features implementation
here. So core features implementation guidelines. Let's see what it's doing
guidelines. Let's see what it's doing now. Okay. So on quick overview, it's
now. Okay. So on quick overview, it's not really that big. Um it gives us basically what we said before, but it breaks down its core features into um a
few different parts and a few implementation guidelines. I like
implementation guidelines. I like that. But now I'll say okay, now you've
that. But now I'll say okay, now you've created Oh, I think I actually have a prompt for this. So let's go back and I have a plan prompt. So I'm
going to give that. And it says, "From this PRD, create an actionable step-by-step plan that we can use as a guide for LLM assisted uh coding. Before
you create the plan, think about a few different plan styles that would be suitable for this project before selecting the best one. Give your
reasoning for why you think this uh we should use this plan style." So, let's paste that
style." So, let's paste that in. And let's see what it does.
in. And let's see what it does.
I forgot to mention that it should write it in um plan.md. Let's maybe it figures that out by itself. Planning style for this project
itself. Planning style for this project vertical slice imitation or a milestone based combined with user
stories. All right. So it's wants to
stories. All right. So it's wants to create user stories that we can go from. It's creating four phases. The plan provides a structured
phases. The plan provides a structured row map. Say write this plan to plan
map. Say write this plan to plan MD. And we want that so that we can, you
MD. And we want that so that we can, you know, implement one thing at a time. Um,
we can just go subtask by subtask and break everything up into chunks for the LLM. Okay.
LLM. Okay.
Great. So, we've got it all there. The
phase three, phase 4, CSV import is phase four.
Um, let's see what we got there. Budget
category, budget profile, entity. Um, I'm just going to ask it a
entity. Um, I'm just going to ask it a question real accept that and ask it a question real quick. Say in the
plan, do we have instructions for implementing envelopes? Remember, this is an envelope
envelopes? Remember, this is an envelope budgeting app. And if it doesn't, we'll ask it to
app. And if it doesn't, we'll ask it to update it accordingly because I'm not going to read all that revive coding.
says, "Yeah, the implementation does include for envelopes concept below primarily refers to them as budget categories." And then I'm going to say,
categories." And then I'm going to say, "Can you refactor the plan to include um specific
mention of envelopes for our envelope budgeting app?
also refactor it to use these little things which are to do check boxes.
Right.
So, oh, I forgot to put it. I'm going to stop. I'm going to I forgot to put it in
stop. I'm going to I forgot to put it in agent mode. Let's just go to agent mode
agent mode. Let's just go to agent mode so that it can um make changes on its own. All right, great. Now you see there
own. All right, great. Now you see there it's refactoring everything to use checkboxes so we can check those off as we go which is great. It's a lot cleaner
that way. Um let's see. Did I mention
that way. Um let's see. Did I mention envelopes and envelopes? Yeah. Budget
envelope I created.
Um okay. It's still putting envelopes in in parenthesis. So I'm going to say
in parenthesis. So I'm going to say explicitly change the
category model to be named envelope and update the entire plan
accordingly.
Oops.
Agent. Yes. I want to fully commit to the envelope terminology. Okay. So, it says now uses
terminology. Okay. So, it says now uses envelopes. Let's see if that's correct.
envelopes. Let's see if that's correct.
If I go up here, yeah, budget profile entity. Budget envelope entity. Great.
entity. Budget envelope entity. Great.
So, we're going to have envelope models in the database. Um, we're going to apply that to plan MD.
We're going to accept changes. Accept all.
changes. Accept all.
Perfect. All right.
And from there, I think we can start implementing. Right. So, let's just look
implementing. Right. So, let's just look at it real quick. Phase
one, we've got the goal is to establish user authentication, create the basic budget structure, and allow users to manage budget envelopes. So, step one.
Oh, why didn't we get the nice um to-do boxes there? That's
there? That's annoying. I thought we had
annoying. I thought we had that. There you go. This is what vibe
that. There you go. This is what vibe coding is all about. Complaining to the LLM refactor
plan MD to use. Check boxes, please.
or you go to jail. Okay.
jail. Okay.
Accept. Accept it all. Accept it all and let's go. So number one, off setup.
let's go. So number one, off setup.
Configure and verify wasp built-in off username and password. Ensure users can sign up, log in, and log out. Define as
necessary fields, email, hash, password, etc. Implicitly via W wasp config or explicitly in if needed. Okay, we know I know that wasp doesn't need hash
password and all that stuff. So I've um done that in here. It says agent requested which means the agent is doing anything related to off it'll look up these rules. So let's see if it can do
these rules. So let's see if it can do that um correctly. So I'll say great let's
implement step 1.1 from the plan.
Let's reference um the three database operations
reference off rules for your process implementing whatever just leave it like that. I don't know what I mean I
think. Great. So it's looking at that.
think. Great. So it's looking at that.
It's referencing rules and it's figuring out that it's going to use a different method from uh Wasp. Instead of username and password,
Wasp. Instead of username and password, it will use the email method. Let's see
if we can get it right. It's pretty
tricky to be honest. Um I was impressed with what it
honest. Um I was impressed with what it did last time. Okay, so it's changing
time. Okay, so it's changing the method to email, adding an email sender. Um, it's implementing
sender. Um, it's implementing some different off pages.
Cool. Which it's probably defining here, right? So, it's implementing the
right? So, it's implementing the uh off pages and routes in the file. Um,
so I'm just going to accept.
And let's see. We got some errors down there for a second, but it might uh Okay, one error found. Um, let me just copy and paste
found. Um, let me just copy and paste these to the chat. Say, fix these errors, please, or
chat. Say, fix these errors, please, or you go to jail. Okay, so it's looking for O
jail. Okay, so it's looking for O wrapper. Um, might
wrapper. Um, might not I don't think there is any O wrapper.
So, it's going to fix email verification. It says assuming an
verification. It says assuming an offrapper exists. Okay. So, I can see that it
exists. Okay. So, I can see that it actually had a better um better implementation from the beginning.
Um so, I'm actually just going to stop this. And this is because I I know that
this. And this is because I I know that Wasp gives us um O stuff out of the box.
Um and so yeah, this email verification form like it was right. It was getting that. Um and I think the issue here is
that. Um and I think the issue here is that I have this authentication thing set on agent requested. I'm just going to set it to always. I think that'll be a better approach.
Um as well as the advanced troubleshooting so that they're always passed in the context. So, let's just reject all and let's go back up to where we started where it
says where was it? Uh,
here. Fix these errors, please. And
let's just try it again. See if it gets it this time. And this is an instance where
time. And this is an instance where um I know that off gives uh Wasp gives
these uh off UI forms um right away. So,
it looks like, let's see what it exports from off UI. Um, verify email form. So, it's just
UI. Um, verify email form. So, it's just getting the the name wrong. There it
goes. It got it right. And it's trying to rely on this O wrapper, which doesn't exist. So, I don't know why it's hung up
exist. So, I don't know why it's hung up on that. And we're just going to accept
on that. And we're just going to accept it and um not use the O wrapper.
Um, in fact, there's this one has a decent wrapper. So, why don't we just
decent wrapper. So, why don't we just use that one? I think that would make more sense.
Um, ah, it's getting it now. There it
goes. So, I think just setting that. So,
that's a good thing to look out for.
Um, these rules when you use MDC files, you can see agent requested. So, like if the agent's looking for it, um, you can set it to always or you can set it to
manual. And uh last time I used the
manual. And uh last time I used the cursor rules file. This time um I'm using the MDC files. So I'm just going to leave most of them on always. So
they're always being passed into the chat context. And let's accept. Let's go
chat context. And let's accept. Let's go
see if we have any more errors in our uh terminal here. I'm hoping this will work. Looks
here. I'm hoping this will work. Looks
like it looks good. Yep, we got the right things being exported. We got
login and sign up coming from Wasp off.
Um, so yeah, that looks like a good start. It says recompilation
start. It says recompilation successful. Let's try it. If we go to
successful. Let's try it. If we go to Right now, nothing's being logged in.
Nothing's being uh authorized. So, if we go to login, cool. We go to sign up. Let's sign up. Where is it? Sign up.
up. Let's sign up. Where is it? Sign up.
Oop Sign up. Okay, let's let's try and sign up an account. So, we need an email. So, we're just using it's just um
email. So, we're just using it's just um uh development. So, we can use fake
uh development. So, we can use fake email sign up. Okay, we get a network error. Where's the network error
error. Where's the network error happening? Let me try again. Create a
happening? Let me try again. Create a
new account.
email.com fake password. Okay, I don't see anything
password. Okay, I don't see anything here. So, let's see what we see in the
here. So, let's see what we see in the console. And we can
console. And we can um What's this? Get out of here. One
password. React router. Create new
account.
Vinnie.com password one two three. Uh
connection refused. Why is connection refused? Is it not working? Is the thing
refused? Is it not working? Is the thing ah oh we have some is not let me try and run the I
think the database wasn't running let's see if we do it now ready to accept and if we do start okay so I did I canceled
the um the postcost database running locally and I restarted it um and let's see now if we can get things to
work at email.com password 1 2 3. Yay. So, we're
using a dummy email sender um instead of a real provider. So, like send grid or something like that or an SMTP host. So,
it's going to log the verification uh email to the um uh the console. So, I'm going to click
it. Email verified. You can now log in.
it. Email verified. You can now log in.
Let's see if that's true.
Um localhost login.
Vinnie.com. Cool. And it worked. And we
can um check that that worked by looking at the console for one. Or we can go to our main.wasp file. And I don't need the
our main.wasp file. And I don't need the um uh what do you call it? the
uh LLM to put in one line, but all we have to do is put in one line to make this route, this page um uh uh authorized. So you have to be
authorized. So you have to be authenticated to log in. So off required is true. We can do the same for any
is true. We can do the same for any other page. Let's just do it for that.
other page. Let's just do it for that.
So we are logged in. Cool. So I will ask it, can you please um mark that step as
complete? That's something I could
complete? That's something I could probably also do myself, but vibe code. We're vibe
code. We're vibe coding. Yeah, that that's kind of
coding. Yeah, that that's kind of stupid. Let's stop
stupid. Let's stop that. Okay, so great. We got off set up
that. Okay, so great. We got off set up pretty easily. Ready to move on to step one
easily. Ready to move on to step one two? Yes. Let's move on to step 1.2
two? Yes. Let's move on to step 1.2 which is budget profile uh entities or database models. Um was refers to them
database models. Um was refers to them as entities because they can be used these database models can be used throughout the entire app. So let's see
now. Thinking thinking thinking we're
now. Thinking thinking thinking we're going to create a budget entity in the schema.prisma. Prisma file link to the
schema.prisma. Prisma file link to the user. Establish logic perhaps in a user
user. Establish logic perhaps in a user creation hook or first logic action login action to ensure each user is associated with a budget.
Cool. Okay. So it's selfcorrected and it's applying changes to the budget. I'm
sorry to the schema.prisma file. adding
budgets and it's adding relations to be defined in later steps. I like that.
That's really cool. That's great. It knows what it's
cool. That's great. It knows what it's going to do in advance because we created the PRD and this plan. So,
that's really nice. Okay, now we need to run Wasp DB migrate dev. I hope it works in here. I don't know why I can't. Let
in here. I don't know why I can't. Let
me do pop out ter to terminal. Let me do nvm or let me do it here.
Um, I don't know why I have keep having to switch to that, but let's do Wasp DB migrate dev after switching to node 20. Okay. And it says, let me know when
20. Okay. And it says, let me know when you've updated Node.js and successfully run the migration. So, smartbot knows to
and we're going to call this budget entity and then wasp start and I say
okay I migrated that database buddy.
Um okie dokie. So, now it's doing
dokie. So, now it's doing stuff. There's our
stuff. There's our app. It looks like we crashed. Let's
app. It looks like we crashed. Let's
restart while we start. This buddy just keeps on coding.
start. This buddy just keeps on coding.
Um, cool. It's adding an off hook on user signup.
Um, did you mean on after signup hook?
So, let's try that on. So, we got an error here. It says uh has no exported
error here. It says uh has no exported member called um on user signup hook server hooks.
Uh okay. So let's just again let's pass it to the chat and say uh let's say accept all. Pass that bad boy to the
accept all. Pass that bad boy to the chat. Say
chat. Say fix. So it looks like it's referencing
fix. So it looks like it's referencing the wrong um type definition. It should match this one. So it should be
one. So it should be um on after signup or something like that.
I mean the error pretty much gives you the answer there right on after sign up. Um I think it's expecting different
up. Um I think it's expecting different arguments expected two but it got one. So it's consulting the wasp
one. So it's consulting the wasp documentation on on after signup hook which is pretty cool. I'm going to click auto search for next time, but it's going to look at the docs and try and
figure out what's going on here. So,
that's really sweet. Um, pretty amazing to be honest because that would be the point where I would have to go do that myself. So, it said got it. The search
myself. So, it said got it. The search
results confirm the signature of on after signup. And wow, look at
after signup. And wow, look at that. Fixed it for us. Pretty nice.
that. Fixed it for us. Pretty nice.
I'm going to say accept. Let's go back and run wasp start to start the app. Oh,
what do we have? We have an issue here in the file. Uh where did hooks
file. Uh where did hooks go? Hooks uh type error again. Let's
go? Hooks uh type error again. Let's
just pass the to the chat and say fix. Looks like
we have an issue with the field hooks.
Um, it'll probably do some searching probably on after sign up, but as it's suggesting, but let's see what it
does. Yeah, on after sign
does. Yeah, on after sign up. So, cool. There's a good instance of
up. So, cool. There's a good instance of where it's going to assume some of the things some of the definitions on its
own um without consulting the um uh the docs and then it runs into an error and then it consults the docs and it realizes okay you don't have to define
it via the um a hook object. So with
that, we should be able to run again.
And the reason it's doing that, I saw when it was creating, is that it's going to create a sign on after signup hook that will look if a budget profile has been created or not yet for the user. So
if it's the first time they're logging in, there won't be. And it'll probably um redirect them to
um to that uh budget profile um uh page to create one.
Um, so cool. Uh, let's see. Okay, where
were we at in the plan? What should be done next?
Um, okay, we finished the implementation. Um, the next step. So,
implementation. Um, the next step. So,
they finished the implementation for that. So, let's just go to our plan and
that. So, let's just go to our plan and we will check that off. And it says next is um budget envelope entity. Are we
ready to create the budget envelope entity in the schema prisma file? Um
yeah, let's do it. Cool. So after we create these
it. Cool. So after we create these database models, you'll see it's going to want to create the operations which are the backend functions um our server side functions for things like creating
an envelope, getting envelopes, stuff like that.
Um I wonder if there's any if it's user creator first login. Um if it'll just create a budget
login. Um if it'll just create a budget on we'll see probably create one budget.
So there will be a budget. The way I imagined it is like you have one budget that's like called, you know, my household budget or whatever. And then
um you have envelopes within that, right? So your food envelope, your fun
right? So your food envelope, your fun envelope, your blah blah blah, whatever you um allocate money to. Let's see if I can run the command in there. And that's
really annoying, but um there's probably a way to fix it, but I'm just going to roll with it here and run wasp db migrate dev from in here. Um, and it
even tells me what name to name the database migration add envelope model. I
will do that. Thank
you. Okay. And then I'll say okay migration is done though. And wasp start again. If anybody
though. And wasp start again. If anybody
knows how to fix that so that the cursor uh embedded terminal also uses node version 20, that would be great. Leave
it in the comments. Okay, cool. So,
migration is done.
Um, so it's saying, yeah, they confirm the data migration. Okay, so this is where we move on to the fun stuff.
That's just a couple database migrations. No big deal. So now we've
migrations. No big deal. So now we've got the budget envelope database model, but now it wants to implement this task with many other subtasks, which are the
create operations. So in the back end
create operations. So in the back end the backend functions like things like hitting the server to create an envelope, right? It's defining an async
envelope, right? It's defining an async function blah blah blah update. So it's
already started doing that and you'll see there's an operations folder. So
let's go to it's created a budget folder operations. So here are our backend
operations. So here are our backend functions and we're getting those um our server side functions without having to actually configure the entire server.
Wasp is doing that for us. We just have to define those operations in the main.
was file and then it's create um creating the the function here that um being defined. So we've got things like
being defined. So we've got things like create envelope, get envelopes, etc. And um yeah, an action and a query, right?
Create envelope and get all your envelopes. So it's done that. Um great.
envelopes. So it's done that. Um great.
The create envelope and get envelopes queries are now defined. This completes
step 1.4. Um I don't know if it completes all of it. Does it? Um let's
accept all and let's go to the plan and see plan. Um right we have create envelope
plan. Um right we have create envelope um get envelopes but we didn't do update
and delete. So I'm going to say it seems
and delete. So I'm going to say it seems like we still need to imple implement the
remaining remaining operations from 1.4. Please do so. Got to be nice to
1.4. Please do so. Got to be nice to your LLM. You know, you don't want the
your LLM. You know, you don't want the AIS to get mad at you and get payback when the singularity comes. Or so I've been told.
comes. Or so I've been told.
The funny thing is on stream or on video like a lot of times when it's doing um LM's generating stuff. Um I'll go and do something else. Go and do some other
something else. Go and do some other work, come back, see where it's at, test things out, keep going. That's pretty
amazing part is that we can offload a lot of stuff. I think it'll be only a matter of time before um the agents get good enough that you don't have to hold
their hand so long.
Um so let's see. Okay, so it says it's done those things. I'm going to accept all and just go take a look at the operations
folder. We are getting
folder. We are getting errors as any type because maybe it hasn't been defined yet or we have errors in our thing. What's going on? Um
uh something unexpected field off. Oh,
okay. So, I know what the issue is. It
says off on the budget page. It should
be off required, right? We could pass that in. Um here's the error. Uh where is
in. Um here's the error. Uh where is it? This is
it? This is off. Off
off. Off required. Where the hell is it?
required. Where the hell is it?
U budget page. Yeah, there's our our culprit. Surprised we're not getting a
culprit. Surprised we're not getting a um uh restart. I tried to restart the Wasp
uh restart. I tried to restart the Wasp language server. Well, we can pass that
language server. Well, we can pass that in there. I know what the issue is that
in there. I know what the issue is that we need to change it to required. O
required is true. But just for the sake of um demonstration purposes, let's add it to the chat and say fix. and it's going to find the culprit.
fix. and it's going to find the culprit.
And um it's kind of helpful to to know your your project and and know your apps cuz sometimes you can fix stuff faster than
the LLMs can. Humans aren't so dumb after
can. Humans aren't so dumb after all. Okay, so now we should be able to
all. Okay, so now we should be able to restart. And it's restarted on its own.
restart. And it's restarted on its own.
Nice.
Okay, where were we? I believe we were implementing the
we? I believe we were implementing the other Yep. Get envelopes, update
other Yep. Get envelopes, update envelope, and delete envelope actions on the server. So
the server. So great, these are you can see they are um validating if a user is logged in or not on the server, which is great. And I
think we can move to step 1.5 which is the budget UI. This is a basic budget
UI. Um I think we've resolved
UI. Um I think we've resolved those. Oh, there's a in budget page.
those. Oh, there's a in budget page.
What do we got? Okay, the components and budget page. Uhhuh. Did it already
budget page. Uhhuh. Did it already start?
Oh, it already started implementing those. Okay. So, did it do that
those. Okay. So, did it do that already? We have No, we don't have we
already? We have No, we don't have we have inlin errors here. Import shad cm components. Let's
here. Import shad cm components. Let's
say you know what? I think this is also, you know, I don't like that new feature.
I actually kind of preferred that having the cursor rules file all in uh one file and everything. So, let's just try that.
and everything. So, let's just try that.
I'm going to always pass all these rules into context every time because I see a front-end styling error. So, people
Yeah, select your your rule types in the MDC to be always. At least for this project, it seems to be the better option. So, I'm just going to go here
option. So, I'm just going to go here and I'm going to do the same thing and I'm going to say fix and chat.
Um, it looks like we've already do done handle create envelope. Do we have handle update
envelope. Do we have handle update envelope? Probably not. We just see
envelope? Probably not. We just see update. No. So, those are the next ones
update. No. So, those are the next ones we can handle in the plan. So, we're going to move on to 1.5
plan. So, we're going to move on to 1.5 next. 1.4 is done.
next. 1.4 is done.
And then we'll be able to see some interesting stuff in our actual app. For
now, a lot of it's just been database models and backend functions. Um yeah,
so it figured out that not to reference with aliases, but um relative paths.
Um that's just how I like to do it in the project file. Um I know Shad CN likes doing it with the aliases, but I'm a weirdo.
Okay, let's accept. And I'm going to say let's move on on to plan step 1.5.
Okay, so it's giving me two options. We
can implement the edit u delete UI now or we can move to phase two. So it
says we've actually already completed the main steps of 1.5, but um I like the idea of adding the
um edit and delete. So let let's do let's go with option one. So we have the edit and delete functionality of the envelopes.
And I want the um edit and delete op the edit button to open a modal. Um I think that'll just be nicer. So, I'm just going to say make
nicer. So, I'm just going to say make sure to open a modal dialogue
when click when the user clicks on edit and delete.
reference um how modals are built in the app under
the I can refer it to the components um directory directory. Okay,
directory. Okay, so let's tell it to do that and let's see what we get. go check out the budget
page. And the cool thing about Wasp is
page. And the cool thing about Wasp is the budget page. Um, you have to be authenticated to go there. And it's at available at budget. So, if our app
isn't throwing errors, then we can see it at /budget. And we'll also tell it to add it to the sidebar there. Okay. So,
there's add a new envelope. Not sure how much I like that. But the whole point of this vertical slice thing is do start simple and and you know get the basic um implementation down first and then
improve upon it o over time. So we'll
just stick with that. Um let's go check out what it's doing. Oh wow. Okay. Um it has a plan
doing. Oh wow. Okay. Um it has a plan for doing all that. Uh because I asked it to look at the confirm dialogue stuff which is which are the modals and it's just going ahead and and going to town.
Look at that.
Cool. Is it using the right stuff? How
does it look? Car title dialogue looks great. So let's
great. So let's accept. All right, it's recompiling.
accept. All right, it's recompiling.
There it says phase one is now fully complete. Besides the little bit of uh
complete. Besides the little bit of uh the few hiccups that we had on in the beginning there, it went pretty smooth.
So, we're going to go to add budget.
Let's just refresh. Let's say yeah, I think groceries is a good idea. So,
groceries. Say add
envelope. Oh, and we get an issue.
What's going on here? No budget found. Okay, so no
here? No budget found. Okay, so no budget has been created. So, that should be interesting. So, we need a budget
be interesting. So, we need a budget first. I know that your budget has to be
first. I know that your budget has to be um your envelopes have to be connected to a budget perhaps. Or maybe that's a bad implementation. Let's ask let's ask
bad implementation. Let's ask let's ask AI. Let's ask Gemini. Let's say okay,
AI. Let's ask Gemini. Let's say okay, I'm getting an error on the server that I've pasted into this chat.
Um, I initially asked you to create a budget
from which there are envelopes or within
which for each user so that other users can collaborate on that one budget.
together. Now I'm getting this no budget found error. Why is
error. Why is that? And is this a good way to
that? And is this a good way to implement this functionality? Okay, that was a lot,
functionality? Okay, that was a lot, but thanks to everyone who sticking with me here. I know this is quite long. We're
here. I know this is quite long. We're
almost at an hour. It looks like about an hour.
Okay. Uh when we create the envelope, the action runs. It's looking for find budget to find a budget first. The
existing user was logged in before we implemented the on after signup hook. Okay, that
makes sense. So, it is trying to create a budget, but we just didn't do it. So
um it's saying test the current flow by signing up a new user. Consider the
alternative approach which is don't automatically create a budget on sign up and add functionality for user to explicitly create a new budget.
Um I don't know. Let's just try let's just try doing the uh new user. And where are we? Over here.
user. And where are we? Over here.
Um, how can we log out? There's no log out thing. And we
out? There's no log out thing. And we
don't have it set up in the thing first.
So, let's have it create. Um, or we can Yeah, we want some log out functionality somewhere. So let's go back to agent
somewhere. So let's go back to agent mode and say okay I want to create a new
user but I realized there is no logout functionality implemented yet. Can you
put one in the nav user dropdown or yeah something like that.
So, you notice I kind of just like I talk to it like I'm like a dummy.
Um, but the LMS are nice and patient and they're smart enough to know what I want. Um, so it's going to use the
want. Um, so it's going to use the logout function from Wasp client off and it's going to put it in the profile
dropdown. Drop down menu item log out.
dropdown. Drop down menu item log out.
So, I don't know which one's the profile dropdown, but it did those edits. So, let's say accept. And let's go over
accept. And let's go over here and go back to home. Is that
profile? That's log out. Yeah. Yeah.
Cool. We logged out. Let's go to sign up. Man, that one's getting me. It's
up. Man, that one's getting me. It's
sign-up. And let's create dude@mail.com.
And let's look in our dummy email provider for the verification link. And
we get it. Awesome. And we want to go to localhost 3000/lo. And what was it?
3000/lo. And what was it?
Doemail.com. Awesome. Okay. And let's
see if we can create is it budget that the thing was a new envelope called groceries.
Yay. Edit allocated amount. Let's say we want $500 a month for groceries. Okay,
cool. Um I would like to see if it's like spent and stuff like that. So let's
just ask the LLM. Right, we've allocated 500 bucks, but uh I'm going to wait maybe during the transaction implementation phase, then we will update the um the budget um the
envelopes. So, so I'm going to I'm going
envelopes. So, so I'm going to I'm going to tell it that. I'm going to say, I just noticed that the envelope doesn't show
uh spent and remaining amounts, but I realize we haven't
implemented transactions yet. Can you
make sure that the plan will address thing this and other things like this when we
get to that point? And I'm going to reference the
point? And I'm going to reference the plan here at plan.md. And let's see what our nice
plan.md. And let's see what our nice friend says.
You've made a great observation. You're
absolutely right. The current budget page only shows the allocated amount from the envelope. So,
um it says phase 2 manual. uh uh uh uh to explicitly address this issue, I provise we add a new step. Okay, great.
Uh just to make uh the point, this is one of my things that I say like create and revise your PRD and plan like constantly test assumptions, constantly ask this is what you should be doing. Um
otherwise, you're going to run into issues later on. So, if you think something might not be uh right or is a little bit off or missing, you ask the LLM, get it to update your your your
plan or whatever code at the moment. You
don't have to follow the plan strictly.
You know, you can say, okay, like the logout functionality, for example, like let's add it right now. Um, you know, it's vibe coding. You should be vibing.
Uh, so yes, add that to the plan.
Um, I mean to be honest, this is pretty much how a uh implementation workflow would kind of look like if you were doing it on your own.
Um, you might realize it and you would just do it manually. Um, but now we're just getting, you know, AI to take care of a lot of the grunt work for us. So,
uh, let's see. It says
plan. Did it make the changes? Yeah.
Cool. So, we've got um that there. Um while we're at it, I'm going
there. Um while we're at it, I'm going to say with this recent addition to the plan in mind, can you go through our
plan and look for similar inconsistencies?
Think about our current implementation and
um yeah decide after ruminating about it buddy. We'll see what it gets. So I'm
buddy. We'll see what it gets. So I'm
just telling it look for similar stuff that we might not have thought about.
Um understand the goal review the recent change. Scan phase one. So this is cool.
change. Scan phase one. So this is cool.
This is something I did a lot in the previous um uh time. I something that seems to work pretty well because you know nobody's perfect. Not even the
LLM. It's
LLM. It's saying consistency check. The plan
appears consistent in addresses. One
minor action. We completed the work for 1.5. So we could update the boxes. Shall
1.5. So we could update the boxes. Shall
I update the boxes? I think we got that.
So, it's saying um yeah. Uh but we also allow editing if
yeah. Uh but we also allow editing if these are Yeah. So, the stretch goal allow editing and deleting envelopes. We
got that now, right? Can I delete it?
Oh, beautiful. Funny money. Let's see.
Add an envelope for funny money. Let's
make it. We want We don't want to spend too much funny money.
rent. Cool. I like
this. This makes me feel like, you know, responsible. Okay, with that, it looks
responsible. Okay, with that, it looks like we can proceed to phase two.
Awesome. All right, we're ready to move on to phase two. Uh just one thing I did real quick before was I asked um cursor or Gemini um how can I make node version
uh 20 the default for all my um terminal sessions and so it gave me the nvm alias default 20 command which I put in. So
now if I open a um new terminal window and I do node version I see node uh version 20. So that fixes the issue
version 20. So that fixes the issue where before we were trying to run a command it would give us the node version error. Um, so yeah, hopefully
version error. Um, so yeah, hopefully cursor agent can run commands in these little um embedded terminal windows that
it has now. So we've got to restart our database now. Well, didn't didn't use 20
database now. Well, didn't didn't use 20 here. Um, we've got to restart our
here. Um, we've got to restart our database and we've got to start our app.
And then we see on our plan phase two.1 is um well phase two is all about
two.1 is um well phase two is all about the manual transaction um entry and assignment to envelopes. So
we're going to start with the manual and then we can go to more um like bulk transaction imports and stuff like that.
So let's go ahead and say let's implement phase 2.1 which is just adding the transaction entity to our schema.prisma file. uh so that we can
schema.prisma file. uh so that we can start implementing create, read, update, delete operations or credit operations for transactions like create transaction, get all transactions,
update and delete transaction. So
cool, it's going doing its thing. Let's just go take a peek in
thing. Let's just go take a peek in schema.prisma, see what's going on.
schema.prisma, see what's going on.
Okay. So remember before it was commented out the transactions uh relation there. Um so now we're slowly
relation there. Um so now we're slowly working our way through. We've got a transaction enum. Um so we'll see that
transaction enum. Um so we'll see that here when we see the um transaction type is the transaction type enum. Awesome. Okay. Let's see if
type enum. Awesome. Okay. Let's see if it works now. Wasp db migrate dev. Awesome. or before we were getting
dev. Awesome. or before we were getting that node error. So if you run into that, just make sure to
um uh use nvm alias. Uh what do we want to name our
alias. Uh what do we want to name our transaction? This is yeah, we'll say add
transaction? This is yeah, we'll say add transaction model. Um yeah, just
transaction model. Um yeah, just remember to um use nvm alias 20. I believe it was
cool. So um database migration
cool. So um database migration successful. We've defined the
successful. We've defined the transaction entity. This completes step
transaction entity. This completes step 2.1. So let's go back to our plan. Looks
2.1. So let's go back to our plan. Looks
good. We're going to accept. I say let's do 2.2 now. And we should see in the source
now. And we should see in the source features transactions operations.ts file. So where are
operations.ts file. So where are transactions? Maybe it hasn't created
transactions? Maybe it hasn't created that yet. So it will probably create a
that yet. So it will probably create a new folder here under features hopefully. And um uh first it is
hopefully. And um uh first it is creating the defining the uh operations in the main.loss file.
Perfect. And then we should see that it creates a transactions folder. There we go with the operations.
folder. There we go with the operations.
So these are our backend server side functions for creating and it looks like create and get transactions. It's deferring the
get transactions. It's deferring the update and delete but I say let's go ahead and do it. Why not? Okay, let's
just say accept all and um I'll say let's implement the update
and delete functionality or um operations as well.
Okay, so we've got create transaction, we've got get transaction, and hopefully by this we should have update and delete. We can see it being uh added to
delete. We can see it being uh added to the main.loss file right
the main.loss file right there. Now they will add
there. Now they will add implementations. So we should be seeing
implementations. So we should be seeing that get added to our operations folder. Great.
Nice thing about um Wasp is that by uh defining these operations in the main.wasp file um it uh Wasp will create
main.wasp file um it uh Wasp will create the types for these um serverside functions. So we see create, get, delet
functions. So we see create, get, delet uh update and delete transaction and then we can define those um we can use those types there add the input and um
uh output types as well and then when we use those on the front end those um operations on the front end they are fully um uh end to end type safe. So
that's really nice and that also helps um guide the LLM. Okay, so it looks like it's done. Uh let's just say okay. So
it's done. Uh let's just say okay. So
now we've implemented all those and the next is the transaction form UI. So I'm
just going to say okay let's go ahead and do 2.3 but also make sure to implement the
edit and delete functionality on the UI via modals. Um
let's see how well it can uh deal with that request.
Okay. So, it says it's going to create a component in the transaction form.tsx um
file that it should create over here soon in transactions with a date picker um input and select type.
it will trigger create transaction on submit. So the only thing missing from
submit. So the only thing missing from the plan is the update and delete stuff.
Uh let's see if it gets that right. Okay. Created a transaction uh
right. Okay. Created a transaction uh modal.
Um, let's see if it can deal with these import errors. Uh, let's see. It doesn't seem
errors. Uh, let's see. It doesn't seem to be recognizing the import errors.
I'll wait a second and I'll just say, um, well, we've got some here. Let's
just accept all and let's, uh, fix in chat.
So it's assuming shad CN utils path. Um
I changed those I because I put them in my own um uh I set up the template a bit differently. Um but the nice thing is is
differently. Um but the nice thing is is once I just pass the error to chat say fix in chat um it's able to do that. So
that's great. So it's looking in lib utils but um I changed it to CN because that was all that was in there. So
hopefully it'll realize that or if not we can change it ourselves. Okay. So accept all and I
ourselves. Okay. So accept all and I think I name that CN. Yeah. So that's
looking good. And
good. And um let's see. Go to
the terminal and allow the app to recompile. And everything looks good. So
recompile. And everything looks good. So
let's see what happens here. We've got
that. It's probably at transactions or transaction. Let's try it out. Now let's
transaction. Let's try it out. Now let's
check the main.woss file. What route are we do we have now? Um where is transaction? Do we have a transaction
transaction? Do we have a transaction route? It looks like it did not create a
route? It looks like it did not create a transaction route. Search page budget page. Okay.
route. Search page budget page. Okay.
So, I'll just tell it I can't seem to access to find the URL for the transaction
route. How can I
route. How can I access it or do we still need to define that? Okay. So
that? Okay. So
um looks like it's added the transaction page here within the transaction regions. So let's go ahead and say
regions. So let's go ahead and say accept. And it created a route at
accept. And it created a route at transactions path.
So, we got an error. Um, internal error failed to
error. Um, internal error failed to resolve. Um, let's
resolve. Um, let's set pass that to the chat. So, transactions
chat. So, transactions page is probably how's it being exported? export
function transaction form. Hey, what's
that?
Yeah.
Okay. So, it's saying transactions list blah blah will go here. And I can just say um please import the
components. We got transaction form and
components. We got transaction form and transaction modal. Um
modal. Um transaction form
and into the transactions page.
Um I don't know if it needs transa the transaction modal but we'll just tell it if necessary. So please import the
necessary. So please import the components transaction form and transaction modal into the transactions
page. Okay. So, it's added them,
page. Okay. So, it's added them, but it doesn't um it says will be implemented next. So, let's go to the
implemented next. So, let's go to the plan and let's see. Maybe I'm getting ahead of myself. Uh transaction list UI.
Oh, okay. Yeah. So, I was assuming I got a little ahead of myself there.
Um let's tell it to implement 2.4 now.
So, I wanted it to do something that it had planned for 2.4 and I did not do that.
correctly. So, sorry, the LLM was following the plan correctly, but I was not. Let's see how it deals with
not. Let's see how it deals with that. So, that was pretty cool actually
that. So, that was pretty cool actually to see where I'm trying to force the LLM to go um past the plan. It knows we're
still on um uh what do you call it? On section 2, what was it? 2.3. And I was kind of
jumping the gun there.
Um, and it implemented part of the transaction page but left it blank because it was waiting for the the command to continue with 2.4. Um, so let's see what it's doing
2.4. Um, so let's see what it's doing there.
Um, it looks to me like it kind of re So, we had transaction form. Looks to me like it's kind of doing it again in the page. So, it's not using the transaction
page. So, it's not using the transaction form.
Um, okay. Let's just say accept. See
what we get.
Let me see if I'm correct in that it's not using the transaction form. Where is
the transaction form being used in the transaction modal? Oh, okay. Maybe it
transaction modal? Oh, okay. Maybe it
is.
Um, okay. Pretty sweet. So, we've got something nice here already. Let's do
add transaction. Awesome. Look at that.
Got date picker from the components we have in our um the Shadzian admin. Let's
give it a description. Let's say uh we went to we bought pizza was 28 say $28. So there's an
expense. Um I don't have an envelope for
expense. Um I don't have an envelope for that. So let's call it um we went we
that. So let's call it um we went we went to the bar and that's funny money.
Cool. And we've got nice expense badge.
It's in red. Awesome. We can edit it. Oh
no, it was $32. Amazing. Okay, so that seems to
$32. Amazing. Okay, so that seems to work well. Let's see if we can delete
work well. Let's see if we can delete one. Select an
one. Select an envelope. Okay, we want to delete that
envelope. Okay, we want to delete that one. Absolutely. Sure. Sure. Awesome.
one. Absolutely. Sure. Sure. Awesome.
So, all that stuff's working. Um, and I should have trusted the process there.
Um, because the LLM knew exactly what it was doing, was following the plan, and it did it really well. So, uh, let's move on to section 2.5. It says, "This
completes 2.4 for for providing the UI for listing, adding, editing, and deleting. Next step is 2.5 involves
deleting. Next step is 2.5 involves calculating and displaying envelope summaries on the budget page. So, okay,
let's do it. So, one thing I am noticing is that
it. So, one thing I am noticing is that we're not updating the sidebar in here and stuff yet, but that'll probably be something later. Let's check our plan.
something later. Let's check our plan.
So after this it's collaboration on budgets and envelopes um and then CSV import and mapping to envelopes. So let's just follow the plan
envelopes. So let's just follow the plan um and we can update all the the the sidebar and stuff later. All right. So cool. We're adding
later. All right. So cool. We're adding
the entity transaction entity to the main.wasp uh um get envelopes query. So
main.wasp uh um get envelopes query. So
what that means is that um WS takes care of automatic um caching and cach invalidation on the client and uh in
order for the the um get envelopes function to have access to those entities. You just have to let it know
entities. You just have to let it know that you want it to be able to act on those entities. And through that you get
those entities. And through that you get lots of cool stuff out of the box. Um so
that was in get envelopes. So, we're in the budget operations. Let's see where.
Yeah. So, it has updated um get all envelopes to include a summary. Says envelopes with summary.
a summary. Says envelopes with summary.
So, a calculated summary of what's going on. So, the envelope info, what's spent,
on. So, the envelope info, what's spent, and what's remaining. So, that's pretty cool. Let's accept all and let's go see
cool. Let's accept all and let's go see the budgets page now. Okay, we get an error. Maybe it's
now. Okay, we get an error. Maybe it's
not done. Okay, it hasn't done it's not done compiling. Recompiling. Now it's
done compiling. Recompiling. Now it's
finished. Still get an error. So, let's
look in the browser console. Um, response. So, no. Oh, no
console. Um, response. So, no. Oh, no
budgets. Maybe it's budget. That was my fault. Okay. So, um I don't see anything
fault. Okay. So, um I don't see anything on the UI yet. Let's go to the plan.
[Music] Um, oh, where'd my chat go? That was this one,
go? That was this one, right? Okay. Um, so it says, "I've added
right? Okay. Um, so it says, "I've added the transaction entities. Forget
envelopes and main bot. This should
resolve now that the query returns the calculated amount. The next step is to
calculated amount. The next step is to update the UI." Yes. So that's what we're missing. Yes.
we're missing. Yes.
Update. Cool. So we should see some stuff happening on the budget page.
So, it will display the spent and remaining amounts and a simple progress bar for visual uh bar visual for the spent amount relative to the allocated amount. I like that.
amount. I like that.
There's probably stuff we could save for the um the dashboard, but let's do it now. We can always move it
now. We can always move it later.
Okay.
Um so it's looking for a progress component. Do we have a loading
component. Do we have a loading component or something like that? Uh UI
instead of progress. Yeah, it probably doesn't have
progress. Yeah, it probably doesn't have a prog has a skeleton. Doesn't have a progress loader. So,
progress loader. So, um let's try resume. It said it had problem connecting. Stay with me.
connecting. Stay with me.
Okay. So, did it create a progress component or did it make its own progress component are properly commented out in budget page? Let's see that. Where's
budget page? Let's see that. Where's
progress? Let's look for it.
Um, okay. So, it says progress component is added. This completes step five 2.5
is added. This completes step five 2.5 minus the visual project bar which can be added later. Why don't we just do that now? So uh let's go ahead and
that now? So uh let's go ahead and implement the progress bar that component that is commented out in the
budget page right in at budget page.
Before we move on to plan uh phase three. Oh, so it's saying it assumes you
three. Oh, so it's saying it assumes you already added or will add the progress component to your SAS command. Um alo
there is one from shad CN UI. Yeah. So it's getting angry because
UI. Yeah. So it's getting angry because it's not there. Um I'm surprised it didn't
there. Um I'm surprised it didn't say let's accept. So it kept it commented out. Let's go ahead and and
commented out. Let's go ahead and and add it.
So, I know this is going to be a little bit tricky because of the um uh the way that I set up the template with the components and the path aliases
and stuff, but let's just go for it and we'll work out the errors and and we'll deal with it on the fly. So npx shotc latest ad progress please you chat uh okay so npn
shad cx latest add progress go for it invalid configuration
app. So, let me go back to Shad CN admin
app. So, let me go back to Shad CN admin and go to the Shad Shad CN admin GitHub. And let's look at their original
GitHub. And let's look at their original components, JSON. And it's got
JSON. And it's got aliases. Is it the aliases that's
aliases. Is it the aliases that's missing? because I removed
missing? because I removed that. Let's see. What do we got that's
that. Let's see. What do we got that's different? Yeah, I think
different? Yeah, I think so. Let's
so. Let's see. If I add that and I try it again,
see. If I add that and I try it again, what will it do? There it goes. Guess I shouldn't
do? There it goes. Guess I shouldn't have deleted that. I mean, we're not using the aliases. We're using relative paths, but um I believe we just got it
added in there. Where's the
progress?
Um, ah, funny. It added it up there. So,
let's try that again. I'm just going to mess around. I'm going to delete that
mess around. I'm going to delete that whole thing. And I'm going to
whole thing. And I'm going to say it gave us a suggestion that it's source,
right? So, I don't think UI is under I'm
right? So, I don't think UI is under I'm sorry. I don't think uh hooks hooks are
sorry. I don't think uh hooks hooks are there.
Lib I think I deleted utils and I put the stuff in lib. So
maybe just leave that there for now. Let
it let it do its thing. Let's add
progress. Where does it add it? Components UI. Yeah, there we go.
it? Components UI. Yeah, there we go.
Okay, that wasn't too hard. Sorry about
that. um is looking for of course for the wrong thing. I want it under CN. Okay. So, that's probably something
CN. Okay. So, that's probably something I wouldn't do next time. I wouldn't mess around with the the um uh with the aliases and stuff just to
make it easier to work with Shad CN. I
didn't think about that. I thought we had all the components we needed, but it's not a hard change, right? It's like
that was looking for the CN function in utils. I know it's in CN because I
utils. I know it's in CN because I changed it. You probably wouldn't have
changed it. You probably wouldn't have to have uh if you were doing your own project, you wouldn't have that issue.
Um but yeah, anyway, let's go then and say okay I imported the progress component. Now,
let's uncomment it out and use it. That should be in the budget page.
it. That should be in the budget page.
So, spent percentage did we? Uhhuh.
Okay. So, it's already got a calculate spent percentage um function right there. I wonder if
that it's not too expensive of a calculation. Could be memorized maybe. I
calculation. Could be memorized maybe. I
don't know too much that much about that. I mean, how often were we doing
that. I mean, how often were we doing that call? It's probably fine the way it
that call? It's probably fine the way it is. That's something we could ask um uh
is. That's something we could ask um uh Gemini about. Let's wait and see. Actually, I
about. Let's wait and see. Actually, I
will ask I'll ask about this um spent percentage calculation once we're done.
Okay. So, accept it. And I'm just going to go ahead and say um add to chat and say is this function worth
memoizing to say to increase performance in our app. I'm not sure this is that
app. I'm not sure this is that expensive of an operation on the client.
Think about the possible issues or um think about this scenario and
present a rationale of your decision. All right. Interesting. That
decision. All right. Interesting. That
looks like a very simple calculation. My
guess is it's going to probably say that's not worth memorizing, but who knows? Um, yeah, you're right to
knows? Um, yeah, you're right to consider performance, but in this specific case, spent percentage calculation using memo is likely not worth the added complexity. This
calculation is cheap. Memorization has
overhead. Focus on higher impact memorizations. And it's saying if this
memorizations. And it's saying if this page did have performance issue, i.e.
with thousands of envelopes. The
bottleneck neck would be DOM rendering, creating updating many card components. Um, list virtualization or
components. Um, list virtualization or memorizing the memorizing the card component itself would be far more impactful. That's really cool. Um, I
impactful. That's really cool. Um, I
didn't know that. So, it's generally best practice to avoid optimizing until you measure a real performance problem.
Cool. So, that's great to know. Um, so
let's see if that works. Uh, let's go to our um thing and amazing. We've got a cool little a little bar there. That's
awesome. So, let's go to transactions and um let's add we have one under funny
money. So, let's just add a bunch under
money. So, let's just add a bunch under funny money. Let's say we um we went to
funny money. Let's say we um we went to the theme park and we spent like $300 And then let's go back to
budgets. Oh, so we went past our budget
budgets. Oh, so we went past our budget because budget money was only was only 100 bucks. So let's make it
100 bucks. So let's make it 400. Oh, that's pretty cool. I like
400. Oh, that's pretty cool. I like
that. It looks clean. Nice. Um the only thing I'm noticing is that we're missing some of these like nice uh nav bars and stuff. And I mean that's like a
stuff. And I mean that's like a something we could probably optimize later, but I kind of want to go ahead and do that now. So,
um I'm going to tell it to do that and also to add um to the sidebar the budgets and
transactions page. Great. Something I
transactions page. Great. Something I
noticed that I'd like to implement before continuing is that the
uh budget is it budgets budget and is it transactions? Okay, the budget
transactions? Okay, the budget and transactions roots
aren't are missing two things.
One, the pages themselves do not have the header [Music]
slashnavbar navbar found on the tasks. Um, and what's it called?
tasks. Um, and what's it called?
Dashboard pages, for example.
and two um these roots are not accessible in the
sidebar. Can you make these changes
sidebar. Can you make these changes please?
Okay. So, hopefully it looks at these um pages here like tasks and it adds these nice sidebar um and stuff like that to our budgets and transactions and also adds them
here. Okay, it seems to have stalled.
here. Okay, it seems to have stalled.
So, I'll say okay, go ahead. So, it's found the app
ahead. So, it's found the app sidebar. So now it's going to add the
sidebar. So now it's going to add the links to the sidebar along with some nice um
icons.
Okay, so let's accept and go look. Okay, we've got budget and
look. Okay, we've got budget and transactions. Okay, it didn't do the add
transactions. Okay, it didn't do the add the navbar. It says these changes
the navbar. It says these changes should and ensure they appear within the application standard.
Okay, to see the sidebar update. Okay,
so it assumed that we would get the um the the header navbar. Um but we didn't.
So, I'm going to go back and say, um, that worked great for the
sidebar, but these routes still don't have the header/navbar that I'm seeing on the
tasks and users um, pages. Can you
um, pages. Can you investigate EG tasks um page and figure
out which components are being used for the
header/navbar and import them into the budget. And let's just add those the
budget. And let's just add those the budget page and uh what was it?
Transactions page, right? Cool. So, it's investigating the
right? Cool. So, it's investigating the test page like we asked. Um and it imports a header and a
asked. Um and it imports a header and a main component. It imports search,
main component. It imports search, theme, switch, profile, drop down. Um
all this stuff.
Awesome. So, that's budget page. So, we
should see the updates on um budget page soon. Let's go check it out. Nice. There we go.
out. Nice. There we go.
Perfect.
Transactions. Nice. So, we should see there it goes. Yeah. Cool.
I think there's still um some little headers there for uh tasks, some some uh inconsistencies in the in the UI there, but we can work that out later. I mean,
it looks pretty good for now. We have
this as a uh as an example. So, I like it. I really love this progress bar that
it. I really love this progress bar that I made. That's great. Um
I made. That's great. Um
cool. All right. Everything looks
good. Okay. Where were we? What's
next? I mean, I can check the plan, but we're vibe coding.
So, we calculated that. That looks
good. Um, and we modified get envelopes query, right? And we updated the budget
query, right? And we updated the budget page. Looks awesome.
page. Looks awesome.
So the first steps in phase 3.1 is to define the collaboration um model in schema Prisma.
Um all right uh let's see before we move to phase three when we start doing the collaboration and stuff um would it be cool to just create
the docs in um uh the AI folder um so that we have it and we can maybe reference it later. I don't know if it's necessary, but um can't hurt to do it.
So, before we move on to this, let's create the uh phase one and two um docs
for LLMs and human uh reference in
AI. Oops.
AI. Oops.
AI.
AI in a new docs directory.
Okay. So, first it's creating says yeah, this is a good idea good idea to document what we've built. And so just gives an
built. And so just gives an overview of the stuff that we created the budget model that we've got these actions how the
actions are defined simply and it's all one like all there in one document so it doesn't have to look through multiple pages which is
nice. So it has an good overview of
nice. So it has an good overview of what's going on like for example that the on after signup hook is creating the budget for them automatically when they
create a new user and this is necessary for the collaborative feature. So cool
we've got docs and it looks nice and we can pass those. They're real simple uh overviews of what we built so far. And
with that, let's move on to 3.1. Um yes,
move on to it asked me, do you want to start modifying step 3.1? So, let's go back to our plan. Cool. So, this is going our goal
plan. Cool. So, this is going our goal here is to enable users to invite others to view and or edit their budget. So,
this is great for collaborating with someone on a similar budget.
Um, and this is something that when I I pulled um people on on online and uh friends and co-workers what kind of app
they want and a budgeting app was um a common response. So let's run was dbm migrate dev to add the budget
collaborator um model changes.
Okay. So it's we're going to call it um how can I I was able to write in it before and
say pop out. Okay. So it's there. Um
what is it? I'll just say add budget collaborator model. Okay. Um,
model. Okay. Um,
cool. All right. The background next step will be to implement 3.2 two which is W wasp actions for inviting removing
um and other uh remove collaborator update collaborator things like that. So we got 3.1 done. Um it looks like we're going
3.1 done. Um it looks like we're going to do 3.2 in steps. So I'll say okay implement the invite [Music]
collaborator operation first.
This is where it could get tricky, could get hard because um you know this is also linked to uh how O works like if we have an invite token and stuff like
that. Um we need the signup page to
that. Um we need the signup page to accept the um invite token. Um and I'm not sure that has
token. Um and I'm not sure that has planned it here. So let's see. We're just going to
here. So let's see. We're just going to run with it.
Just going to check the schema.prisma to
see if m um ah we didn't accept the file or did we accept file?
Okay, invite collaborator action is defined. Let's look where would it do
defined. Let's look where would it do that in but collaboration. Nice. Cool.
Looks good.
can't invite yourself. Got to validate the budget
yourself. Got to validate the budget exists and the inviter is the owner.
Like it validate that the invite to user exists. Check if is already a
exists. Check if is already a collaborator.
Um so what it's doing is you have to be signed up first to get invited. Um
that's a more simple approach. I mean,
we could always make it so that you can invite someone by email and then um uh they can sign up and automatically be set up. Um but maybe we can do that
later. Right? The whole idea with this
later. Right? The whole idea with this vertical slice implementation is that we do things um simple things first across the entire stack and move to more
complex things. So uh invite invite
complex things. So uh invite invite collaborator action is defined. It
handles authentication, preventing self invites, validating the budget exists and the inviter owns it. Validating the
inviteee user exists. Uh, cool.
exists. Uh, cool.
Awesome. So, um, let's, uh, yes, let's do the remove collaborator action next. So, if you're the owner of the
next. So, if you're the owner of the budget and, um, yeah, you want to remove someone. Let's say
someone. Let's say your roommate used to be collaborating on the budget with you and they move out then you can remove
them. Okay, so it says it's good. Let's
them. Okay, so it says it's good. Let's
see. Good. Recompilation on file succeeded. Um what did we updated the
succeeded. Um what did we updated the operations file so that we can invite and remove collaborator. Awesome. Um, I
do not think we've got the UI going yet.
So, that will probably be um, yeah, add UI elements will be 3.4. So, we won't even look at that. We'll just keep accepting our way, vibing our way through stuff. So, let's next is update
through stuff. So, let's next is update collaborator ro. Go for it.
ro. Go for it.
So, I guess as the owner, what you'll be able to do is um the collaborator on your budget, you can give them maybe an owner role or something else or you can downgrade them to just a viewer or something like
that. Update the role of the budget
that. Update the role of the budget creator. What is the collaborator role?
creator. What is the collaborator role?
Enums collaborator role. It can be owner, editor or viewer.
role. It can be owner, editor or viewer.
Exactly. Cool. All right. Ready to
proceed for modifying operations for permissions checks? Yes.
permissions checks? Yes.
Proceed. Go back to our plan. So
modifying operations for permissions means we're updating all the relevant uh operations, queries, and actions. So
things like get envelopes create envelope create transaction will check context users permissions via budget collaborator for the target budget and
ensure that users can only affect budget envelopes they have access to. Pretty
cool. That has to go across quite a few um actions there. So
um or operations I should say cuz queries and actions and you can see it's adding budget to um budget collaborator to each of the entities on the main.wasp
file. Get
transactions.
Um, so it's doing the queries first and now it looks like it's going for the
actions. No, no, get envelopes and get
actions. No, no, get envelopes and get transactions. So, it's going for the
transactions. So, it's going for the queries first. Um, now it's starting
queries first. Um, now it's starting with the budget operations like create envelope, update envelope. We'll need a helper function to check the user's permission level for a given
budget. It's pretty amazing that it's
budget. It's pretty amazing that it's doing all this. I mean, none of this is extremely complex stuff, but um it's quite detailed and there's a lot of features going on here. And that it's
able to get all this is um and do it for me is like yeah, pretty amazing. If I were raw dogging this, I'd have a lot harder time
right now.
would take a lot longer, that's for sure. Okay, so the final step is to
sure. Okay, so the final step is to build the UI on the budget or dedicated settings page. Should we do it on the
settings page. Should we do it on the budget or a dedicated settings page? Let's ask it. But sounds good.
page? Let's ask it. But sounds good.
Before we move on, what do you think is the best approach here for
managing the budget and I'll just say what is for the best here the best approach
here for managing [Music] collaborators the budget it page or a
dedicated settings page. Think about
page. Think about your about the possible solutions
and provide rationale for the one you think is best.
It helps us kind of understand like why it's choosing that way. Um, I like asking it always to do that. Um, I could
probably pack that into a rules for AI um prompt like the global one. Oh
res resend that. Um, and then I wouldn't have to ask it every time, but you don't I don't need it every time. So, I'm not sure. Or maybe create a rule that I
sure. Or maybe create a rule that I could auto um that's probably a good idea.
Um let's try that while it's thinking.
So let's say oops here seven possible solutions
thinking and I'll say um think about a few possible scenarios or
scenarios or solutions to this problem.
Present the one you think is best suited to solve this
issue and provide rationale for why you think it's the best one. Did I name
that correctly? Should be MDC, right?
that correctly? Should be MDC, right?
And then I say manual and I can mention it every time so I don't have to keep typing it. Okay.
typing it. Okay.
So back to the question. It says I re recommend we proceed by adding the collaboration management UI elements to the budget page using modals and potentially collapsible se sections to
keep the layout clean. I like that idea.
Let's do it.
use the components we've got already in components UI components. All
components. All right.
So cool. So later I can say possible solutions thinking I can with the rule type being manual I can just say at let's see uh it's called seven possible.
So yeah, I can just add that rule and add it and then I don't always have to type the same thing there. But now we're back on the budget
there. But now we're back on the budget page and we're [Music] adding the collaboration UI. Ah, so we actually probably in
UI. Ah, so we actually probably in collaboration page um or users. So we're adding a find user by
users. So we're adding a find user by email. Hey, what is
email. Hey, what is this?
No off utils. That's not right.
Okay. So, here it said get email under Wasp off. That seems to be correct. But it's
off. That seems to be correct. But it's
asking extension.
So, it's saying um we don't store the email on the user right now. Although I believe we do, right?
now. Although I believe we do, right?
You can only go in with username. Where
is it? Um user. Hello user. Where are you?
it? Um user. Hello user. Where are you?
Ah, that's true. We don't because Wasp takes care of the off in the background.
So, let's see. Let's just let it go ahead. It's dealing with
ahead. It's dealing with errors.
Okay. So, it looks like that'll definitely be an error that it didn't solve. So, we'll just say fixing chat.
solve. So, we'll just say fixing chat.
The important note as noted in the code comments reliably getting the email for any arbitrary collaborate within a standard WASP operation is tricky because the standard user entityd doesn't store email. The current
implementation uses a dummy email for display purposes. A production ready
display purposes. A production ready solution might require storing email directly on the user model as discussed in the authentication
MDC's recommendations um and or creating a custom API route or displaying user ids or fetching um so
maybe we should just go ahead and store email directly on the user model which means we'll have to, you know, log in new users and stuff. So, it
seems to have stalled here as well. So,
I think I might stop it.
Um, and let's stop it. Let's restore it to here. What does it say?
here. What does it say?
Yeah, I don't know if it made any changes, but I'm going to say let's go ahead and store the email directly on
the user model as discussed in rule. We
can add that rule. I know that um rule four uh let's see
rule cursor rules. Hey, cursor rules number four.
Um, to do this will probably require that we reset the database, but I'm okay with
that. And this will probably fix the
that. And this will probably fix the issue that we're having there with um, finding the user email. So, what this is going to do hopefully is when the user
signs up, um because W was takes care of the O stuff for you in the background, it has like an O user, but um we can just store the email. There it goes.
We're going to create like a simple config function that will store the email on the user directly so that we can access it easier than having to um
constantly you know um uh go deeper into the Wasp off stuff to get the email.
H. It's still want It still is wanting to use the get email thing. So,
um I don't like this what it's doing.
So, I'm going to reject all and I'm going to stop that. I'm
going to restore it to here.
Um yeah, let's reject that. Editing 15
that. Editing 15 files. Um operations find user email.
files. Um operations find user email.
Reject still there. Find user by email. I'm pretty sure let's go check
email. I'm pretty sure let's go check out the Wasp docs ourselves.
that off. Forgetting the
off. Forgetting the user accessing user data. It's on
data. It's on identities. So user identities
identities. So user identities um off identity. So that's the off identity in the background uh that Wasp makes getting off data from the user
object. Let's just maybe give the whole
object. Let's just maybe give the whole thing to it here and say let's go ahead.
Um we've got the what is it called? Find
user. Find user by email.
operation, but let's just access the offidentity, right? Isn't that what it's
offidentity, right? Isn't that what it's called? O identity
called? O identity entity signed up with email. Okay, so
there it is.
Let's see the off identity properties as described
in in this example. Let's just copy that. Oops.
example. Let's just copy that. Oops.
copy this and then maybe it can figure it out. Let's see how it get
out. Let's see how it get goes. Okay, so I'm just pointing it like
goes. Okay, so I'm just pointing it like we see here.
Um we've got um yeah, it's trying to do crazy stuff because I know uh basically how it
should work. I can kind of stop it and
should work. I can kind of stop it and um tell it uh yeah here um let's look at the docs pass the URL pass the example that we're talking
about and let's see if we can figure it out. Um so it's going
out. Um so it's going to modify get um collaborators to return only the user
ID and then update budget page to reflect that. And then it's saying we can now
that. And then it's saying we can now proceed to implement the invite collaborator model modal using the find user by email query. But it doesn't look
like it updated the find user by email query. And so let's say okay first
query. And so let's say okay first update the find user by email query. All right. What's going on here?
query. All right. What's going on here?
Good point regarding um so it's saying to get the email associated with an arbitrary user we needed this find user by email query.
Um so can't find revised recommendation.
Let's simplify get budget collaborators for now. Instead of trying to fetch and
for now. Instead of trying to fetch and return emails, we'll modify it to return the ID and we'll update the budget to display the user ID for each collaborator instead of an email
address. This is secure and avoids the
address. This is secure and avoids the complexities of fetching sensitive off identity data for other users.
H but I I thought you can get the thing.
Um so when you find include user okay why can't we do that then I think this is what we need here.
So this looks like a good one. I'm going
to say um okay but I've seen in the wasp docs
that you can access the off identities information
by selecting it in a prisma query like this. Can we not use this method to get
this. Can we not use this method to get the email and display it email? Let's just say
it email? Let's just say that. And if we can then we'll tell it
that. And if we can then we'll tell it to update the other stuff.
clearly shows that was sets up the underlying Prisma relations in a way that allows you to traverse them using nested include or select statements. So
yes, we can use this method to fetch the uh here's how it could work. Modify get
budget collaborators and include the select provider name email uh result for each collaborator. The con
is the query is nested but um I don't care. Should we modify to use this? Yes.
care. Should we modify to use this? Yes.
And yes, we should also should
we update find user by email? Is this
being used anymore? If it could be used, should we
anymore? If it could be used, should we use it?
If so, please update accordingly. So, it's thought for 4
accordingly. So, it's thought for 4 seconds. Big thinker. Let's implement
seconds. Big thinker. Let's implement
fetching blah blah blah blah. Let's
update. Yes, the find. Okay, so it will update get budget collaborators and update find user by email. It's still
valuable. Now fits email find us needed for the invite process where you type an email address. Previous implementation
email address. Previous implementation had a llinter error. Okay, so it's updating the find
error. Okay, so it's updating the find user by email. Nice. So budget has been updated
email. Nice. So budget has been updated to display the collaborator's email address fetched via the nested include.
It falls back to showing the user ID if the email is somehow null. Let's
implement the invite collaborator modal using the find user by email query.
Awesome. All right. So, a little hiccup there. Takes reading through the docs a
there. Takes reading through the docs a little bit.
Um, but I think we'll get it. Okay. It says phase three is
it. Okay. It says phase three is complete. Let's accept all and let's see
complete. Let's accept all and let's see if it is if it works.
I don't think it is. We getting an error. React router cannot read
error. React router cannot read properties of undefined reading viewer at budget page. Send that
in. I get the following client uh client side error.
So that's probably an enum error, right?
It's the enums not being um yeah, so it was trying to import server side Prisma client on the front end.
So, we could probably put those types in a more central place and um make them compatible with uh um but that's something we can do later
to make it a little bit cleaner so we don't have types and enums all over the place. Um let's see. We have
place. Um let's see. We have
recompilation. Let's re refresh. Okay,
cool. So, now we have invite collaborators here. took a little while,
collaborators here. took a little while, but um we need to search. Ah, so it allows us to search for the user. So,
let's see. I think it was vinnie.com. User found. See, I don't
vinnie.com. User found. See, I don't like that it sends the uh user ID back. So, let's tell it not to do
back. So, let's tell it not to do that. But you can assign RO and all this
that. But you can assign RO and all this stuff. Viewer. Um, so we can say invite
stuff. Viewer. Um, so we can say invite user. Um, let me tell it to I don't want
user. Um, let me tell it to I don't want the find user by email and
um what's it called?
and invite collaborator um functionality to return and display the
users's user ID for security purposes. Can you remove
purposes. Can you remove that while you're at it?
Add a section to the plan that includes an extensive review of the code for
security vulnerabilities. And that's something I
vulnerabilities. And that's something I like to do is um you know constantly update the plan when I think run into something like that where I didn't consider it before. Um but it's
something that we should uh do later and um yeah have add to the plan. Cool.
plan. Cool.
So says still needs ID internally to confirm existence but we don't need to send that back to the user, right? Return only the email if user was
right? Return only the email if user was found. So I like that.
found. So I like that.
Now, it's going to update the budget page and adjust the found user type. It's either going to find the user
type. It's either going to find the user or not. And since we're only using the
not. And since we're only using the email method to log in, there's not an email in the in the uh database and they won't be there. Um, they don't exist,
right? Says having trouble applying
right? Says having trouble applying changes on the budget page. Why is that?
I don't see that. I think it's okay now. Okay, edit should now be correct.
now. Okay, edit should now be correct.
Now, let's add section to the plan for security review and refinement.
Nice. I've made the changes. Okay, let's
go ahead and accept. Let's see if this bad boy
accept. Let's see if this bad boy works. To test the invite collaboration
works. To test the invite collaboration stuff, I'm going to sign up a
user. Oh, found an error. Users error.
user. Oh, found an error. Users error.
Where is it? Oh, an extra thingy. Curly
brace. I'm going to sign up a user.
free. Um, this is interesting. I wonder
if the user already has a budget and you invite them to collaborate on yours, what happens? What
What does the plan say? It says we've completed all of
say? It says we've completed all of phase three. So, let's just try it out.
phase three. So, let's just try it out.
I am logged in with um I think it's dude at email. No, that one doesn't work. It's
email. No, that one doesn't work. It's
this one. Um let's try a new email. Let's go
one. Um let's try a new email. Let's go
sign up. And let's make let's just call it
up. And let's make let's just call it [Music] testermail.com. Password one two
testermail.com. Password one two three. Let's go to get the verification
three. Let's go to get the verification link. Okay.
link. Okay.
Um, let's go to login tester atmail.com. Okay, so we've got that
atmail.com. Okay, so we've got that user. They probably have no budget, no
user. They probably have no budget, no transaction history. And let's log out.
transaction history. And let's log out.
Let's log in with dude@gmail.com. Let's see. This dude has
dude@gmail.com. Let's see. This dude has budget and transaction information. I
want to remove that collaborator. I want
to invite testermail.com. Search user found. Let's
testermail.com. Search user found. Let's
make them an editor. Invite user. All
right. So, if we log out and log back in, I'll be impressed if that works. I
have a feeling that's not going to work. Let's go to budget. I have too
work. Let's go to budget. I have too many password popups. Oh it works.
And you can edit it. Aha.
it. Aha.
Updating envelope fails with let's see what happens here.
cannot read properties of undefined when check budget permissions at check budget
permissions when a invited collaborator
um tries to update the envelope of the shared budget. it, we
get this error. And let me try and add that
error. And let me try and add that rule possible solutions thinking which just to remind you says think about a few possible solutions to this problem.
Provide the one you think is best suited to solve this issue and provide a rationale why you think it's the best one. Mhm.
one. Mhm.
And I think there's fundamentally a problem with the collaboration logic. So
um let's see. So it says the budget collaborator
see. So it says the budget collaborator is undefined. So for an operation like
is undefined. So for an operation like update envelopes have access to the thing they must be explicitly listed in the entities definition.
Grant entity access most likely. Uhhuh.
Oh, so it could be much simpler than that.
Okay, let's see if that fixes it. Where
is this in? Um, budget
operations. Budget
operations should be update, right?
Update envelope.
Okay, maybe that was simpler than we thought. Let's try it
thought. Let's try it again. Wow. Okay, I'm quite impressed
again. Wow. Okay, I'm quite impressed that that works so simply.
Um, and that would have take me a lot longer to figure out on my own. Um,
cool. So, just to check, we can log out and we try with dude again who was the original um owner of the
budget. And yeah, there it is. It's
budget. And yeah, there it is. It's
updated correctly. So, tester. So, what
I want to try now is sign up. Let's just
try asdfmail.com.
asdfmail.com.
Close asdfmail.com.
asdfmail.com.
Okay. Okay, now it works.
Um, okay. Okay, so we got 200. Um, this
is the AFD user. Let me go back to dude@email.com and let's go to budget and we've got tester is there. What
about [Music] asdfmail.com user found? This one can be an editor as well. Invite
user. And then let's log out. Let's log
in with ASDF at email. Now, what does their budget look
email. Now, what does their budget look like? Ah, okay. Cool. So it can keeps
like? Ah, okay. Cool. So it can keeps their old um uh yeah their original envelopes and
adds a new ones. That's pretty cool.
That's very reassuring.
Um so yeah they can choose they can add on to their own or um you know add their own envelopes but they also can
collaborate on the um um collaborate on the shared ones or um they can edit their own
envelopes. Um and that would be
envelopes. Um and that would be something cool that we can share that maybe we show that these are shared envelopes right?
um we see the transactions um and that's something maybe we can add to the plan.
So um add to plan a an task to visually
um identify shared envelopes. I'll say shared
envelopes. I'll say shared collaborative envelopes on the UI so that users with shared budgets know
which envelopes are being shared by other users. Also
users. Also show info like whether No, that's that's probably
enough. Okay, cool. Where were we? That
enough. Okay, cool. Where were we? That
was a quite a little detour there. I
think we are done with 3.3. Yeah. So, it's just saying to do it
3.3. Yeah. So, it's just saying to do it now. Why don't we just do it now
now. Why don't we just do it now then?
Cool. Okay. I accept that and say let's implement those visual distinctions and let's add the cursor rule which
is think about different possible scenarios and pick the best one and give rationale for why you think it's the
best. So it's going to modify probably
best. So it's going to modify probably the UI needs to know for each envelope displayed whether the currently logged in user is the owner of the envelope that it belongs to. Analysis of the
current data. The problem the envelopes data
data. The problem the envelopes data fetched by get envelopes does not currently contain who owns the budget. We can't directly
budget. We can't directly compare because envelope budget is included possible modify client side. So
what does it say? It says option one modify get envelopes is the most robust way. So there it goes. It's going to
way. So there it goes. It's going to modify get envelopes to include the budget uh user ID. Then it will compare to see
who is the the user IDs to see who is the owner. That makes
the owner. That makes sense.
Cool. Let's accept all and go check it out. Cool. There you go. That's really
out. Cool. There you go. That's really
nice. So, now we see that it's a shared one. Um, because they aren't the owner.
one. Um, because they aren't the owner.
They're the owner of this one, ASF. So,
they see that one. And just to make sure that we don't have some crazy stuff going on, if I log in with uh dude, who is the owner of those initial two envelopes,
[Music] um then I shouldn't see anything and I shouldn't see the asdf one. Awesome. And
we see the tester there. Cool. And that
looks pretty good.
Um seems to work pretty well. Let me
just log out and let's try to create a new user to make sure nothing crazy is going on. And we'll call this um new
going on. And we'll call this um new user hello@gmail.com sign up. Verify the
up. Verify the link. Go to
link. Go to log.
Hello.com. Okay. Okay. No envelopes
created. Nothing. Awesome. Maybe we
should rename that to Hello.
Cool. Transactions. No transactions
yet. Hey, I was able to add a transaction before. Now I don't see the
transaction before. Now I don't see the add transaction button. So, let's go ahead and fix that before we move on.
Why don't I see add transaction
functionality in the transaction page, right? Um I've heard about before where
right? Um I've heard about before where people say that um it'll just kind of delete stuff and change stuff without you asking. And
you asking. And um that's one of the downsides of vibing. I mean the plus side is that we
vibing. I mean the plus side is that we have a pretty nice looking functional um app pretty quickly. I mean what is it
taking a couple hours?
So with a few more hours you can do quite a lot handle add transaction. What did it
do? Modal button
do? Modal button exists. I don't see it. Am I
exists. I don't see it. Am I
crazy? Where's the add transaction button? You full of
button? You full of crap. Let me go to the transactions
crap. Let me go to the transactions page. Add transaction plus circle
page. Add transaction plus circle transaction modal.
Okay. But where's the where's the Okay, there's an add transaction. There is an add
transaction button within the transaction modal but not on the main page slash form.
No wonder I swear we had that before. The modal which contains has its
before. The modal which contains has its own submit button at the bottom. There
should also be an adaction itself. This
is the button that's intended to open the modal.
So it says uh could you please double check the top right area of the transaction page next to the title? The
add transaction button with the icon should be visible there. Clicking that
button should open the modal.
What? This is the button rendered on the main page. I don't see
main page. I don't see it. Where
it. Where are Oh there it is. Why is it obscured?
Uh-huh. It is there, but it's obscured by the header navbar. Is there
navbar. Is there a padding or margin styling issue? We have something like that with
issue? We have something like that with the budget. Oh, yeah. We have the same
the budget. Oh, yeah. We have the same thing for the budget. It's blocked the the um Look at that. Yeah, my budget
envelopes. Haha, funny. I'll make sure
envelopes. Haha, funny. I'll make sure we fix that. The header fix component likely
that. The header fix component likely takes uses fixed or sticky.
Let's see. Budget. We're on transactions page, right? It's saying something about
page, right? It's saying something about a fixed property. Um, if I get rid of
property. Um, if I get rid of it, that's all it is. Okay. So, cool.
Well, it set me in the right direction.
Um, surprised uh was fixed. That's all
it takes to fix it. Cool. Then we get a little dingy
it. Cool. Then we get a little dingy dingy dingy. I like the way the
dingy dingy. I like the way the tasks the styling on the tasks looks nicer, but we can fix that later. Think
of got to cool. Okay. Anyway, now we have the add transaction. And we can add transaction expense. It was in hello.
transaction expense. It was in hello.
And we see it in our budget spent. Oh,
we didn't add any budget too. Cool. Okay, great. Um, where were
too. Cool. Okay, great. Um, where were [Music] we? Cool. So, we've got the visual
we? Cool. So, we've got the visual indicators for shared um envelopes within a budget. And next, the phase four is um CSV import and mapping to
envelopes. So, the goal is to allow
envelopes. So, the goal is to allow users to upload a transaction data via CSV file and map imported transactions to the correct
envelope. Cool. Before we do that, let's
envelope. Cool. Before we do that, let's have it create the doc. So let's say before we move on, let's create a
um doc for phase three in docs in AI
docster. Okay, at this point to this is
docster. Okay, at this point to this is probably the point where I would um start a new chat.
Um because now we have the the context of the docs and stuff like that. Um so
we don't need all this chat context to be in there. Um and it's kind of getting slow. So I would assume that this is a
slow. So I would assume that this is a point a good point to um move on to a uh yeah see it's saying there start new chats for better results. So, um, it's
even letting us know that that's what we should do. And now it's saying we're ready to
do. And now it's saying we're ready to move on. Um, where did it do it?
move on. Um, where did it do it?
Collaboration.
Cool. Summarizing chat
context. So, I'll let it finish doing that before I accept, even though it looks like everything's good to go.
And it's taking a long time. I'm getting impatient here. Cool.
time. I'm getting impatient here. Cool.
Um, yeah, it's planning next moves. Blah
blah blah blah blah.
Okay, we're ready to start phase four. Saving
four. Saving action. Okay, so it wants to do that.
action. Okay, so it wants to do that.
Um, I want to slow down because I want to move to a new chat.
Um, so let's say let's go first to the plan. Does it in the plan it says it
plan. Does it in the plan it says it wants to use pop-up parse, I guess?
Yeah. So, I'm going to um stop it here.
I'm going to accept all changes and I'm going to stop it.
Um, so we've accepted the collaboration, right?
Cool. And I'm going to do a new chat and get rid of that. Keep the plan in there. Okay. So, they seem to be done
there. Okay. So, they seem to be done with 3.4. We did 3.5. Forgot to mark
with 3.4. We did 3.5. Forgot to mark these off. All right. Cool.
these off. All right. Cool.
Um I am going to do get add all get commit m phase
three collaborate collab collaborate get push origin or what branch are we
on get push what was the remote get push origin
video. All right, cool. Didn't take a
video. All right, cool. Didn't take a little breather here. It's been an hour uh almost 2 hours of uh vibing and
before we move on to phase four. Okay, so I kind of decided that um
four. Okay, so I kind of decided that um I'm going to put off phase 4 um not do it for the video because it's already gotten pretty long. And uh what I'd prefer to do is kind of clean up this
dashboard and actually get it to show us some um stats here. So let me log in with my other user um that has more going on
and right because they have yeah like this stuff and collaborators and stuff. So we want some of these stats to be shown on the dashboard here. So, what I'm going to do
dashboard here. So, what I'm going to do is um I'm going to say instead of moving
on to plan phase 4, let's add some useful graphs
to the dash let's say dashboard page of the app.
think about some possible graphs or um visuals to show here based on our
envelope and our envelopes transactions and collaborations functionality.
Give me a few suggestions of what you think will
be the best things to display here after thinking about your answer. Okay.
answer. Okay.
So, after it gives me some possible suggestions, um what I'm going to do is I'm going to tell it to use these components here and the charts that it's got in there as um
as a guide and um base it off that. So, it's saying expense
that. So, it's saying expense um income versus expense for the current period. A simple bar chart with a
period. A simple bar chart with a summary uh pair of summary or a pair of summary cards comparing total income total expenses for the current month.
Spending breakdown by envelope and envelope status progress. Let's
progress. Let's do let's do the income versus expense overview because we have the envelope status and progress on the budgets page.
Let's do income expense overview and spending breakdown by envelope. Um let's do the first
envelope. Um let's do the first two. Use the let's see what we got in
two. Use the let's see what we got in there. We've got um on the dashboard
there. We've got um on the dashboard page we have some components with an overview and that's a bar chart using
recharts.
Um use the overview component as a guide [Music]
to help develop uh use the overview component as a guide. Yeah, just this should be enough because it already set up here,
you know, we have to choose whether we do recharts, chart.js, blah blah blah.
And because the overview is already using um recharts, then that should help.
And so let's see what it does. I saw before that it's going to
does. I saw before that it's going to create some new um operations. So it's going to make a get
operations. So it's going to make a get accessible budgets query. Cool.
query. Cool.
Um, and it's going to define dashboard aggregation queries, which is the those are like dashboard totals and get spending by envelope. I like it. And then it's going
envelope. I like it. And then it's going to create some front-end components, which are bar charts and a pie chart.
And should be pretty good once we have that stuff in order.
seeing an update the dashboard page. Um,
we'll go ahead and we'll try and just deploy this app. Um, for deployment, we'll probably have to um add a real email sender. We can't use
the dummy email sender that we've been using in development. Um, so it might take a little while, but uh should be worth it. Okay.
it. Okay.
Um, now I'm not sure if it applied these um these changes or not. That's just
odd. Says the setup and it I'm just going to say go ahead and implement that. Implement those
that. Implement those changes. Funny that I didn't do it
changes. Funny that I didn't do it there. Um, which I
there. Um, which I find surprising. I mean, it created all the
surprising. I mean, it created all the things and I don't feel like going through and yeah, manually clicking apply to all
of them. So, let's have it work it
of them. So, let's have it work it itself.
deleting the old overview. So, it made a envelope spending breakdown and an income expense overview. Oh, I need to accept the
overview. Oh, I need to accept the delete file um thingy.
Cool. I see some import errors.
We have recharts installed so we don't need to do that. These I know are false and I figured that out right away. We do
have an error here which is budget and I don't I think it went ahead and deleted which file is that? That is update collaborator
role. So, I'm not sure why it changed
role. So, I'm not sure why it changed that, but I'm going to put that back. I don't think um revert this
back. I don't think um revert this change. So, I think that was what's was
change. So, I think that was what's was causing the issue there. And let's see.
there. And let's see.
Um SDK fail, build fail. Okay, so we're getting a lot of
fail. Okay, so we're getting a lot of errors now. Um where are we getting them from?
now. Um where are we getting them from?
from the index. Mhm.
index. Mhm.
Okay. One of them is this one's that. We
can just tab through those. Let's go
down here. Budget
here. Budget ids type string is not assible to type number. Okay. Okay, so that means this
number. Okay. Okay, so that means this one those we tab through those type string is not assignable to type number.
So this should be string right h. So I guess the get spending by
h. So I guess the get spending by envelope expects a number array.
So let's ask it what the best way to deal with this is fix and chat. I know we can
chat. I know we can cast strings as numbers. Let's see. Um seems budget ID
numbers. Let's see. Um seems budget ID field is likely a string. Perhaps a U ID. We could look that
ID. We could look that up. Is budget
up. Is budget ID. Where are
ID. Where are budgets? Yes, this is a UYU
budgets? Yes, this is a UYU ID. So, it's going to change that to
ID. So, it's going to change that to string and that to string.
Okay, so it just is expecting to take a number, but because budget ID was a UYU ID, which is a long string of um
um characters and numbers. That should fix the issue. Now
numbers. That should fix the issue. Now
let's see what happens when it builds and recompiles. Some more
recompiles. Some more errors. Mhm. Okay. Not null. And it says
errors. Mhm. Okay. Not null. And it says null is not assignable to type string. Let's fix in
string. Let's fix in chat. I've actually never seen this
chat. I've actually never seen this before. this not null um definition here
before. this not null um definition here in a Prisma group by [Music]
sum where envelope ID okay but it doesn't solve this issue envelope ID is string So huh undefined. Okay.
undefined. Okay.
apply. What do we got? Request error loading budget info
got? Request error loading budget info request failed with 404 HTC loss error 404
object. Okay. At failure key.
object. Okay. At failure key.
So we get this error on the client. After those changes, I
client. After those changes, I unfortunately get this error on the client. Probably not finding a
client. Probably not finding a um budget ID or something like that. So
let's see how it deals with this.
is the function path get accessible details. It's asking me questions. So
details. It's asking me questions. So
get accessible budgets here is collaboration operations. Get accessible budgets.
operations. Get accessible budgets.
Yeah. budgets owned by user or budgets where the user is a collaborator.
Okay. Could you please confirm you have restarted the server and check the server logs for any errors when 404 happens? Restart like they
happens? Restart like they ask. Ah, interesting. Okay, so we've got
ask. Ah, interesting. Okay, so we've got um income, no income versus expense. So,
let's go check and if we add an income, let's say some income [Music] um we'll add
a,000 say income for that whatever.
Nice. So, we added a,000 bucks. So,
we've got income verse expense for the current month. Pretty good. And we've
current month. Pretty good. And we've
got money spent, funny money. Do we not have any envelopes? Yes. So, no money was spent on rent. So, if I go to transactions and I add a transaction and I say uh
rent that was 600 rent at transaction. So, my budget I see I spent
transaction. So, my budget I see I spent all my money on rent. I went over on my funny money and my dashboard should
reflect that that so majority of my spending is on rent. The rest is on funding money and I've got uh this income versus expense for the current
month. They're pretty
month. They're pretty close. Um right. So maybe I could do
close. Um right. So maybe I could do something with the rest of this where for example we use some of these cards here.
Um, I kind of like these indicators there. Um, but I think, you know what,
there. Um, but I think, you know what, this is pretty good for for for now.
This kind of um shows that we're able to do it. Let's
just go ahead and um repurpose those cards and get rid of recent sales. So,
nice. It works now. Um, but on dashboard page, I want to repurpose some of those
cards with general info such as total income, total spent, and total
remaining or something like that. remove
recent sales too. So we'll remove the recent sales and I will fix up some of these.
Right. Okay. So a lot of the um we have functions already, we have operations already that get that data for us. So it's easy to pass to those um
for us. So it's easy to pass to those um uh cards there. I mean we could go deeper and actually make it a little nicer, but I mean I think that's pretty cool. That looks pretty nice what it
cool. That looks pretty nice what it just did there. Um made it very simple for us. Then of course you can jump to
for us. Then of course you can jump to your budget where you see your collaborators and you see your transactions.
Um, I like it. Quick view of what you have remaining this month.
And yeah, really nice. Um, vibe
coded. I'm going to leave the other stuff in place for now. I mean, none of this perfect. Um, we can keep using this
this perfect. Um, we can keep using this process uh to refine everything. Um, I
think that's good enough for the uh purposes of this video. So, I'm going to
um make a new chat and I'm going to say um I'd like to deploy this app now
using let's do the docs wasps CLI deployment
methods. Um, can you lay out a
methods. Um, can you lay out a deployment plan in the AI
folder? Um, because yeah, AI is making
folder? Um, because yeah, AI is making it. Um, and title it
it. Um, and title it deployment plan.md where we go
plan.md where we go through where we outline all the deployment steps necessary.
So Wasp has some cool deployment features um and like you can deploy using a um
single command with um uh the Wasp CLI and right now you can do that with fly.io. So, we'll probably have to go
fly.io. So, we'll probably have to go set up a fly account and stuff like that. Um hopefully the plan will tell us
that. Um hopefully the plan will tell us that. So, it's just going through the
that. So, it's just going through the docs and it's going to tell us what to do.
Um, so where did it make the deployment?
Here's the deployment plan. Let's check
it out. Accept
file. So you need an account with Fly.io. Requires a credit card. Um, I
Fly.io. Requires a credit card. Um, I
know that they don't um charge you if you're under $5. So you install the Fly Ctl CLI. We've already I already have
Ctl CLI. We've already I already have done that. Um, this gives you the link
done that. Um, this gives you the link to how you can do it. You log in with it. And then we need to follow these
it. And then we need to follow these steps. So while CLI simplifies
steps. So while CLI simplifies deployment to a single command.
[Music] Um so we need to choose app region run deployment command blah blah blah blah.
So we will do that. Um but I know before we can deploy we need to move off the dummy email provider and move to a real one.
Um so let's go ahead and do that now. So
here we're using dummy email provider in production and that was just logging like all the emails um to the console. Um but we want to use a real
console. Um but we want to use a real one like send grid or something. Okay.
So um in the was docs for the email sender that we've been using been using the dummy email sender which is just a a placeholder in um development that logs
all the emails that would be sent by a real email sender to the console. So, I
just quickly went ahead off uh camera and I got the um Send Grid uh I logged into my Send Grid account and got the API keys and put them
into.server with under the send grid API
into.server with under the send grid API key um environment variable and yeah, you can do the same and um uh yeah, this
is env.server.example. You'll want
is env.server.example. You'll want
av.server file. put your Send Grid API key in um and change the email sender to provider send grid default from and be
your um email that you use um for that uh send grid account. Um so you'll see the same thing in here from field. Um so
let's uh um let's try it out. Uh I've
got to restart the um oh import main.
What's going on? Import main from um I'm missing something here. Oh, I got two. Uh no, that should
here. Oh, I got two. Uh no, that should be right. Where I was going. Import main
be right. Where I was going. Import main
root component client server unexpected token root component. Oh, okay. I don't know what
component. Oh, okay. I don't know what was going on there. uh maybe missing a curly bracket or something. Okay,
so start the app again and just to see if this um API key is working, I'm going to try and register a new
user. So, we're logged in with probably
user. So, we're logged in with probably dude or whatever. go to sign up and we're going to do um
guymail.com. Um or let me actually use
guymail.com. Um or let me actually use my real email address. Budget created for new user.
address. Budget created for new user.
Okay, let me go to my email address um off camera. Cool. And there's my real email address. And it says, "Yeah,
email address. And it says, "Yeah, you've got an email." So, I'm going to verify it.
Um, again, off camera here, go to my email address.
and it gave me a link that I'm going to click verify email. Cool. So, I went to my Gmail
email. Cool. So, I went to my Gmail account, clicked on it, and it verified.
So, now I should be able to log in with that uh real actual email address. So,
we know that it is [Music] working. Cool. And here of course um we
working. Cool. And here of course um we have no spending data for the moment because we have no budget and stuff like that. But cool. Yeah, that worked. Um so
that. But cool. Yeah, that worked. Um so
that was a prerequisite to be able to actually deploy the app. Um because um Oh, there's my API key. I'm going to
have to get rid of that.
Um because um yeah, with the dummy email provider, you can't deploy to production. So, we
had this deployment plan that we made.
Um and I'm going to go back to the docs and I'll just say um how can I check if I'm logged in with the fly
uh ctl? It says here you have to ini
uh ctl? It says here you have to ini install the flyct ctl and log in. So let's just uh run that command. Cool. So it shows I'm logged
command. Cool. So it shows I'm logged in. I've already done that before. And
in. I've already done that before. And
it's fly off. Who am I? Um so now I'll just ask it what's the next um uh prepare the next command for me
according to the um deployment plan.
So, I'm just going to have it, you know, create the um uh unique name blah blah blah the region. So, uh it's
saying what base name would you like to use for your application? Um I like this one. Yeah, envelope budgeting app. Um
one. Yeah, envelope budgeting app. Um
yeah, say I like the name and let's go with Miami. So you
need a name and a region to deploy the app in. Um so it's running a command.
app in. Um so it's running a command.
It's going to check fly. So it's got my personal and it's got shared. Um which
organization would you like? I'll say
personal. Okay. So it's prepared the command wasp deploy fly launch the name of the app uh in Miami and to the personal org. If you don't have
personal org. If you don't have different organizations, it'll just you don't need that um tag. But that's the great thing about having it put out this uh plan and then having it make the
commands for you. So, let's run it. Now, of course, you would have to,
it. Now, of course, you would have to, like it says here, you'll have to, you know, go to fly.io and create account if you don't already have one.
Um, but as you can see here, it's building the app. This might take a while.
Press any key to continue.
Continue. Okay. So, we popped out the terminal.
Um, and then it's running here. Okay. It says my app was deployed
here. Okay. It says my app was deployed finally. So, let's open up the link and
finally. So, let's open up the link and see what we get.
And how's it going? See a loading spinner
going? See a loading spinner here. Log in to probably to sign up. We
here. Log in to probably to sign up. We
need I know we need to add the environment variable. So,
environment variable. So, uh no match signs up.
sign up for free thingy.
So, let's go ahead. We've got the We see the client there. It's doing a loading spinner probably because it's not able to find the um send grid API key. Um, so
let's ask uh the agent according to the Wasp docs, how do I add a an environment
variable via the CLI. So yeah, I'm going to go access
CLI. So yeah, I'm going to go access that envir environment variable on camera, but of course I'm going to delete this later. So you goons don't
have access to it. Okay. So here we go. Um let's just
it. Okay. So here we go. Um let's just say can I change that? No. Let's put it
Well, it's there. So let's just copy that. Let's put it here. And it's going
that. Let's put it here. And it's going to be Oh So paste it again and get
the send good API key. Paste that in there. Okay. Um let's go back to our
there. Okay. Um let's go back to our app. Where was the URL again?
app. Where was the URL again?
Here. Let's see what our issue is. Okay,
cool. That I think it's getting the the API key now. So, we'll go to sign up and put in my real email address again.
Okay. And then it sent an email. I'm
going to go off camera and check my email here. And I've got
here. And I've got a email. Okay. So, email has
a email. Okay. So, email has been verified as you can see here. So,
I'm going to go to login and I'm going to put in my email.
And we are logged in, baby. All right.
So, let's create a budget. Fun
uh household stuff. Awesome. We have a deployed
stuff. Awesome. We have a deployed um semi-finished um collaborative budgeting app. Let's
see if we can add some transactions. Nice. I'll just say
transactions. Nice. I'll just say coffee. And I like coffee, so I'll spend
coffee. And I like coffee, so I'll spend 100 on that. Cool. All right. And
that. Cool. All right. And
um everything seems to be working pretty well, I would say. Save changes. Cool. And go to our
say. Save changes. Cool. And go to our dashboard. And we see our income
dashboard. And we see our income expenses. Things are looking good. total
expenses. Things are looking good. total
income remaining this month. Um Oh, yes, because I didn't put any income in. So,
it took a while. I mean, it's not like everything is done for you. You kind of need to know what you're doing, but you can definitely vibe code your way and
get a lot done um a lot faster um and than you could in the past. create some
complex apps.
Um, and yeah, this workflow I think definitely um is one I will be sticking to. Um, I
even noticed that adding like stuff like this or maybe adding like this solutions possible solutions thinking idea. Um but
having these like set of cursor rules that you can either automatically um or manually um inject into the context is really helpful. Um having a
detailed PRD and plan that you can go through is super helpful. Um starting on top of a really nice component library is very helpful. using a uh full stack
um framework with batteries included gets you um you know a lot further than usually would. So that's it in a
usually would. So that's it in a nutshell. Um I know this is long, but I
nutshell. Um I know this is long, but I hope it provided some um use somewhere within this video. You
found something useful or uh you've learned something. Uh let me know in the
learned something. Uh let me know in the comments um anything that I might have missed. um stuff that you think is
missed. um stuff that you think is improves this workflow or or things I'm overlooking. Um yeah, these tools keep
overlooking. Um yeah, these tools keep improving, keep getting better. So, this
video might even be obsolete in a few months. Who knows? But anyway, um that's
months. Who knows? But anyway, um that's it for now. Signing off. Enjoy the vibe coding.
Loading video analysis...