[{"data":1,"prerenderedAt":478},["ShallowReactive",2],{"article-how-fantasy-shipped-liv-golf-in-72-days-optimized":3},{"page":4,"related":429},{"id":5,"title":6,"slug":7,"date":8,"_updatedAt":9,"external":10,"categories":11,"featuredMedia":8,"blocks":12,"menu":8,"foot":8,"seo":8},"bP7BfCrfR7OHSyXzOZSVDQ","How Fantasy Shipped LIV Golf in 72 Days","how-fantasy-shipped-liv-golf-in-72-days-optimized",null,"2026-07-08T00:51:11+01:00","",[],{"id":13,"type":14,"blocks":15},"I5WFg4ahSnuKo8pcDvJNZA","blocks_select",[16,28,32,41,44,66,69,80,82,106,108,115,117,125,127,137,139,149,151,161,163,173,175,185,187,197,199,208,210,219,221,231,233,243,245,255,257,267,269,279,281,287,289,297,299,309,311,321,323,331,333,343,345,351,353,361,363,373,375,385,387,397,399,409,411,417,419,427],{"id":17,"type":18,"eyebrow":19,"breadcrumb":8,"title":6,"titleSize":20,"titleAlignment":21,"label":22,"text":10,"media":8,"mediaMobile":8,"mediaSmall":8,"theme":23,"aligned":27},"DvsEjUYBTRi1oE050RDmFQ","media_hero_expanded_block","FANTASY · HOW WE BUILD","h3","items-center justify-center","A live broadcast doesn't wait",{"id":24,"background":25,"text":27},"en13_fe2QGyXsux0_3kGyA",{"hex":26},"#000000",false,{"id":29,"type":30,"space":31},"OVKXownqRwWbAtAYfoJJXg","space_block","medium",{"id":33,"type":34,"eyebrow":35,"title":36,"titleCondensed":27,"titleSmall":37,"text":10,"leftAligned":27,"cta":8,"theme":38},"cUQ1kmhnTbatdBg5TOc_Lw","intro_block","THE SHORT VERSION","Fantasy built and shipped LIV Golf's mobile app in 72 business days, then its website, by running AI through every layer of the build while keeping human review on every change.",true,{"id":39,"background":40,"text":27},"NmQe8RzWQi644mSsIs5xfg",{"hex":26},{"id":42,"type":30,"space":43},"Mox6rlKiQjOXJpzZ9KFdYQ","small",{"id":45,"type":46,"items":47,"theme":63},"PgEkvF0ZSPaagHDIk04Liw","stats_carousel_block",[48,53,58],{"id":49,"stat":50,"title":51,"text":52},"bBiP69HdSlSHQcw1768-Kg","72","business days","From day one to the App Store, in time for the season opener.",{"id":54,"stat":55,"title":56,"text":57},"HWcden94SYicGOC7lubyWQ","~1,200","reviewed changes","Merged across the mobile app and the website.",{"id":59,"stat":60,"title":61,"text":62},"N30211pwQGS6FUCS95sVWw","100%","of scope delivered","Nothing cut to hit the date.",{"id":64,"background":65,"text":27},"d8cGWOYDQDqVJO88rQtvFw",{"hex":26},{"id":67,"type":30,"space":68},"YMVrEdj-S7O98XgtmE6fDw","large",{"id":70,"type":71,"eyebrow":72,"title":73,"text":74,"cta":8,"list":75,"stats":76,"theme":77},"Ck1ZruXGQYSRt9ywta572A","text_block","01 · THE STAKES","\u003Cp>\u003Cstrong>A live broadcast doesn't wait\u003C/strong>\u003C/p>","\u003Cp>When a LIV Golf event goes live, the app has to keep pace with a broadcast watched around the world. A score changes the instant a putt drops, and the app has to change with it, in sync across television, streaming, and the web. We built and shipped the mobile app that does that in 72 business days, from the first day of the engagement to the App Store, in time for the league's first event of the season at the end of January 2026.\u003C/p>",[],[],{"id":78,"background":79,"text":27},"JkDwaDCuTPuu8zIWIKHfTA",{"hex":26},{"id":81,"type":30,"space":31},"SfO5vymGQ02wsUvQsDu8rQ",{"id":83,"type":84,"title":85,"text":86,"media":87,"caption":10,"theme":103,"reverse":27},"GoMBH9OOSPqeBtqjo0oEjQ","media_text_block","AI at every level of the build","\u003Cp>In the week the mobile app shipped to the store, a team of five merged 88 pull requests, every one of them reviewed first. Months later, when the LIV Golf website launched, a team the same size merged 102 in its final week. Teams that size don't usually move that fast, and they almost never hold their quality while they do.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>When people hear that an agency used AI to build something, they usually imagine one moment. A designer hands over a mockup, and AI turns it into working code. That happened on LIV Golf too, and it was the smallest piece of the job.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>We used AI at every level of the engineering work. We built the designs so that AI could turn them into code, checked the interface automatically as it came together, and used the same discipline to build everything underneath the app: live scoring, the publishing system, the personalized feed, and the cloud infrastructure that keeps all of it running during a global broadcast.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":89,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":96,"video":8},"fWwNIOAOSMO4gNPnoNRy6A",{"x":90,"y":90},0.5,1728,972,"https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&fit=max&h=800&q=95&w=800","https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&fit=max&h=1440&q=95&w=1440","https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&fit=max&h=2000&q=95&w=2000",{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},"https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&dpr=0.25&fit=max&h=2880&q=95&w=2880 432w,https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&dpr=0.5&fit=max&h=2880&q=95&w=2880 864w,https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&dpr=0.75&fit=max&h=2880&q=95&w=2880 1296w,https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&fit=max&h=2880&q=95&w=2880 1728w","(max-width: 1728px) 100vw, 1728px","https://www.datocms-assets.com/157026/1750716785-blue-placeholder.jpg?auto=format&fit=max&h=2880&q=95&w=2880",1.7777777777777777,"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICBAJEw0XDhgODgkNDRENDQ0NFxUZGBYVFhUaHysjGh0oHSEWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OFQUNEC8cFh0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA4AGAMBIgACEQEDEQH/xAAYAAACAwAAAAAAAAAAAAAAAAAEBQABBv/EABoQAAIDAQEAAAAAAAAAAAAAAAABAwQRAhL/xAAWAQADAAAAAAAAAAAAAAAAAAADBAX/xAAXEQADAQAAAAAAAAAAAAAAAAAAAhEB/9oADAMBAAIRAxEAPwDaX7HqQWzy6E2Fr0V2ZHy2UlwTbQK3YfPRAG3M3IUEgKn/2Q==","#4f77a8",{"id":104,"background":105,"text":27},"a6DJ2LX-Suebx6bnOcnCcg",{"hex":26},{"id":107,"type":30,"space":31},"RDS0ov7gQlKovyXCjcZ1Tw",{"id":109,"type":110,"icon":37,"quote":111,"cite":10,"theme":112},"BJ9RInBdTdWMkSfR3ddFAQ","quote_block","This is not vibe coding.",{"id":113,"background":114,"text":27},"AXmb3IpBR_ym2DzJAzKOvg",{"hex":26},{"id":116,"type":30,"space":31},"UjuZ7jXQR_q-b2qPDcnJFw",{"id":118,"type":71,"eyebrow":10,"title":10,"text":119,"cta":8,"list":120,"stats":121,"theme":122},"CR8VIYKlQb2RvFyKKIQm8g","\u003Cp>Clients ask us about one thing more than anything else, so let me deal with it up front. This is not vibe coding. Vibe coding is when you let an AI improvise a solution and take whatever it gives you, which means the result is unpredictable and usually overbuilt, inconsistent, and light on security. We do the opposite. We're on the hook for a system that behaves and looks exactly the way we designed it and that holds up to enterprise standards for security and architecture.\u003C/p>",[],[],{"id":123,"background":124,"text":27},"Mu91lmfURHKoTeCXehywYg",{"hex":26},{"id":126,"type":30,"space":68},"dI1FujerQiiFZpOUuCh4zw",{"id":128,"type":71,"eyebrow":129,"title":130,"text":131,"cta":8,"list":132,"stats":133,"theme":134},"aaKF4GeLSoW1XQrV8YdpAw","02 · THE METHOD","\u003Cp>\u003Cstrong>First, we had to learn to trust it\u003C/strong>\u003C/p>","\u003Cp>We didn't start with LIV Golf. From the middle of 2025 we ran a careful set of experiments on two other client projects, Mars Veterinary Health and Panasonic Well. We were trying to find a dependable way to let AI do real development work instead of treating it as a clever autocomplete.\u003C/p>",[],[],{"id":135,"background":136,"text":27},"H7CqEqRuTjeJK7iUjkH4aQ",{"hex":26},{"id":138,"type":30,"space":31},"bGqXRknaSJ6g4R7EcGD7ww",{"id":140,"type":84,"title":141,"text":142,"media":143,"caption":10,"theme":146,"reverse":37},"VbnSv4dRRpayIzDUo0rUHg","A blueprint, not improvisation","\u003Cp>What we arrived at is called spec-driven development. Before the AI writes a line of code, you write a detailed description of what you want, the patterns it should follow, and the rules it has to obey. The AI then builds from that description.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>It's the difference between handing a contractor a blueprint and telling them to build a nice house. Once you control what the AI knows and give it a real specification, the quality climbs and the output stops surprising you.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Those two projects settled the question for us. AI could handle front-end development, and it could start handling the work behind it, as long as we stayed disciplined about what we fed it. By the time LIV Golf came along, we were confident we could take the approach somewhere much harder.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":144,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":145,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":147,"background":148,"text":27},"WRkLPugqTSKAXpjAqBPXeQ",{"hex":26},{"id":150,"type":30,"space":31},"arqRFiwDS3uBlguBzYdsNw",{"id":152,"type":71,"eyebrow":153,"title":154,"text":155,"cta":8,"list":156,"stats":157,"theme":158},"BTnSWCu1Su69jazpZe4Jvw","03 · THE BRIEF","\u003Cp>\u003Cstrong>What the LIV Golf build actually required\u003C/strong>\u003C/p>","\u003Cp>LIV Golf is a global golf league, and the product had to work during events held all over the world. These aren't simple broadcasts. Each event is a simulcast that runs across television and digital platforms at once, streaming services included, so the app had to stay in step with everything else happening around a live tournament.\u003C/p>",[],[],{"id":159,"background":160,"text":27},"YBQw6w3WT3igTFsxgwtYfQ",{"hex":26},{"id":162,"type":30,"space":31},"foO1yGkWROCpoytVT9U_nA",{"id":164,"type":84,"title":165,"text":166,"media":167,"caption":10,"theme":170,"reverse":27},"Q1FZ9B6hSPSggrqpOp26Kg","Two products, one launch window","\u003Cp>The mobile app is where the clock was tightest. We shipped it to the App Store in 72 business days, counting from the first day of the engagement through design, build, and release. That number is easy to misread, so let me be exact. It covers the whole engagement for the mobile app, design included, and it is the mobile app alone. We did not build all of LIV Golf in 72 days.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>It was two products, not one. The mobile app came first, built in React Native. Once it was live, the design team rolled straight from the mobile work into the website, and web development got underway in February, built in Next.js. The website launched later that spring.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>We ran two separate teams of five and kept the same senior technology leadership across both, which is part of why the second build went the way it did. A fixed launch date on a build that large is the kind of problem most agencies solve by throwing bodies at it. We took a different route.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":168,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":169,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":171,"background":172,"text":27},"HxqiAIQfSJqoXfC1ncH1dg",{"hex":26},{"id":174,"type":30,"space":31},"aCcb6SlxR2e8Fx6Eks7VdA",{"id":176,"type":71,"eyebrow":177,"title":178,"text":179,"cta":8,"list":180,"stats":181,"theme":182},"die637gnTfu_Fr_E_gUxgQ","04 · THE BUILD","\u003Cp>\u003Cstrong>AI showed up at every layer\u003C/strong>\u003C/p>","\u003Cp>AI wasn't confined to one corner of the project. It showed up in every layer of the stack, so let me walk through them.\u003C/p>",[],[],{"id":183,"background":184,"text":27},"NeBT8W27ToumgKuAlFm7MQ",{"hex":26},{"id":186,"type":30,"space":31},"R08vEkuPRu6bXVn4UI1aHQ",{"id":188,"type":84,"title":189,"text":190,"media":191,"caption":10,"theme":194,"reverse":37},"MMTngD-KQj2qO8M2qmfUHg","Thinking, before we built anything","\u003Cp>Some of the most useful AI work happened before a line of app code existed. Our architects designed the system, and they used AI to stress-test that design and find its weak spots. We did not hand the architecture to a model. We built it ourselves and used AI to make a stronger version of it.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>The same went for platform decisions, where we put content systems side by side, Sanity against Contentful against Payload, to choose the right one. Left to their own devices, large language models are relentlessly wordy, so part of the craft was holding them to only what mattered. Between editing their output and drawing architecture diagrams in Mermaid, we got aligned with the client's technical stakeholders quickly.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":192,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":193,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":195,"background":196,"text":27},"Y8JNf-n0TSqdHds2tHDkGQ",{"hex":26},{"id":198,"type":30,"space":31},"afKJ4CUoSxOol-vOFDttSA",{"id":200,"type":71,"eyebrow":10,"title":201,"text":202,"cta":8,"list":203,"stats":204,"theme":205},"NLhGT-g4Qiq2d4lUZ7jvIA","\u003Cp>\u003Cstrong>Turning designs into code\u003C/strong>\u003C/p>","\u003Cp>This is the part people picture, and we built a careful pipeline for it. Designers worked in Figma, with their files structured so a machine could read them cleanly. From that structured design, AI built each piece as a small, self-contained component. We reviewed every component on its own in Storybook, checking it for accessibility and visual accuracy before it went anywhere near the app. That gave us an experience assembled from high-quality parts that matched the designs exactly.\u003C/p>",[],[],{"id":206,"background":207,"text":27},"Gbb6WZxBSQuQ58zxNMGn3A",{"hex":26},{"id":209,"type":30,"space":43},"Rd_UU8HxRK2-1c-QnJw2Fg",{"id":211,"type":71,"eyebrow":10,"title":212,"text":213,"cta":8,"list":214,"stats":215,"theme":216},"Q1RreU4AQpq6N_bkfi2hjw","\u003Cp>\u003Cstrong>Building the content system\u003C/strong>\u003C/p>","\u003Cp>A live golf product needs the client's own staff to publish stories, scores, and updates while an event is underway. We turned the requirements from our design, UX, and business teams into specifications, then used AI to build both the underlying content system and the dashboard the staff would run it from.\u003C/p>",[],[],{"id":217,"background":218,"text":27},"B_i_fuCnStugbocTh62QjQ",{"hex":26},{"id":220,"type":30,"space":31},"V4WyPF2WSYqPbQZ4CIjUzA",{"id":222,"type":84,"title":223,"text":224,"media":225,"caption":10,"theme":228,"reverse":27},"D71CtSrOT8SUYx8oEStIQg","One gateway, live everywhere","\u003Cp>A golf app is only useful if it knows what's happening on the course, and all of that data came from the client and their partners. We built a set of middleware to pull it together. At the center sat a GraphQL gateway, a single service the apps could query for anything they needed instead of talking to a dozen data sources directly. We built it on Apollo and Fastify and backed it with a Redis cache. We generated the apps' data-fetching code automatically from our queries, then cached it with React Query, which removed a whole class of tedious, error-prone work without costing us type safety.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Running alongside the gateway was a real-time service built on server-sent events, or SSE, a lightweight way for a server to push updates the instant they happen. Any client, web or mobile, could subscribe, and the moment a score or an event status changed, every subscriber heard about it at once.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":226,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":227,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":229,"background":230,"text":27},"JS_YpKKoTDqGypOY7gAfJw",{"hex":26},{"id":232,"type":30,"space":31},"ReqcWszwTe-72M3uz1A24Q",{"id":234,"type":84,"title":235,"text":236,"media":237,"caption":10,"theme":240,"reverse":37},"JsXWwvfTRImAdkNmMOWFPg","A feed tuned to each user","\u003Cp>Every user got their own feed, which we called 4U. We built it on Elasticsearch, so we could serve relevant results quickly and keep tuning them as someone interacted with content. That drove an endless, TikTok-style scroll in the mobile app.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Before we committed to the approach, we used AI to run a quick proof of concept that confirmed it would hold up under heavy real-world use, with people constantly marking content as seen.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":238,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":239,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":241,"background":242,"text":27},"etEB2Fy7T4Sz1ozPo1TbOw",{"hex":26},{"id":244,"type":30,"space":31},"AoXfwDwuSRGoP7Fxp_AY-w",{"id":246,"type":84,"title":247,"text":248,"media":249,"caption":10,"theme":252,"reverse":27},"PVQinrbYTnW9CrtIrQn9vQ","Infrastructure as code, across regions","\u003Cp>The servers and services that run everything were written as code, so they can be rebuilt and scaled on their own. We spread them across regions so the system stays up under load and recovers from trouble without us during a worldwide event. AI helped build this layer too, out to the automated pipeline that tests and ships new code.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>So none of this lived only on the screen. The same approach ran from the infrastructure at the bottom to the build pipeline at the top, with AI in the loop the entire way and people watching it.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":250,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":251,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":253,"background":254,"text":27},"bg1izEipRXWWP0o2D95Gtw",{"hex":26},{"id":256,"type":30,"space":31},"WabGJNt6Tj6pyNfZ2PJmCw",{"id":258,"type":71,"eyebrow":259,"title":260,"text":261,"cta":8,"list":262,"stats":263,"theme":264},"YX3MevPxSMG5Y2eo1kWClA","05 · THE GUARDRAILS","\u003Cp>\u003Cstrong>Why we still trusted the result\u003C/strong>\u003C/p>","\u003Cp>We did not let AI run loose. Moving fast made review more important, not less, so we built it in at several points.\u003C/p>",[],[],{"id":265,"background":266,"text":27},"XvK_q0BHQGS0czeTL3fiBw",{"hex":26},{"id":268,"type":30,"space":31},"JucA4BJdQOiN-K87Q7DiTg",{"id":270,"type":84,"title":271,"text":272,"media":273,"caption":10,"theme":276,"reverse":37},"V3Z0G3OyQQKqjRMrV_IZXg","Review, built in at every step","\u003Cp>Every pull request, the package of changes a developer submits, went through an automatic pipeline of checks first: linting, type checking, and other static analysis that catches errors and enforces consistency before a human looks at anything. After that, another engineer reviewed the change before it merged. Then we added a layer most teams don't have: a separate AI reviewed the work and flagged problems, including the kind of mistakes our own method can introduce.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>We chose carefully where to spend human attention. Routine, low-risk work could run almost entirely on AI, while anything risky or important got real eyes on it. None of that speed removed responsibility. Every change that shipped had a person who had signed off on it.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":274,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":275,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":277,"background":278,"text":27},"bPQ7mUuBSSi0tBgIJsauVQ",{"hex":26},{"id":280,"type":30,"space":31},"HsaCEg9cRyOsLkFllZhm4w",{"id":282,"type":110,"icon":37,"quote":283,"cite":10,"theme":284},"UUU1cP5iRYiITK1qJm_IGQ","Every change that shipped had a person who had signed off on it.",{"id":285,"background":286,"text":27},"bBmpCvUhS3SwgbzZkDQwXA",{"hex":26},{"id":288,"type":30,"space":31},"DdwEOVDGTouEW3YeutvK3w",{"id":290,"type":71,"eyebrow":10,"title":10,"text":291,"cta":8,"list":292,"stats":293,"theme":294},"UlPEJiwCQt6C6V8Zzoc8iw","\u003Cp>There is a fair worry about AI-written code, which is that it produces more of everything, defects included, and just shoves the problem downstream into review. Our process is built to prevent that. The specification constrains what the AI can produce before it produces it, so there's less to catch later, and the layered review catches what is left. The bugs people associate with AI code tend to come from letting it improvise with neither a specification in front of it nor a real review behind it. We did neither.\u003C/p>",[],[],{"id":295,"background":296,"text":27},"Lm2cHEpjRe2L_jhaLuFV1w",{"hex":26},{"id":298,"type":30,"space":68},"NT3P9BRDTGqZuMFyAf6DoQ",{"id":300,"type":71,"eyebrow":301,"title":302,"text":303,"cta":8,"list":304,"stats":305,"theme":306},"av4yZBOJSOGDhlMzP-Ekrw","06 · THE PAYOFF","\u003Cp>\u003Cstrong>What this let the team do\u003C/strong>\u003C/p>","\u003Cp>People assume the lesson here is that AI lets you run a smaller team. That's not what happened. We scaled the team up, and the payoff was how much that larger team could produce.\u003C/p>",[],[],{"id":307,"background":308,"text":27},"Pd1ZzXc4SCOhj6PVLUuNQQ",{"hex":26},{"id":310,"type":30,"space":31},"AW0tP0A5T4SYQAYP803d4g",{"id":312,"type":84,"title":313,"text":314,"media":315,"caption":10,"theme":318,"reverse":27},"ImnnIIjTTPK_1BF5b9NLhw","Launch-week velocity","\u003Cp>Because AI let us hand off work quickly, give one person oversight of a whole area, and bring new people up to speed in days, we could grow to meet the scope and still move faster than a traditional project of the same size. At its peak the engagement ran with a tech director, a tech lead, two product managers, and a technical program manager, plus four engineers and a QA engineer on mobile, and four engineers, a QA engineer, and a QA analyst on web.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Come back to those launch-week numbers, because they carry the argument. In the week the mobile app shipped, its team of five merged 88 pull requests. When the website shipped, its team of five merged 102.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Every one passed the automated checks, and the higher-stakes changes passed human review on top of that, scaled to how critical the feature was. A conventional team that size, working the conventional way, can't keep that pace at that level of rigor.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":316,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":317,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":319,"background":320,"text":27},"bMawWhhxSI2guc3PUT0uJA",{"hex":26},{"id":322,"type":30,"space":31},"Y4h0D-ZSRGaCb-KGxg2qKg",{"id":324,"type":71,"eyebrow":10,"title":10,"text":325,"cta":8,"list":326,"stats":327,"theme":328},"OSi4Swq1Qb65L9eByiaz1w","\u003Cp>Those weeks were peaks, not the whole story. Across the mobile build the team merged about 700 reviewed pull requests, holding a steady week-after-week pace long after the app went live. The website added roughly 480 more. That is close to 1,200 reviewed, merged changes across the two builds, and the pace held for months rather than spiking for a single week before a deadline.\u003C/p>",[],[],{"id":329,"background":330,"text":27},"fhPs7cD2SH2K5HaYIw7Pow",{"hex":26},{"id":332,"type":30,"space":31},"etJqTE3vStOi11DVWbg1jA",{"id":334,"type":84,"title":335,"text":336,"media":337,"caption":10,"theme":340,"reverse":37},"WdoYBvKZQheAIr-e5GYJhg","Fewer paths, full scope","\u003Cp>The obvious question is whether this would have taken a bigger team without AI. Probably not a smaller one, and maybe a larger one. But headcount is the wrong way to think about it, because adding people is never free. When an agency is staring down a hard deadline, the usual move is to quietly trim the product vision to protect the date and the budget.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>Bigger teams tend to make that worse rather than better. They add some throughput while wearing down quality and consistency, and past a point another engineer just pushes the bottleneck somewhere else, usually back upstream to the question of what to build at all.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>A senior team with AI behind it doesn't hit that wall as fast. We still had to think hard about what to build. We could just build it, and rebuild it, much faster, without cutting quality to make the date.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":338,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":339,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":341,"background":342,"text":27},"H0z7qINfTjioxM3FOfvUzQ",{"hex":26},{"id":344,"type":30,"space":31},"Eic4ng3cR9edDDUD5DrpXQ",{"id":346,"type":110,"icon":37,"quote":347,"cite":10,"theme":348},"EjIWgtcPRX21evUo8UQvDQ","For years our conversations with clients have started with what they would have to give up. This one started with how much we could actually do.",{"id":349,"background":350,"text":27},"TLHeeVweQxauJYN5_AygFQ",{"hex":26},{"id":352,"type":30,"space":31},"EBKSiaIFQBiLJmKp1EZs3A",{"id":354,"type":71,"eyebrow":10,"title":10,"text":355,"cta":8,"list":356,"stats":357,"theme":358},"D5NuLP42QsqH9lVAEWjkwg","\u003Cp>The people mattered as much as the tools. We staffed senior. Plenty of agencies lean on junior talent, and junior people are the most likely to produce AI slop and the least able to tell it apart from good work. Experienced engineers catch it. Our leads also stayed hands-on instead of hovering above the work, writing critical parts of the product, reviewing code, and merging changes themselves.\u003C/p>",[],[],{"id":359,"background":360,"text":27},"FpGxQvV5R8WJig9DCuaPUQ",{"hex":26},{"id":362,"type":30,"space":31},"CvO-c068RHa-vj50oHF-pw",{"id":364,"type":84,"title":365,"text":366,"media":367,"caption":10,"theme":370,"reverse":27},"E6_yIuhyQ2GFdIVvm1pfGw","The codebase as a shared brain","\u003Cp>A lot of what made the scale manageable came down to one idea. We treated the codebase as a shared brain. The rules, the architecture, and the standards lived in the code itself, so AI enforced them across everyone's work, and anyone who pulled the latest code pulled the latest thinking along with it. The AI could check whether a component already existed before someone rebuilt it, which kept the work consistent and stopped people from quietly duplicating each other.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>It also made onboarding fast. A new engineer was usually opening reviewed pull requests by their third day on the project and fully productive after that, because the codebase itself explained how the code worked and how it was organized around the task in front of them. Review got easier too, since the same tools could point out where someone had misunderstood something before a human reviewer ever saw it.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":368,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":369,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":371,"background":372,"text":27},"CX3Kmrw5SXGuI_oq6l_S9Q",{"hex":26},{"id":374,"type":30,"space":31},"d-_oV_EHRdaRiQZRpLgm7g",{"id":376,"type":71,"eyebrow":377,"title":378,"text":379,"cta":8,"list":380,"stats":381,"theme":382},"aNE7oYJ-Rn61KiV0EcCaBQ","07 · THE HABIT","\u003Cp>\u003Cstrong>The ground kept moving while we built\u003C/strong>\u003C/p>","\u003Cp>Our process didn't hold still. It changed more than once during LIV Golf, because the tools and the models underneath us kept improving while we worked.\u003C/p>",[],[],{"id":383,"background":384,"text":27},"fyfv6_FyQEi-jFj8Xr-jDA",{"hex":26},{"id":386,"type":30,"space":31},"LcbQYE8uTCSzoJCa9gp9tQ",{"id":388,"type":84,"title":389,"text":390,"media":391,"caption":10,"theme":394,"reverse":37},"NjfiXemiT-KJ67UrLwXTzA","Every engagement leaves the system better","\u003Cp>You can't stop a team mid-deadline and have everyone relearn their craft. So the habit that mattered most was writing down what we learned as we went, in plain files checked into the project, so our systems and our people got smarter together.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>That turns a project into a place where research and development happen continuously, and it lets a lesson from one project travel out to the next one, or to someone waiting between projects. The advantage was the habit itself, learning fast and passing it around, more than any particular tool we happened to be using that month.\u003C/p>",{"id":88,"alt":8,"title":8,"focalPoint":392,"width":91,"height":92,"thumbnail":93,"small":94,"medium":95,"responsiveImage":393,"video":8},{"x":90,"y":90},{"srcSet":97,"webpSrcSet":10,"sizes":98,"src":99,"width":91,"height":92,"aspectRatio":100,"alt":8,"title":8,"base64":101,"bgColor":102},{"id":395,"background":396,"text":27},"ZzatoJq5TKiNJNJVqm6feg",{"hex":26},{"id":398,"type":30,"space":31},"R_MO33HuRi6ztPFp9zZ8BQ",{"id":400,"type":71,"eyebrow":401,"title":402,"text":403,"cta":8,"list":404,"stats":405,"theme":406},"HFSHGsSeSxODgyHORQZEMQ","08 · WHAT'S NEXT","\u003Cp>\u003Cstrong>Where this is going\u003C/strong>\u003C/p>","\u003Cp>So what does all of this add up to? AI ran through the entire project, from the screen down to the infrastructure, and the result was a large, complicated product built faster and to a higher standard than the old way would have allowed.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>What happens next is that these techniques stop being special. Spec-driven development, the thing we leaned on hardest, is already on its way to being something everyone does. The frontier models can now do much of what our hand-built process did a year ago, and the gap keeps closing. So the edge can't be the technique itself. It has to be the ability to improve the technique faster than anyone else, to treat our own process as something we research and rebuild constantly and feed straight back into live client work. LIV Golf is where we got good at that, and we are still getting better.\u003C/p>",[],[],{"id":407,"background":408,"text":27},"Up2Jb7sESsatTtbzazS7Hw",{"hex":26},{"id":410,"type":30,"space":31},"D3Sr8_ruRQyiY8Z4snYRdQ",{"id":412,"type":110,"icon":37,"quote":413,"cite":10,"theme":414},"eEL85wFmT8u4FHgaVEE1lg","Part of what you're buying is a delivery process that keeps improving while it runs.",{"id":415,"background":416,"text":27},"bpESuCXjSrCik6ueJO5XvA",{"hex":26},{"id":418,"type":30,"space":31},"FDNP5pUMS_mkwdJdIt5K1w",{"id":420,"type":71,"eyebrow":10,"title":10,"text":421,"cta":8,"list":422,"stats":423,"theme":424},"eP4dRLz1TvebpzpkYyFt-g","\u003Cp>It has changed how we describe ourselves, too. Fantasy designs and builds your product, but that's not the whole of it. We're also a process R&D partner, which means part of what you're buying is a delivery process that keeps improving while it runs. The technology under all of this turns over every few months. You can't solve for that once and move on. You have to keep adjusting to it, and that's the part most teams aren't built to do.\u003C/p>\u003Cp>&nbsp;\u003C/p>\u003Cp>This is the first piece we're publishing on how we work, and more are coming. In the ones that follow, we will go deeper into the parts we only touched here: how design becomes code and code becomes design, how we prototype in working software instead of static mockups, and how product management changes when AI is in the loop.\u003C/p>",[],[],{"id":425,"background":426,"text":27},"Cxkdxub2SeuAH5pC5N1EEA",{"hex":26},{"id":428,"type":30,"space":43},"I6hYVpjyS6CA4-q7sTg5GA",[430,455],{"id":431,"slug":432,"title":433,"date":434,"categories":435,"featuredMedia":440},"TtJluPcXSsO1g22c8p9Y-g","the-product-decision-no-algorithm-could-make","How We Build: The Product Decision No Algorithm Could Make","2026-07-07",[436],{"id":437,"slug":438,"title":439},"MRKCA8y-RtSXQRHCBbP9Og","innovation","Innovation",{"id":441,"alt":8,"title":8,"focalPoint":442,"width":443,"height":444,"thumbnail":445,"small":446,"medium":447,"responsiveImage":448,"video":8},"dK2xC2RySO-eJ3vgjjD6aA",{"x":90,"y":90},1920,1360,"https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&fit=max&h=800&q=95&w=800","https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&fit=max&h=1440&q=95&w=1440","https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&fit=max&h=2000&q=95&w=2000",{"srcSet":449,"webpSrcSet":10,"sizes":450,"src":451,"width":443,"height":444,"aspectRatio":452,"alt":8,"title":8,"base64":453,"bgColor":454},"https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&dpr=0.25&fit=max&h=2880&q=95&w=2880 480w,https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&dpr=0.5&fit=max&h=2880&q=95&w=2880 960w,https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&dpr=0.75&fit=max&h=2880&q=95&w=2880 1440w,https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&fit=max&h=2880&q=95&w=2880 1920w","(max-width: 1920px) 100vw, 1920px","https://www.datocms-assets.com/157026/1783448045-the-product-decision-hero.png?auto=format&fit=max&h=2880&q=95&w=2880",1.411764705882353,"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICA4VDxEPDhUXFRYNDRESDQ4NFxMZGBYfFhUaHysjGh0oHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQ0OHBAQGTsoHh07Oy8vLzsvLy8vLzUvOy8vLy81Ly8vLy8vLzUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABEAGAMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABQYBBP/EAB8QAAICAgEFAAAAAAAAAAAAAAABAgMEEXEUMzRCYf/EABgBAAMBAQAAAAAAAAAAAAAAAAIEBgMB/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAECBAMxMhH/2gAMAwEAAhEDEQA/AIGjNlKxD1Zzji6YiwIQdy2U9mLT0ifwsFG0Tth4ExVC9WTZh0UQohJ7AZUbPhkpYBLg95FRZ4a4NAKJy30hT7sAAYjoFn//2Q==","#0199f1",{"id":456,"slug":457,"title":458,"date":459,"categories":460,"featuredMedia":462},"M3oZgDF_SuG0I63r7_W8KA","what-happens-when-a-designer-opens-xcode","How We Build: What Happens When a Designer Opens Xcode","2026-05-11",[461],{"id":437,"slug":438,"title":439},{"id":463,"alt":8,"title":8,"focalPoint":464,"width":465,"height":466,"thumbnail":467,"small":468,"medium":469,"responsiveImage":470,"video":8},"FasUvCJPQV2wCOGxCUbmfA",{"x":90,"y":90},3840,2720,"https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&fit=max&h=800&q=95&w=800","https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&fit=max&h=1440&q=95&w=1440","https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&fit=max&h=2000&q=95&w=2000",{"srcSet":471,"webpSrcSet":10,"sizes":472,"src":473,"width":474,"height":475,"aspectRatio":452,"alt":8,"title":8,"base64":476,"bgColor":477},"https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&dpr=0.25&fit=max&h=2880&q=95&w=2880 720w,https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&dpr=0.5&fit=max&h=2880&q=95&w=2880 1440w,https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&dpr=0.75&fit=max&h=2880&q=95&w=2880 2160w,https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&fit=max&h=2880&q=95&w=2880 2880w","(max-width: 2880px) 100vw, 2880px","https://www.datocms-assets.com/157026/1780023529-how-we-build-jesper-hero-image.png?auto=format&fit=max&h=2880&q=95&w=2880",2880,2040,"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLFQoVDhsXFQ0WDhoNDg4PFx8ZGBYVFhUaHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OHBAKHS8oFhw7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABEAGAMBIgACEQEDEQH/xAAZAAADAQEBAAAAAAAAAAAAAAAABAUGAwH/xAAhEAACAQQBBQEAAAAAAAAAAAAAAQIDBBFBEhMUMTIzBf/EABkBAAIDAQAAAAAAAAAAAAAAAAIEAQUGAP/EABkRAAMBAQEAAAAAAAAAAAAAAAABAgMyEv/aAAwDAQACEQMRAD8Afr3FZ28sLRm7e+rw/Qaa2aSpUcIuLRH6ce75cdlWjIY1LkpK4qTw2enNSeUkgBYpo59DF35Ja+4AcgsORyHsAAQxe+j/2Q==","#2fd062",1783468308720]