[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fportfolio\u002Fcashback-loyalty-platform":167,"glossary":525},[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,"categories":501,"client":505,"date":506,"description":507,"duration":508,"extension":509,"image":510,"links":513,"meta":514,"metaDescription":515,"navigation":516,"ogDescription":517,"path":518,"seo":519,"slug":520,"stem":521,"technologies":522,"updated":523,"__hash__":524},"projects_en\u002Fportfolio\u002Fcashback-loyalty-platform.md","Cashback & Loyalty App Platform",{"type":171,"value":172,"toc":486},"minimark",[173,178,182,195,203,206,212,216,220,227,230,241,244,248,256,267,271,274,278,285,307,310,314,317,320,326,336,342,346,368,371,374,378,385,389,405,416,424,428,431,434,460,478,482],[174,175,177],"h2",{"id":176},"project-overview","Project Overview",[179,180,181],"p",{},"Our client runs a cashback platform that lets offline shops — cafés, salons, boutiques, neighbourhood retail — reward their customers and, just as importantly, finally get to know them. Brick-and-mortar businesses rarely have the customer data that online stores take for granted: who their regulars are, when they last visited, what brings them back. The platform closes that gap by putting a cashback and loyalty program in every participating shop's hands, and a branded app in every customer's pocket.",[179,183,184,185,189,190,194],{},"Rather than ship a single app, the business model calls for a ",[186,187,188],"em",{},"family"," of applications: a flagship consumer app where shoppers discover participating shops and track their cashback, a dedicated merchant app for shops to connect and run their own rewards, and a growing catalogue of ",[191,192,193],"term",{"slug":193},"white-label"," apps — each one a fully branded, independently published cashback app for a partner brand or retail chain, all powered by the same product.",[179,196,197,198,202],{},"By the time the project matured, the ecosystem spanned ",[199,200,201],"strong",{},"15+ live mobile applications",". The engineering challenge was never building one app well — it was building one codebase that could become any number of branded cashback apps without the maintenance cost growing linearly with each new partner.",[179,204,205],{},"We were responsible for the entire system end to end: the shared consumer app, the merchant app, the white-label fleet, the cashback rules engine and backend services, and the internal admin tooling that turned \"launch a new branded app\" from a multi-day engineering task into a self-service form.",[207,208,209],"nda-notice",{},[179,210,211],{},"This project is covered by a non-disclosure agreement. The client, the partner brands behind the white-label apps, and the published store listings are not named — the screenshots below show the product running on test data.",[213,214],"gallery",{":images":215},"[{\"url\": \"\u002Fprojects\u002Fcashback-loyalty-platform\u002Fimages\u002F01.webp\", \"alt\": \"Consumer app home with cashback balance and invite-friends bonus\"}, {\"url\": \"\u002Fprojects\u002Fcashback-loyalty-platform\u002Fimages\u002F02.webp\", \"alt\": \"Shop details with per-purchase cashback rate\"}, {\"url\": \"\u002Fprojects\u002Fcashback-loyalty-platform\u002Fimages\u002F03.webp\", \"alt\": \"Vouchers and shop news feed\"}, {\"url\": \"\u002Fprojects\u002Fcashback-loyalty-platform\u002Fimages\u002F05.webp\", \"alt\": \"Single white-label application setup\"}, {\"url\": \"\u002Fprojects\u002Fcashback-loyalty-platform\u002Fimages\u002F06.webp\", \"alt\": \"Admin UI white-label applications list\"}]",[174,217,219],{"id":218},"one-codebase-many-apps","One Codebase, Many Apps",[179,221,222,223,226],{},"The flagship consumer app and every white-label variant run on a ",[199,224,225],{},"single codebase",". There are no forks, no per-brand branches, and no copy-pasted projects to keep in sync. What differs between apps — branding, theme, brand identity, feature flags, reward configuration, and store-listing metadata — is expressed entirely as configuration that lives outside the code.",[179,228,229],{},"We built the client around a flavor-and-configuration system: a single binary blueprint that resolves its brand identity at build time from a per-app config bundle. Colors, typography, logos, splash screens, app icons, bundle identifiers, and enabled feature sets are all injected per flavor. A bug fixed once, or a feature shipped once, lands in every app in the fleet on the next release — there is no per-brand divergence to maintain.",[179,231,232,233,236,237,240],{},"Crucially, the levers that define each brand are operated by ",[199,234,235],{},"managers with no programming skills",". Through the admin UI, a non-technical operator sets a new app's ",[199,238,239],{},"icons, colors, brightness (light or dark theme), and select labels"," — and those choices flow straight into the build with no developer involvement. The people who own a brand's look and feel can change it directly, instead of filing a ticket and waiting on engineering.",[179,242,243],{},"This is the core economic lever of the project: the marginal cost of the sixteenth app is close to zero, because it is the same code as the first, with a different configuration.",[174,245,247],{"id":246},"native-build-configuration-in-dart","Native Build Configuration in Dart",[179,249,250,251,255],{},"A white-label fleet lives or dies on the native build configuration — the Android and iOS settings that the stores actually care about. Application IDs and bundle identifiers, app display names, version and build numbers, signing setup, icon and splash assets, and per-flavor entries in ",[252,253,254],"code",{},"build.gradle"," and the Xcode project all have to be correct for every single app, every single build.",[179,257,258,259,262,263,266],{},"Rather than maintain that by hand, we wrote ",[199,260,261],{},"custom Dart tooling that programmatically manages the Android- and iOS-related build configuration",". Given a brand's config bundle, the tool rewrites the relevant Gradle, manifest, ",[252,264,265],{},"Info.plist",", and asset-catalogue entries to match the target flavor before the build runs. Keeping this logic in Dart means it shares the same source of truth as the Flutter client and runs as a first-class step of our build process — so a brand's native configuration is generated deterministically from its config, never edited by hand.",[174,268,270],{"id":269},"the-merchant-app","The Merchant App",[179,272,273],{},"Offline shops needed their own tool — not a stripped-down consumer view, but a purpose-built app for running a rewards program and understanding their customers. From the merchant app, a shop owner connects to the platform in minutes, defines their cashback and discount rules, confirms customer purchases to grant cashback, and finally sees who their customers are: new versus returning, how often they visit, and how each promotion performs. For many of these businesses it is the first structured view of their customer base they have ever had. We built it on the same Flutter foundation and shared component library as the consumer apps, so design-system updates and platform fixes propagate across both audiences, while the merchant-specific workflows live in their own modules.",[174,275,277],{"id":276},"configurable-cashback-discount-rules","Configurable Cashback & Discount Rules",[179,279,280,281,284],{},"The heart of the platform is a flexible ",[199,282,283],{},"rules engine"," that lets each shop design its own rewards with no help from us. Through the merchant app, a shop composes rules such as:",[286,287,288,295,301],"ul",{},[289,290,291,294],"li",{},[199,292,293],{},"Per-purchase cashback"," — a percentage or fixed amount returned to the customer's balance on every qualifying purchase.",[289,296,297,300],{},[199,298,299],{},"Birthday bonus"," — a reward credited automatically around a customer's birthday to bring them back through the door.",[289,302,303,306],{},[199,304,305],{},"Invitation bonus"," — a referral reward that pays out when an existing customer invites a friend who joins and makes their first purchase.",[179,308,309],{},"Rules are data, not code: each shop picks its own combination, sets the amounts, caps, and validity windows, and the engine evaluates them at purchase time. Because the rules live in configuration, a shop can launch a birthday campaign or change a cashback rate itself, instantly, across its app — and we never ship a release to support it.",[174,311,313],{"id":312},"the-admin-ui-automated-build-pipeline","The Admin UI & Automated Build Pipeline",[179,315,316],{},"The standout piece of the system is the internal admin UI. Onboarding a new white-label brand used to be an engineering errand — create the configuration, register the bundle identifiers, generate signing assets, set up the store listings, and add the new target to CI. We collapsed all of that into a single web application that managers operate without writing code.",[179,318,319],{},"A manager fills in a form — brand name, theme, assets, store metadata, feature selection — and the system does the rest:",[179,321,322,325],{},[199,323,324],{},"Configuration generation",": The admin UI persists the new brand's configuration and assets and produces the per-flavor config bundle the Flutter client consumes.",[179,327,328,331,332,335],{},[199,329,330],{},"Pipeline registration",": The new app target is registered into the ",[191,333],{"slug":334},"ci-cd"," pipeline automatically. The build system picks up the new flavor, runs our custom Dart tooling to apply the native Android and iOS configuration, and produces signed artifacts for both platforms.",[179,337,338,341],{},[199,339,340],{},"Self-service launches",": What previously required a developer in the loop for every new brand became a form-driven, repeatable process. The business can scale the number of published apps without scaling the size of the engineering team.",[174,343,345],{"id":344},"build-deploy-automation-with-fastlane","Build & Deploy Automation with Fastlane",[179,347,348,349,355,356,361,362,367],{},"The entire build-and-release process is automated end to end with ",[350,351,33],"a",{"href":352,"rel":353},"https:\u002F\u002Ffastlane.tools",[354],"nofollow"," — the open-source toolchain for automating mobile build and deployment. We use it to standardize every step that would otherwise be manual and error-prone across 15+ apps: managing signing and provisioning, building and signing the iOS and Android binaries, and submitting each app to the ",[350,357,360],{"href":358,"rel":359},"https:\u002F\u002Fdocs.fastlane.tools\u002Fgetting-started\u002Fios\u002Fappstore-deployment\u002F",[354],"App Store"," and ",[350,363,366],{"href":364,"rel":365},"https:\u002F\u002Fdocs.fastlane.tools\u002Fgetting-started\u002Fandroid\u002Frelease-deployment\u002F",[354],"Google Play"," along with its metadata and screenshots.",[179,369,370],{},"Because every app shares one Fastlane configuration parameterized per flavor, releasing the whole fleet is a single, repeatable operation. A new white-label brand inherits the exact same battle-tested deploy path as the flagship app — no bespoke release scripting required.",[179,372,373],{},"The admin UI is a Nuxt application backed by our PHP services and a PostgreSQL data store, with Ruby and Fastlane tooling orchestrating the build-and-release automation.",[174,375,377],{"id":376},"backend-services","Backend & Services",[179,379,380,381,384],{},"Underpinning every app is a shared backend that runs the ",[199,382,383],{},"cashback ledger",", the rules engine, customer profiles, and per-brand configuration. A single set of services backs the entire fleet, with brand context resolved per request — so a customer in any white-label app, the flagship app, or a shop using the merchant app is talking to the same API surface, scoped to their brand. The ledger records every accrual and redemption so balances are always auditable, and customer profiles give each shop the insight into their audience that offline retail usually lacks.",[174,386,388],{"id":387},"deferred-deep-linking-the-invitation-bonus","Deferred Deep Linking & the Invitation Bonus",[179,390,391,392,395,396,400,401,404],{},"The feature this unlocked was the ",[199,393,394],{},"invitation bonus",". Referrals are how the platform grows: a happy customer invites a friend, who taps the invite link — but almost never has the app installed yet. With a plain ",[191,397,399],{"slug":398},"deep-linking","deep link",", that invite context was lost the moment the friend hit the store: they would install, open the app, land on a generic home screen, and the connection between inviter and invitee was gone — and with it the invitation bonus both sides were promised. The most viral moment in the product was broken at its most important step. We fixed it with ",[199,402,403],{},"deferred deep linking"," so the invitation survives the install.",[179,406,407,408,411,412,415],{},"Because the whole fleet shares one codebase, the feature was built once and every branded app — flagship, merchant, and all white-label variants — inherited it automatically. We implemented it with first-party mechanisms rather than a third-party service: a lightweight ",[199,409,410],{},"iOS App Clip"," captures the invite link before the full app exists and hands it off through a shared App Group container, while the ",[199,413,414],{},"Google Play Install Referrer API"," carries the payload on Android. A pending-link queue holds the invitation until the app is ready and the new customer has signed up and logged in — only then is the referral attributed and the invitation bonus credited to both the inviter and the new customer, so the reward resolves correctly even though it spans an install and a fresh login on a cold start.",[179,417,418,419,423],{},"We wrote up the full technical approach — including why the common solution stopped working — in ",[350,420,422],{"href":421},"\u002Fblog\u002Fdeferred-deep-linking-app-clips-install-referrer","Deferred Deep Linking After Firebase Dynamic Links: App Clips + Play Install Referrer",".",[174,425,427],{"id":426},"results","Results",[179,429,430],{},"The client can now launch a fully branded, store-ready cashback app for a new partner in a fraction of the time it once took — without pulling engineers off product work for each launch. The shared-codebase architecture keeps 15+ apps in lockstep: one fix, one feature, one release reaches them all. The admin UI turned a recurring engineering bottleneck into a self-service capability, and the automated pipeline made each new launch a predictable, repeatable event rather than a bespoke project. And the offline shops that once flew blind now run their own cashback and discount campaigns and, for the first time, know who their customers are.",[179,432,433],{},"The economics in numbers:",[286,435,436,442,448,454],{},[289,437,438,441],{},[199,439,440],{},"15+ live apps from one codebase"," — no forks, no per-brand branches, no divergence to reconcile at release time.",[289,443,444,447],{},[199,445,446],{},"The marginal cost of the next branded app is close to zero"," — a new brand is a configuration bundle plus store metadata, not a new engineering project.",[289,449,450,453],{},[199,451,452],{},"Launching a brand went from a multi-day engineering task to a self-service form"," operated by managers with no programming skills.",[289,455,456,459],{},[199,457,458],{},"The single Flutter codebase runs about 30–40% cheaper than two native apps would"," — and because the fleet shares it, that saving is avoided once per brand, compounding across all 15+ apps.",[179,461,462,463,467,468,472,473,477],{},"This is the kind of platform we build as a ",[350,464,466],{"href":465},"\u002Fservices\u002Fwhitelabel-app-development","white-label app development"," engagement — one Flutter codebase powering an entire fleet of branded apps — and it anchors the loyalty-and-cashback side of our ",[350,469,471],{"href":470},"\u002Fservices\u002Fflutter-app-development\u002Fe-commerce","e-commerce app development"," practice. The admin UI that launches each brand is the kind of internal back office our ",[350,474,476],{"href":475},"\u002Fservices\u002Fweb-development\u002Fadmin-dashboards","admin panels & dashboards"," page describes.",[174,479,481],{"id":480},"faq","FAQ",[483,484],"questions",{":items":485},"[{\"title\":\"What is a white-label app platform?\",\"text\":\"A single codebase that can be rebranded and republished as any number of separate, independently branded apps. On this platform, the flagship cashback app and every partner app share the same Flutter code; what differs — colors, logos, app icons, bundle identifiers, feature flags, reward configuration, store metadata — is expressed entirely as per-brand configuration that lives outside the code.\"},{\"title\":\"How can one Flutter codebase power more than 15 different apps?\",\"text\":\"Through a flavor-and-configuration system: a single binary blueprint resolves its brand identity at build time from a per-app config bundle, and custom Dart tooling rewrites the native Android and iOS build configuration — Gradle entries, manifests, Info.plist, asset catalogues — to match the target brand before each build. A bug fixed once, or a feature shipped once, lands in every app in the fleet on the next release.\"},{\"title\":\"How does a new branded app get launched without developers?\",\"text\":\"Through an internal admin UI. A manager fills in a form — brand name, theme, icons, colors, store metadata, feature selection — and the system generates the configuration bundle, registers the new app in the CI pipeline, and produces signed iOS and Android artifacts. Fastlane then submits each app to the App Store and Google Play with its metadata and screenshots, so releasing the whole fleet is a single repeatable operation.\"},{\"title\":\"Do the app stores reject white-label apps?\",\"text\":\"They reject fleets of thin, near-identical reskins — that is exactly what Apple guideline 4.2.6 exists for. A white-label platform has to be designed to pass review from the start: each app in this fleet is a fully branded product with its own identity, store listing, and per-brand configuration of features and rewards, not a template with a swapped logo. The publishing pipeline also supports separate developer accounts per brand where partner agreements or store policy call for it.\"},{\"title\":\"What does a white-label fleet cost compared to separate apps?\",\"text\":\"The first app carries the platform cost — the shared codebase, the theming and feature-flag system, the rules engine, the admin panel, and the automated pipeline. Every app after that is dramatically cheaper, because a new brand is configuration rather than a project. On top of that, the single Flutter codebase runs about 30–40% cheaper than maintaining separate native iOS and Android apps, a saving that compounds across the whole fleet.\"},{\"title\":\"How does the invitation bonus survive the app not being installed yet?\",\"text\":\"Through deferred deep linking built on first-party mechanisms: a lightweight iOS App Clip captures the invite link before the full app exists and hands it off through a shared App Group container, while the Google Play Install Referrer API carries the payload on Android. A pending-link queue holds the invitation until the new customer has installed, signed up, and logged in — only then is the referral attributed and the bonus credited to both sides.\"}]",{"title":487,"searchDepth":488,"depth":488,"links":489},"",2,[490,491,492,493,494,495,496,497,498,499,500],{"id":176,"depth":488,"text":177},{"id":218,"depth":488,"text":219},{"id":246,"depth":488,"text":247},{"id":269,"depth":488,"text":270},{"id":276,"depth":488,"text":277},{"id":312,"depth":488,"text":313},{"id":344,"depth":488,"text":345},{"id":376,"depth":488,"text":377},{"id":387,"depth":488,"text":388},{"id":426,"depth":488,"text":427},{"id":480,"depth":488,"text":481},[502,503,504],"mobile","backend","web","nda","2025-08-01","A white-label cashback and loyalty platform for offline shops — 15+ branded mobile apps from one Flutter codebase, a merchant app for configuring custom cashback rules (birthday, invitation, per-purchase), and an admin UI that launches new branded apps automatically.","8 Months","md",{"alt":511,"url":512},"Cashback & Loyalty App Platform: visuals withheld under NDA","\u002Fprojects\u002Fcashback-loyalty-platform\u002Fhero.webp",null,{},"A white-label cashback and loyalty platform: 15+ branded mobile apps from one Flutter codebase, a merchant app for cashback rules, and an auto-launch admin UI.",true,"One Flutter codebase, 15+ branded apps, and an admin panel that launches a new one on its own. Plus a merchant app for the cashback rules.","\u002Fportfolio\u002Fcashback-loyalty-platform",{"title":169,"description":507},"cashback-loyalty-platform","portfolio\u002Fcashback-loyalty-platform",[41,18,155,90,160,95,100,121,35],"2026-09-05","cBgBBqxGgg5wfJ4ne8XI0ZoQKMN3q6u32fFEGQ3lQbs",[526,541,553,568,581,595,611,622,636,649,663,676,691,704,721,734,745,755,768,780,791,806,815,828,841,848,859,871,882,897,909,922,934,946,958,970,981,992,1003,1014,1026,1036,1047,1060,1072,1081,1094,1106,1116,1127,1141,1150,1161],{"slug":527,"term":528,"definition":529,"category":530,"aliases":531,"links":533,"related":537,"readMore":-1,"target":539,"hasArticle":540},"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",[532],"Android Open Source Project",[534],{"kind":535,"url":536},"website","https:\u002F\u002Fsource.android.com\u002F",[538],"host-card-emulation","\u002Fglossary#aosp",false,{"slug":542,"term":543,"definition":544,"category":530,"aliases":545,"links":546,"related":550,"readMore":-1,"target":552,"hasArticle":540},"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.",[],[547],{"kind":548,"url":549},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[398,551],"install-referrer","\u002Fglossary#app-clips",{"slug":554,"term":555,"definition":556,"category":530,"aliases":557,"links":558,"related":564,"readMore":-1,"target":567,"hasArticle":540},"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.",[],[559,561],{"kind":535,"url":560},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":562,"url":563},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[565,566],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":334,"term":569,"definition":570,"category":571,"aliases":572,"links":576,"related":579,"readMore":-1,"target":580,"hasArticle":540},"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",[573,574,575],"CI","continuous integration","continuous delivery",[577],{"kind":562,"url":578},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":582,"term":583,"definition":584,"category":585,"aliases":586,"links":588,"related":591,"readMore":-1,"target":594,"hasArticle":540},"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",[587],"Create, Read, Update, Delete",[589],{"kind":562,"url":590},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[592,593],"rest","graphql","\u002Fglossary#crud",{"slug":596,"term":597,"definition":598,"category":585,"aliases":599,"links":604,"related":607,"readMore":-1,"target":610,"hasArticle":540},"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.",[600,601,602,603],"image registry","Docker registry","GHCR","ghcr.io",[605],{"kind":548,"url":606},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[608,609],"dev-container","multi-arch-image","\u002Fglossary#container-registry",{"slug":398,"term":612,"definition":613,"category":530,"aliases":614,"links":617,"related":620,"readMore":621,"target":621,"hasArticle":516},"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.",[403,615,616],"universal links","Android App Links",[618],{"kind":562,"url":619},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[542,551],"\u002Fglossary\u002Fdeep-linking",{"slug":608,"term":623,"definition":624,"category":571,"aliases":625,"links":629,"related":634,"readMore":-1,"target":635,"hasArticle":540},"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.",[626,627,628],"devcontainer.json","Dev Containers","VS Code Dev Containers",[630,632],{"kind":535,"url":631},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":548,"url":633},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[596],"\u002Fglossary#dev-container",{"slug":566,"term":637,"definition":638,"category":530,"aliases":639,"links":642,"related":647,"readMore":-1,"target":648,"hasArticle":540},"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\".",[640,641],"Elastic","ELK",[643,645],{"kind":535,"url":644},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":562,"url":646},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[554],"\u002Fglossary#elasticsearch",{"slug":650,"term":651,"definition":652,"category":585,"aliases":653,"links":656,"related":659,"readMore":-1,"target":662,"hasArticle":540},"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.",[654,655],"E2EE","end-to-end encrypted",[657],{"kind":562,"url":658},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[660,661],"tls","jwt","\u002Fglossary#end-to-end-encryption",{"slug":664,"term":665,"definition":666,"category":585,"aliases":667,"links":670,"related":671,"readMore":-1,"target":675,"hasArticle":540},"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.",[668,669],"fanout","broadcast",[],[672,673,674],"websocket","pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":677,"term":678,"definition":679,"category":571,"aliases":680,"links":684,"related":687,"readMore":-1,"target":690,"hasArticle":540},"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.",[681,682,683],"feature flag","feature toggle","feature gating",[685],{"kind":562,"url":686},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[688,193,689],"staged-rollout","multi-tenancy","\u002Fglossary#feature-flags",{"slug":692,"term":693,"definition":694,"category":585,"aliases":695,"links":699,"related":702,"readMore":-1,"target":703,"hasArticle":540},"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.",[696,697,698],"IEEE 754","double","floating-point arithmetic",[700],{"kind":562,"url":701},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point",{"slug":705,"term":706,"definition":707,"category":571,"aliases":708,"links":711,"related":716,"readMore":-1,"target":720,"hasArticle":540},"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.",[709,710],"General Data Protection Regulation","data protection",[712,714],{"kind":535,"url":713},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":562,"url":715},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[717,718,719],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":722,"term":723,"definition":724,"category":571,"aliases":725,"links":729,"related":732,"readMore":-1,"target":733,"hasArticle":540},"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.",[726,727,728],"golden tests","screenshot test","snapshot test",[730],{"kind":548,"url":731},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[334],"\u002Fglossary#golden-test",{"slug":593,"term":735,"definition":736,"category":585,"aliases":737,"links":738,"related":743,"readMore":-1,"target":744,"hasArticle":540},"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.",[],[739,741],{"kind":535,"url":740},"https:\u002F\u002Fgraphql.org\u002F",{"kind":562,"url":742},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[592],"\u002Fglossary#graphql",{"slug":719,"term":746,"definition":747,"category":571,"aliases":748,"links":750,"related":753,"readMore":-1,"target":754,"hasArticle":540},"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.",[749],"Health Insurance Portability and Accountability Act",[751],{"kind":562,"url":752},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[717,705,718],"\u002Fglossary#hipaa",{"slug":756,"term":757,"definition":758,"category":585,"aliases":759,"links":762,"related":765,"readMore":-1,"target":767,"hasArticle":540},"headless-cms","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.",[760,761],"headless content management system","content API",[763],{"kind":562,"url":764},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[766,592],"server-side-rendering","\u002Fglossary#headless-cms",{"slug":538,"term":769,"definition":770,"category":530,"aliases":771,"links":775,"related":778,"readMore":-1,"target":779,"hasArticle":540},"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.",[772,773,774],"HCE","EMV Contactless","contactless payments",[776],{"kind":548,"url":777},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[717,527],"\u002Fglossary#host-card-emulation",{"slug":781,"term":782,"definition":783,"category":530,"aliases":784,"links":785,"related":788,"readMore":-1,"target":790,"hasArticle":540},"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.",[],[786],{"kind":548,"url":787},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[789],"skia","\u002Fglossary#impeller",{"slug":792,"term":793,"definition":794,"category":795,"aliases":796,"links":800,"related":803,"readMore":-1,"target":805,"hasArticle":540},"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",[797,798,799],"IAP","in-app purchases","in-app subscription",[801],{"kind":548,"url":802},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[804],"product-market-fit","\u002Fglossary#in-app-purchase",{"slug":551,"term":807,"definition":808,"category":530,"aliases":809,"links":810,"related":813,"readMore":-1,"target":814,"hasArticle":540},"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.",[],[811],{"kind":548,"url":812},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[398,542],"\u002Fglossary#install-referrer",{"slug":661,"term":816,"definition":817,"category":818,"aliases":819,"links":821,"related":826,"readMore":-1,"target":827,"hasArticle":540},"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",[820],"JSON Web Token",[822,824],{"kind":535,"url":823},"https:\u002F\u002Fjwt.io\u002F",{"kind":562,"url":825},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[717],"\u002Fglossary#jwt",{"slug":829,"term":830,"definition":831,"category":571,"aliases":832,"links":836,"related":839,"readMore":-1,"target":840,"hasArticle":540},"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.",[833,834,835],"Know Your Customer","AML","KYC\u002FAML",[837],{"kind":562,"url":838},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[717,705],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":842,"category":530,"aliases":843,"links":845,"related":846,"readMore":847,"target":847,"hasArticle":540},"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.",[844],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":849,"term":850,"definition":851,"category":795,"aliases":852,"links":854,"related":857,"readMore":-1,"target":858,"hasArticle":540},"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.",[853],"minimum viable product",[855],{"kind":562,"url":856},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[193],"\u002Fglossary#mvp",{"slug":609,"term":860,"definition":861,"category":585,"aliases":862,"links":866,"related":869,"readMore":-1,"target":870,"hasArticle":540},"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.",[863,864,865],"multi-arch build","multi-platform image","linux\u002Famd64 + linux\u002Farm64",[867],{"kind":548,"url":868},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[596],"\u002Fglossary#multi-arch-image",{"slug":689,"term":872,"definition":873,"category":585,"aliases":874,"links":877,"related":880,"readMore":-1,"target":881,"hasArticle":540},"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.",[875,876],"multi-tenant","tenant",[878],{"kind":562,"url":879},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[193,677],"\u002Fglossary#multi-tenancy",{"slug":883,"term":884,"definition":885,"category":818,"aliases":886,"links":890,"related":895,"readMore":-1,"target":896,"hasArticle":540},"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.",[887,888,889],"OAuth 2.0","social login","Sign in with Apple",[891,893],{"kind":535,"url":892},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":562,"url":894},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[661],"\u002Fglossary#oauth",{"slug":565,"term":898,"definition":899,"category":585,"aliases":900,"links":904,"related":907,"readMore":-1,"target":908,"hasArticle":540},"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.",[901,902,903],"S3","S3-compatible storage","blob storage",[905],{"kind":562,"url":906},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[554],"\u002Fglossary#object-storage",{"slug":717,"term":910,"definition":911,"category":571,"aliases":912,"links":915,"related":920,"readMore":-1,"target":921,"hasArticle":540},"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.",[913,914],"PCI DSS","Payment Card Industry Data Security Standard",[916,918],{"kind":535,"url":917},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":562,"url":919},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[661],"\u002Fglossary#pci-dss",{"slug":923,"term":924,"definition":925,"category":530,"aliases":926,"links":929,"related":932,"readMore":-1,"target":933,"hasArticle":540},"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.",[927,928],"platform channel","method channel",[930],{"kind":548,"url":931},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":935,"term":936,"definition":937,"category":818,"aliases":938,"links":941,"related":944,"readMore":-1,"target":945,"hasArticle":540},"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.",[939,940],"PQC","post-quantum crypto",[942],{"kind":562,"url":943},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[660,650],"\u002Fglossary#post-quantum-cryptography",{"slug":804,"term":947,"definition":948,"category":795,"aliases":949,"links":952,"related":955,"readMore":-1,"target":957,"hasArticle":540},"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.",[950,951],"PMF","product\u002Fmarket fit",[953],{"kind":562,"url":954},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[849,956],"time-to-market","\u002Fglossary#product-market-fit",{"slug":959,"term":960,"definition":961,"category":571,"aliases":962,"links":964,"related":967,"readMore":-1,"target":969,"hasArticle":540},"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.",[963],"injection attack",[965],{"kind":562,"url":966},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[968],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":673,"term":971,"definition":972,"category":585,"aliases":973,"links":976,"related":979,"readMore":-1,"target":980,"hasArticle":540},"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.",[974,975],"publish\u002Fsubscribe","Google Cloud Pub\u002FSub",[977],{"kind":562,"url":978},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":592,"term":982,"definition":983,"category":585,"aliases":984,"links":987,"related":990,"readMore":-1,"target":991,"hasArticle":540},"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.",[985,986],"REST API","Representational State Transfer",[988],{"kind":562,"url":989},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[672,674],"\u002Fglossary#rest",{"slug":968,"term":993,"definition":994,"category":571,"aliases":995,"links":998,"related":1001,"readMore":-1,"target":1002,"hasArticle":540},"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.",[996,997],"rate limit","throttling",[999],{"kind":562,"url":1000},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[959],"\u002Fglossary#rate-limiting",{"slug":718,"term":1004,"definition":1005,"category":571,"aliases":1006,"links":1009,"related":1012,"readMore":-1,"target":1013,"hasArticle":540},"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.",[1007,1008],"SOC2","System and Organization Controls",[1010],{"kind":562,"url":1011},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[717,705,719],"\u002Fglossary#soc-2",{"slug":1015,"term":1016,"definition":1017,"category":795,"aliases":1018,"links":1021,"related":1024,"readMore":-1,"target":1025,"hasArticle":540},"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.",[1019,1020],"Software as a Service","software-as-a-service",[1022],{"kind":562,"url":1023},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[689,193],"\u002Fglossary#saas",{"slug":674,"term":1027,"definition":1028,"category":818,"aliases":1029,"links":1031,"related":1034,"readMore":-1,"target":1035,"hasArticle":540},"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.",[1030],"SSE",[1032],{"kind":562,"url":1033},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[672,592],"\u002Fglossary#server-sent-events",{"slug":766,"term":1037,"definition":1038,"category":585,"aliases":1039,"links":1042,"related":1045,"readMore":-1,"target":1046,"hasArticle":540},"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.",[1040,1041],"SSR","server-rendered",[1043],{"kind":562,"url":1044},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[756],"\u002Fglossary#server-side-rendering",{"slug":789,"term":1048,"definition":1049,"category":530,"aliases":1050,"links":1053,"related":1058,"readMore":-1,"target":1059,"hasArticle":540},"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.",[1051,1052],"Skia Graphics Engine","skia-safe",[1054,1056],{"kind":535,"url":1055},"https:\u002F\u002Fskia.org\u002F",{"kind":562,"url":1057},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[781],"\u002Fglossary#skia",{"slug":1061,"term":1062,"definition":1063,"category":795,"aliases":1064,"links":1068,"related":1069,"readMore":-1,"target":1071,"hasArticle":540},"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.",[1065,1066,1067],"team augmentation","dedicated developers","outstaffing",[],[1070,956],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":688,"term":1073,"definition":1074,"category":571,"aliases":1075,"links":1078,"related":1079,"readMore":-1,"target":1080,"hasArticle":540},"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.",[1076,1077],"phased release","canary release",[],[677,334],"\u002Fglossary#staged-rollout",{"slug":1082,"term":1083,"definition":1084,"category":585,"aliases":1085,"links":1089,"related":1092,"readMore":-1,"target":1093,"hasArticle":540},"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.",[1086,1087,1088],"state management","BLoC","Riverpod",[1090],{"kind":548,"url":1091},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[722],"\u002Fglossary#state-management",{"slug":660,"term":1095,"definition":1096,"category":818,"aliases":1097,"links":1101,"related":1104,"readMore":-1,"target":1105,"hasArticle":540},"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.",[1098,1099,1100],"SSL","HTTPS","Transport Layer Security",[1102],{"kind":562,"url":1103},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[650,661],"\u002Fglossary#tls",{"slug":956,"term":1107,"definition":1108,"category":795,"aliases":1109,"links":1111,"related":1114,"readMore":-1,"target":1115,"hasArticle":540},"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.",[1110,956],"TTM",[1112],{"kind":562,"url":1113},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[849,1070],"\u002Fglossary#time-to-market",{"slug":1070,"term":1117,"definition":1118,"category":795,"aliases":1119,"links":1122,"related":1125,"readMore":-1,"target":1126,"hasArticle":540},"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.",[1120,1121],"TCO","cost of ownership",[1123],{"kind":562,"url":1124},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[956],"\u002Fglossary#total-cost-of-ownership",{"slug":1128,"term":1129,"definition":1130,"category":818,"aliases":1131,"links":1133,"related":1138,"readMore":-1,"target":1140,"hasArticle":540},"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.",[1132],"Web Real-Time Communication",[1134,1136],{"kind":535,"url":1135},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":562,"url":1137},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[1139,672],"xmpp","\u002Fglossary#webrtc",{"slug":672,"term":1142,"definition":1143,"category":818,"aliases":1144,"links":1145,"related":1148,"readMore":-1,"target":1149,"hasArticle":540},"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.",[],[1146],{"kind":562,"url":1147},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[674,592],"\u002Fglossary#websocket",{"slug":193,"term":1151,"definition":1152,"category":795,"aliases":1153,"links":1156,"related":1159,"readMore":1160,"target":1160,"hasArticle":516},"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.",[1154,1155],"white label","multi-tenant app",[1157],{"kind":562,"url":1158},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[849],"\u002Fglossary\u002Fwhite-label",{"slug":1139,"term":1162,"definition":1163,"category":818,"aliases":1164,"links":1167,"related":1172,"readMore":-1,"target":1173,"hasArticle":540},"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.",[1165,1166],"Jabber","Extensible Messaging and Presence Protocol",[1168,1170],{"kind":535,"url":1169},"https:\u002F\u002Fxmpp.org\u002F",{"kind":562,"url":1171},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[1128,672],"\u002Fglossary#xmpp"]