▶ Submind YouTube summaries
Thumbnail for When Postgres is Enough: Postgres as a Coordinator - Michael Cooper

When Postgres is Enough: Postgres as a Coordinator - Michael Cooper

Watch on YouTube

Video summary

Michael Cooper, the founder of AG Ledger, shares his journey of simplifying a complex software stack by relying exclusively on PostgreSQL as a coordinator for an AI agent signing system. Initially building a conventional SaaS with a distributed architecture involving AWS services like ECS, Fargate, and various caching layers, he faced significant complexity in managing dependencies, especially when needing to offer the service as self-hosted solutions to enterprise customers. The primary motivation for this architectural shift was data sovereignty; since AI agents operate within customer environments handling proprietary records, all supporting infrastructure had to reside there without external dependencies that required patching or management by the vendor. This realization led him to strip away components like Redis and BullMQ, eventually consolidating his entire stateful logic—including queues, locks, schedules, and rate limit counters—into a single PostgreSQL instance augmented by the pgBoss library. The transition involved overcoming specific technical challenges, particularly regarding vacuuming and connection management, which are critical when using PostgreSQL for high-frequency append-only ledger operations where rows are deleted shortly after creation. Cooper details how he tuned autovacuum settings to handle one-hour retention periods effectively, ensuring that performance degradation did not impact the system's reliability under chaotic conditions. A significant portion of his work also involved creating custom wrappers around pgBoss to handle SQL interactions and schema changes directly within the database rather than in application code. This approach allowed for greater flexibility, enabling customers to modify data schemas in near real-time to adapt to the evolving behaviors of AI agents, a capability that would be difficult to achieve with a rigid, code-heavy architecture. Despite initial concerns from peers about potential performance trade-offs and the need for larger server instances when removing specialized tools like Redis, Cooper's testing demonstrated that the simplified stack was not only robust but also more cost-effective and easier to manage. His solution runs on very small AWS VMs at a fraction of the cost of his previous setup while maintaining bulletproof reliability even under adversarial load testing. The core lesson from this journey is that "good enough" solutions built on mature, community-supported technologies like PostgreSQL often outperform overly optimized stacks filled with unnecessary dependencies. By reducing the number of moving parts to just one stateful component, he achieved a system that is simpler to configure, cheaper to run, and easier to ship to customers who prefer to own their infrastructure rather than rely on external SaaS providers.
Read the full video transcript
So um I am Michael Cooper. Uh I am founding a company called AG Ledger. Uh and uh today's conversation we're going to walk through my learnings on this journey. Um just a quick word of of who we are. Um and so I build a or I'm building um a a tool or system that signs and change every signs on a chain every AI agent action. it's in into into an appendon ledger that can be verified offline. Uh what we're trying to solve for is pretty simple. Uh if agents are going to do work for you, then that record of what happened can't just be a log because agents can one uh uh change the log and two if you ask an agent what happened after the fact, it will just make things up. So you have to capture things ahead of time and you have to uh validate the difference between the intent ahead intent at first and the and the uh action that happened as well as the results. And so it is at the end of the day a log uh in all practical purposes but we have to treat it as a leisure because agents are just different and they work with systems in a different way. Um, and so what we're going to talk about today or what I'm going to talk about today is, you know, the learnings I've I I've um had on this journey of of building out this product and how at the end of the day I've ended up uh building what is in in essence a a an entire solution built on Postgress and Postgress only and that is so this is also me just giving back to the community because as Postcrest is is a pretty incred incredible product and so I want to kind of thank everybody here for um for building building this thing out. And so uh just to explain where I started, I started building out a a conventional SAS with the usual uh distributed stack. Uh it was it was on AWS uh staple services. Um all the things you'd expect from a SAS perspective. Um and then once we started once I started building it out, I I kind of went through um two different ways and two different reasons for simplifying the stack. And I'm going to talk about the processes of simplifying the stack and how the processes of simplifying the stack ended up at me just being on Postgress. And so this is is a journey of how we got there, the learnings um many of which were self-inflicted from my own ignorance. Um but the learnings of how I got here and what's working for me in terms of uh how it relates uh to uh hosting Postgress and and I'm happy to stop along the way and answer uh questions as they come in. And so as I'm moving from a conventional SAS, we simplified in two ways. Uh we expected some some serious tradeoffs. And so I was doing this expecting a lot of bloat in my code. And I was doing this expecting a lot of a significant decrease in performance. And my at the end of the day, what's kind of fun and so to to lead with the findings up front, I ended up with a smaller codebase, uh less moving parts, easier to manage and configure, and my stack is slightly faster. And so it's a fun journey. It was a fun journey for me to be on. Uh had I known these answers ahead of time, but it was it would have saved about four months of my life. But um let me walk kind through what that what that does. And so the first thing that matters is if you're looking at um if you're looking at my use of Postgress and my use as Postgress as a coordinator, it's incredibly important to understand uh the data that I'm using, the shape of that data and the requirements of that data. So there are there are three there's three kinds of uh state come out of this product. The ledger itself which is assigned record record hash chained events now is append only uh immutability triggers no updates nothing ever deleted uh uh ID7 keys so inserts land in the right uh hand edge uh of the index instead of scared through it. I do support other versions of Postgress. So there is some wrapping I do sometimes on those keys. So I'm always I'm always on V7, but uh on on the older versions I'll I'll have a a wrapper on it. And if if anyone has any questions on that one, let me know. But I here I'm just going to assume that we're on uh everything that I'm running is native in terms of the that that the the talks and learning that I'm going to give. Um and the Q is for for me then. So issue one is my ledger and the needs of the ledger as it relates to Postgress and the second and then is the is the queue which is the exact opposite. So every row is created work completed and deleted basically in an hour and nothing in it outlives the the work it describes. So it generates nearly all of my vacuum work and so a lot some of the learnings we'll have below and and data I can share if anyone's interested ping me uh tuning of the vacuum and testing of the vacuum um because there was some very serious concerns that I was going to hit that and we'll we'll talk about what that means as we go. Um and so from a rebuildables cash cache invalidation and rate limit counters uh lossable and rebuildable from postcress at any time. So they they get the weake weakest durability that we could accept. Uh batch works we do run uh checkpointing and integrity sampling and is scheduled incremental and and off the hot path. So I do have a slightly different data set than others do and it's it's worth noting that along the way because I'm I'm not saying at the end of the day my choices and my architecture is going to work for everybody but it does work for me and it does mean that I do have some especially as it relates to uh coordination of of tasks and things um some some unique needs and I do uh stress a system in in other ways. One thing that is incredibly important if anyone else is looking at designing a service uh uh based on on Postgress you do have to realize it in the era of AI everyone talks about AI development coding and you know AI assisted in terms of building it out that's interesting but it's not as interesting as AI as your customer and so in in this particular case my service is entire is a deterministic service there is nothing in my codebase that is uh probabilistic. So I I'm a deterministic service, but my customers are probabilistic agents. And so uh they are ridiculously bursty. Uh they are really um uh they're they're know-it-alls at times and go down weird odd paths. And so there's a lot of what I have to do to to build my service in a deterministic way to kind of predict where the agents are going to go off the rails, bring them back on the rails, and also uh keep those agents and the very bursty nature of those agents from um affecting my overall service. And so we'll we'll talk about that as we go as well in terms of the architectural choices you have to make when you're when you're building out a service when agents are your customers. Um which I don't think is a topic that gets as much it gets as much conversation as it should. Uh we all kind of talk about you know using agents to build our services. Um that's kind of overdone but uh use having agents use our service is is kind of the new fun and interesting space that's changing uh every day. And so again just to recap and where I ended up um the conventional SAS the stack you would reach for uh ECS Fargate API worker uh ALB with WFT. Um uh my first introduction to Postgress in this stack was actually just Postgress within RDS. And so it was just going to uh hold um uh certain sets the the the ledger workload itself and everything around it. Uh especially caching and things like that. Um and um my data SKs and things along those lines were not going to be in Postgress itself. they they were all in uh Reddus eventually and then once I moved to I need to be able to provide the service as a self-hosting service to my customers. Um Reddus made less sense and then we switched to Valky. Um so Elastic and Valky and so with Bull MQ all the usual suspects the the the process worked fine. It was just really really complex. And if I'm going to send this as a self-hosted service into a customer environment and need that needed to work in an offline mode where I don't have um you know instant access to what's going on in the environment. I can't be patching things myself. I have to wait I have to ship code to a customer for them to patch. Um then having all of these dependencies suddenly becomes a liability and adds to the complexity of my life quite a bit. And so the first thing I dropped, and I know this isn't a Postgress conversation, but I do think we as a community should start talking about it. The first thing I dropped is was the OM and and and and Drizzle. Um I know this is going to be fairly controversial. Uh I get to say it because I I'm an infro guy at heart. I'm a networking guy. I I go old school networking. I know if you look at my LinkedIn, you'll see that, you know, I had two stops at at open source data companies. one at at Confluent which uh we went public with Jay and and with Kafka and loved loved everything that Kafka was doing really cool and astronomer with Airflow and so that might lead you to believe I'm more of a data guy than I am. I'm not. I'm an infrastructure guy at heart in training and I'm newer to the Postgress uh world and again I'm I'm a a recent advocate and a huge fan. But with that said, um all the things that we were using uh that I was using Drizzle for, which was to help me understand SQL, um wasn't actually helping because what I ended up having is uh more places for bugs to hide. And um using an AI agent to help me structure my SQL rights were a heck of a lot easier for me than using an AI agent to help me structure my Drizzle and then help me structure and uh debug my SQL that the Drizzle was was pointing out and then help me structure and and look through the the JSON. And so at the end of the day, the the the from my perspective, the primary value Drizzle was providing providing was the abstraction or or making SQL easier to understand for humans. Um the AI assisted coding was already making SQL easier to understand for humans and was already um uh was doing a lot of double-checking for me. And so it was it was a level I didn't need in the first thing that came out. Not part of this conversation, but I do think it is going to be I do think it's a valid conversation that more and more people are going to have. Um but then the second thing that kind of definitely shifted the skew is if I'm selling something that has uh agents doing work against real systems of records that and I'm asking the agent to document what it's doing why it's doing it when it's doing it then everything in that d everything in that agent's record is incredibly proprietary to the customer. There's no way that customer is going to trust that data to leave their environment. the agents going to be working next to data and next to systems of record in their environment and if that's the case then the agent records have to stay in their environment too and therefore that's that customer self host hosted and the requirement that everything happens within the customer's environment from from a data data integrity point of view and a data sovereignty point of view just means that I now needed to look at the entire stack and so uh RDS Postgress is is still something I I I expect most of my customers are going to use or or probably Aurora, but it's going to be within their tenant, not mine. And so that service is going to say they can they can be running a native version of Postgress in my for my service or they can be running a hosted, but it's theirs, not mine is the is kind of the issue. Elastic Cache and Valky was kind of the first thing that we move moved uh to. Um but then now I've got two staple services I have to manage and that started to become problematic and scary for me and I'll and I'll talk that through here in a second. Um, and then all of the rest of that scaffolding I just can't ship with uh with my service because my customer is going to have their own. And so I have to build all the infrastructure necessary to interact with what I'm expecting to be their load balancers and the rest. And I need to be able to ship very clear APIs, agent friendly APIs to be able to interact with this and and clear provide clear uh hints in the rest and and very good documentation. Um, but I can't ship my own service here because there's no way a large enterprise shop is going to, you know, take a allow me to to ship ship those services. And so the the the conversation for me did not become, you know, what's the best service? What's the best solution for any of these stacks? It was it was never a conversation of is Postgress better than Valkyrie for this particular function. it was what's the least number of uh dependencies I can take in my product and if I take these dependencies do I do I see a a trade-off for performance somewhere else and you know starting you know starting with valky which we'll talk about in a second there there was you know a lot of things can do better than postgress but there's a lot of things that can't do period and so I if if that's the case hey postgress does these 12 things valky does these four things it might do one of those four things better than my 12 guess what the answer there is postgress and so that's exactly what we started so it was BMQ and Valky uh and it's it was a hard it was it was a hard lesson for me to do because I spent a lot of turn time learning Valky I became a huge Valky advocate overnight I was I loved what these guys were doing I I I love bowling Q spent a lot of time reading those things and and learning about it and and then halfway through when you realize Yeah, I uh while as cool as this thing is, I don't actually need it that it was really painful to to strip that out. And so it's it's not a jab against Valky or BMQ or or for any of the purists on the phone saying on on the call saying that they hey you know they can do things especially with you know managing Q that um that uh Postgress doesn't do nearly as well. I totally agree. I just it it's more dependencies means more complexity. more complexity means more bugs, more issues, more downtime, um more patches. Uh the the trade-off wasn't worth it. And so, uh Bowling Q back in cross instant cache and rate limit counters. Rate limit counters being my probably the biggest problem for me to solve and and it spent a lot of time testing and tweaking that. Um those issues uh those were the things three things bal is can I move into into Postcrest? Uh the answer is with PG boss yes I could and so it was Postgress plus P pg Boss meant that everything Valky was doing got stripped out. Um there are some uh I've got some demos here if anyone asks questions in terms of wanting to look at some of the um uh stats but uh I'll skip that for this and uh we can go back to that if there's there's questions that are specific to it. Um, and so that PG boss is kind of the unsung hero here. And I know Postgress gets a lot of a lot lot than I'm a huge fan and and and as everyone else here, but um based on well my web traffic is I get far more hits on my on log on lessons learned log uh blogs I post about my my PG boss learnings than I do on my own product which is a little bit uh embarrassing for me. Um there's there's many of you actually kind of uh running into to the love of of PG Boss as well. And so uh in moving PG Boss or in moving uh Valky out PG Boss in here's some of the things that you know kind of uh here's here's a here's what's working for me. Um I've got one PG boss. I've got two processes uh for my API that's send only um and then uh with with API it so API runs in a supervision and schedule with supervision is scheduling off so it is affect it is functionally uh send only uh worker runs as a full instance it supervises owns every cron schedule uh registers every handler PG bus keeps its own schema um which it installs on the first boot which is a migration baseline kind of deliberately excludes and so it for the most part it it's working for me uh out of the box. Um there are uh six wrappers I've had to build around it because of uh issues I was consistently hitting in my own code. Um I I've got those listed here. So uh register batch worker unique in Q insure Q and pool adapter. Um, I've spent a lot of time on those rappers. And so, um, happy to to to send those over to anyone if you if you want to see what I'm doing on those. Happy to share that out um or or uh or build a blog around them uh so that you can see the the code I'm doing the code I'm doing here to kind of handle some of those situations. And so, um, one of the biggest, uh, things I'm I having to, um, uh, adjust, um, or the kind of the first place I I hit problems because I wasn't using dribble was or and or in general, uh, actually was, uh, uh, having SQL uh, native SQL um, hitting uh, PG boss. that's not something that that seems to be as common as I think it's probably going to be. And so some of the rappers I'm write I I'm putting um are entirely around it. Um, one of the other dependencies I took or one of the other things I I did with uh PG Boss, which you know, looking back probably cost me a lot more time than I needed to is, uh, I built I wrapped PG Boss Boss and a replace assuming that I might want to replace it later. Uh, especially for maybe, uh, PG Bounce for for um, uh, some of the connection work. Uh, and the more I get into PG Boss, the more I just love it. And so I don't think it's coming out anytime soon, but I did spend a lot of time uh wrapping um PG Boss so that it wasn't a it was something I could I could take back out. Um but with that said, huge fan of PG Boss. If you guys aren't using it, you should you should think about it. Um and if there's anything in my learnings here on PG Boss or any of the the things that any of the rappers I've built, um happy to share. Just ping me. Um and so couple of uh issues on trial. Um uh kind of the one thing I was expecting uh most people to the I was expecting uh the more research I did on what I was doing that you know vacuum was going to cause issues and you know if you if your vacuum is set at you know 6 hours or 12 hours or whatever then you know everything I'm saying would run just great and then when vacuum hits 12 hours later your your system comes to its knees and so I spent a lot of time with the autovacuum tune uh on on my different job t tables. And one of the first things I did is actually just uh I moved vacuum up to a 1 hour retention um on my hot cues because again I'm building a a stateful ledger. Uh things are writing to the ledger. So I don't actually need the logs to reconstruct my ledger is if my ledger isn't accurate at in real time then u then I've got a fundamental problem with my product. And so I I do have a different need here because the the I don't need those logs for to to play back uh to play back things. Um and so I can I can kill the logs after an hour. I can also then autovacuum after an hour. And so uh I did a lot of the different um uh performance modeling on that. And if we have time, I actually have some uh test testing I can show in terms of what happens when I um change things because of skip lock or change scenes because of um uh when I the different um tweaks I've made to see whether or not um the performance holds up. But uh to to to skip to the chase, the the honest answer is is it didn't change much. Um, and so yes, I moved to the issue I was going to have a 12 hours until 1 hour, but I didn't I don't actually see big long cues building up. I don't I don't see things run away. Um, I see my performance slightly degrade at times and, um, and life and life moves on. And so, um, kind of the biggest core issue as expecting in moving this over and taking the the Postgress and PG boss dependency, um, we just haven't seen. Um, again another demo we can we can come back to and and I'll post these demos because uh this it's mostly just how my product works versus uh how it impacts uh uh Postgress and and PG boss just to kind of share my learnings. Um but they they kind of they they're better suited to specific questions and so I'll I'll post them uh I'll include them in the in the post follow-up so you can you can watch them if you if you like. um at at another time. And so uh where I'm at so where my product is today is and it's a huge benefit to me as a as a founder and as a startup is I literally have one stateful thing left and it this is not by choice. This was completely by accident. I was not I I was not part of the just use uh Postgress debates. Um I was struggling through the which part which tool should I use here uh at the same time as you you all you smart people were having the debate I wasn't smart enough to know that was a valid question and so I I have one thing left and it's it's Postgress and so uh Postgress holds the state the chain the queue the locks the schedule uh the invalidation bus as well as where my my rate limit counters um one thing I learned far later than I should have is uh I was putting a lot of my schema in code. Um which as I as I have a a a tool that is built to work with AI agents that means that schema changes fast and you know what was working for uh uh codecs yesterday may not work for codeex tomorrow. Codex might be an agent based on a codeex model might go in a different way. And so I was changing my schema via rebuilds on a really regular basis. And um that was that was a learning and a fascination that I once I realized I can just start moving a lot of that schema into Postgress as well. And then measure the impact in performance and there are some there are some performance concerns in doing that. So moving schema out of code to uh Postgress does impact but not nearly as much as I thought and the flexibility of allowing then my customers to be able to modify their own schema and shape the data uh in somewhat real time while still locking things down for for the agent. So they, you know, they can adjust their the shape of the data or the shape of of what they're responding to an AI agent with in near real time if they choose to or they can hold the line uh and the agent kind of does um follow. That is an amazing capability I only got by um moving a lot of my schema and a lot of things that were code to start with just into data in Postgress. And so, um, another, um, you know, I I know all the old school Postgress people on the on the call are kind of are are rolling their eyes because, you know, the rookie didn't kind of know that, but, um, it's also just it's a tremendous, uh, capability, uh, especially in the area era of AI because it allows me to go it allows me to change allows my customers to change the shape of the data as fast as our agents change. And so, um, I didn't mention it ahead of time, you guys probably could have guessed. Um I'm I'm a Fastify uh is by my front door and so um so all my writers come through there and that that was never in doubt. That's kind of the only piece of my stack that's kind of always been there. Um and really happy with that choice. Um uh I've had to write a lot of rappers and and and had a lot of learnings on that front too, but uh no regrets there. And then my the the PG boss lives as a library throughout my post P post P post P post P post P post P post P post P post P post P postgress and as I mentioned earlier when I was putting it in I was you know the first question is is you know can I live without Valky and the rest of these things and the second question question is is you know is postrest or is pgbos the only thing I'm going to need here or is is it pg balance and and are there other libraries I'm going to have to add as I've gone down this path I'm more and more comfortable that um I'm staying on PG Boss and so I spend a lot of time wrapping it so I can pull it out if I need to, but I just I really don't think I'm going to. Um and then I do have a a one service that pretends to be S3 and it just allows the anchor for the for my uh uh my chain. Um and so that's the extent of my service. And so with this with this shift to Postgress, I now have a very um understandable very small um I have a lot less code. It's more performant in many ways than my previous stack. Um it's a fraction of the cost to run than my previous stack. And I can ship that to an enterprise customer. uh they can run that uh off uh completely um uh disconnected from me um and they can just take patches from me on a on a fairly regular basis. And so for the most part my you know my managing SAS switched to me shipping tarballs. And so it it's a it's a very different um solution that I've ended up with. But that's prime that's because the world changed. Customers expectations of where data goes has changed and customers expectations of well why would I just why would I buy your SAS service for you and take that dependency? I'll just write it myself. And so u because of that you know that third issue where you know many companies are just going to write these services themselves instead of taking a dependency from somebody else you my feeling is I just had to make myself ridiculously easy simple and clear to understand and also make myself cheap enough that there there's no benefit for them to write it themselves they might as well just use mine and you can't do that with a 12 dependency stack you can do that with um with Postgress and Postgress only and so um a huge fan of of what Postgress plus PG boss has has has given me and and really happy with the solution as it exists today. And so um one of the things I mentioned before is uh you know we had a lot of concerns and one of the first ones when I when I reached out and asked my friends and said hey you know you know what is so from an honest downside the perspective they said yeah you can do this but you're going to pay for it in performance you're going to have to run much bigger boxes than the rest and that hasn't been true. Um, one thing that is true and if you're going this route, you have to spend a lot of time thinking about um, which I have spent a lot of time thinking about and we we tweak and we allow our customers to tweak. Um, we have not paid for it in performance. The, uh, uptick in some of the things has been measurable but not meaningful. Um, the connections is and so uh, you do have to plan, you do have to pay a lot of attention to your connections. you do have to um spend a lot of time uh managing those. But that's not overly unique to any data service and that's was probably something I was going to have to spend just as much time on before. And there's a case to be made that I you know I only have to manage connections in one spot versus in 12. And so there's a case to be made this is simpler to do but the number of knobs I have are are smaller. And so, um, the one real Bill, you you can't overlook it is connections. For me, we I'm comfortable in with my with our performance and our capability of getting around it. Uh, as long as you plan for it. Um, but it it is real and it it was uh um and it can't be overlooked and um it can't be overlooked and and it shouldn't be overlooked and it should it should be called out. And so the uh kind of the last thing I want to say uh uh on this you on my journey and where I'm at and I'm happy to double click on any of the additional concept content. I mean I think we originally p pitched this as a as a three-part series. This kind of being the overlay of how we got here, what we did and then we could kind of double click into others. And so if there's interest there we can do it. If not then I can just write me and I'll and I'll and I'll provide my learnings in an email to you. Um it is incredibly important to note I am not claiming that Postgress won these bake offs. I am not claiming that you know I put Postgress against Valky and Postgress one. I am not claiming that um you know that PG boss means I don't need BM Q. Um what I am saying is in the era that we are in today good enough is sometimes much better than um any other solution and in our particular case um in my particular case um Postgress was was the good enough solution and it helped I'm far my my final solution is much better than um what I started out with uh by choosing again the path of good enough and the path of good enough for me um ended with postcross and so uh two things first uh if you're interested in kind of my learnings the easiest way to do it is uh I have a free version of my product it takes about five minutes to set up on a uh on on a docker node and uh so you can point your you can point your uh you can either do it manually or point agent at AG Ledger and have a a local instance of what I'm doing running on your box which would get which would spin up um uh my version of or my modifications to um uh see to Postgress as well as my configuration of PG boss and you can see my entire service run you can do uh performance against it and the rest uh if you're interested in uh my learnings or or some of my testings because you're you're building out your own service and kind of want to learn um the ping me at michael@agledger.com or just you from sorry my agedger.ai or you can uh ping from the agedger um website um and you you'll reach me um life of a founder. This is pretty much all I do and I would be um insanely grateful for anyone to talk to me about it. Um and so mainly because my wife and kids are sick of hearing about it and so um it's a really fun journey. I'm having a blast and if any of you guys are on the same journey, uh ping me and I'm happy to help. Um the one kind of uh one of my favorite stats to point out is uh I have done um scale testing on my solution. Um I have done it over uh days at a time um with you know very adversarial um chaotic uh testing environments. And for the most part, my my records were never processing in in less in less than I mean I think the longest I ever got my cues out to was about 2 minutes, which is way too long. I agree. But even when they were c 2 minutes, it didn't mean anything stopped processing. It just means some of them were 2 minutes late. And so um it to me that means that the infrastructure is solid and I can trust these things and even when they get behind it doesn't fall down. And but my favorite part about that testing wasn't that it can happen. Of course it can happen. Um I did all of that testing and all of my max scale testing on AWS VMs that cost 65 cents an hour to run. So these are very small VMs. This is not what my customer is going to be running their infrastructure on. Again, 65 cents a minute and and that or 65 cents an hour that included the compute, the storage, and the database. And so for 65 cents an hour um my infrastructure was was for the most part bulletproof for 90% of the customer workloads I was expecting my customers to hit. And so to me again it it does not speak to um you know that's the correct tuning or hey look how much you can save with postgress. Those are not those aren't actually what I'm testing. I was just testing whether or not the code failed out and the answer is no. And so Postcross with PG Boss um under chaotic conditions with you know lots of things breaking and under artificially constrained um environments I'm getting the performance I need to be comfortable shipping the solution um on and and to that um again it's a it's a testament to not what I've built um it's a testament to what this community has built in in Postgress and and and in PG Boss and so If anyone listening uh knows the people contributing to PG Boss, tell them I owe them many beers. Uh I love what they're doing. Um, and obviously um, huge fan of the Postgress community and I I'll continue to look for ways to give back in my learnings and my lessons because what this community is built and what this product what this product is is is pretty impressive.