1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[383],{58145:function(e,t,a){a.d(t,{default:function(){return l}});var i=a(57437),o=a(2265),n=a(33145),s=a(27648),r=a(39821);function l(){let[e,t]=(0,o.useState)(!1);return(0,o.useEffect)(()=>(e?(0,r.X)():(0,r.K)(),()=>{(0,r.K)()}),[e]),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"flex items-center gap-3 lg:justify-between lg:gap-0",children:[(0,i.jsx)(s.default,{href:"/privacy-policy",className:"text-[12px] font-light leading-[1.5] text-[#4D5054] transition-colors hover:text-[#00050B]",children:"Privacy Policy"}),(0,i.jsx)("span",{"aria-hidden":!0,className:"h-[11px] w-px bg-[#D5D6D8]"}),(0,i.jsx)(s.default,{href:"/terms",className:"text-[12px] font-light leading-[1.5] text-[#4D5054] transition-colors hover:text-[#00050B]",children:"Terms of service"}),(0,i.jsx)("span",{"aria-hidden":!0,className:"h-[11px] w-px bg-[#D5D6D8]"}),(0,i.jsx)("button",{onClick:()=>t(!0),className:"text-[12px] font-light leading-[1.5] text-[#4D5054] transition-colors hover:text-[#00050B]",children:"Cookies Policy"})]}),e&&(0,i.jsx)("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-[#3741514D] backdrop-blur-sm",onClick:()=>t(!1),children:(0,i.jsxs)("div",{className:"relative mx-4 mt-20 w-full overflow-y-auto rounded-lg bg-white px-5 py-8 md:mx-0 md:w-4/5 md:max-h-[72%] lg:w-[55%]",onClick:e=>e.stopPropagation(),children:[(0,i.jsx)("button",{onClick:()=>t(!1),className:"absolute right-4 top-4 text-[#00050B]","aria-label":"Close",children:(0,i.jsx)(n.default,{src:"/images/close.svg",alt:"close",width:20,height:20})}),(0,i.jsx)("h2",{className:"mb-4 text-lg font-semibold text-[#00050B]",children:"Cookies Policy"}),(0,i.jsx)("div",{className:"prose max-w-none text-base",dangerouslySetInnerHTML:{__html:"<p>We use cookies to improve your experience on our website. By continuing to use our website, you consent to our use of cookies.</p>"}})]})})]})}},95867:function(e,t,a){a.r(t),a.d(t,{default:function(){return m}});var i=a(57437),o=a(2265),n=a(27648),s=a(33145),r=a(99376),l=a(32489),c=a(58293),d=a(92654),h=a(59055);function p(){return(0,i.jsx)("svg",{width:"18",height:"18",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":!0,children:(0,i.jsx)("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z"})})}function u(){return(0,i.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":!0,children:(0,i.jsx)("path",{d:"M12.6 0h2.454l-5.36 6.124L16 16h-4.937l-3.867-5.056L2.77 16H.314l5.733-6.55L0 0h5.063l3.496 4.622L12.6 0zm-.86 14.52h1.36L4.323 1.404H2.866L11.74 14.52z"})})}function m(){var e,t;let a=null!==(t=(0,r.usePathname)())&&void 0!==t?t:"",[m,g]=(0,o.useState)(!1);(0,o.useEffect)(()=>{g(!1)},[a]);let f=e=>e.startsWith("/")&&!e.startsWith("/#"),b=null===(e=d.$n.links.find(e=>f(e.href)&&(a===e.href||a.startsWith("".concat(e.href,"/")))))||void 0===e?void 0:e.label;return(0,i.jsxs)("header",{className:"sticky top-0 z-50 w-full border-b border-[#EAEBEC] bg-[#FAFAFA]/80 backdrop-blur",children:[(0,i.jsxs)("div",{className:"mx-auto flex h-14 w-full max-w-[1120px] items-center justify-between px-6",children:[(0,i.jsxs)("div",{className:"flex items-center gap-9",children:[(0,i.jsx)(n.default,{href:"/","aria-label":"Platformatic home",className:"flex items-center",children:(0,i.jsx)(s.default,{src:"/images/platformatic-logo.svg",alt:"Platformatic",width:40,height:27,priority:!0})}),(0,i.jsx)("nav",{className:"hidden items-center gap-7 md:flex",children:d.$n.links.map(e=>(0,i.jsxs)(o.Fragment,{children:["BLOG"===e.label&&(0,i.jsx)("span",{"aria-hidden":!0,
1className:"h-3.5 w-px bg-[#D5D6D8]"}),(0,i.jsx)(n.default,{href:e.href,...(0,h.Gb)(e.href),className:(0,h.cn)("text-[12px] font-medium uppercase tracking-[0.12em] transition-colors hover:text-[#00050B]",e.label===b?"text-[#00050B]":"text-[#808285]"),children:e.label})]},e.label))})]}),(0,i.jsxs)("div",{className:"flex items-center gap-4",children:[(0,i.jsx)(h.un,{href:d.$n.cta.href,variant:"primary",icon:"none",children:d.$n.cta.label}),(0,i.jsxs)("div",{className:"hidden items-center gap-4 sm:flex",children:[(0,i.jsx)(n.default,{href:d.$n.github,...(0,h.Gb)(d.$n.github),"aria-label":"GitHub",className:"text-[#4D5054] transition-colors hover:text-[#00050B]",children:(0,i.jsx)(p,{})}),(0,i.jsx)(n.default,{href:d.$n.x,...(0,h.Gb)(d.$n.x),"aria-label":"X",className:"text-[#4D5054] transition-colors hover:text-[#00050B]",children:(0,i.jsx)(u,{})})]}),(0,i.jsx)("button",{type:"button","aria-label":m?"Close menu":"Open menu","aria-expanded":m,onClick:()=>g(e=>!e),className:"flex items-center text-[#00050B] md:hidden",children:m?(0,i.jsx)(l.Z,{className:"h-5 w-5"}):(0,i.jsx)(c.Z,{className:"h-5 w-5"})})]})]}),m&&(0,i.jsx)("nav",{className:"border-t border-[#EAEBEC] bg-[#FAFAFA] md:hidden",children:(0,i.jsxs)("div",{className:"mx-auto flex w-full max-w-[1120px] flex-col gap-5 px-6 py-6",children:[d.$n.links.map(e=>(0,i.jsxs)(o.Fragment,{children:["BLOG"===e.label&&(0,i.jsx)("span",{"aria-hidden":!0,className:"h-px w-full bg-[#D5D6D8]"}),(0,i.jsx)(n.default,{href:e.href,...(0,h.Gb)(e.href),onClick:()=>g(!1),className:(0,h.cn)("text-[12px] font-medium uppercase tracking-[0.12em] transition-colors hover:text-[#00050B]",e.label===b?"text-[#00050B]":"text-[#808285]"),children:e.label})]},e.label)),(0,i.jsxs)("div",{className:"flex items-center gap-4 pt-1",children:[(0,i.jsx)(n.default,{href:d.$n.github,...(0,h.Gb)(d.$n.github),"aria-label":"GitHub",className:"text-[#4D5054] transition-colors hover:text-[#00050B]",children:(0,i.jsx)(p,{})}),(0,i.jsx)(n.default,{href:d.$n.x,...(0,h.Gb)(d.$n.x),"aria-label":"X",className:"text-[#4D5054] transition-colors hover:text-[#00050B]",children:(0,i.jsx)(u,{})})]})]})})]})}},92654:function(e,t,a){a.d(t,{p2:function(){return s},$n:function(){return n}});var i=JSON.parse('[{"route":"/the-node-book","book":"The Definitive Guide for NodeJs in Enterprise.pdf","title":"The Node.js Book for Enterprise"},{"route":"/white-paper-first-90-days","book":"Nailing_First90_Days_in_Your_New_Tech-Lead_Role.pdf","title":"The First 90 Days Playbook for Tech Leaders"},{"route":"/navigating-digital-architecture-a-comprehensive-guide-for-senior-technical-leadership","book":"Platformatic Insights _ Navigating Digital Architectures.pdf","title":"Navigating Digital Architecture: A Comprehensive Guide for Senior Technical Leadership"},{"route":"/the-technical-leader-s-guide-to-scaling-digital-practices","book":"The Technical Leaders Guide to Scaling Digital Practices.pdf","title":"The technical leader\'s guide to scaling digital practices"}]'),o=JSON.parse('{"R":[{"slug":"spendesk","company":"Spendesk","title":"How Spendesk Gave AI Agents Access to Financial Data","titleEmphasis":"(Without Rebuilding Its Security Model)","description":"Using Platformatic to extend its existing security architecture to AI agents.","cover":"/images/case-studies/spendesk-case-study.png","logo":"/images/partners/spendesk.svg","industry":"FinTech â Spend Management Platform","companySize":"500 - 1000 employees","publishedAt":"2026-09-22","mainPageQuote":"roberto-mcp","detail":{"quotes":[{"id":"roberto-mcp","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["The best thing Platformatic gave us was the ability to introduce MCP without creating a second platform.","We gained an MCP implementation that fits our architecture rather than forcing us to work around it."]},{"id":"roberto-fastify","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["This made the MCP server straightforward to build because it fit directly into our existing Fastify architecture. We could reuse Spendeskâs OAuth tokens, request context, scopes, roles, tenant boundaries, and observability instead of building a separate integration layer for AI clients."]}
1,{"id":"roberto-massimo","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["Massimo makes the OpenAPI specification the source of truth for our clients. It generates the TypeScript methods and definitions from the contract, so changes to an operation, parameter, or response shape are detected during development or CI rather than through a failed MCP call in production.","Developers can iterate against a local specification and regenerate from the canonical service-catalogue contract before shipping."]},{"id":"roberto-clients","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["The client implementation and its TypeScript definitions are generated together instead of being maintained independently. That reduces duplication and makes changes to large API contracts easier to review and maintain. Massimo gives us a consistent and repeatable way to maintain type-safe clients as our APIs evolve."]},{"id":"roberto-performance","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["The important performance characteristic for us is that MCP calls run within our Fastify architecture, while trusted internal workflows can reuse the same handlers through mcpCallTool without making a loopback HTTP request. Redis-backed sessions also allow the service to run across multiple production instances."]},{"id":"roberto-verdict","name":"Roberto Bianchi","title":"Staff Software Engineer","avatar":"/images/quotes/roberto-bianchi.png","text":["The best thing Platformatic gave us was the ability to introduce MCP without creating a second platform.","We kept Spendeskâs existing authentication, authorization, tenant isolation, service integrations, and operational tooling, while extending the framework where our production requirements exposed gaps. We gained an MCP implementation that fits our architecture rather than forcing us to work around it."]}],"figures":[{"id":"pipeline","type":"flow","steps":["OpenAPI","Massimo","type-safe clients","Spendesk services","MCP tools","Platformatic MCP"]},{"id":"latency","type":"timings","rows":[{"label":"get_chart_of_accounts","value":"~32ms"},{"label":"list_companies","value":"~37ms"},{"label":"get_analytical_field_values","value":"~36ms"},{"label":"get_analytical_fields","value":"~61ms"},{"label":"get_cost_centers","value":"~63ms"}]}],"blocks":[{"html":"<p>Spendesk aims to give finance teams a secure and trusted way to access and use their spend data through AI. Spendesk brings together every aspect of company spend - from cards, expenses, and invoices to procurement, budgets, and travel - and captures the financial context needed to make strategic business decisions.</p><p>Its MCP makes that data instantly usable through the AI assistant of their choice: ask questions, find details, build reports, automate recurring workflows, and take action, all with permissioned access that keeps finance data protected. The result is a new kind of finance workflow, built for speed, trust, and everyday decision-making.</p><p>This was not Spendeskâs first bet on Platformatic. The engineering team had already shipped the alpha of Spendeskâs Public API using Platformaticâs client generator, now known as Massimo. When building the MCP server, they extended a proven relationship with production-grade tooling, this time with @platformatic/mcp. Along the way, they contributed improvements directly to the open-source packages.</p>"},{"title":"Building without starting over","html":"<p>Financial data integrations demand zero tolerance for error. Spendesk ruled out generic MCP implementations from the start. AI clients must authenticate through the same OAuth system as all other clients, with no parallel authentication stack.</p><p>Every tool call enforces the same scopes, roles, and company boundaries as the rest of Spendeskâs platform. The initial release is retrieval-only by design. Assistants can answer questions about payables or suppliers, but cannot approve or pay until the write path earns production trust.</p><p>Platformaticâs Fastify-native MCP implementation enabled this without a rebuild. MCP requests connect directly to the same request context as the rest of Spendeskâs stack. The team reused existing OAuth tokens, roles, scopes, and operational tooling. No second authorization system was needed for AI traffic.</p>[[quote:roberto-fastify]]<p>The result is a single, consistent pipeline running from API contract to AI tool call:</p>[[figure:pipeline]]<p>Tools like <code>get_payables</code>, <code>get_suppliers</code>, and <code>create_purchase_order</code> are registered with a name, description, input schema, and handler, and Platformatic exposes them automatically through the MCP protocolâs <code>tools/list</code> and <code>tools/call</code>.</p><p>Because the handlers call straight into Spendeskâs existing services, thereâs no shadow version of the business logic living alongside the real one.</p>"},{"title":"Security that doesnât cut corners","html":"<p>Every tool call must pass strict checks before reaching a handler. Only a valid OAuth token issued to an MCP-configured client is accepted. The token must carry the required scope. For example, <code>payable:read</code> can access <code>get_payables</code>, but anything needing <code>payable:write</code> is not visible.</p><p>Spendesk independently checks the authenticated userâs role, so even with the right scope, access can be denied if the role does not permit the action. Company or organization context is derived from the token, never from an argument passed by the AI. All input must pass JSON Schema validation before any handler runs.</p><p>That role check was a real gap Platformaticâs authorization hook had to close, it needs to inspect the full authenticated request context, not just the MCP payload, and the hook that makes it possible, <code>canAccessTool</code>, didnât exist in the package until Spendesk needed it.</p><p>Itâs one of a small set of features the team built against their own production requirements and then contributed upstream rather than keeping in a private fork: AJV-based JSON Schema validation for strict argument checking, <code>transformRouteSchema</code> for attaching Spendeskâs own OAuth requirements and scopes to the schemas MCP routes generate, and a trio of functions: <code>mcpCallTool</code>, <code>mcpHasTool</code>, <code>mcpListToolNames</code>, that let trusted internal workflows reuse the exact same handler, validation, and authorization pipeline as an external MCP call, without a loopback HTTP request in between.</p><p>Every one of those is now available to any team building a production MCP on Platformatic, not just Spendesk.</p>"}
1,{"title":"Type-safe, end-to-end, with Massimo","html":"<p>Each MCP tool is built on a Massimo-generated TypeScript client, produced directly from Spendeskâs OpenAPI specs. Any change to an operationâs name, parameters, or response shape triggers a TypeScript error in development or CI, not a broken tool call in production.</p>[[quote:roberto-massimo]]<p>Massimo generates clients from a checked-in spec, a local development spec, or the authenticated canonical spec in Spendeskâs service catalogue. Developers can iterate locally and then regenerate against the source of truth before shipping. Spendesk wraps the generated clients in an inter-service client layer, adding request authentication, caching, tracing, and error handling.</p><p>This is critical for MCP, since Spendeskâs APIs have large schemas, many optional filters, and varying response shapes. An AI assistant calling a tool does not have a human to catch silent response changes.</p>[[quote:roberto-clients]]"},{"title":"Performance under AI-shaped traffic","html":"<p>AI assistants generate bursty, exploratory API traffic, with no human to notice subtle issues. Internal execution through <code>mcpCallTool</code> skips the network hop for trusted workflows. Redis-backed sessions allow a session started on one instance to continue on another, with a controlled memory fallback if Redis is unavailable. This is essential for distributed production setups like Spendeskâs.</p>[[quote:roberto-performance]]<p>Based on real production logs/metrics over a week, performance is typically fast, with long-tailed outliers only for very complex aggregated responses that aren\'t cached.</p><p>For the fastest results, when we hit the Redis cache (that we also use for the MCP sessions), tool calls take a few ms. The fastest tools are simple lookups:</p>[[figure:latency]]<p>All well under 100ms.</p>"},{"title":"The verdict","html":"[[quote:roberto-verdict]]<p>Write-action tools, such as creating or archiving a supplier, are already built and gated behind a security review before production. Once approved, Spendeskâs platform moves from answering questions to enabling agents to take action.</p>"}]}},{"slug":"supabase","company":"Supabase","title":"Supabase: to a billion (requests) and beyond","description":"Supporting 200x growth on half the infrastructure with Platformatic Watt.","author":"Luca Maraschi","cover":"/images/case-studies/supabase-case-study.png","logo":"/images/partners/supabase.svg","industry":"BAAS - Postgres Development Platform","companySize":"201-500 employees","publishedAt":"2026-08-14","mainPageQuote":"fabrizio-production","detail":{"heroTitle":"With Great Scale Comes Great Responsibility","quotes":[{"id":"fabrizio-metrics","name":"Fabrizio Fenoglio","title":"Team Lead for Supabase Storage","avatar":"/images/quotes/fabrizio-fenoglio.jpg","text":["We had metrics â Grafana metrics â and we could see sudden spikes and instability in the runtime. Response time was growing exponentially when these issues happened. The problem was, we didn\'t know exactly what was going on under the hood. We could see the instability, but we didn\'t know why."]},{"id":"fabrizio-production","name":"Fabrizio Fenoglio","title":"Team Lead for Supabase Storage","avatar":"/images/quotes/fabrizio-fenoglio.jpg","text":["The only way to figure it out was in production, with Platformatic.","The first step was adding Watt to the Node.js stack, which let us do very powerful profiling and snapshotting on live production traffic."]},{"id":"fabrizio-outcomes","name":"Fabrizio Fenoglio","title":"Team Lead for Supabase Storage","avatar":"/images/quotes/fabrizio-fenoglio.jpg","text":["Our metrics are much flatter now â especially the garbage-collection runtime.","A single container, at peak on heavy operations, was handling about 50 MB/s per core and having a very hard time keeping up.","Now we\'re running 300 MB/s per second per container with 2 cores â so we\'ve halved the number of containers we run, and the system is much more stable."]},{"id":"fabrizio-customers","name":"Fabrizio Fenoglio","title":"Team Lead for Supabase Storage","avatar":"/images/quotes/fabrizio-fenoglio.jpg","text":["Customers won\'t experience spikes of latency anymore when heavy or bursty traffic hits our service â their latency is very stable overall, and we can scale our instances up very quickly.","Performance is much improved too: they can expect to download and upload files much, much faster now."]},{"id":"fabrizio-road","name":"Fabrizio Fenoglio","title":"Team Lead for Supabase Storage","avatar":"/images/quotes/fabrizio-fenoglio.jpg","text":["We\'re not done yet. Once we complete the last three or four improvements, we think we can get our Node.js system to 500â600 MB/s per second per container."]}
1],"stats":[{"id":"growth","items":[{"label":"Supabase Storage Last Year Growth","value":"200x","caption":"Traffic surging due to an influx of AI-native builders adopting the platform."},{"label":"Daily Uploads","value":"400M","caption":"Handled by the service across all their regions."}]},{"id":"throughput","items":[{"label":"Before Watt","value":"50 MB/s","caption":"A single container, at peak"},{"label":"With Watt","value":"300 MB/s","caption":"Per container with 2 cores"},{"label":"Throughput Improvement","value":"4x"}]}],"blocks":[{"html":"<p>If you\'re a developer, you\'re likely already familiar with <strong>Supabase</strong> and what they do: they\'re the team behind the insanely popular and scalable Postgres-based âeverything you need for your backendâ platform that lets teams âbuild in a weekend and scale to millions,â all without needing to set up their own supporting database infrastructure.</p><p>In 2021, Supabase introduced object storage as âSupabase Storage,â which has since evolved to support S3 compatibility, Row-Level Security policies, CDN-based asset caching, and full Postgres metadata.</p><p>Like Supabase as a whole, Storage has seen explosive growth over the last year, with traffic surging as much as 200x due to an influx of AI-native builders adopting the platform. Across all their regions, the service now handles more than 400 million uploads a day, with total requests topping a billion.</p><p>Like many teams building infrastructure for the next generation of AI-enabled builders, <strong>Fabrizio Fenoglio</strong> (Team Lead for Supabase Storage) and his team realized they would need to rethink the architecture behind their service.</p>[[stats:growth]]"},{"title":"You can\'t scale what you can\'t see","html":"<p>The original Storage architecture used Node.js for its API, chosen for the runtime\'s capacity to scale I/O and data streaming via its unique Event Loop mechanism. However, at 200x the traffic you originally architected for, you\'ll inevitably begin to see the common signs of stress for a Node.js service: Event Loop instability, climbing latency, runaway garbage collection, and a throughput wall you can\'t get past, no matter how much infrastructure you throw at it.</p><p>Fabrizio\'s team could see that something was wrong. What they couldn\'t see was why:</p>[[quote:fabrizio-metrics]]<p>Given the scale their service runs at, reproducing these errors outside of production was effectively impossible â simulating the failure would mean simulating millions of tenants. If they wanted to find the bottleneck, they would have to profile in production.</p><p>Now, performance profiling in production is notoriously difficult, because generating the profile itself typically comes with a significant performance hit to your throughput (think on the order of 15%), which isn\'t something you can tolerate if your service is already experiencing stability issues.</p><p>This is the old âQuis custodiet ipsos custodes?â (âwho watches the watchmenâ) dilemma: you can\'t safely monitor or profile from within the same Event Loop.</p><p>Watt solves this via its management plane and platformatic/flame, which together allow profiles to be collected safely from the worker threads without disturbing their Event Loop.</p><p>This means Fabrizio and his team could finally diagnose these performance issues in production:</p>[[quote:fabrizio-production]]<p>The flamegraph revealed the hotspots in the call stack, one of them being an outdated ORM that spun up a connection pool for every customer database and tore it down when idle â churn that, across millions of tenants, carried a heavy memory footprint and drove the garbage collector into overdrive.</p>"},{"title":"Architecting for the AI Era with Platformatic and Watt","html":"<p>Fabrizio and his team at Supabase worked with Platformatic on a new, Watt-based architecture â one designed to get far more out of every ECS task they were already paying for.</p><p>One of the core ideas behind Watt â the same one that made production profiling possible â is running your services as worker threads, each with its own dedicated Event Loop.</p><p>Fabrizio and the Storage team used this to increase their compute density and throughput. They consolidated their single-CPU ECS tasks into fewer containers packed with more compute, and used Watt to run multiple copies of their applications as worker threads inside each ECS task.</p><p>Watt\'s built-in load balancing, based on <a href=\\"https://nodejs.org/api/net.html#serverlisten\\">SO_REUSEPORT</a>
1, enables each worker thread to efficiently consume the allocated compute, while the management plane watches Event Loop Utilization on each thread, hot-swapping any worker that starts to degrade.</p><p>The outcomes thus far have more than validated this approach:</p>[[quote:fabrizio-outcomes]][[stats:throughput]]<p>This 4x improvement in throughput was a huge win for the folks at Supabase managing (and paying for) the underlying AWS infrastructure, and an even bigger one for the builders who rely on Storage, as Fabrizio explains:</p>[[quote:fabrizio-customers]]"},{"title":"The Road Ahead","html":"<p>With the Storage Service delivering consistent performance, even during peak traffic, Fabrizio and the team can focus on using Watt to further optimize their system.</p><p>The next step is to further leverage this multi-worker capability to share the tenant database connection pool across multiple threads.</p><p>This is the kind of separation of concerns you\'d normally split into microservices, except that with Watt, you have the option to simplify your architecture by running these services as threads in one machine instead of separate containers.</p><p>Next, several improvements are already mapped out from the architecture sessions: extracting connection pooling into its own dedicated system, allowing the service to maintain a fixed set of connections and multiplex queries across tenants to avoid the runtime cost of constantly reopening connections.</p><p>That, coupled with a new S3 upload path that trims internal buffering and cuts garbage collection even further, could push per-container throughput significantly higher still.</p>[[quote:fabrizio-road]]<p>Incredible DX at incredible scale is central to the mission for Fabrizio and the team at Supabase, and with Watt at the core of their architecture, they are ready for the next billion requests and beyond.</p>"}]}}]}');let n={links:[{label:"WATT",href:"/#watt"},{label:"ICC",href:"/#icc"},{label:"Autoscaler",href:"/#autoscaler"},{label:"BLOG",href:"https://blog.platformatic.dev"},{label:"RESOURCES",href:"/resources"},{label:"CASE STUDIES",href:"/case-studies"}],github:"https://github.com/platformatic/platformatic",x:"https://x.com/platformatic",cta:{label:"Talk to an expert",href:"/contact"}},s={label:"See how Booking.com cut Node.js compute costs by 38% with Watt â",href:"https://medium.com/booking-com-development/node-js-at-scale-rebalanced-how-we-cut-cost-by-38-62ce247a3002",cookie:"plt_banner_booking_dismissed"},r={"/the-node-book":{description:"Insights, patterns, and Node.js best practices distilled from years of helping Fortune 500 companies build and scale their Node.js applications.",cover:"/images/reports/the-node-book.png",featured:!0,detail:{tag:"Insights",heroTitle:"The Node.js Book for Enterprise",intro:["With years of experience helping Fortune 500 companies build and scale their Node.js apps, weâve seen & tackled the challenges teams face when trying to streamline their operations.","Thatâs why we wrote this bookâto share the insights, patterns, and Node.js best practices weâve developed."],midTitle:"Your roadmap to mastering Node.js.",midBody:["Node.js seems simple at first â and getting started is. But scaling apps and teams is a different story.","As complexity grows, many teams hit roadblocks. Skilled Node.js developers are hard to find, and quick fixes often lead to long-term issues.","This book is your guide to navigating those challenges â whether youâre a CTO, tech lead, or developer."],insideTitle:"Whatâs inside:",items:[{title:"The Road to Node.js",body:"A look at JavaScript, npm, TypeScript, and where Node stands today."},{title:"Creating APIs with Fastify",body:"What is Fastify, how does it work, and how do I get started with it?"},{title:"Building SSR Frontends",body:"SSR frameworks, building a basic SSR page, deployment considerations, HTTP caching, & more."},{title:"Managing Configurations",body:"The importance of configs, how to provide & implement them in Node.js & best practices."},{title:"Structuring Large Applications",body:"The core benefits of modularity, common architectural pitfalls, and best practices for constructing robust and maintainable systems."},{title:"Running Node.js in the Cloud",body:"Strategies for deploying Node.js applications in the cloud, including containerization, Kubernetes orchestration, serverless computing, and real-world optimization techniques."},{title:"Ensuring Scalability and Resilience",body:"Core concepts and best practices for architecting robust, scalable Node.js applications that can withstand high traffic volumes and unexpected events."}]}},"/white-paper-first-90-days":{description:"A week-by-week breakdown of goals, conversations, and quick wins that build momentum fast for first-time engineering leaders.",cover:"/images/reports/white-paper-first-90-days.png",detail:{tag:"Insights",heroTitle:"The First 90 Days Playbook for Tech Leaders",intro:["With thousands of hours coaching Seed-to-IPO engineering orgs, weâve seen the pressure new tech leaders face when they step into the hot-seat and have 90 days to prove they belong.","Thatâs why we wrote this playbookâto share the frameworks, checklists, and battle-tested moves weâve seen turn first-time leaders into trusted, high-impact CTOs and VPs."],midTitle:"Your roadmap to owning the first 90 days",midBody:["Landing a leadership title feels greatâuntil the real work starts.","In those first three months youâre expected to win trust, tame tech debt, chart a product vision, and still ship. Miss the window and the narrative sticks.","This playbook is your GPS through that mazeâwhether youâre a brand-new Head of Engineering, a freshly promoted Tech Lead, or a seasoned architect grabbing the reins."],insideTitle:"Whatâs inside:",items:[{title:"The 30-60-90 Game Plan",body:"A week-by-week breakdown of goals, conversations, and quick wins that build momentum fast."},{title:"Rapid Systems Audit",body:"A lightweight method to surface bottlenecks in architecture, tooling, spend, and team workflowsâbefore they blow up."},{title:"Credibility-Building One-on-Ones",body:"The questions that unlock psychological safety and surface the unspoken truths in your new team."},{title:"Designing for Scale (Without Rewrites)",body:"Patterns for incrementally modernising legacy services while still shipping new features."},{title:"Metrics That Matter",body:"How to choose and socialise the three numbers that prove engineering value to the C-suite."},{title:"Risk & Incident Playbooks",body:"Templates for on-call rotation, post-mortems, and stakeholder comms that keep you calm during 2 a.m. pages."},{title:"Crafting Your 12-Month North Star",body:"A storytelling framework that connects roadmap, headcount, and budget in a single crisp narrative execs will fund."}]}}
1,"/navigating-digital-architecture-a-comprehensive-guide-for-senior-technical-leadership":{description:"Everything senior technical leaders need to know about developing, operating, and scaling API products for modern backends.",cover:"/images/reports/navigating-digital-architecture.png",detail:{tag:"Reports",heroTitle:"Navigating Digital Architecture",heroSubtext:"A Comprehensive Guide for Senior Technical Leadership",intro:["Everything you need to know about developing, operating and scaling API products for modern backends."],midTitle:"Welcome to the ultimate guide for navigating the complexities of modern digital architectures and harnessing their full potential.",midBody:["Whether youâre a CTO, technical leader, or developer striving to drive innovation and efficiency within your organization and team, this book will equip you with the insights and strategies needed to thrive in todayâs digital landscape."],insideTitle:"Whatâs inside:",items:[{title:"Understanding Architecture Options",body:"Gain a deep understanding of the evolution of digital architectures, from monoliths to microservices, and explore the innovative concept of composable monoliths."},{title:"Making Digital Architecture Choices",body:"Explore the profound impact of architectural decisions on your digital platformâs success, with real-world case studies of the consequences of architectural choices."},{title:"Aligning Technical Decisions with Business Goals",body:"Understand the importance of aligning technology needs with business objectives and strategies for balancing technology with business priorities."},{title:"Harmonizing Consumer, Management, and Developer Needs",body:"Navigate the balance between consumer demands, management expectations, and developer aspirations through cross-functional teams and continuous feedback loops."}]}},"/the-technical-leader-s-guide-to-scaling-digital-practices":{description:"A practical guide to developing, operating, and scaling digital practices across a growing engineering organization.",cover:"/images/reports/technical-leader-guide.png",detail:{tag:"Reports",heroTitle:"The technical leaderâs guide to scaling digital practices",intro:["Everything you need to know about developing, operating and scaling API products for modern backends."],midTitle:"Welcome to the definitive guide that will transform your approach to backend development.",midBody:["This book is your roadmap to mastering the intricate world of modern backend development and platform engineering. Whether youâre a CTO, technical leader, or developer seeking insights to drive efficiency, innovation, and success within your organization, keep this book handy to guide you through the challenges that scaling digital practices can bring."],insideTitle:"Whatâs inside:",items:[{title:"The current backend development landscape",body:"Explore the game-changing impact of cloud computing, microservices architecture, and the API economy on backend development."},{title:"A deep dive into Developer Experience (DX)",body:"Discover how DX unlocks developer productivity, satisfaction, and innovation, and learn strategies to create a thriving development environment."},{title:"The ins & outs of APIs",body:"Dive into the world of APIs, from best practices to the business case for extensibility."},{title:"Unpacking key challenges faced by technical leaders",body:"Strategies for operational excellence in a distributed systems landscape â tackling complexity, optimizing development, and fostering a culture of innovation."}]}}};i.map(e=>{let t=r[e.route];return t?{route:e.route,book:e.book,title:e.title,description:t.description,cover:t.cover,featured:t.featured,detail:t.detail}:null}).filter(e=>null!==e),o.R.slice().sort((e,t)=>t.publishedAt.localeCompare(e.publishedAt))},59055:function(e,t,a){a.d(t,{$0:function(){return T},Gb:function(){return k},M$:function(){return A},ZA:function(){return w},cn:function(){return v},hh:function(){return C},q0:function(){return S},un:function(){return N}});var i=a(57437);a(2265);var o=a(27648),n=a(76858),s=a(16443),r=a(88906),l=a(13420),c=a(42208),d=a(50091),h=a(40476),p=a(66337),u=a(42488),m=a(61341),g=a(14822),f=a(31810),b=a(25330),y=a(6830);let w="#21FA90",v=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.filter(Boolean).join(" ")},x=e=>/^https?:\/\//i.test(e),k=e=>x(e)?{target:"_blank",rel:"noopener noreferrer"}:{},S={cursor:s.Z,shield:r.Z,network:l.Z,eye:c.Z,database:d.Z,gauge:h.Z,lock:p.Z,activity:u.Z,cloud:m.Z,cpu:g.Z,thumbsup:f.Z,code:b.Z,barchart:y.Z};function T(e){let{id:t,className:a,children:o}=e;return(0,i.jsx)("section",{id:t,className:v("w-full px-6",a),children:(0,i.jsx)("div",{className:"mx-auto w-full max-w-[1120px]",children:o})})}function j(e){let{children:t}=e;return(0,i.jsx)("p",{className:"text-center text-[11px] font-medium uppercase tracking-[0.22em] text-[#B2B4B6]",children:t})}function A(e){let{overline:t,title:a,highlight:o,after:n,intro:s,breakHighlight:r=!1}=e;return(0,i.jsxs)("div",{className:"mx-auto flex max-w-[640px] flex-col items-center gap-4 text-center",children:[t&&(0,i.jsx)(j,{children:t}),(0,i.jsxs)("h2",{className:"text-[28px] font-semibold leading-[1.25] tracking-tight text-[#00050B] md:text-[32px]",children:[a," ",o&&(0,i.jsxs)(i.Fragment,{children:[r&&(0,i.jsx)("br",{}),(0,i.jsx)("span",{style:{color:w},children:o})]}),n]}),s&&(0,i.jsx)("p",{className:"text-[15px] leading-[1.6] text-[#4D5054] md:text-base",children:s})]})}function P(){return(0,i.jsx)("svg",{width:"15",height:"15",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":!0,
1children:(0,i.jsx)("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z"})})}function N(e){let{href:t,variant:a="primary",children:s,icon:r="arrow"}=e;return(0,i.jsxs)(o.default,{href:t,...k(t),className:v("inline-flex items-center justify-center gap-1.5 rounded-md px-4 py-2 text-[13px] font-medium transition-colors","primary"===a?"bg-[#00050B] text-white hover:bg-[#00050B]/90":"border border-[#E5E6E7] bg-white text-[#00050B] hover:bg-[#F4F5F5]"),children:[s,"arrow"===r&&(0,i.jsx)(n.Z,{className:"h-3.5 w-3.5"}),"github"===r&&(0,i.jsx)(P,{})]})}function C(e){let{href:t,children:a}=e;return(0,i.jsxs)(o.default,{href:t,...k(t),className:"group inline-flex items-center gap-1 text-[13px] text-[#4D5054] transition-colors hover:text-[#00050B]",children:[a,(0,i.jsx)(n.Z,{className:"h-3.5 w-3.5 transition-transform group-hover:translate-x-0.5"})]})}},39821:function(e,t,a){function i(){document.body.classList.add("side-open")}function o(){document.body.classList.remove("side-open")}a.d(t,{K:function(){return o},X:function(){return i}})}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.