Timestamps follow the original livestream. Select a time to watch that moment. Transcripts are machine-generated with reviewed name and terminology corrections; occasional recognition errors may remain.
4:15:17People have been saying that SaaS is dead for a while now.
4:15:19It's not even a hot take at this point.
4:15:21Why pay someone to build and maintain the tools you use when you could just do it yourself?
4:15:27Just ask your agent to do it.
4:15:28And for me, there's one missing piece that rarely gets mentioned.
4:15:32And it's the fact that there's a gap, a big gap between working software that got one-shotted
4:15:38and software I would actually use.
4:15:40Software that sparks joy, that is polished, that feels good.
4:15:43And I actually went on a journey to replace a bunch of SaaS providers we were using internally
4:15:48at Railway for marketing purposes.
4:15:50And I just built an all-in-one tool that we use.
4:15:52The tool allows us to manage content
4:15:54for the Railway website, change log, blog.
4:15:56We can use it to send emails,
4:15:58post on all of our social platforms at the same time,
4:16:03There's even a mini CRM so that when we're working
4:16:05with external creators, we can keep track of that.
4:16:08There is task tracking, launch planning,
4:16:10because you wanna coordinate multiple things
4:16:12and when they'll go out, there's a calendar.
4:16:14and at the same time there's like comments real-time editing and it's all built using
4:16:21agents i would say i felt the breakthrough when gpt6 came out and all of this is running on railway
4:16:28everything just auto deploys and let me essentially now walk you through the principles i use
4:16:34to actually make sure that when i want to add a feature it's you know actually polished and
4:16:40matches the rest of the app and at the same time the principles that you can pull from and apply
4:16:47when building tools of your own so instead of doing my talk from my boring office i decided to
4:16:52switch things up and do it outside it is absolutely beautiful right now i'm in edinburgh scotland
4:16:58and it's just unreal like i'm on a bench outside and this is my view definitely a 10 out of 10
4:17:06bench. Now, this type of talk for me feels a little bit different than what I'm used to, because
4:17:13I essentially will walk you through the journey of me building our own internal tools and the
4:17:19opinions I've developed. But I also understand that the landscape changes very, very quickly.
4:17:25So like anything I say might change completely in like the span of months. Who knows? So I don't
4:17:33know consider this my disclaimer like but the time of recording is fall 2026 it's october and
4:17:40yeah so anyway with that out of the way uh let's talk about the first point which is text acts don't
4:17:48matter now a lot of people say that it doesn't matter what programming language you use what
4:17:53framework you use you can just ask your agent to go do anything and those are able to do it
4:17:57And 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.
4:18:21And the reason is, like, it's very simple.
4:18:23The agent doesn't need to reinvent the same, like, wheel every time it tries to add a new feature,
4:18:30or it doesn't need to introduce new patterns.
4:18:31It will just essentially follow existing patterns.
4:18:35And when it comes to, like, what you choose, I feel like it kind of doesn't really matter
4:18:40as long as you have a code base that is properly structured.
4:18:44But my go-to choice today is, one, TanStack libraries for anything when building on the web.
4:18:51And if you're building anything content-related, I would say definitely go with payload.
4:18:55Solid experience, great abstraction.
4:18:58I 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.
4:19:08Maybe the future will change.
4:19:09but yeah and that's kind of like the main first item that i kind of ran into
4:19:20when you use like a lot of sas products out there that you actually love they use every day
4:19:25when you're a user there's like a lot of things you don't notice but when you actually try to like
4:19:31replicate an experience you quickly find out how much care and thought goes into different flows
4:19:38So something as simple as, oh, I want to be able to send an email or to publish something.
4:19:45You can easily do it by having a good old server-side rendered app with forms that you submit.
4:19:54But if you try to build something that is going to be used every day that you will reach for
4:20:00a lot, you're like, oh, it shouldn't feel that way.
4:20:03And there are kind of like a bunch of patterns that I found that agents don't typically do unless you explicitly ask them to.
4:20:11And this is my list. So we'll go through them one by one.
4:20:15And 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.
4:20:25So 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.
4:20:39So that you can, let's say, as you're typing, you're able to type and then it just automatically saves.
4:20:44And 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.
4:20:56So 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.
4:21:04Now, you can also go a step further and to add like real time collaboration so that you can have like concurrent edits.
4:21:12And again, my agent didn't struggle at all with adding the feature.
4:21:16It was like, I don't know, asking about it, reviewing how it would work.
4:21:21And then once that's done, just 700 million tokens later, I had real time.
4:21:26So I would say in general, this is the first thing that I find agents just don't do well from a product experience perspective.
4:21:34Another pattern I found that agents completely forget to implement is optimistic updates.
4:21:39So rather than showing your users a bunch of loading spinner whenever they're taking any action,
4:21:43you essentially show them the success state optimistically.
4:21:48And in the background, you're going to sync whatever change they made.
4:21:51Now, if the sync or the operation fails for whatever reason,
4:21:56you just roll it back and then tell them, like, oh, the operation didn't work.
4:21:59Now, of course, you shouldn't blindly have optimistic updates for everything.
4:22:04There are some scenarios where you want to show the user a loading spinner
4:22:07and they're going to wait to check that everything worked properly.
4:22:11But in general, having optimistic updates
4:22:14makes the overall experience feel significantly faster,
4:22:18much snappier, and it will just feel much more instant.
4:22:22So pretty sure you can just ask your agent like,
4:22:25hey, I would like to implement optimistic updates where it makes sense.
4:22:28Let's come up with a plan and it will tell you all the areas
4:22:31Again, it's like it's not difficult for the agent to build it.
4:22:34you just need to ask and know exactly what to ask for. Now an extension of optimistic updates in my
4:22:40opinion is giving users the ability to undo certain actions. Now for example if you ask your agent to
4:22:47implement the ability to delete records what it will typically do is it will give you a delete
4:22:53button you click it might show a confirmation dialog you hit confirm and then it will actually
4:22:57do the deletion. But a much nicer experience is actually allowing the user to undo that action
4:23:04so they could delete you immediately remove the item they want to delete from the ui but you tell
4:23:10them like hey you have like a couple of seconds where you could change your mind and if they don't
4:23:16do anything that means you actually want to delete a thing then you actually implement the operation
4:23:22otherwise if they hit undo you just bring back the change so it's kind of like you do the operation
4:23:28in the background as well it's just kind of a delayed action which kind of ties into the next
4:23:34point, which is archiving, you should tell your agent you want the ability to archive records
4:23:40and be able to unarchive them. Because sometimes you want to hide something from the UI completely,
4:23:46or let's say from search results, and archiving will be the way to do it. And you shouldn't
4:23:51force your user to be like, well, if you don't want to see this, you have to delete it.
4:23:54Any much better experience is just the ability to archive records. So I think it is a pattern
4:24:00that should definitely exist.
4:24:02Another big one for me is URL state.
4:24:04You should ask your agent to persist in the URL
4:24:06whenever it makes sense, of course.
4:24:07And it's so useful because whenever you have,
4:24:10let's say, a list of records
4:24:10and you want the ability to filter or sort them
4:24:15and you just have a bunch of conditions,
4:24:19maintaining these things in the URL
4:24:21makes it trivial for you to give them to someone else.
4:24:24And then, let's say, another team member
4:24:25is just going to be able to see
4:24:27exactly what you want them to see.
4:24:28Now another small detail that agents don't implement out of the box is infinite scroll.
4:24:32I don't want to be clicking on lobe more over and over and over or like a next page button.
4:24:38As I scroll, I should just get the data.
4:24:41I shouldn't need to click next page.
4:24:43And then in the end, I'll just see that, oh, I've reached the end.
4:24:47But also when you use something every day, I think it makes a huge difference.
4:24:51Now another pattern I found that made the output significantly better is telling the
4:24:56agent explicitly to use existing pages as references when it comes to the ui the data
4:25:02fetching and how it works and how the thing is overall structured and that made it possible for
4:25:08me to essentially define what good looks like once and then just reuse it for more features now
4:25:15to be completely honest sometimes even when you tell the agent like hey use page x as a reference
4:25:22sometimes it just doesn't follow it i don't know if models like get dumber sometimes but sometimes
4:25:28it does happen but overall i would say that my success rate is higher whenever i tell the agent
4:25:34to like well use an existing page as a reference because you also just end up with a more consistent
4:25:39experience so like as you're using your app you're like oh this just matches the other part of the
4:25:44app if they both share like the same concept so like if two parts of the app are essentially
4:25:50lists of records that you can create, update, and delete and list. Well, both of these parts
4:25:57should be pretty much identical. This list kind of brings me to my next point, which is whenever
4:26:02you have opinions about something, they should be packaged as agent skills. And then this way,
4:26:07your agent, whenever it's building something, it will actually follow those skills pretty closely.
4:26:12And as I was building all of our internal tooling, I found myself reaching for three agent skills.
4:26:18two of them are related to design engineering so one made it easier to have better ui better
4:26:24typography better layouts as well as like better error messages in general and the second one was
4:26:29a set of design engineering skills that made it easier to just have better animations and other
4:26:34things like that and then last but not least is the railway agent skills of course so like
4:26:39everything that i built for us internally at railway runs on railway of course like everything
4:26:45So like buckets, databases, the app itself, the real-time server, everything.
4:26:50And for the agent to effectively work with Railway and be able to deploy everything,
4:26:55you just give it the Railway agent skills and it was just able to do it.
4:26:59And yeah, so like once you have all of your agent skills and everything,
4:27:03in my opinion, the final step, and I think the most important step, is verification.
4:27:10So the agents typically, whenever you ask it to build something,
4:27:13it's going to be like, okay, I implemented the feature.
4:27:16build pass, test pass, all good, right?
4:27:19But what I found is when you actually try out what happens,
4:27:22you sometimes end up with just like a very broken experience.
4:27:27So once you have like a verification loop in place,
4:27:30it's like a nine day difference
4:27:32because the agent, you can literally see it,
4:27:34be like, okay, I built this thing.
4:27:40And then in the end, it's like, okay, I fully tested it.
4:27:42And I felt this breakthrough with computer use once it got really, really good.
4:27:47And 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.
4:28:02And the agents are very capable of doing this.
4:28:06and once you have all those pieces,
4:28:08I would say you will end up with solid internal tools
4:28:14that work properly and work in a consistent way.
4:28:17This was my list of principles that I use
4:28:19whenever I'm building any internal tools.
4:28:23that you're inspired to build your own internal tools
4:28:26that feel good, that are polished and spark joy.
4:28:30And I hope that you too can become your company's SaaS layer.
4:28:34And with that, thank you so much for watching, and I'll see you in the next one.
No passages match. Try a shorter word or phrase.