[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"i-lucide:sun":3,"i-lucide:menu":8,"i-lucide:mail":10,"i-lucide:phone":12,"i-lucide:calendar":14,"i-lucide:map-pin":16,"services-page":18,"i-lucide:layers":178,"i-lucide:server-cog":180,"i-lucide:shield-check":182,"i-lucide:wrench":184,"i-lucide:box":186,"i-lucide:check":188},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233a14 14 0 0 0 6.392 6.384\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 2v4m8-4v4\"\u002F>\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"\u002F>\u003Cpath d=\"M3 10h18\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\"\u002F>\u003Ccircle cx=\"12\" cy=\"10\" r=\"3\"\u002F>\u003C\u002Fg>",{"pillars":19,"engagements":124},[20,41,61,82,103],{"slug":21,"name":22,"summary":23,"covers":24,"deliverables":25,"audience":31,"engagementSlug":32,"fitsYouIf":33,"ctaLabel":38,"icon":39,"order":40},"saas-product-development","SaaS product development","We design and build multi-tenant products: data model, application, billing, and the admin side that keeps them running.","We take a product from a data model on a whiteboard to something paying customers use every day. That means multi-tenancy, roles and permissions, billing, the admin back office you will live in, and the operational work that keeps it upright after launch. We build in small increments with tests and CI from the first commit, so you see working software every week instead of a status report.",[26,27,28,29,30],"An architecture and data model documented in your repository","A multi-tenant application with role-based access and an admin back office","Automated tests and a CI pipeline running on every commit","Staging and production environments, with deploys and rollbacks written down","A handover pack: runbook, credentials, and how to change things without us","Companies and founders with a product to build and no in-house engineering team, or one that is already full.","fixed-scope-build",[34,35,36,37],"You have a product to build and a budget, not a finished spec","You want one senior engineer accountable for it, not a rotating team","You expect to own the code, the data, and the infrastructure","You can give us a decision-maker for an hour a week","Book a scoping call","lucide:layers",1,{"slug":42,"name":43,"summary":44,"covers":45,"deliverables":46,"audience":52,"engagementSlug":32,"fitsYouIf":53,"ctaLabel":58,"icon":59,"order":60},"devops-and-cloud","DevOps and cloud operations","Pipelines, environments, and infrastructure set up so a deploy is routine and a rollback is one command.","We set up the path from a commit to production and make it boring. Pipelines, separate staging and production, infrastructure written down as code, backups you have watched being restored, and alerts that reach a person rather than an inbox nobody opens. We work with the cloud you are already on rather than moving you to ours.",[47,48,49,50,51],"CI\u002FCD pipelines with separate staging and production","Infrastructure defined as code, in your repository","Backups with a restore we have run in front of you","Monitoring, logging, and alerting that reaches a person","A runbook for the routine jobs: deploy, roll back, restore, rotate keys","Teams shipping by hand, and owners running production on a server only one person understands.",[54,55,56,57],"Deploys are manual, or only one person can do them","You have backups but have never restored one","You hear about outages from customers first","Your infrastructure exists in a console, not in a repository","Talk about your infrastructure","lucide:server-cog",2,{"slug":62,"name":63,"summary":64,"covers":65,"deliverables":66,"audience":72,"engagementSlug":73,"fitsYouIf":74,"ctaLabel":79,"icon":80,"order":81},"sla-support","SLA maintenance and support","A retainer that keeps software patched, monitored, and answered for, with response times written down.","A monthly retainer that keeps software patched, watched, and answered for, whether we built it or not. Response times sit in the agreement by priority, so you know what a P1 buys you before you need it. Each tier includes engineering hours for the small changes that would otherwise queue up behind a quote.",[67,68,69,70,71],"Response times per priority, in writing","Dependency and security patching on a schedule","Uptime and error monitoring, with alerts reaching a person","Included engineering hours each month for small changes","A monthly report: uptime, incidents, patches, hours used","Anyone running software their business depends on, including systems another team built.","sla-retainer",[75,76,77,78],"Your software earns money and nobody is on call for it","You want a person to call, not a ticket queue","You would rather pay monthly than negotiate per incident","You need response times you can show a customer or an auditor","Ask about a support retainer","lucide:shield-check",3,{"slug":83,"name":84,"summary":85,"covers":86,"deliverables":87,"audience":93,"engagementSlug":94,"fitsYouIf":95,"ctaLabel":100,"icon":101,"order":102},"modernization-and-rescue","Modernization and rescue","For systems that still earn money but nobody wants to touch. We stabilise first, then modernise in steps you can pause.","For systems that still earn money but nobody wants to touch. We read the code, the data, and the infrastructure before proposing anything, then stabilise what is actively breaking, then modernise in steps you can stop after any one of them. The system stays live throughout, and every step has a way back.",[88,89,90,91,92],"A written audit of the code, data, and infrastructure","A stabilisation pass before any rewrite is discussed","Tests around the parts that cost money when they break","A staged migration plan, priced step by step","The system live throughout, with a rollback at every step","Owners of a working system whose original developer has moved on, or whose stack has aged past the point of safe change.","time-and-materials",[96,97,98,99],"The original developer is gone and the documentation went too","You have been told the only option is a full rewrite","Small changes take weeks and break something else","The system still makes money, which is why nobody dares touch it","Book a rescue call","lucide:wrench",4,{"slug":104,"name":105,"summary":106,"covers":107,"deliverables":108,"deliverablesLabel":113,"audience":114,"engagementSlug":115,"fitsYouIf":116,"ctaLabel":121,"icon":122,"order":123},"our-products","Our own products","We run our own SaaS, rentiQ, on the same stack and the same discipline we sell, M-Pesa integration included. The lessons come back into client work.","We run our own SaaS on the stack and the discipline we sell. rentiQ is a property management platform for the Kenyan market, live in early access, built and operated by the same engineer who does the client work. It reconciles M-Pesa rent against invoices, which means we have shipped a payments integration that has to be right about somebody else's money. Running it is how we know what year three of a product costs, not just the first sprint: the migrations, the support load, the invoice from the cloud provider.",[109,110,111,112],"rentiQ: a property management platform for Kenya, live and taking real use","A production M-Pesa integration, reconciling real rent against real invoices","Built and operated by the same engineer who ships client work","Running costs, migrations, and support load we have paid for ourselves","What that proves","Anyone weighing whether a studio that builds SaaS has ever had to keep one running.",null,[117,118,119,120],"You want a supplier who has operated a product, not only shipped one","You need a payments or mobile money integration that has to balance","You would rather see working software than a case study deck","You manage rental property and want to try rentiQ yourself","Ask how we run it","lucide:box",5,[125,144,163],{"slug":32,"name":126,"summary":127,"howItWorks":128,"price":129,"includes":136,"bestFor":142,"featured":143,"order":40},"Fixed-scope build","One agreed scope, one price, one delivery date. Quoted after scoping, when we both know what is being built.","Scoping produces the plan, and the plan produces the price. From then on the number does not move unless the scope does, and a change of scope is a conversation before it is an invoice. Payments run against working software at agreed milestones rather than against the calendar.",{"kind":130,"unit":131,"usd":132,"kes":134,"draft":6},"from","project",{"min":133,"max":115},600000,{"min":135,"max":115},80000000,[137,138,139,140,141],"A fixed price and a delivery date, in the contract","Milestone payments against working software","Tests and CI from the first commit","Staging and production environments, documented","Handover with no lock-in to us","Products, rebuilds, and platform work where the scope can be pinned down first.",true,{"slug":94,"name":145,"summary":146,"howItWorks":147,"price":148,"includes":157,"bestFor":162,"featured":6,"order":60},"Time and materials","An hourly rate against a monthly ceiling you set. For work whose scope genuinely cannot be known in advance.","You set a ceiling for the month. We log hours against it and send the log with the invoice, so you can see where the money went. When the ceiling is close we say so before we reach it, not after. Rescue work usually starts here and moves to a fixed scope once the system is understood.",{"kind":149,"unit":150,"usd":151,"kes":154,"draft":6},"band","hour",{"min":152,"max":153},4000,8000,{"min":155,"max":156},550000,1100000,[158,159,160,161],"An hourly rate agreed before any work starts","A monthly ceiling you set and can change","An itemised hour log with every invoice","Stop or pause at the end of any month","Audits, rescue work, and changes to a system nobody has mapped yet.",{"slug":73,"name":164,"summary":165,"howItWorks":166,"price":167,"includes":173,"bestFor":177,"featured":6,"order":81},"SLA retainer","A monthly fee for response times, patching, monitoring, and a set number of engineering hours. Three tiers, compared below.","You pick a tier. We sign an agreement with the response times in it, by priority, and it renews monthly. Unused included hours do not roll over, because the thing you are paying for is capacity held open for you rather than a block of hours in a drawer.",{"kind":130,"unit":168,"usd":169,"kes":171,"draft":6},"month",{"min":170,"max":115},35000,{"min":172,"max":115},4500000,[67,68,174,175,176],"Uptime and error monitoring, alerting a person","Included engineering hours each month","A monthly report you can read in five minutes","Software in production that somebody has to answer for.",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":179},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"\u002F>\u003Cpath d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\"\u002F>\u003Cpath d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":181},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m10.852 14.772l-.383.923m2.679-.923a3 3 0 1 0-2.296-5.544l-.383-.923m2.679.923l.383-.923\"\u002F>\u003Cpath d=\"m13.53 15.696l-.382-.924a3 3 0 1 1-2.296-5.544m3.92 1.624l.923-.383m-.923 2.679l.923.383\"\u002F>\u003Cpath d=\"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5m-15 4H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5M6 18h.01M6 6h.01m3.218 4.852l-.923-.383m.923 2.679l-.923.383\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":183},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\u002F>\u003Cpath d=\"m9 12l2 2l4-4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":185},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":187},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"\u002F>\u003Cpath d=\"m3.3 7l8.7 5l8.7-5M12 22V12\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":189},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 6L9 17l-5-5\"\u002F>"]