[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":167,"service-parent:\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":437,"service-children:\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":742,"glossary":743},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Every app we ship reaches Android — platform APIs, background execution, permissions, and the store requirements that come with them.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","The front-end framework we work in when a product is already Angular — a batteries-included structure that suits large, long-lived apps.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","The language every Flutter app we ship is written in — sound null safety, real pattern matching, and a compiler that targets native and the web.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","The Python framework we use when a product needs an admin, auth and a real data model on day one rather than a hand-rolled service.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Every service we build ships as a container, so what runs on a laptop, in CI and in production is one artefact rather than three of them.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","The release automation behind our mobile work — signing, builds and store uploads run from CI instead of from one engineer's laptop on release day.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Our primary mobile stack since 2018 — one Dart codebase shipping to iOS, Android, web and desktop without a separate team per platform.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Every project we touch lives in Git — reviewed pull requests, CI on every branch, and a history that still makes sense months later.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Our backend language for real-time APIs and services under load — small binaries, fast builds, and concurrency that stays readable.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","The cloud our production workloads run on — managed Kubernetes, storage and networking, without hand-built servers nobody wants to maintain.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","The build system every Android release goes through — product flavours, signing configs, and the dependency wiring under a Flutter app.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","How we package a Kubernetes deployment — service, config, secrets and ingress as one versioned unit that can be promoted and rolled back.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","What we reach for when a Flutter app needs real Android underneath it — platform channels, background work, and native SDK integrations.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Sharing business logic across iOS and Android while each platform keeps its own native UI — the alternative when Flutter is not the right fit.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","How we run services in production — Helm-packaged deployments, rollouts that can be rolled back, and scaling that does not need a person at 3am.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Lightweight messaging between services — publish\u002Fsubscribe and request\u002Freply without the operational weight of a full broker cluster.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue with server rendering, routing and SEO handled — how we build marketing sites and web apps that must be fast and indexable on first load.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Where we work with an existing PHP backend — extending it, integrating with it, and building the mobile and web clients it has to serve.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Our default database — the one we reach for unless a product gives us a specific reason not to, from schema design through to index tuning.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Our language for backends, data work and AI integrations — including the Python bindings we ship for our own Rust tooling.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","The front-end library we work in when a product is already React — components, hooks, and the ecosystem that has grown around them.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Where we put data that has to be fast and can be rebuilt — caches, sessions, rate limits, and the queues behind a product's slow paths.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","The language our mobile release automation is written in — Fastlane lanes, custom actions, and the CI glue that ships builds to the stores.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Where we go when performance and correctness both matter — document rendering, CLI tooling, and services that have to stay fast and predictable.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","The database that ships inside the app — local caches, offline-first storage, and anything that still has to work with no network.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","A headless CMS we reach for when editors need to own the content — a real admin and a clean API, without building either from scratch.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","What we reach for when a Flutter app needs real iOS underneath it — platform channels, native SDK integrations, widgets and App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","Apple's UI framework, where we build the native surfaces a Flutter app cannot own — widgets, App Clips, extensions and system integrations.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","How we style every front end we build — utility classes and design tokens instead of a stylesheet that only ever grows and is never deleted.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","The default for everything we write for the browser and for Node services — types that catch integration bugs before they reach a review.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Our front-end framework for admin panels, merchant dashboards and product web apps that have to stay maintainable for years, not sprints.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","OpenAI's open-source speech recognition model — the transcription engine behind voice input, running as both a backend service and on-device in the app.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":401,"extension":402,"footerCta":403,"headingCta":417,"image":421,"meta":425,"metaDescription":426,"metaTitle":427,"navigation":428,"ogDescription":429,"parent":430,"path":431,"seo":432,"slug":433,"stem":434,"updated":435,"__hash__":436},"services_en\u002Fservices\u002Fcompanion-web-app.md","Companion Web Apps",{"type":171,"value":172,"toc":382},"minimark",[173,177,180,185,230,235,238,242,249,253,266,270,273,277,280,284,287,291,294,298,306,310,316,332,335,339,354,357,361,364,368],[174,175,176],"p",{},"A companion web app is the browser-side surface of a product that lives primarily in a mobile app: the place where a customer signs up before installing, where a shared link opens for someone without the app, where work started on a phone continues on a desktop. It is the same product, on the same API, shaped for what a browser is actually good at, rather than a port of the app or a brochure about it.",[174,178,179],{},"Most agencies build one side or the other. We ship Flutter apps, web frontends, and the backend services both consume. That changes the engineering, because the question \"which surface should this feature live on\" gets answered by one team looking at one system instead of negotiated across two contractors.",[181,182,184],"h3",{"id":183},"the-products-we-build","The products we build",[186,187,188,196,202,208,219],"ul",{},[189,190,191,195],"li",{},[192,193,194],"strong",{},"Customer web apps alongside mobile apps"," — the full product in the browser where that makes sense, or the deliberate subset where it does not",[189,197,198,201],{},[192,199,200],{},"Public, shareable surfaces"," — the pages a shared link resolves to, rendered and indexable, that hand off into the app when it is installed",[189,203,204,207],{},[192,205,206],{},"Real-time web clients"," — live data in the browser from the same feed the apps consume",[189,209,210,213,214],{},[192,211,212],{},"Back offices for the same product"," — the operator-facing side is its own discipline, covered on ",[215,216,218],"a",{"href":217},"\u002Fservices\u002Fweb-development\u002Fadmin-dashboards","admin panels & dashboards",[189,220,221,224,225,229],{},[192,222,223],{},"The web side built on Nuxt"," — when the companion surface must rank, the machinery is our ",[215,226,228],{"href":227},"\u002Fservices\u002Fweb-development\u002Fnuxt-development","Nuxt development"," practice",[231,232,234],"h2",{"id":233},"who-builds-your-companion-web-app","Who Builds Your Companion Web App",[174,236,237],{},"Two products in production show the pattern, each with an app and a web surface sharing one backend.",[181,239,241],{"id":240},"formtastic-one-platform-three-clients","Formtastic — one platform, three clients",[174,243,244,248],{},[215,245,247],{"href":246},"\u002Fportfolio\u002Fformtastic","Formtastic"," runs as a Nuxt web application plus Flutter apps for iOS, iPad, and Android, all against the same Django and Go backend. Features land differently per surface. Voice-to-text on the web records audio in the browser and sends it to a transcription endpoint, because a backend was already there to extend; the mobile apps bundle Whisper on-device, because job sites have no signal. Same feature, two implementations, each honest about its surface. That judgment, more than framework skill, is what a two-surface product actually requires.",[181,250,252],{"id":251},"extraetf-one-real-time-feed-every-client","ExtraETF — one real-time feed, every client",[174,254,255,256,260,261,265],{},"For ",[215,257,259],{"href":258},"\u002Fportfolio\u002Fextraetf","ExtraETF",", we built the Go ",[262,263],"term",{"slug":264},"websocket"," service that broadcasts live market data to both web and mobile clients — thousands of simultaneous connections, updates conflated to the cadence a human watching a price actually needs. We built the mobile apps and the real-time layer; the web client consuming it belongs to the client's own team. A well-designed service feeds surfaces you will never build yourself.",[231,267,269],{"id":268},"what-a-two-surface-product-actually-demands","What a Two-Surface Product Actually Demands",[174,271,272],{},"Four disciplines keep an app and a web surface from drifting into two products.",[181,274,276],{"id":275},"one-api-that-serves-both-honestly","One API that serves both honestly",[174,278,279],{},"The moment the web needs \"just one special endpoint,\" you have two backends wearing one name. We design the API as the product's single contract, with the same authentication, the same models, and the same versioning for every client. Where the surfaces genuinely need different shapes of data, that difference is written into the contract rather than patched into a client.",[181,281,283],{"id":282},"deciding-what-the-web-version-is","Deciding what the web version is",[174,285,286],{},"The expensive mistake is \"the app, but in a browser.\" A companion surface earns its budget by doing what the app cannot: being reachable from a search result, opening instantly from a shared link, offering a keyboard and a big screen for heavy editing. We scope the web surface feature by feature against that test, and cutting a feature from the web version is a decision we argue for out loud rather than a gap you discover later.",[181,288,290],{"id":289},"the-handoff-between-web-and-app","The handoff between web and app",[174,292,293],{},"A shared link should open the app when it is installed, the web page when it is not, and never a broken interstitial. Universal links on iOS and app links on Android, the fallback pages behind them, and the sign-up flow that starts in a browser and continues in the app. This seam is where two-surface products most visibly leak users, so we engineer it deliberately instead of assuming it works.",[181,295,297],{"id":296},"rendering-matched-to-the-pages-job","Rendering matched to the page's job",[174,299,300,301,305],{},"The public, shareable pages render on the server so crawlers and link previews see real content; the logged-in workspace behind them renders like the application it is. The trade-offs are laid out on the ",[215,302,304],{"href":303},"\u002Fservices\u002Fweb-development","web development"," pillar, and the choice is per route, not per project.",[231,307,309],{"id":308},"how-we-work","How We Work",[174,311,312,315],{},[192,313,314],{},"Fixed-scope build."," We take the web surface from feature scoping through deployment, against your existing API or one we build alongside it.",[174,317,318,321,322,326,327,331],{},[192,319,320],{},"Staff augmentation."," Our engineers join the team that owns the product — see ",[215,323,325],{"href":324},"\u002Fservices\u002Fteam-augmentation","team augmentation",". If the mobile side needs building too, that is our ",[215,328,330],{"href":329},"\u002Fservices\u002Fflutter-app-development","Flutter practice",".",[174,333,334],{},"Either way, we send a scoped quote within two business days of understanding the requirements.",[231,336,338],{"id":337},"what-a-companion-web-app-costs","What a Companion Web App Costs",[174,340,341,342,344,345,350,351,331],{},"A companion surface is priced from the same published tiers as the ",[215,343,304],{"href":303}," page: an authenticated web app on your existing API sits in the web app tier at ",[346,347],"service-price",{"format":348,"service":349},"full","web-development\u002Fapp",", while a full second surface with real-time features, payments, or multi-tenant structure prices as SaaS-grade work from ",[346,352],{"format":348,"service":353},"web-development\u002Fsaas",[174,355,356],{},"These are the same keys that render the pillar's pricing table, so the two cannot drift. What moves the number: how much of the API already exists and how cleanly it was designed for more than one client, how much of the product the web version covers, and whether real-time features ride an existing feed or need one built.",[231,358,360],{"id":359},"frequently-asked-questions","Frequently Asked Questions",[174,362,363],{},"Common questions from teams whose product lives in an app and keeps being asked for in a browser.",[365,366],"questions",{":items":367},"[{\"title\":\"Our product is a mobile app. Do we need a web version at all?\",\"text\":\"Not always. The honest answer depends on where your growth leaks. A web surface earns its budget when sign-ups start from search or shared links, when users ask to work on a big screen, or when every shared piece of content currently dead-ends for people without the app. If none of those apply, we will say so; a well-made store listing and deep links may be all the web presence you need.\"},{\"title\":\"Should the web version have every feature the app has?\",\"text\":\"Usually not, and deciding what to leave out is most of the scoping work. The browser wins at reachability (search, shared links, instant access with no install) and at keyboard-and-big-screen work; the app wins at camera, offline, notifications, and being one tap away. Formtastic's voice-to-text is the pattern: the web records in the browser and transcribes on the server, the apps transcribe on-device because job sites have no signal. Same feature, different honest implementations, and some features rightly stay app-only.\"},{\"title\":\"Can you build on our existing backend, or do you need to own it?\",\"text\":\"We build against existing APIs routinely. Formtastic's web frontend runs on the Django backend the product already had, extended where the web needed it. What we will do first is assess whether the API is genuinely multi-client: authentication a browser can use safely, models that do not assume app-only flows, and versioning that lets two clients evolve. Where it falls short we tell you precisely what to change, and can do both sides ourselves when that is faster.\"},{\"title\":\"Can the web app show the same live data as the mobile app?\",\"text\":\"Yes, and it is a feed design question rather than a framework question. For ExtraETF we built the Go WebSocket service that broadcasts live market data to web and mobile clients alike, holding thousands of simultaneous connections and conflating updates to roughly one per instrument per second, the rate a human actually needs. Design the real-time layer once, correctly, and every current and future client consumes the same stream.\"},{\"title\":\"How do shared links decide between the app and the web page?\",\"text\":\"Through universal links on iOS and app links on Android: the same URL opens the app when installed and the web page when not, with the web page carrying the full content rather than an install nag. Done right, the link also survives installation — someone who lands on the web, installs the app, and opens it arrives at the content they were promised. This handoff is where two-surface products lose the most users, so we treat it as a feature with its own engineering budget.\"},{\"title\":\"How much does a companion web app cost?\",\"text\":\"An authenticated web app on an existing API typically runs 15,000 to 40,000 US dollars over one to three months, the published web app tier on our web development page. A full second surface with real-time data, payments, or multi-tenant structure prices as SaaS-grade work upward of 50,000. The biggest lever is your API: one designed for multiple clients keeps the web build lean, while one assuming app-only flows adds backend work we will scope explicitly.\"}]",[174,369,370,371,373,374,378,379,381],{},"See both surfaces in the ",[215,372,247],{"href":246}," case study, read how the ",[215,375,377],{"href":376},"\u002Fblog\u002Fextraetf-realtime-fintech-flutter-go","ExtraETF real-time feed"," fans out to every client, or start from the ",[215,380,304],{"href":303}," pillar.",{"title":383,"searchDepth":384,"depth":384,"links":385},"",2,[386,388,392,398,399,400],{"id":183,"depth":387,"text":184},3,{"id":233,"depth":384,"text":234,"children":389},[390,391],{"id":240,"depth":387,"text":241},{"id":251,"depth":387,"text":252},{"id":268,"depth":384,"text":269,"children":393},[394,395,396,397],{"id":275,"depth":387,"text":276},{"id":282,"depth":387,"text":283},{"id":289,"depth":387,"text":290},{"id":296,"depth":387,"text":297},{"id":308,"depth":384,"text":309},{"id":337,"depth":384,"text":338},{"id":359,"depth":384,"text":360},"The browser side of a mobile-first product — one API, one backend, two surfaces that stay in step, from a team that ships the apps, the web, and the services behind both","md",{"heading":404,"text":405,"buttons":406},"Does Your App Need a Web Surface?","Tell us what your product does on mobile and what keeps being asked for in a browser. We will tell you honestly which features belong on the web — and which genuinely do not.",[407,413],{"to":408,"label":409,"leadingIcon":410,"color":411,"variant":412},"\u002Fcontact?intent=web-development","Book a Consultation","lucide:message-circle","neutral","outline",{"to":246,"label":414,"color":415,"variant":416},"See a two-surface product","primary","solid",[418,419],{"to":408,"label":409,"leadingIcon":410,"color":415,"variant":416},{"to":246,"label":420,"color":411,"variant":412},"See Our Work",{"url":422,"alt":423,"text":424},"\u002Fservices\u002Fcompanion-web-app.webp","Companion web app development for mobile products","One product, one API — app and browser in step",{},"Companion web app development: the browser surface of a mobile-first product on the same API and backend — built by the team that ships both sides.","Companion Web App Development for Mobile Products",true,"Your product lives in an app — but sign-ups, sharing, and search happen in a browser. We build the web surface on the same backend as your apps.","web-development","\u002Fservices\u002Fweb-development\u002Fcompanion-web-app",{"title":169,"description":401},"companion-web-app","services\u002Fcompanion-web-app","2026-09-05","a3vNiDgAq6hdv6U6AhHLDJXWumv9NtNHFhQcTsjTFqE",{"id":438,"title":439,"body":440,"description":714,"extension":402,"footerCta":715,"headingCta":725,"image":731,"meta":734,"metaDescription":735,"metaTitle":736,"navigation":428,"ogDescription":737,"parent":738,"path":303,"seo":739,"slug":430,"stem":740,"updated":435,"__hash__":741},"services_en\u002Fservices\u002Fweb-development.md","Web Development",{"type":171,"value":441,"toc":701},[442,446,449,469,473,477,480,484,487,491,494,498,508,512,525,530,543,547,550,594,598,601,607,613,623,652,656,659,663,670,672,675,698],[231,443,445],{"id":444},"modern-web-development-with-nuxt-and-ssr","Modern Web Development with Nuxt and SSR",[174,447,448],{},"We build fast, search-friendly web applications on a modern, server-rendered stack. Not a page-builder, not a bloated single-page app that ships a blank screen to Google — real applications that render on the server, load quickly on a phone, and rank.",[174,450,451,452,455,456,460,461,463,464,468],{},"How sure are we about this stack? ",[192,453,454],{},"This very site is built on it"," — Nuxt 4, ",[262,457,459],{"slug":458},"server-side-rendering","server-side rendering",", Tailwind CSS, and Nuxt Content. We didn't pick these tools for a sales page; we run our own business on them. We've also shipped them for clients, including ",[215,462,247],{"href":246},", a form-building platform built on Nuxt, and the ",[215,465,467],{"href":466},"\u002Fportfolio\u002Fcashback-loyalty-platform","cashback loyalty platform",", whose Nuxt admin back office launches branded apps on top of PHP services.",[470,471],"statistics-grid",{":items":472},"[{\"icon\": \"lucide:search\", \"value\": \"SSR\", \"label\": \"Indexable by Default\", \"description\": \"Server-rendered HTML crawlers can read without running JavaScript\"}, {\"icon\": \"lucide:gauge\", \"value\": \"90+\", \"label\": \"Lighthouse Targets\", \"description\": \"We build to Core Web Vitals, not against them\"}, {\"icon\": \"lucide:smartphone\", \"value\": \"Mobile-First\", \"label\": \"Responsive Everywhere\", \"description\": \"Designed for phones first, scaled up to desktop\"}, {\"icon\": \"lucide:code\", \"value\": \"Type-Safe\", \"label\": \"TypeScript End to End\", \"description\": \"From the API layer to the component props\"}]",[231,474,476],{"id":475},"our-stack-and-why-nuxt-ssr","Our Stack — and Why Nuxt + SSR",[174,478,479],{},"The framework choice is the difference between a site Google can read instantly and one it struggles to render. Here is what we build on and why.",[181,481,483],{"id":482},"server-side-rendering-for-seo","Server-Side Rendering for SEO",[174,485,486],{},"A traditional single-page app ships an empty HTML shell and asks the browser to build the page with JavaScript. Crawlers, link previews, and slow devices all suffer for it. Nuxt renders the full HTML on the server, so the content is present on the very first response — meta tags, headings, structured data, and copy all there before a single line of client JavaScript runs. This is the single biggest on-page SEO lever a framework can give you, and it's the default, not an add-on.",[181,488,490],{"id":489},"tailwind-for-fast-consistent-ui","Tailwind for Fast, Consistent UI",[174,492,493],{},"We style with Tailwind CSS — utility-first, no wandering global stylesheets, no dead CSS shipped to users. It keeps the design system consistent across every page, makes responsive breakpoints explicit, and ships only the classes you actually use. The result is a UI that's quick to build, easy to maintain, and small to download.",[181,495,497],{"id":496},"nuxt-content-for-content-driven-sites","Nuxt Content for Content-Driven Sites",[174,499,500,501,507],{},"For marketing sites, documentation, and blogs, ",[215,502,506],{"href":503,"rel":504},"https:\u002F\u002Fcontent.nuxt.com",[505],"nofollow","Nuxt Content"," turns Markdown into fully rendered, server-side pages with type-safe schemas — exactly how this site's blog and service pages work. Editors write Markdown; the site stays fast and indexable; developers keep version control over everything. No database required.",[181,509,511],{"id":510},"strapi-when-you-need-a-headless-cms","Strapi When You Need a Headless CMS",[174,513,514,515,519,520,524],{},"When non-technical editors need to own the content — products, listings, campaigns — we wire up ",[215,516,134],{"href":517,"rel":518},"https:\u002F\u002Fstrapi.io",[505],", an open-source ",[262,521,523],{"slug":522},"headless-cms","headless CMS",". Your team gets a friendly admin panel; the Nuxt frontend consumes a clean API and renders it server-side. You get editorial freedom without giving up performance or SEO, and you own the data and the hosting.",[526,527],"features",{":items":528,":title":529},"[{\"label\": \"Mobile-Compatible Pages\", \"description\": \"Mobile-first, responsive layouts that work on every screen from phone to widescreen — tested, not assumed\"}, {\"label\": \"Authentication Done Properly\", \"description\": \"Sessions, OAuth, and JWT with real server-side authorization checks — not a login screen with an open back door\"}, {\"label\": \"Secure Cookies & Consent\", \"description\": \"httpOnly, secure, SameSite cookies for sessions, plus GDPR-compliant consent handling for analytics and tracking\"}, {\"label\": \"SEO Built In\", \"description\": \"Server-rendered meta tags, Open Graph, canonical and hreflang links, and JSON-LD structured data on every page\"}, {\"label\": \"Performance & Core Web Vitals\", \"description\": \"Image optimization, code splitting, and caching tuned to pass Core Web Vitals on real devices\"}, {\"label\": \"Headless CMS Integration\", \"description\": \"Nuxt Content or Strapi so your team can publish without touching code\"}]","What We Get Right",[531,532,535],"info-box",{":leading-icon":533,":title":534},"lucide:shield-check","Security is part of the build",[174,536,537,538,542],{},"Authentication, cookies, and data handling are where most web apps quietly leak. We build them right from the start — and if you've inherited an app you're unsure about, our ",[215,539,541],{"href":540},"\u002Fservices\u002Fai-code-audit","AI-generated code audit"," reviews authentication, session security, and data exposure before they become an incident.",[231,544,546],{"id":545},"what-we-build","What We Build",[174,548,549],{},"Four kinds of web work come up again and again in our engagements, and each now has its own page with the proof behind it:",[186,551,552,562,573,581],{},[189,553,554,559,560,331],{},[192,555,556],{},[215,557,558],{"href":217},"Admin panels & dashboards"," — the back offices behind products: role-based access, forms that drive real machinery, tables that stay usable at scale. Anchored by the admin UI that launches branded apps for our ",[215,561,467],{"href":466},[189,563,564,568,569,572],{},[192,565,566],{},[215,567,228],{"href":227}," — marketing sites, content platforms, and migrations onto server-side rendering, like ",[215,570,571],{"href":246},"Formtastic's"," move from Django templates to Nuxt. This site is the standing demo.",[189,574,575,580],{},[192,576,577],{},[215,578,579],{"href":431},"Companion web apps"," — the browser surface of a product that lives primarily in a mobile app, sharing one API and one backend with it.",[189,582,583,589,590,331],{},[192,584,585],{},[215,586,588],{"href":587},"\u002Fservices\u002Fweb-development\u002Fembeddable-widgets","Embeddable widgets & scripts"," — JavaScript that runs inside pages you don't control, built dependency-free and defensive, like the collector behind our ",[215,591,593],{"href":592},"\u002Fportfolio\u002Frealtime-bot-detection-platform","bot-detection platform",[231,595,597],{"id":596},"flutter-for-the-web-pros-and-cons","Flutter for the Web — Pros and Cons",[174,599,600],{},"Flutter can compile to the web, and clients with a Flutter mobile app often ask whether they should reuse it for their website too. The honest answer: sometimes — but rarely for public, content-driven web. Here's the trade-off.",[602,603],"features-table",{":heading":604,":rows":605,":top-left-label":606},"[{\"label\": \"Nuxt + SSR\", \"hightlightLabel\": \"Public Web\"}, {\"label\": \"Flutter Web\"}, {\"label\": \"Traditional SPA\"}]","[{\"label\": \"SEO \u002F Indexability\",\"cells\": [{\"text\": \"Excellent (SSR)\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Poor (canvas render)\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Weak (empty shell)\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Initial Load Size\",\"cells\": [{\"text\": \"Small\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Heavy (large bundle)\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Medium\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Code Shared with Mobile\",\"cells\": [{\"text\": \"None\", \"color\": \"warning\", \"icon\": \"lucide:minus\" },{ \"text\": \"Near 100%\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Some (React Native)\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"App-Like \u002F Complex UI\",\"cells\": [{\"text\": \"Good\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Excellent\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Good\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" }]}, {\"label\": \"Content \u002F Marketing Sites\",\"cells\": [{\"text\": \"Ideal\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Poor Fit\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Workable\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Accessibility\",\"cells\": [{\"text\": \"Native HTML\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Improving, Limited\", \"color\": \"warning\", \"icon\": \"lucide:minus\" },{ \"text\": \"Native HTML\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" }]}, {\"label\": \"Best For\",\"cells\": [{\"text\": \"Sites & Web Apps\", \"color\": \"success\"},{ \"text\": \"Internal \u002F App-Like Tools\", \"color\": \"warning\"},{ \"text\": \"Dashboards\", \"color\": \"warning\"}]}]","Aspect",[174,608,609,612],{},[192,610,611],{},"Where Flutter web shines:"," an app-like product where you already have a Flutter mobile codebase and want one team shipping everywhere — internal dashboards, logged-in tools, highly interactive or canvas-driven UIs behind a login wall, where SEO doesn't matter and users expect an app, not a page.",[174,614,615,618,619,622],{},[192,616,617],{},"Where it hurts:"," anything that needs to be found on Google. Flutter web renders to a canvas, which crawlers struggle to read, ships a heavy initial bundle, and fights the browser on accessibility and ",[262,620,621],{"slug":621},"deep-linking",". For marketing sites, blogs, e-commerce, and landing pages, that's disqualifying.",[531,624,625],{},[174,626,627,630,631,634,635,638,639,642,643,647,648,331],{},[192,628,629],{},"Bottom line:"," Use ",[192,632,633],{},"Nuxt + SSR"," for anything public or SEO-driven — marketing sites, content, e-commerce, SaaS marketing surfaces. Use ",[192,636,637],{},"Flutter web"," when you're extending a Flutter mobile app into an app-like web tool where reach through search isn't the goal. We build both and will tell you honestly which one your project needs. If mobile is also on the table, see our ",[215,640,641],{"href":329},"Flutter app development"," service and the trade-offs in ",[215,644,646],{"href":645},"\u002Fblog\u002Fflutter-vs-react-native-2026","Flutter vs React Native in 2026"," and ",[215,649,651],{"href":650},"\u002Fblog\u002Fflutter-vs-native-2026","Flutter vs Native",[231,653,655],{"id":654},"web-development-pricing","Web Development Pricing",[174,657,658],{},"Transparent ranges based on scope and complexity",[660,661],"pricing-table",{":items":662},"[{\"title\": \"Marketing \u002F Landing Site\", \"subtitle\": \"Fast, SEO-ready, content-driven\", \"price\": \"web-development\u002Flanding\", \"terms\": \"2-4 weeks\", \"lines\": [\"Nuxt + SSR for full indexability\", \"Responsive, mobile-first design\", \"SEO meta, Open Graph & structured data\", \"Nuxt Content or Markdown CMS\", \"Contact forms & analytics\", \"Core Web Vitals tuned\", \"Deployment & domain setup\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Get Started\"}},{\"highlight\": \"Popular\",\"title\": \"Web App\", \"subtitle\": \"Authenticated, interactive product\", \"price\": \"web-development\u002Fapp\", \"terms\": \"1-3 months\", \"lines\": [\"Everything in Marketing Site\", \"User authentication (OAuth \u002F JWT)\", \"Secure sessions & cookie handling\", \"REST or GraphQL API integration\", \"Role-based access control\", \"Database design & integration\", \"Admin dashboard\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Get Started\"}},{\"title\": \"Headless CMS Platform\", \"subtitle\": \"Editor-owned content at scale\", \"price\": \"web-development\u002Fheadless-cms\", \"terms\": \"2-4 months\", \"lines\": [\"Strapi or Nuxt Content backend\", \"Custom editorial admin panel\", \"Multi-language content support\", \"Server-rendered, indexable pages\", \"Media & asset management\", \"Preview & publishing workflow\", \"API-first architecture\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Get Started\"}},{\"title\": \"SaaS \u002F E-commerce\", \"subtitle\": \"Complex, scalable web product\", \"price\": \"web-development\u002Fsaas\", \"terms\": \"4+ months\", \"lines\": [\"All platforms & integrations\", \"Payments & subscriptions\", \"Multi-tenant architecture\", \"Advanced security & compliance\", \"Scalable backend infrastructure\", \"Monitoring & observability\", \"Dedicated support\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Get Started\"}}]",[531,664,667],{":leading-icon":665,":title":666},"lucide:dollar-sign","Custom Pricing Available",[174,668,669],{},"Every project is unique. These ranges are approximate and based on typical scope. We'll provide a detailed quote after understanding your requirements, integrations, and timeline. Contact us for a free consultation and an accurate estimate.",[231,671,360],{"id":359},[174,673,674],{},"Common questions about our web development services",[365,676,678],{":items":677},"[{\"title\":\"Why do you build with Nuxt instead of WordPress or a website builder?\",\"text\":\"Nuxt gives you server-side rendering, which means search engines and link previews see fully built HTML on the first request rather than an empty shell. You get the speed and indexability of a static site with the power of a real application, full version control over the code, and no plugin bloat or security surface of a typical WordPress install. For content-heavy sites we pair Nuxt with a headless CMS so editors still get a friendly admin panel.\"},{\"title\":\"Does server-side rendering actually improve SEO?\",\"text\":\"Yes, significantly. With SSR the page content, meta tags, Open Graph data, and structured data are present in the HTML the server sends, so crawlers can read them without executing JavaScript. Single-page apps that render entirely in the browser are slower to index and can be missed entirely by some crawlers and social link previews. SSR is the most impactful framework-level decision you can make for organic search.\"},{\"title\":\"Can you build my web app with Flutter for the web?\",\"text\":\"We can, and for the right project it is a great fit. Flutter web works well for app-like products and internal tools behind a login, especially when you already have a Flutter mobile app and want to share one codebase. It is a poor fit for anything that needs to rank on Google, because it renders to a canvas that crawlers struggle to read and ships a heavy initial bundle. For public, content, or e-commerce sites we recommend Nuxt with server-side rendering instead.\"},{\"title\":\"How do you handle authentication and user data securely?\",\"text\":\"We implement real server-side authorization, not just a login screen. Sessions use httpOnly, secure, SameSite cookies so tokens cannot be stolen by client-side scripts, and we support OAuth and JWT flows with role-based access control. Cookie consent is handled to meet GDPR. If you have an existing app, our AI code audit service reviews authentication, session handling, and data exposure as a dedicated check.\"},{\"title\":\"Should I use Nuxt Content or Strapi for my content?\",\"text\":\"It depends on who edits the content. Nuxt Content is ideal when developers or technical writers manage content in Markdown under version control, like a blog or documentation, with no database needed. Strapi is the right choice when non-technical editors need a friendly admin panel to manage products, listings, or campaigns. Both render server-side through the Nuxt frontend, so either way the site stays fast and indexable. We help you pick based on your team.\"},{\"title\":\"How much does a web development project cost?\",\"slot\":\"cost\",\"text\":\"A fast marketing or content site typically runs 5,000 to 12,000 US dollars, an authenticated web app 15,000 to 40,000, a headless CMS platform 20,000 to 50,000, and a complex SaaS or e-commerce product upward of 50,000. The final number depends on the number of features, integrations, and the design scope. We provide a fixed quote after a free consultation.\"}]",[679,680,681],"template",{"v-slot:cost_body":383},[174,682,683,684,687,688,690,691,694,695,697],{},"A fast marketing or content site typically runs ",[346,685],{"format":348,"service":686},"web-development\u002Flanding",", an authenticated web app ",[346,689],{"format":348,"service":349},", a headless CMS platform ",[346,692],{"format":348,"service":693},"web-development\u002Fheadless-cms",", and a complex SaaS or e-commerce product ",[346,696],{"format":348,"service":353},". The final number depends on the number of features, integrations, and the design scope. We provide a fixed quote after a free consultation.",[174,699,700],{},"::",{"title":383,"searchDepth":384,"depth":384,"links":702},[703,704,710,711,712,713],{"id":444,"depth":384,"text":445},{"id":475,"depth":384,"text":476,"children":705},[706,707,708,709],{"id":482,"depth":387,"text":483},{"id":489,"depth":387,"text":490},{"id":496,"depth":387,"text":497},{"id":510,"depth":387,"text":511},{"id":545,"depth":384,"text":546},{"id":596,"depth":384,"text":597},{"id":654,"depth":384,"text":655},{"id":359,"depth":384,"text":360},"Fast, SEO-Ready Web Apps Built on Nuxt, SSR, and Tailwind",{"heading":716,"text":717,"buttons":718},"Ready to Build a Web App That Ranks and Performs?","Let's turn your idea into a fast, SEO-ready web application your users and search engines both love.",[719,722],{"to":720,"label":721,"leadingIcon":410,"color":411,"variant":412},"\u002Fcontact","Start Your Project",{"to":723,"label":724,"color":415,"variant":416},"\u002Fportfolio","View our work",[726,728],{"to":720,"label":727,"leadingIcon":410,"color":415,"variant":416},"Get a Free Consultation",{"to":729,"label":730,"color":411,"variant":412},"#web-development-pricing","View Pricing",{"url":732,"alt":439,"text":733},"\u002Fservices\u002Fweb-development.webp","Built on the Stack This Site Runs On",{},"Web development on Nuxt, SSR, and Tailwind: fast, SEO-ready, mobile-first web apps with authentication, headless CMS, and Strapi. Free consultation.","Web Development Services — Nuxt, SSR & SEO","Web apps on Nuxt and SSR that load fast and rank — authentication, a headless CMS, and a mobile-first build that does not fight the browser.",null,{"title":439,"description":714},"services\u002Fweb-development","PGjV1VFd_62ov1NTy0ip1mvYByZIYAZe5AyL-eT3cEk",[],[744,759,771,786,800,814,830,842,856,869,883,895,911,924,941,954,965,975,986,998,1009,1024,1033,1046,1059,1066,1077,1089,1100,1115,1127,1140,1152,1164,1176,1188,1199,1210,1221,1232,1244,1254,1265,1278,1289,1298,1311,1323,1333,1344,1358,1367,1378],{"slug":745,"term":746,"definition":747,"category":748,"aliases":749,"links":751,"related":755,"readMore":-1,"target":757,"hasArticle":758},"aosp","AOSP","The Android Open Source Project — Android without the Google layer on top, which anyone may fork. Point-of-sale terminals, kiosks and in-car systems run on forks of it, and working at that level exposes parts of the OS an app developer never sees.","platform",[750],"Android Open Source Project",[752],{"kind":753,"url":754},"website","https:\u002F\u002Fsource.android.com\u002F",[756],"host-card-emulation","\u002Fglossary#aosp",false,{"slug":760,"term":761,"definition":762,"category":748,"aliases":763,"links":764,"related":768,"readMore":-1,"target":770,"hasArticle":758},"app-clips","App Clips","An Apple feature that runs a small slice of an iOS app — under 15 MB — without installing the whole thing. Invoked from a QR code, an NFC tag or a link, for when the first thing a user does should not require a store visit.",[],[765],{"kind":766,"url":767},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[621,769],"install-referrer","\u002Fglossary#app-clips",{"slug":772,"term":773,"definition":774,"category":748,"aliases":775,"links":776,"related":782,"readMore":-1,"target":785,"hasArticle":758},"bigquery","BigQuery","Google Cloud's analytics warehouse. You point SQL at billions of rows and it scans them in seconds, on storage held separately from the machines doing the querying — which is what keeps reporting and exploration off the database that is serving live traffic.",[],[777,779],{"kind":753,"url":778},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":780,"url":781},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[783,784],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":787,"term":788,"definition":789,"category":790,"aliases":791,"links":795,"related":798,"readMore":-1,"target":799,"hasArticle":758},"ci-cd","CI\u002FCD","Automation that builds, tests and ships every change without anyone running commands by hand. On mobile it is what turns a release into a button press instead of an afternoon of someone else being unavailable.","practice",[792,793,794],"CI","continuous integration","continuous delivery",[796],{"kind":780,"url":797},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":801,"term":802,"definition":803,"category":804,"aliases":805,"links":807,"related":810,"readMore":-1,"target":813,"hasArticle":758},"crud","CRUD","Create, read, update, delete — the four operations behind almost every form and admin screen. Shorthand for the routine data-management half of an app, as opposed to the parts carrying real domain logic.","architecture",[806],"Create, Read, Update, Delete",[808],{"kind":780,"url":809},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[811,812],"rest","graphql","\u002Fglossary#crud",{"slug":815,"term":816,"definition":817,"category":804,"aliases":818,"links":823,"related":826,"readMore":-1,"target":829,"hasArticle":758},"container-registry","Container registry","A hosted store for container images, addressed by name and tag — Docker Hub, GitHub Container Registry, or a cloud provider's own. Pushing a build there turns 'works on my machine' into an image anyone can pull and run unchanged.",[819,820,821,822],"image registry","Docker registry","GHCR","ghcr.io",[824],{"kind":766,"url":825},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[827,828],"dev-container","multi-arch-image","\u002Fglossary#container-registry",{"slug":621,"term":831,"definition":832,"category":748,"aliases":833,"links":837,"related":840,"readMore":841,"target":841,"hasArticle":428},"Deep linking","A link that opens a specific screen inside an installed app instead of its home screen or a web page. Deferred deep linking survives an install, so a tap that leads through the app store still lands on the right screen.",[834,835,836],"deferred deep linking","universal links","Android App Links",[838],{"kind":780,"url":839},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[760,769],"\u002Fglossary\u002Fdeep-linking",{"slug":827,"term":843,"definition":844,"category":790,"aliases":845,"links":849,"related":854,"readMore":-1,"target":855,"hasArticle":758},"Dev Container","A development environment described once in devcontainer.json — the OS, tools, and runtime versions a project needs — and opened identically inside a container by every contributor's editor, instead of a setup guide everyone interprets differently.",[846,847,848],"devcontainer.json","Dev Containers","VS Code Dev Containers",[850,852],{"kind":753,"url":851},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":766,"url":853},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[815],"\u002Fglossary#dev-container",{"slug":784,"term":857,"definition":858,"category":748,"aliases":859,"links":862,"related":867,"readMore":-1,"target":868,"hasArticle":758},"Elasticsearch","A search and analytics engine that indexes records so they can be filtered and searched interactively instead of scanned. What you reach for when the question is \"show me these particular sessions, narrowed six ways\" rather than \"sum this column\".",[860,861],"Elastic","ELK",[863,865],{"kind":753,"url":864},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":780,"url":866},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[772],"\u002Fglossary#elasticsearch",{"slug":870,"term":871,"definition":872,"category":804,"aliases":873,"links":876,"related":879,"readMore":-1,"target":882,"hasArticle":758},"end-to-end-encryption","End-to-end encryption","Encryption applied on the sending device and undone only on the receiving one, so the service carrying the message cannot read it — not under subpoena, not after a breach. It protects the content and never the metadata.",[874,875],"E2EE","end-to-end encrypted",[877],{"kind":780,"url":878},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[880,881],"tls","jwt","\u002Fglossary#end-to-end-encryption",{"slug":884,"term":885,"definition":886,"category":804,"aliases":887,"links":890,"related":891,"readMore":-1,"target":894,"hasArticle":758},"fan-out","Fan-out","Reading an upstream source once and delivering each update to every client subscribed to it. The naive version writes to subscribers in a loop and stalls the moment one socket is slow; a real one buffers per client and drops whoever cannot keep up.",[888,889],"fanout","broadcast",[],[264,892,893],"pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":896,"term":897,"definition":898,"category":790,"aliases":899,"links":903,"related":906,"readMore":-1,"target":910,"hasArticle":758},"feature-flags","Feature flags","Switches that turn functionality on or off from configuration rather than from a release. They let one binary behave differently per brand, market or user, and let a risky feature be shut off without shipping a new build through review.",[900,901,902],"feature flag","feature toggle","feature gating",[904],{"kind":780,"url":905},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[907,908,909],"staged-rollout","white-label","multi-tenancy","\u002Fglossary#feature-flags",{"slug":912,"term":913,"definition":914,"category":804,"aliases":915,"links":919,"related":922,"readMore":-1,"target":923,"hasArticle":758},"floating-point","Floating point","The IEEE 754 binary format behind double and float. It cannot hold 0.1 exactly, so 0.1 + 0.2 is 0.30000000000000004 — invisible in graphics and fatal in money, which belongs in integer minor units or a decimal type instead.",[916,917,918],"IEEE 754","double","floating-point arithmetic",[920],{"kind":780,"url":921},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point",{"slug":925,"term":926,"definition":927,"category":790,"aliases":928,"links":931,"related":936,"readMore":-1,"target":940,"hasArticle":758},"gdpr","GDPR","The EU regulation covering personal data of people in the EU: a lawful basis for collecting it, real consent for tracking, and rights to see and delete it. It follows your users, not your servers, so it applies wherever the company is registered.",[929,930],"General Data Protection Regulation","data protection",[932,934],{"kind":753,"url":933},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":780,"url":935},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[937,938,939],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":942,"term":943,"definition":944,"category":790,"aliases":945,"links":949,"related":952,"readMore":-1,"target":953,"hasArticle":758},"golden-test","Golden test","A test that renders a widget and compares the result pixel for pixel against a stored reference image. In Flutter it is the cheapest way to answer whether a redesign broke the empty state at 320pt, in dark mode, at 200% text scale.",[946,947,948],"golden tests","screenshot test","snapshot test",[950],{"kind":766,"url":951},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[787],"\u002Fglossary#golden-test",{"slug":812,"term":955,"definition":956,"category":804,"aliases":957,"links":958,"related":963,"readMore":-1,"target":964,"hasArticle":758},"GraphQL","A query language for APIs where the client names exactly the fields it wants and gets one response shaped to match. It removes the over-fetching REST endpoints drift into, and adds a failure mode of its own: an unbounded query that walks the whole data model.",[],[959,961],{"kind":753,"url":960},"https:\u002F\u002Fgraphql.org\u002F",{"kind":780,"url":962},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[811],"\u002Fglossary#graphql",{"slug":939,"term":966,"definition":967,"category":790,"aliases":968,"links":970,"related":973,"readMore":-1,"target":974,"hasArticle":758},"HIPAA","The US law governing protected health information — how it may be stored, transmitted, logged and disclosed. Like PCI-DSS it is an architectural constraint chosen at the start, not a policy document added before launch.",[969],"Health Insurance Portability and Accountability Act",[971],{"kind":780,"url":972},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[937,925,938],"\u002Fglossary#hipaa",{"slug":522,"term":976,"definition":977,"category":804,"aliases":978,"links":981,"related":984,"readMore":-1,"target":985,"hasArticle":758},"Headless CMS","A content system with an editor and an API but no front end of its own. Editors publish in one place, and the site or app renders that content itself — so the presentation layer is yours rather than the CMS vendor's.",[979,980],"headless content management system","content API",[982],{"kind":780,"url":983},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[458,811],"\u002Fglossary#headless-cms",{"slug":756,"term":987,"definition":988,"category":748,"aliases":989,"links":993,"related":996,"readMore":-1,"target":997,"hasArticle":758},"Host Card Emulation","Letting an Android phone act as a contactless card over NFC in software, with no hardware secure element. It is how a wallet app pays at a terminal: the phone speaks the same EMV contactless protocol the plastic card would have.",[990,991,992],"HCE","EMV Contactless","contactless payments",[994],{"kind":766,"url":995},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[937,745],"\u002Fglossary#host-card-emulation",{"slug":999,"term":1000,"definition":1001,"category":748,"aliases":1002,"links":1003,"related":1006,"readMore":-1,"target":1008,"hasArticle":758},"impeller","Impeller","The rendering engine Flutter uses today, default on iOS since 2023 and on Android since 2024. It compiles its shaders ahead of time instead of during the first animation, which removed the shader-compilation jank that was Flutter's most visible production problem.",[],[1004],{"kind":766,"url":1005},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[1007],"skia","\u002Fglossary#impeller",{"slug":1010,"term":1011,"definition":1012,"category":1013,"aliases":1014,"links":1018,"related":1021,"readMore":-1,"target":1023,"hasArticle":758},"in-app-purchase","In-app purchase","Selling digital goods or a subscription through the Apple or Google billing that both stores require for digital content and take a commission on. The hard part is never the purchase; it is restoring it on a new device and keeping entitlement state honest.","business",[1015,1016,1017],"IAP","in-app purchases","in-app subscription",[1019],{"kind":766,"url":1020},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[1022],"product-market-fit","\u002Fglossary#in-app-purchase",{"slug":769,"term":1025,"definition":1026,"category":748,"aliases":1027,"links":1028,"related":1031,"readMore":-1,"target":1032,"hasArticle":758},"Install Referrer","A Google Play API that hands a freshly installed Android app the campaign parameters from the link that led to the install. The Android half of deferred deep linking, and the dependable way to attribute where a user came from.",[],[1029],{"kind":766,"url":1030},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[621,760],"\u002Fglossary#install-referrer",{"slug":881,"term":1034,"definition":1035,"category":1036,"aliases":1037,"links":1039,"related":1044,"readMore":-1,"target":1045,"hasArticle":758},"JWT","A signed token carrying its own claims, so a server can tell who a request belongs to without looking a session up. Standard for mobile authentication. The signature proves it was not altered; it does not hide what is inside.","protocol",[1038],"JSON Web Token",[1040,1042],{"kind":753,"url":1041},"https:\u002F\u002Fjwt.io\u002F",{"kind":780,"url":1043},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[937],"\u002Fglossary#jwt",{"slug":1047,"term":1048,"definition":1049,"category":790,"aliases":1050,"links":1054,"related":1057,"readMore":-1,"target":1058,"hasArticle":758},"kyc","KYC","Know Your Customer — the identity checks a regulated financial product runs before it lets anyone move money: document capture, liveness, sanctions and anti-money-laundering screening. It shapes onboarding more than any design decision does.",[1051,1052,1053],"Know Your Customer","AML","KYC\u002FAML",[1055],{"kind":780,"url":1056},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[937,925],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":1060,"category":748,"aliases":1061,"links":1063,"related":1064,"readMore":1065,"target":1065,"hasArticle":758},"Sharing business logic written in Kotlin across Android, iOS and the server while each platform keeps its own native UI. The alternative to Flutter when the interface has to be native but the rules behind it do not.",[1062],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":1067,"term":1068,"definition":1069,"category":1013,"aliases":1070,"links":1072,"related":1075,"readMore":-1,"target":1076,"hasArticle":758},"mvp","MVP","The smallest version of a product that can go in front of real users and still answer the question you built it to answer. A decision about scope, not about quality — an MVP still has to work.",[1071],"minimum viable product",[1073],{"kind":780,"url":1074},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[908],"\u002Fglossary#mvp",{"slug":828,"term":1078,"definition":1079,"category":804,"aliases":1080,"links":1084,"related":1087,"readMore":-1,"target":1088,"hasArticle":758},"Multi-architecture image","A single image tag that resolves to different binaries per CPU architecture — linux\u002Famd64 and linux\u002Farm64 are the common pair — so the same docker pull works unchanged on Intel\u002FAMD servers and Apple Silicon laptops.",[1081,1082,1083],"multi-arch build","multi-platform image","linux\u002Famd64 + linux\u002Farm64",[1085],{"kind":766,"url":1086},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[815],"\u002Fglossary#multi-arch-image",{"slug":909,"term":1090,"definition":1091,"category":804,"aliases":1092,"links":1095,"related":1098,"readMore":-1,"target":1099,"hasArticle":758},"Multi-tenancy","One deployment serving many customers, each seeing only its own data, configuration and enabled features because tenant context is resolved per request. It is what makes a fleet of branded apps one product instead of many forks.",[1093,1094],"multi-tenant","tenant",[1096],{"kind":780,"url":1097},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[908,896],"\u002Fglossary#multi-tenancy",{"slug":1101,"term":1102,"definition":1103,"category":1036,"aliases":1104,"links":1108,"related":1113,"readMore":-1,"target":1114,"hasArticle":758},"oauth","OAuth","The standard behind Sign in with Apple, Google and the rest: the user authorises your app at a provider they already trust, and your app receives a token instead of their password. Nobody invents a new credential and you never store one.",[1105,1106,1107],"OAuth 2.0","social login","Sign in with Apple",[1109,1111],{"kind":753,"url":1110},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":780,"url":1112},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[881],"\u002Fglossary#oauth",{"slug":783,"term":1116,"definition":1117,"category":804,"aliases":1118,"links":1122,"related":1125,"readMore":-1,"target":1126,"hasArticle":758},"Object storage","Storage that holds a whole file under a key rather than in a filesystem tree — Amazon S3 and the many services that speak its API. Cheap, effectively unlimited, and the usual home for raw events, backups and media: written once, read rarely, kept forever.",[1119,1120,1121],"S3","S3-compatible storage","blob storage",[1123],{"kind":780,"url":1124},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[772],"\u002Fglossary#object-storage",{"slug":937,"term":1128,"definition":1129,"category":790,"aliases":1130,"links":1133,"related":1138,"readMore":-1,"target":1139,"hasArticle":758},"PCI-DSS","The card industry security standard binding anyone who stores, processes or transmits card data. Most apps stay out of its scope on purpose, by handing card entry to a certified payment provider instead.",[1131,1132],"PCI DSS","Payment Card Industry Data Security Standard",[1134,1136],{"kind":753,"url":1135},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":780,"url":1137},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[881],"\u002Fglossary#pci-dss",{"slug":1141,"term":1142,"definition":1143,"category":748,"aliases":1144,"links":1147,"related":1150,"readMore":-1,"target":1151,"hasArticle":758},"platform-channels","Platform channels","The bridge a Flutter app uses to call native iOS and Android code — Keychain and Keystore, biometrics, payment sheets, any SDK without a Dart package. Routine work but real work, and the first place an engineer who never left Dart will stall.",[1145,1146],"platform channel","method channel",[1148],{"kind":766,"url":1149},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":1153,"term":1154,"definition":1155,"category":1036,"aliases":1156,"links":1159,"related":1162,"readMore":-1,"target":1163,"hasArticle":758},"post-quantum-cryptography","Post-quantum cryptography","Encryption algorithms built to stay secure against a future quantum computer, now standardized by NIST. The migration is urgent ahead of the hardware because traffic captured today can be decrypted once such a machine exists.",[1157,1158],"PQC","post-quantum crypto",[1160],{"kind":780,"url":1161},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[880,870],"\u002Fglossary#post-quantum-cryptography",{"slug":1022,"term":1165,"definition":1166,"category":1013,"aliases":1167,"links":1170,"related":1173,"readMore":-1,"target":1175,"hasArticle":758},"Product-market fit","The point at which a product has demonstrably found people who want it — they use it, come back, and pay. Before it, engineering answers a question; after it, engineering answers demand.",[1168,1169],"PMF","product\u002Fmarket fit",[1171],{"kind":780,"url":1172},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[1067,1174],"time-to-market","\u002Fglossary#product-market-fit",{"slug":1177,"term":1178,"definition":1179,"category":790,"aliases":1180,"links":1182,"related":1185,"readMore":-1,"target":1187,"hasArticle":758},"prompt-injection","Prompt injection","An attack where text supplied by a user is read by a language model as instructions rather than as data, steering it past its own rules. The LLM-era sibling of SQL injection, and it appears wherever user input is concatenated into a prompt.",[1181],"injection attack",[1183],{"kind":780,"url":1184},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[1186],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":892,"term":1189,"definition":1190,"category":804,"aliases":1191,"links":1194,"related":1197,"readMore":-1,"target":1198,"hasArticle":758},"Pub\u002FSub","A messaging pattern where a producer publishes an event and any number of consumers read it independently, with a broker in between. The producer never waits for them, which is how a request path stays fast while slower work happens behind it.",[1192,1193],"publish\u002Fsubscribe","Google Cloud Pub\u002FSub",[1195],{"kind":780,"url":1196},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":811,"term":1200,"definition":1201,"category":804,"aliases":1202,"links":1205,"related":1208,"readMore":-1,"target":1209,"hasArticle":758},"REST","The conventional style for HTTP APIs: a URL names a resource and the HTTP verb says what to do with it. The default way an app talks to a backend, and what most third-party integrations expect to find.",[1203,1204],"REST API","Representational State Transfer",[1206],{"kind":780,"url":1207},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[264,893],"\u002Fglossary#rest",{"slug":1186,"term":1211,"definition":1212,"category":790,"aliases":1213,"links":1216,"related":1219,"readMore":-1,"target":1220,"hasArticle":758},"Rate limiting","A cap on how many requests one caller may make in a given window. It is what stops a single enthusiastic user, a scraper or a bot from spending a month of paid API budget in an afternoon, and it has to live on your side of the integration.",[1214,1215],"rate limit","throttling",[1217],{"kind":780,"url":1218},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[1177],"\u002Fglossary#rate-limiting",{"slug":938,"term":1222,"definition":1223,"category":790,"aliases":1224,"links":1227,"related":1230,"readMore":-1,"target":1231,"hasArticle":758},"SOC 2","An external auditor report on how an organisation handles customer data — security, availability, confidentiality — rather than a certificate you buy. Enterprise buyers ask for it, and it constrains architecture long before the audit itself does.",[1225,1226],"SOC2","System and Organization Controls",[1228],{"kind":780,"url":1229},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[937,925,939],"\u002Fglossary#soc-2",{"slug":1233,"term":1234,"definition":1235,"category":1013,"aliases":1236,"links":1239,"related":1242,"readMore":-1,"target":1243,"hasArticle":758},"saas","SaaS","Software sold as an ongoing subscription to a hosted product rather than as a one-off license the customer installs and runs. The vendor operates the servers, ships updates continuously, and bills per seat or per usage.",[1237,1238],"Software as a Service","software-as-a-service",[1240],{"kind":780,"url":1241},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[909,908],"\u002Fglossary#saas",{"slug":893,"term":1245,"definition":1246,"category":1036,"aliases":1247,"links":1249,"related":1252,"readMore":-1,"target":1253,"hasArticle":758},"Server-Sent Events","A one-way stream from server to client over an ordinary HTTP connection. Simpler than a WebSocket and enough wherever only the server has something to say — a progress feed, an AI response arriving token by token.",[1248],"SSE",[1250],{"kind":780,"url":1251},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[264,811],"\u002Fglossary#server-sent-events",{"slug":458,"term":1255,"definition":1256,"category":804,"aliases":1257,"links":1260,"related":1263,"readMore":-1,"target":1264,"hasArticle":758},"Server-side rendering","Building a page as finished HTML on the server, so the first response already carries the content, headings, meta tags and structured data. Crawlers, link previews and slow devices read it without running JavaScript.",[1258,1259],"SSR","server-rendered",[1261],{"kind":780,"url":1262},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[522],"\u002Fglossary#server-side-rendering",{"slug":1007,"term":1266,"definition":1267,"category":748,"aliases":1268,"links":1271,"related":1276,"readMore":-1,"target":1277,"hasArticle":758},"Skia","The open-source 2D graphics library from Google that draws Chrome, Android and — until Impeller — every Flutter frame. It renders to PDF as well as to a screen, which is what print-to-PDF in Chrome is doing.",[1269,1270],"Skia Graphics Engine","skia-safe",[1272,1274],{"kind":753,"url":1273},"https:\u002F\u002Fskia.org\u002F",{"kind":780,"url":1275},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[999],"\u002Fglossary#skia",{"slug":1279,"term":1280,"definition":1281,"category":1013,"aliases":1282,"links":1285,"related":1286,"readMore":-1,"target":1288,"hasArticle":758},"staff-augmentation","Staff augmentation","A hiring model where engineers from an outside partner join your team and work under your management — in your repository, your sprints, your process — instead of delivering a project of their own. You buy capacity; the code and the context stay with you.",[325,1283,1284],"dedicated developers","outstaffing",[],[1287,1174],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":907,"term":1290,"definition":1291,"category":790,"aliases":1292,"links":1295,"related":1296,"readMore":-1,"target":1297,"hasArticle":758},"Staged rollout","Releasing a build to a small percentage of users first and widening only once the crash-free rate holds. A bad build caught at ten percent is a bad afternoon; the same build at a hundred percent is a bad week.",[1293,1294],"phased release","canary release",[],[896,787],"\u002Fglossary#staged-rollout",{"slug":1299,"term":1300,"definition":1301,"category":804,"aliases":1302,"links":1306,"related":1309,"readMore":-1,"target":1310,"hasArticle":758},"state-management","State management","How an app decides where a value lives, who is allowed to change it, and which parts of the screen redraw when it does. In Flutter the choice between Riverpod, BLoC and Provider is among the first architectural decisions and the hardest to revisit.",[1303,1304,1305],"state management","BLoC","Riverpod",[1307],{"kind":766,"url":1308},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[942],"\u002Fglossary#state-management",{"slug":880,"term":1312,"definition":1313,"category":1036,"aliases":1314,"links":1318,"related":1321,"readMore":-1,"target":1322,"hasArticle":758},"TLS","The encryption layer underneath HTTPS. It proves the server is who its certificate says, agrees a fresh key for the session, and encrypts everything after that — so the network in between sees ciphertext it cannot quietly alter.",[1315,1316,1317],"SSL","HTTPS","Transport Layer Security",[1319],{"kind":780,"url":1320},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[870,881],"\u002Fglossary#tls",{"slug":1174,"term":1324,"definition":1325,"category":1013,"aliases":1326,"links":1328,"related":1331,"readMore":-1,"target":1332,"hasArticle":758},"Time to market","How long it takes to get a product from decision to real users. Most stack and scope arguments are really arguments about this number, because every week saved is a week of revenue, feedback and competitive position.",[1327,1174],"TTM",[1329],{"kind":780,"url":1330},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[1067,1287],"\u002Fglossary#time-to-market",{"slug":1287,"term":1334,"definition":1335,"category":1013,"aliases":1336,"links":1339,"related":1342,"readMore":-1,"target":1343,"hasArticle":758},"Total cost of ownership","What a product costs across its whole life rather than to build once: maintenance, upgrades, annual OS and store migrations, and the second team you staff to keep two codebases in step. Usually larger than the build quote, and almost never inside it.",[1337,1338],"TCO","cost of ownership",[1340],{"kind":780,"url":1341},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[1174],"\u002Fglossary#total-cost-of-ownership",{"slug":1345,"term":1346,"definition":1347,"category":1036,"aliases":1348,"links":1350,"related":1355,"readMore":-1,"target":1357,"hasArticle":758},"webrtc","WebRTC","The browser and mobile standard for sending audio, video and data directly between two devices, with servers involved only in introducing them to each other. It is what an in-app video call is built on when it is not a rented SDK.",[1349],"Web Real-Time Communication",[1351,1353],{"kind":753,"url":1352},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":780,"url":1354},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[1356,264],"xmpp","\u002Fglossary#webrtc",{"slug":264,"term":1359,"definition":1360,"category":1036,"aliases":1361,"links":1362,"related":1365,"readMore":-1,"target":1366,"hasArticle":758},"WebSocket","A protocol that holds one connection open between client and server so either side can send at any moment, instead of the client asking over and over. What live prices, chat and presence indicators run on.",[],[1363],{"kind":780,"url":1364},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[893,811],"\u002Fglossary#websocket",{"slug":908,"term":1368,"definition":1369,"category":1013,"aliases":1370,"links":1373,"related":1376,"readMore":1377,"target":1377,"hasArticle":428},"White-label","One product shipped under many brands. A white-label mobile platform builds each client a store-ready app with its own name, design and content from a single shared codebase, instead of forking the project per customer.",[1371,1372],"white label","multi-tenant app",[1374],{"kind":780,"url":1375},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[1067],"\u002Fglossary\u002Fwhite-label",{"slug":1356,"term":1379,"definition":1380,"category":1036,"aliases":1381,"links":1384,"related":1389,"readMore":-1,"target":1390,"hasArticle":758},"XMPP","An open, federated messaging protocol, and the long-standing alternative to writing a chat backend or renting one. It extends to presence, typing indicators and file transfer, and it is old enough that every platform has a mature client library.",[1382,1383],"Jabber","Extensible Messaging and Presence Protocol",[1385,1387],{"kind":753,"url":1386},"https:\u002F\u002Fxmpp.org\u002F",{"kind":780,"url":1388},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[1345,264],"\u002Fglossary#xmpp"]