Sweet Hang #3: Matching Tattoos W/ John O'Nolan ![rw-book-cover](https://wsrv.nl/?url=https%3A%2F%2Fimg.transistor.fm%2F7-tuF7RMSNRIRfD3M2fNWLQLF-ShDgRiBeceKLOFVZc%2Frs%3Afill%3A0%3A0%3A1%2Fw%3A1400%2Fh%3A1400%2Fq%3A60%2Fmb%3A500000%2FaHR0cHM6Ly9pbWct%2FdXBsb2FkLXByb2R1%2FY3Rpb24udHJhbnNp%2Fc3Rvci5mbS9zaG93%2FLzQzNjc3LzE2OTE1%2FODI4NTItYXJ0d29y%2Fay5qcGc.jpg&w=512&h=512) ## Metadata - Author: [[Mostly Technical]] - Full Title: Sweet Hang #3: Matching Tattoos W/ John O'Nolan - Category: #podcasts - URL: https://share.snipd.com/episode/9a01a708-3486-4544-84b1-ffecfd1676a3 ## Document Notes ## Highlights - **Bootstrap Projects With Laravel New** - Use Laravel New plus your favorite starter kit to kick off side projects quickly and consistently. - Keep a small set of reusable commands and prompts to speed repetitive tasks like testing and linting. Transcript: John O’Nolan I'm happy i'm happy to have a chance to contribute to the madness after dming you both for weeks on end surely not again not again with laravel new um i'm john i suppose most people know Me for working on a product called Ghost, ghost.org. Laravel New, though, is what I do as my passion. Yes! I need the hat. That's it. Ian Landsman I feel like Ghost is like hitting its stride and you have all the success and you're always sharing these big numbers and millions of dollars and all that stuff. But then, but the only stuff you're really like, you're down in there in the Laravel nude. That's what you're doing. That's what you're actually doing. And you're going to like to see a double Laravel nude this past week. John O’Nolan It's not even just one. That's our show, folks. Thanks for coming today. I'm out of here. We should make it a two-minute show. Ian Landsman How great would that be? John O’Nolan That's's two different it's two different projects so i've reached the point with claude now where um i've just decided that the time spent waiting for a thing to complete is time wasted And so for a while i tried doing parallel claude agents and going back and forth and you're gonna mess with work trees and all that nonsense no lara 2, Laravel New, two different desktops. Aaron Francis Back and forth. Back and forth. It's twice as productive. I love this. John O’Nolan For the listener, if I may, recap, and you tell me where I went wrong here. ([Time 0:00:59](https://share.snipd.com/snip/c6df8097-64c4-4aed-a99f-b00e642f3288)) - **RSS Revival Is A Design Opportunity** - Building an RSS reader can be a designer's playground because many existing readers are slow and unloved. - Modern web tech and structured data let you reimagine RSS beyond its 15-year-old constraints. Transcript: John O’Nolan He doesn't have Twitter anymore. He could Laravel knew every morning until noon. Aaron Francis Yeah, truly. From 8 a.m. To noon, I could build 100 startups. John O’Nolan So the one I'm spending the most time on at the moment is, of all things, an RSS reader, which I love this. I love it. It seems like one of the worst possible ideas to me, but I tweeted, I think I'm working on the worst idea possible and got like more replies than I've had to anything in a while. People were going, this is great. You should do it. Aaron Francis From a 30 and up crowd, I'm sure. Right. Definitely. John O’Nolan Yes. This is grandpa. Yeah. But it's really fun. And also I've managed to get it in one weekend, a weekend and a half to beyond. It's already better than the products I use currently, which is Feedly. And Feedly hasn't changed in like years. And is now, if you go to Feedly.com, it says it's a threat monitoring AI something or other. Shocking no one. It doesn't seem to have anything to do with RSS anymore. Ian Landsman I used to use Feedly. And I got back into RSS and I was like using Feedly. And I was like, all it is, is like trying to make you do all those AI feeds. And I can imagine some useful AI features for my RSS feed, but they weren't like building any of that stuff. Like they were just like, yeah, doing all this like business threat analysis stuff. I don't even understand what this is. This is supposed to be a feed reader. Aaron Francis I don't know. It says the three H ones are threat intelligence, market intelligence, and newsreader. Ian Landsman It's a weird combination. John O’Nolan Embarrassing. Ian Landsman Yeah. I don't really get it even. So yeah, so you were using that. So okay, so you got sick of that. Like I got sick of it. And yeah, you did it. Yeah, and I've got all the stuff I love to read, but it's all over the place. John O’Nolan Some of it's in newsletters, some of it's in RSS. There's no good way of organizing it. The apps aren't changing. It's easier than ever to build anything. Why not just build the thing the way I want it to work? Make it work. So how do you want it to work? ([Time 0:03:20](https://share.snipd.com/snip/b4ca9c83-7123-4338-a36d-5d04d9c1a801)) - **Design Feeds Around Real Business Needs** - Consider adding structured features (like payments) to feed formats to support premium content cleanly. - Design readers and specs together so apps can natively support subscriptions and private feeds. Transcript: John O’Nolan Obvious example of that is now it's really common to have premium blogs and newsletters but RSS doesn't support that right so then you have to have this janky thing where every user has A private RSS feed and subscribes to a different thing. It's kind of a performance nightmare. Well, what if we had payments built into the spec? What if we had a spec with payments built in? And then you had a reader app that could support all that stuff. Ian Landsman Yeah, this is it. He's gone way over the top. I see the vision. Okay. This is the beautiful Laravel do right here. It's like, no, we're not just for the RSS. We're recreating the RSS economy. Like, yes, there we go. It's the new web standard. Okay. Now, are you building on top of, like, RSS has an extensibility capability. Are you building on top of that? Or you're thinking new standard, fully new standard? John O’Nolan Well, it's early days so far. So right now we're just focusing on basic RSS parity. I have looked into the kind of RSS composability where you sort of define your own XML tags. It's fine. I don't like it. It doesn't feel like the future. JSON feels a lot easier to work with. There's a thing called JSON feeds, which is just kind of what if RSS was JSON? It's okay. It's a little better than XML. But I feel like we can go further. I think we can go deeper. ([Time 0:06:25](https://share.snipd.com/snip/3ba950c3-2054-4589-b58e-7a76522a0932)) - **Create Reusable Claude Prompts** - Save and reuse common prompt patterns and dev commands in your Claude setup to avoid repeating work. - Add a quick '/test' prompt that runs your full lint/test flow for immediate feedback. Transcript: John O’Nolan Think i just i don't think i do anything particularly advanced i think i just do a lot more of it than most people as far as i can tell so my my project initiation is just the usual laravel New pick a starter kit off we go um depending on how quickly i think i'm going to get to production i'll either pick work os if it's going to be quickly or not if it's not because just the additional Setup is kind of a pain work os accounts i don't know why they don't allow multiple accounts for work os it's like tied to one email one email domain or one domain name per work os anyway That's a side quest so i get the project up and running with laravel installed. And then usually it's just kind of copying in the things I've used before from other Laravel projects. So augmenting the generated clawed MD file with some additional bits and pieces that I use commonly, putting in my usual clawed commands, little subdirectory of commands, which are Really common things I use. Anything interesting in there? Not particularly interesting, but the one that I use like 100 times a day is called just slash test. And it's a pretty short prompt that says run the tests with this command, which is not PHP artisan test. It's a composer command that will do like pints and then Laravel stand, then run all the tests, go through all of them, then resolve issues one by one test after resolving each issue do Not fix multiple things at the same time keep doing this over and over again until all tests pass so whenever i've built anything fixed anything done anything it will just be slash test On the end and then wait for it to all go green and that is like the fastest feedback loop and then some then it's just kind of off to the races, honestly. Ian Landsman Do you do the testing as a separate run? Like, do you have it build code and then you have it build tests? Or do you have it build tests when it builds the feature? John O’Nolan Build the feature and then do the tests because it's, I rarely know exactly what I want when it starts to build the feature. It's an iterative process. So I have it build something. I'm like, not really like that. Let's change it. Or let's do something different. Or I test it out and I come up with a better idea. Test driven development, I think is great or works well for me when I know exactly what I want. So if I have a very clear idea of what I'm trying to achieve or what I want the outcome to be, I might start with test first or have it right test straight away. ([Time 0:09:15](https://share.snipd.com/snip/0336c360-87c9-4cf6-b8c4-da08494e67b1)) - **Separate Build Mode From Cleanup Mode** - Use iterative feature-first prompting, then switch to test/refactor mode to unify patterns later. - Spin up a fresh agent to hunt inconsistencies and refactor code after features are stable. Transcript: Aaron Francis So the way that you're building this you have so much time that you had to build something additional. So what is the like, what is the thing that you are doing that is taking 10 minutes? Like when you're telling Claude, go do this. What is that thing that you're doing that it takes 10 minutes to do? Is 10 minutes even fair? Or is it like you have five minutes? You're like, I just can't sit here, man. John O’Nolan It's much closer to the second one. And it's more like one minute. It's more like one minute. And my options are. There is something weird when you're waiting for it, though. Ian Landsman When you're waiting for it, it's like, ah, that's weird. It's not enough time to like go do a business-y thing. But it's like you're kind of in the coding mode. Aaron Francis Unless you're John, he's going to go build a new brand new business. Well, that's different, though. He's staying in code mode. Ian Landsman He's just switching between the topics. He's not going off to his email to then write a 10 minute email, but he only had one minute really, you know? So like, it's a little different. John O’Nolan Because it feels unproductive to just stare at it going discombobulating. Watching it talk. Yeah. Fucking spinner or whatever. So I want to do something. What am I going to do? Like retweet it? No. Ian Landsman And that takes you off that way. Oh, then you're gone yeah yeah yeah yeah so do you just tell it like build this feature or what is it yeah what do you what are your prompts like okay build this feature fix this bug so it varies John O’Nolan Depending on how big the thing is that i want to build depends on the type of prompt it's going to get um it will often start as like we're going to do this big thing make a plan do that whole Thing then start working through the plan and doing all that kind of stuff and then after that it's usually a lot of iteration iteration i don't use plan mode at all it's just go and change This move this here update this at this field and then review its work as it goes and then just kind of push it out until an area is feature complete then move on to the next area and then if One model is getting particularly stuck and just going around in circles on not getting to the root cause or the thing i really look out for now is how much um how workaroundy the code it Starts writing feels uh you quite often notice once the model gets onto this track of sort of creating spaghetti then it will add more spaghetti to compensate for the spaghetti and it Will very rarely kind of step back and go oh this is conceptually flawed i'm building workarounds so i'm always keeping it out for that when it starts going down that uh kind of path ([Time 0:11:47](https://share.snipd.com/snip/e9422aa8-7a6a-48d1-9fa4-2330fffea941)) - **Embrace Occasional AI Messiness** - Prompting too tightly limits AI creativity and potential; occasional messy outputs indicate you're under-constraining it. - Let the model make mistakes sometimes to discover better solutions or ideas. Transcript: John O’Nolan Of the things i try and do which is kind of fun is um moderate the level of specificity of uh of prompting because i think when you know what you want which is a strength in ai assisted coding In general sometimes you can get too specific about what you want and you actually narrow or it's a very inefficient way of getting the models through the smallest amount of thing every Time. So every now and then when I'm in an area where I know like, hey, this is kind of easy and I know what I want. So say I'm adding something that tracks your work experience and job roles you've held in the past. I could say like, I want to have a field for company and title and how long you worked there. And I know I want to have them in this particular order. And I know I want to have an add button. And I could describe all of that in meticulous detail and it would do it correctly. But every now and then you just go, I want to have a way for my users to be able to record their work experience and have that be output on their profile. And be blown away that it just builds 90% what you would have described in meticulous detail and just gets it right. It's always fun to be surprised by those. And depending on the model, it can be really impressive, like what scale of thing is possible to achieve with that if you just occasionally let it off the leash a little bit. Ian Landsman And also sometimes think of things you didn't think of which i find interesting too like you know like a field you wouldn't have put in you wouldn't have told it to put that field but you're Like oh yeah that makes sense right or whatever um yeah let it off the leash okay gotta let it off the leash i'm gonna try i think uh no go ahead i was just gonna say i think if if you if not making John O’Nolan Some huge mistake 10% of the time, you're probably prompting too tightly. I think a good pattern is, it's made a mess and I have to scrap that and try again. Because if you're never hitting that, you're probably not using its maximum potential. ([Time 0:17:36](https://share.snipd.com/snip/33d3cf56-0c15-4a9f-96bd-6493fc5fa1bb)) - **Limit Early Signups To Iterate Faster** - Roll out new tools to a small group of users first to avoid support overload and large migration pain. - Keep early access limited so you can iterate without public pressure. Transcript: Aaron Francis For public signup can i can i start reading some feeds with this thing no but i'm very confident that will be before outro that's 100 given for sure. Ian Landsman We just recorded an episode before this and I was like, I haven't coded anything in two weeks. Like, I've done nothing. It's in outro land. Aaron Francis The most devastating thing possible, but with the accent, it's like, ah, it's pretty endearing. We love this guy. What a nice guy. It's incredible. What a sweet waver. Yeah. You told me I'm totally unproductive. Good guy, John. Yeah. Do you have a name or a domain for it? John O’Nolan I have one. It's a domain I've had for ages, and it kind of works, but I don't quite love it. It's like one I had for different projects. It kind of fits this one, but I'm not very committed to it. It's not as good as Outro.fm, which is a sick domain. Aaron Francis You don't have to come back from it. It was a great comment. There's no recovery needed. You don't need to pay him, you know, adulation. John O’Nolan Yeah, that wasn't an apology. Ian Landsman That was just a comment. He understands me. Nobody understands me better than John O'Nolan, let me tell you that. He gets it. Aaron Francis Oh, incredible. John O’Nolan But no, I think I'll have a sign up in the next couple of weeks it's i mean it's already at the point where i can actively use it so why not but i'm probably gonna uh i'm not gonna make it public Sign up for a while i think i'll only like let a handful of people in because i don't want to deal with your fucking support issues of people on the internet asking for things yeah and it's Ian Landsman Just like you might decide to blow it up and change something big in there. And then it's like, well, now it's like you have to manage this transition instead of just being like, sorry, everybody, like I'm blowing this up and you're my 20 friends and family here. So it's fine and I don't care versus like, yeah, you have a thousand people using it and it's a big deal. Which creates ([Time 0:19:40](https://share.snipd.com/snip/634e9826-d290-43e0-afe0-ddcdea1cfdb4)) - **Smarter Polling Cuts Load And Cost** - Adaptive polling based on a publisher's cadence reduces unnecessary checks and resource use. - Dynamic backoff lets you poll active feeds frequently and dormant feeds rarely. Transcript: John O’Nolan So at the moment it has a 30 minute polling with a back off from retry depending on how the feed responds okay i think the next iteration i'll do with that is to have automatic adjustment Of the polling frequency based on the frequency of the publisher's publishing schedule. So on a feed where you can see in the RSS feed, the posts are 30 minutes apart. You probably need to poll like every five minutes. But if the posts are like two weeks apart, we can poll every day or two, you know, so we could do that. That's kind of fun. That's kind of like a fun programming, like programming challenge. A little bit. ([Time 0:22:59](https://share.snipd.com/snip/2621fac3-101f-4acb-a135-4558223a3d39)) - **Queue Pain From Hydrating Public Site Data** - John described Explore.Ghost's backend that fetches many external signals and uses jobs to hydrate site data. - That architecture led him to face queue scaling and rate-limit problems at significant scale. Transcript: John O’Nolan What what product is that for that's for the back end of explore.ghost which is our public facing directory discovery for like all ghost sites in the world and so the front end is just Basically a list of ghost sites that you can kind of preview and they're ranked by a complex algorithm and then the back end is um crm mesh in terms of how we can understand and browse who's Using ghost and how and what for. Obviously, sites we host, we have more data about. Sites that are self-hosted, we have very little data about. But then we go out to the public web and various data sources and try and sort of backfill and hydrate data to understand, you know, what are the popular sites using Ghost. So you can do things like look up data from Ahrefs or open PageRank, kind of try and get domain reputation information from various different places and then use that as a factor to algorithmically Rank and kind of sort popular sites um but that does an inordinate amount of work to go and fetch that data from all these maybe 20 different sources um it's connects to claude to go and Read every single website and then categorize it into one of our categories which was a thing that just was not possible for ai right what are you going to do i've had a human go and read Every site and do more categories of this guy um which is super cool but and all those things are in jobs and then all of those things need to update on some fairly regular cadence to make Sure that the data is fresh. Aaron Francis And so what kind of setup are you running on cloud? They have like Q clusters now that scale up and down. And so tell me about that. John O’Nolan Yeah. So I've got my app server as a $5 VPS, which is the 512 megawatts of RAM. The public site is cached to in Cloudflare mainly, so not a lot makes it through to the app server. The app server doesn't do a whole lot other than dispatch jobs because most of the kind of work is offloaded to the queue. And then the queue cluster is, I think it's FlexV. They all have stupid names. It's one with like a gig of RAM, maybe two gigs of RAM. And then they're all set to autoscale, but they never do. Really? With millions? Aaron Francis It doesn't need to? John O’Nolan Well, Aaron, I finally figured this out. I know I told you. Actually, I think I've told you both minds saying. Aaron Francis I got a first name, so this is going to be a big reveal. I told you both minds saying QXR. John O’Nolan So the thing I was doing initially was I have, so I've got tens of thousands of sites. Each site has hundreds of fields. Most of those fields need to go and be updated some hourly, some nightly, some weekly. And so every time I need to update one of the fields, I was just saying, okay, we'll take my, let's say at some point 50,000 sites for each of them, create a job to go and update this piece Of data from an external API and update the thing. So I just put 50,000 jobs on the queue. Of course. And then, of course, Laravel tries to execute, process that queue as quickly as possible, right? ([Time 0:25:40](https://share.snipd.com/snip/c7245016-4890-4b80-b6f5-d06fc69c0e95)) - **Throttle Jobs By Staggering Dispatch** - Avoid enqueueing huge batches at once; schedule small batches periodically to respect API rate limits. - Use per-data-source last-updated timestamps so workers process items evenly and avoid spikes. Transcript: John O’Nolan Saying QXR. So the thing I was doing initially was I have, so I've got tens of thousands of sites. Each site has hundreds of fields. Most of those fields need to go and be updated some hourly, some nightly, some weekly. And so every time I need to update one of the fields, I was just saying, okay, we'll take my, let's say at some point 50,000 sites for each of them, create a job to go and update this piece Of data from an external API and update the thing. So I just put 50,000 jobs on the queue. Of course. And then, of course, Laravel tries to execute, process that queue as quickly as possible, right? But then you hit API rate limits. You don't want those execute quickly. So then I was trying to figure out how do you slow down a queue, which it's got a very long story short very difficult not intuitive not easy to do claribel wants to process queues quickly Yeah yeah it doesn't want to process queues slowly there aren't actually very good ways of slowing it down um and so what i finally figured out is if you don't put all the jobs on the queue At the same time you just put say 100 jobs on every three minutes instead of doing all 50 000 uh every night something it balances out but the queue can process fast you don't hit the api Rate limits and everyone stays happy um and so that made my life a lot a lot easier was this the aaron's idea this was aaron's discovery here? Ian Landsman No, I don't have a different idea. I was just right up my alley. I knew you were because you sent me a message about this too and I just had to do it the same way you were already doing it. I was not helpful at all. That's funny. I asked various people, I was like, how would you do this? Because I feel like I'm doing something very wrong. John O’Nolan And when I was putting the 50K at a time on, I was just making everything crash constantly in all kinds of different ways. Ian Landsman So did you end up like just putting like a date time, like last updated at type column on the database and you're going about that way, yeah. John O’Nolan Yeah, for each data source so that each one can kind of iterate through by the last update on that particular thing. Yeah. Aaron Francis John and his queue workers, before the mostly technical party at Laracon, I got a telegram from John that said, it was either hide your queue workers or lock up your queue workers. I'm on my way to the party. Yeah, boy, that boy loves some cute jobs. I know that much. It's true. Ian Landsman You know, he's got to keep the cloud team on their toes. That's right. They're just living it easy over there. We've got to have some real customers doing real stuff, causing trouble, breaking things. That's what I like to hear. Aaron Francis Here's 50,000 jobs. Process them as slowly as possible. Internally, they're like, what the hell's going on? I'm looking to slow this whole thing down. Ian Landsman What do you got for me? I'm sick of this thing running fast. It turns out. Nothing. Yeah, they got nothing for me. It just seems odd to me. John O’Nolan I don't understand why this isn't a thing, but you can configure a particular queue, like define a queue, slow updates, and say the job processing rate of this queue should be one job Per second. Whatever I put on this queue, process one job per second. Aaron Francis The other way I think you could do that is with delayed jobs, but I don't know the queue. I know SQS, you can only delay up to 15 minutes. And I don't know what, I guess I assume they're using Redis for their driver, which I imagine you can delay indefinitely, but I don't know. But that approximates it, but it's not exactly what you're looking for. John O’Nolan You're right. That was my only functional workaround prior to getting to a reasonable solution was to do that. But it gets messy when the queue gets really big. I was exceeding, what was it, the max request size for Redis as a result of kind of looping through and setting all those delays, which was a pain. But yes, that was functional. All the rate limiting stuff built into Laravel is a disaster for this because the way the rate limiting works is it releases a job back to the queue if you are above the limit. But then as soon as it's released back to the queue, another worker tries to pick it up again and goes, no, can't do that. Release it again, pick it up, release it again. ([Time 0:28:10](https://share.snipd.com/snip/f83739d4-0262-4890-ab61-bdfe3de100fc)) - **Don't Use Rate Limiter To Slow Queues** - Don't rely on Laravel's rate limiter to slow queues; it can cause endless requeues and wasted attempts. - Instead, design dispatch patterns or specialized queues to control processing rate. Transcript: John O’Nolan But yes, that was functional. All the rate limiting stuff built into Laravel is a disaster for this because the way the rate limiting works is it releases a job back to the queue if you are above the limit. But then as soon as it's released back to the queue, another worker tries to pick it up again and goes, no, can't do that. Release it again, pick it up, release it again. So at one point I was doing 5 million attempts to process 1,000 jobs just to stay under the right lens. Aaron Francis I could see you getting a call from Fidelaburn being like, hey, John, can we talk about your cues here for a second? No, this is the funny thing. I kept saying to the cloud team, I was like, guys, I think I'm really screwing this up. John O’Nolan Like, I should probably be doing something different, right? And they're like, oh, I don't know. I don't know. It seems fine. Let's just see what we can do to scale up your service. Like, are you sure? Because I think this is wrong. I think I'm doing this badly. Ian Landsman You weren't even doing it wrong exactly. Just, you know, there's no good solution until you kind of brute force the solution, which I like. It's like, let's just shove in the database and let's just slow our roll on our own and see what happens. That's it. It's fine. Yeah. ([Time 0:31:53](https://share.snipd.com/snip/74377b8d-3ade-4754-b2c8-d45483b8e4ff)) - **Weekend-Built Reader Outpaced Feedly** - John built a feed reader in a weekend and already prefers its reading experience over Feedly. - He mixes React and other stacks to explore trade-offs and keep learning. Transcript: John O’Nolan Okay, so the side side project. Aaron Francis What is the side side project? John O’Nolan Yes, this is where I guess all credit and I say, which one? Ian Landsman Oh, no! Flare about you!! Laravel New forever! So me and John have had a lot of discussion about tattoos. And I think we're honing in. We're honing in. We might have to do it. Me and John, next time we're together, we find a nice tattoo shop. Oh, Laravel New tattoo. Laravel New tattoos. Aaron Francis Ian, I don't have a lot of veto rights and I never exercise them, but I am vetoing you getting your first tattoo ever is Laravel New. Veto. Terrible idea. John, you can do it. You've got a lot of awesome tattoos, but for the first tattoo ever, you're getting Laravel New as a shtick, a two month running shtick. You're going to put it on your body forever. No, I like it. John's in. All right. Pick any side project, John. Any one you want. Let's see. John O’Nolan I've got one. It's a little bit on the back burner at the moment. It was when it was pre-clawed. I think it was just GPT. It was when this one got started. But it's a hiring applicant tracking system. We're all building one of those everybody wants to do that everybody wants to do that because all the options are so bad so bad they're so over complicated they're all made for like these Complicated businesses with these complicated hr requirements whereas for just a small business remote team especially software company you just the problem I have is we get thousands Of applicants for Jobs at Ghost. I have to review all of them. Reviewing each one takes so much time because the app is so bad. And it has all these features I don't want or need. And they're expensive. Workable is like $1,000 a month. It's so bad. The one we use is not that much, but it's not a great app. Ian Landsman The other problem with it is it's like, and I get why they're doing this because like they want the subscription revenue, but it's like they all want to be this HR department management Platform and have all this other stuff that's not just applicant tracking. And I only want the applicant tracking. I don't want like your time off stuff. I don't want your time sheet thing. I just want applicant tracking. You've already got ADP or Guesto or whatever. Right, I got whatever for that. So they all are pushing that. So that's like embeds in everything is trying to get you over to the HR thing to do stuff in there and there's all this extra tabs for the HR thing. Like I just want applicant tracking. I don't want your HR solution, blah, blah, blah. And they're all like that now. John O’Nolan Most of them have tons of really detailed compliance features as well which we have an international remote team. That's just which compliance of which country. It doesn't exist. I just need a simple thing. Process inbound form submissions. Show me the things that have been submitted and then let me communicate with people easily and track who's where. Ian Landsman And, you know, really, really stressful. There's a market for it. Aaron Francis Yeah, it sounds like a good one. And I can't believe I'm going to say it. Nobody clipped this. This sounds like one you should just Laravel new and start over with Claude. Start again. John O’Nolan Yeah. Yeah, that's what I'm thinking. It was also, I built that one with Livewire 2. We were in the Livewire 2 era and I'd never, I didn't really know what I was doing with any of them. And so it's definitely a lot of our new situation. Also, applicant tracking has enough state that I think I'll probably go React for this. ([Time 0:34:42](https://share.snipd.com/snip/aecb4a61-8763-4c32-a1f4-f3447fe23f55)) - **ATS Born From Hiring Frustration** - John's applicant-tracking side project started from frustration with overcomplicated, expensive ATS tools. - He plans a simpler, focused ATS built with modern stacks and better UX for small remote teams. Transcript: John O’Nolan Got one. It's a little bit on the back burner at the moment. It was when it was pre-clawed. I think it was just GPT. It was when this one got started. But it's a hiring applicant tracking system. We're all building one of those everybody wants to do that everybody wants to do that because all the options are so bad so bad they're so over complicated they're all made for like these Complicated businesses with these complicated hr requirements whereas for just a small business remote team especially software company you just the problem I have is we get thousands Of applicants for Jobs at Ghost. I have to review all of them. Reviewing each one takes so much time because the app is so bad. And it has all these features I don't want or need. And they're expensive. Workable is like $1,000 a month. It's so bad. The one we use is not that much, but it's not a great app. Ian Landsman The other problem with it is it's like, and I get why they're doing this because like they want the subscription revenue, but it's like they all want to be this HR department management Platform and have all this other stuff that's not just applicant tracking. And I only want the applicant tracking. I don't want like your time off stuff. I don't want your time sheet thing. I just want applicant tracking. You've already got ADP or Guesto or whatever. Right, I got whatever for that. So they all are pushing that. So that's like embeds in everything is trying to get you over to the HR thing to do stuff in there and there's all this extra tabs for the HR thing. Like I just want applicant tracking. I don't want your HR solution, blah, blah, blah. And they're all like that now. John O’Nolan Most of them have tons of really detailed compliance features as well which we have an international remote team. That's just which compliance of which country. It doesn't exist. I just need a simple thing. Process inbound form submissions. Show me the things that have been submitted and then let me communicate with people easily and track who's where. Ian Landsman And, you know, really, really stressful. There's a market for it. Aaron Francis Yeah, it sounds like a good one. And I can't believe I'm going to say it. Nobody clipped this. This sounds like one you should just Laravel new and start over with Claude. Start again. John O’Nolan Yeah. Yeah, that's what I'm thinking. It was also, I built that one with Livewire 2. We were in the Livewire 2 era and I'd never, I didn't really know what I was doing with any of them. And so it's definitely a lot of our new situation. ([Time 0:35:40](https://share.snipd.com/snip/580ed245-c140-4600-b77e-509e8f85bcc6)) - **Keep Claude's Project Context Fresh** - Seed your Claude context with a product vision and regenerate the project init as the codebase evolves. - Refresh the ClaudeMD periodically so agents understand new features and project intent. Transcript: John O’Nolan Yeah, so I will get the boost thing. That's the starting point. Then what I like to do is when a new project's getting going, I'll describe my product's vision or intention like what the hell is it we're doing this repository yeah have an ai expand That to describe it in more detail for an agent then i'll stick that in there to start i'll pull that out later but initially i want to load the context window with the idea of the product So that when the ai is building something it's not just thinking about like this is a laravel project with this structure it's also thinking here's the purpose here's where we're trying To get um and then over time we'll do the little hash save uh small things uh to kind of keep it going so like most common one of those on a new project is it constantly is like, I've done the Thing. Now run npm run dev or composer dev in order to build and see the changes. Stop fucking telling me that. The dev stuff is running. Stop wasting tokens. We're good. And then it'll just kind of adapt over time. And then one thing I do i don't know how quickly every so often as the project evolves is just run the init again um so you know when you run slash init claude will go and like look at your code Base and then it will build the claude md file but then you evolve your code base you build new features you change it and so um it can be good to have it repopulate, refresh its kind of idea Of what the code base is and what the project is. ([Time 0:46:44](https://share.snipd.com/snip/d2c2fca0-9098-4ba6-b486-dce89cedb90e)) - **Legacy Code Needs AI-Friendly Tooling** - Greenfield AI-enabled projects are easy to start, while retrofitting long-lived codebases for agents is hard. - Years of internal dev tools (CLIs, docs) become AI superpowers because agents rely on structured developer UX. Transcript: Aaron Francis It's like just crack cocaine. And de-shell, yeah. Oh, we lost you. I think he muted himself. He started cursing. John O’Nolan He got too excited. Aaron Francis Laravel new, he got too excited. Riverside said, not on my watch. John O’Nolan Laroni is the easy mode of AI development. Taking a 12-year code base like Ghost and then going, okay, now try and figure out a way to make an agent work in here. Ooh, very different story. ([Time 0:50:41](https://share.snipd.com/snip/d4e85788-b7db-4170-8366-b30a27706163))