# Please… Enough with the Sloppy, One-Shot SaaS Replacements

Mahmoud Abdelwahab · AI Engineer NYC 2026 · October 13

[Watch recording](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15317s)

[04:15:17](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15317s) People have been saying that SaaS is dead for a while now.

[04:15:19](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15319s) It's not even a hot take at this point.

[04:15:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15321s) Why pay someone to build and maintain the tools you use when you could just do it yourself?

[04:15:27](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15327s) Just ask your agent to do it.

[04:15:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15328s) And for me, there's one missing piece that rarely gets mentioned.

[04:15:32](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15332s) And it's the fact that there's a gap, a big gap between working software that got one-shotted

[04:15:38](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15338s) and software I would actually use.

[04:15:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15340s) Software that sparks joy, that is polished, that feels good.

[04:15:43](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15343s) And I actually went on a journey to replace a bunch of SaaS providers we were using internally

[04:15:48](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15348s) at Railway for marketing purposes.

[04:15:50](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15350s) And I just built an all-in-one tool that we use.

[04:15:52](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15352s) The tool allows us to manage content

[04:15:54](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15354s) for the Railway website, change log, blog.

[04:15:56](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15356s) We can use it to send emails,

[04:15:58](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15358s) post on all of our social platforms at the same time,

[04:16:01](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15361s) manage the website's media.

[04:16:03](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15363s) There's even a mini CRM so that when we're working

[04:16:05](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15365s) with external creators, we can keep track of that.

[04:16:08](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15368s) There is task tracking, launch planning,

[04:16:10](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15370s) because you wanna coordinate multiple things

[04:16:12](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15372s) and when they'll go out, there's a calendar.

[04:16:14](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15374s) and at the same time there's like comments real-time editing and it's all built using

[04:16:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15381s) agents i would say i felt the breakthrough when gpt6 came out and all of this is running on railway

[04:16:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15388s) everything just auto deploys and let me essentially now walk you through the principles i use

[04:16:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15394s) to actually make sure that when i want to add a feature it's you know actually polished and

[04:16:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15400s) matches the rest of the app and at the same time the principles that you can pull from and apply

[04:16:47](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15407s) when building tools of your own so instead of doing my talk from my boring office i decided to

[04:16:52](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15412s) switch things up and do it outside it is absolutely beautiful right now i'm in edinburgh scotland

[04:16:58](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15418s) and it's just unreal like i'm on a bench outside and this is my view definitely a 10 out of 10

[04:17:06](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15426s) bench. Now, this type of talk for me feels a little bit different than what I'm used to, because

[04:17:13](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15433s) I essentially will walk you through the journey of me building our own internal tools and the

[04:17:19](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15439s) opinions I've developed. But I also understand that the landscape changes very, very quickly.

[04:17:25](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15445s) So like anything I say might change completely in like the span of months. Who knows? So I don't

[04:17:33](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15453s) know consider this my disclaimer like but the time of recording is fall 2026 it's october and

[04:17:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15460s) yeah so anyway with that out of the way uh let's talk about the first point which is text acts don't

[04:17:48](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15468s) matter now a lot of people say that it doesn't matter what programming language you use what

[04:17:53](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15473s) framework you use you can just ask your agent to go do anything and those are able to do it

[04:17:57](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15477s) And while I agree to some extent, what I found is when you're building a tool that you will actually use, when you give the agent a proper code base with solid abstractions, what ends up happening is whenever you're working, let's say, on a new feature, you end up with a much more consistent result that is similar to what you've already built before.

[04:18:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15501s) And the reason is, like, it's very simple.

[04:18:23](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15503s) The agent doesn't need to reinvent the same, like, wheel every time it tries to add a new feature,

[04:18:30](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15510s) or it doesn't need to introduce new patterns.

[04:18:31](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15511s) It will just essentially follow existing patterns.

[04:18:35](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15515s) And when it comes to, like, what you choose, I feel like it kind of doesn't really matter

[04:18:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15520s) as long as you have a code base that is properly structured.

[04:18:44](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15524s) But my go-to choice today is, one, TanStack libraries for anything when building on the web.

[04:18:51](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15531s) And if you're building anything content-related, I would say definitely go with payload.

[04:18:55](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15535s) Solid experience, great abstraction.

[04:18:58](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15538s) I went down a big rabbit hole of comparing CMSs at some point because I don't believe that I should build it from scratch, even though I can.

[04:19:07](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15547s) But again, who knows?

[04:19:08](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15548s) Maybe the future will change.

[04:19:09](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15549s) but yeah and that's kind of like the main first item that i kind of ran into

[04:19:20](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15560s) when you use like a lot of sas products out there that you actually love they use every day

[04:19:25](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15565s) when you're a user there's like a lot of things you don't notice but when you actually try to like

[04:19:31](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15571s) replicate an experience you quickly find out how much care and thought goes into different flows

[04:19:38](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15578s) So something as simple as, oh, I want to be able to send an email or to publish something.

[04:19:45](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15585s) You can easily do it by having a good old server-side rendered app with forms that you submit.

[04:19:54](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15594s) But if you try to build something that is going to be used every day that you will reach for

[04:20:00](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15600s) a lot, you're like, oh, it shouldn't feel that way.

[04:20:03](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15603s) And there are kind of like a bunch of patterns that I found that agents don't typically do unless you explicitly ask them to.

[04:20:11](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15611s) And this is my list. So we'll go through them one by one.

[04:20:15](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15615s) And the first one is like autosave. I found that if, like, let's say I'm building some form of document editor, autosave is kind of like a table states feature.

[04:20:25](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15625s) So rather than manually clicking save to save things, you just ask it to automatically save progress in the background and to make sure that it's like a non-blocking action.

[04:20:39](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15639s) So that you can, let's say, as you're typing, you're able to type and then it just automatically saves.

[04:20:44](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15644s) And one other kind of like step further that you could do is to also prevent the browser tab from closing if there are unsafe changes.

[04:20:56](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15656s) So it's kind of like these two layers that kind of guarantee that whatever it is that you're working on is just not going to be lost.

[04:21:04](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15664s) Now, you can also go a step further and to add like real time collaboration so that you can have like concurrent edits.

[04:21:12](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15672s) And again, my agent didn't struggle at all with adding the feature.

[04:21:16](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15676s) It was like, I don't know, asking about it, reviewing how it would work.

[04:21:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15681s) And then once that's done, just 700 million tokens later, I had real time.

[04:21:26](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15686s) So I would say in general, this is the first thing that I find agents just don't do well from a product experience perspective.

[04:21:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15694s) Another pattern I found that agents completely forget to implement is optimistic updates.

[04:21:39](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15699s) So rather than showing your users a bunch of loading spinner whenever they're taking any action,

[04:21:43](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15703s) you essentially show them the success state optimistically.

[04:21:48](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15708s) And in the background, you're going to sync whatever change they made.

[04:21:51](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15711s) Now, if the sync or the operation fails for whatever reason,

[04:21:56](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15716s) you just roll it back and then tell them, like, oh, the operation didn't work.

[04:21:59](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15719s) Now, of course, you shouldn't blindly have optimistic updates for everything.

[04:22:04](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15724s) There are some scenarios where you want to show the user a loading spinner

[04:22:07](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15727s) and they're going to wait to check that everything worked properly.

[04:22:11](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15731s) But in general, having optimistic updates

[04:22:14](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15734s) makes the overall experience feel significantly faster,

[04:22:18](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15738s) much snappier, and it will just feel much more instant.

[04:22:22](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15742s) So pretty sure you can just ask your agent like,

[04:22:25](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15745s) hey, I would like to implement optimistic updates where it makes sense.

[04:22:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15748s) Let's come up with a plan and it will tell you all the areas

[04:22:30](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15750s) where it makes sense to do.

[04:22:31](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15751s) Again, it's like it's not difficult for the agent to build it.

[04:22:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15754s) you just need to ask and know exactly what to ask for. Now an extension of optimistic updates in my

[04:22:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15760s) opinion is giving users the ability to undo certain actions. Now for example if you ask your agent to

[04:22:47](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15767s) implement the ability to delete records what it will typically do is it will give you a delete

[04:22:53](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15773s) button you click it might show a confirmation dialog you hit confirm and then it will actually

[04:22:57](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15777s) do the deletion. But a much nicer experience is actually allowing the user to undo that action

[04:23:04](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15784s) so they could delete you immediately remove the item they want to delete from the ui but you tell

[04:23:10](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15790s) them like hey you have like a couple of seconds where you could change your mind and if they don't

[04:23:16](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15796s) do anything that means you actually want to delete a thing then you actually implement the operation

[04:23:22](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15802s) otherwise if they hit undo you just bring back the change so it's kind of like you do the operation

[04:23:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15808s) in the background as well it's just kind of a delayed action which kind of ties into the next

[04:23:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15814s) point, which is archiving, you should tell your agent you want the ability to archive records

[04:23:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15820s) and be able to unarchive them. Because sometimes you want to hide something from the UI completely,

[04:23:46](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15826s) or let's say from search results, and archiving will be the way to do it. And you shouldn't

[04:23:51](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15831s) force your user to be like, well, if you don't want to see this, you have to delete it.

[04:23:54](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15834s) Any much better experience is just the ability to archive records. So I think it is a pattern

[04:24:00](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15840s) that should definitely exist.

[04:24:02](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15842s) Another big one for me is URL state.

[04:24:04](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15844s) You should ask your agent to persist in the URL

[04:24:06](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15846s) whenever it makes sense, of course.

[04:24:07](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15847s) And it's so useful because whenever you have,

[04:24:10](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15850s) let's say, a list of records

[04:24:10](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15850s) and you want the ability to filter or sort them

[04:24:15](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15855s) and you just have a bunch of conditions,

[04:24:19](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15859s) maintaining these things in the URL

[04:24:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15861s) makes it trivial for you to give them to someone else.

[04:24:24](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15864s) And then, let's say, another team member

[04:24:25](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15865s) is just going to be able to see

[04:24:27](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15867s) exactly what you want them to see.

[04:24:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15868s) Now another small detail that agents don't implement out of the box is infinite scroll.

[04:24:32](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15872s) I don't want to be clicking on lobe more over and over and over or like a next page button.

[04:24:38](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15878s) As I scroll, I should just get the data.

[04:24:41](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15881s) I shouldn't need to click next page.

[04:24:43](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15883s) And then in the end, I'll just see that, oh, I've reached the end.

[04:24:46](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15886s) It's a very minor thing.

[04:24:47](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15887s) But also when you use something every day, I think it makes a huge difference.

[04:24:51](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15891s) Now another pattern I found that made the output significantly better is telling the

[04:24:56](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15896s) agent explicitly to use existing pages as references when it comes to the ui the data

[04:25:02](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15902s) fetching and how it works and how the thing is overall structured and that made it possible for

[04:25:08](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15908s) me to essentially define what good looks like once and then just reuse it for more features now

[04:25:15](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15915s) to be completely honest sometimes even when you tell the agent like hey use page x as a reference

[04:25:22](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15922s) sometimes it just doesn't follow it i don't know if models like get dumber sometimes but sometimes

[04:25:28](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15928s) it does happen but overall i would say that my success rate is higher whenever i tell the agent

[04:25:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15934s) to like well use an existing page as a reference because you also just end up with a more consistent

[04:25:39](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15939s) experience so like as you're using your app you're like oh this just matches the other part of the

[04:25:44](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15944s) app if they both share like the same concept so like if two parts of the app are essentially

[04:25:50](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15950s) lists of records that you can create, update, and delete and list. Well, both of these parts

[04:25:57](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15957s) should be pretty much identical. This list kind of brings me to my next point, which is whenever

[04:26:02](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15962s) you have opinions about something, they should be packaged as agent skills. And then this way,

[04:26:07](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15967s) your agent, whenever it's building something, it will actually follow those skills pretty closely.

[04:26:12](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15972s) And as I was building all of our internal tooling, I found myself reaching for three agent skills.

[04:26:18](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15978s) two of them are related to design engineering so one made it easier to have better ui better

[04:26:24](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15984s) typography better layouts as well as like better error messages in general and the second one was

[04:26:29](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15989s) a set of design engineering skills that made it easier to just have better animations and other

[04:26:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15994s) things like that and then last but not least is the railway agent skills of course so like

[04:26:39](https://www.youtube.com/watch?v=akEqiXFo3GM&t=15999s) everything that i built for us internally at railway runs on railway of course like everything

[04:26:45](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16005s) So like buckets, databases, the app itself, the real-time server, everything.

[04:26:50](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16010s) And for the agent to effectively work with Railway and be able to deploy everything,

[04:26:55](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16015s) you just give it the Railway agent skills and it was just able to do it.

[04:26:59](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16019s) And yeah, so like once you have all of your agent skills and everything,

[04:27:03](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16023s) in my opinion, the final step, and I think the most important step, is verification.

[04:27:10](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16030s) So the agents typically, whenever you ask it to build something,

[04:27:13](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16033s) it's going to be like, okay, I implemented the feature.

[04:27:16](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16036s) build pass, test pass, all good, right?

[04:27:19](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16039s) But what I found is when you actually try out what happens,

[04:27:22](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16042s) you sometimes end up with just like a very broken experience.

[04:27:27](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16047s) So once you have like a verification loop in place,

[04:27:30](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16050s) it's like a nine day difference

[04:27:32](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16052s) because the agent, you can literally see it,

[04:27:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16054s) be like, okay, I built this thing.

[04:27:36](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16056s) I tried it.

[04:27:37](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16057s) It failed.

[04:27:38](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16058s) I'm going to fix it.

[04:27:39](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16059s) And it just keeps going.

[04:27:40](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16060s) And then in the end, it's like, okay, I fully tested it.

[04:27:42](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16062s) And I felt this breakthrough with computer use once it got really, really good.

[04:27:47](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16067s) And now every time I want to add a new feature, I literally just in the end say, well, you should verify that the feature works end-to-end and use it by actually running infrastructure and to test things end-to-end.

[04:28:02](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16082s) And the agents are very capable of doing this.

[04:28:04](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16084s) You just have to tell them.

[04:28:06](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16086s) and once you have all those pieces,

[04:28:08](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16088s) I would say you will end up with solid internal tools

[04:28:13](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16093s) that you can build quickly,

[04:28:14](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16094s) that work properly and work in a consistent way.

[04:28:17](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16097s) And that's it.

[04:28:17](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16097s) This was my list of principles that I use

[04:28:19](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16099s) whenever I'm building any internal tools.

[04:28:21](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16101s) Hope you found them useful.

[04:28:22](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16102s) But more importantly,

[04:28:23](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16103s) that you're inspired to build your own internal tools

[04:28:26](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16106s) that feel good, that are polished and spark joy.

[04:28:30](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16110s) And I hope that you too can become your company's SaaS layer.

[04:28:34](https://www.youtube.com/watch?v=akEqiXFo3GM&t=16114s) And with that, thank you so much for watching, and I'll see you in the next one.
