What's The Deal
As co-founder — I built the platform
Three years live on both app stores, with geofenced push in the hands of real people, RAG search behind it, and a Google Cloud platform built to absorb public traffic without a bad week becoming a bill.
- Kotlin · Ktor
- MongoDB · Atlas Vector Search
- Flutter
- Next.js
- Cloud Run · Cloud Build
- Cloud Load Balancer · Cloud Armor · Cloud CDN
- Cloud Storage
- Pub/Sub · Cloud Functions · Cloud Scheduler
- Vertex AI · Gemini embeddings
- Firebase · BigQuery
- Geofencing · Push notifications
Context
A consumer product I co-founded and built, live in market for three years and still running. Published on both the App Store and Google Play, which means every release survives two review processes and two sets of platform rules — and the web app is where most of the recent work has gone, because organic search is where the audience actually comes from. The whole thing sits on a Kotlin backend I wrote on Ktor.
The problem
Consumer mobile punishes everything that enterprise integration merely dislikes. Geofencing has to be accurate enough to be useful and cheap enough not to drain a battery. Push has to arrive when it is relevant and stay silent when it is not, because the alternative is an uninstall. Permissions can be declined, revoked, or granted only while the app is in the foreground, and the product still has to work.
The second problem is being found at all. A deals product competes with every restaurant's own page, and paying for that traffic is not viable at consumer margins — which makes organic search an engineering problem rather than a marketing one. It also means the platform has to absorb public traffic it does not control, cheaply, without a bad week becoming a bill.
What I built
- A Flutter app on both stores
- One codebase shipped to the App Store and Google Play, with the platform differences handled rather than averaged away.
- Location, geofencing and push
- Location-aware notification that degrades gracefully when a permission is refused or the device is being frugal with the radio. Delivery tied to where someone actually is, which is the only version of a location product anyone keeps installed.
- A Kotlin backend on Ktor
- The API behind all of it is Kotlin on Ktor, with MongoDB integrated. An unfashionable choice in small-company circles and a good one: a typed, fast JVM service with a small footprint, which is exactly what you want carrying public traffic you do not control.
- RAG search and analytics, in production
- Retrieval-augmented search over the live corpus on Atlas Vector Search, running in a consumer product rather than a demo — with the analytics to see what people actually searched for.
- Event ingestion and a vector recommender
- Pub/Sub ingestion feeding a recommender built on MongoDB Atlas Vector Search, with embeddings from Gemini via Vertex AI. The vector store follows the platform rather than arriving as a third system to keep in sync — Atlas here because the data already lives in Mongo, pgvector on the Postgres platform. Cloud Functions and Cloud Scheduler carry the asynchronous and recurring work, with a Next.js web surface alongside the app.
- The infrastructure it runs on
- A public, media-heavy, traffic-exposed product needs the boring parts right. Cloud Run behind a Cloud Load Balancer, with Cloud Armor for filtering and Cloud CDN in front of Cloud Storage so images are served from the edge rather than the origin. Cloud Build wired to GitHub, so a merge is a deploy. Firebase where it earned its place, and BigQuery integrated for the analytics side.
Outcome
Live in market for three years across iOS, Android and web. In July 2026 the web platform recorded 2.63k clicks and 201k impressions in Google Search Console, with 85 pages earning their first impressions and top-six placement for generic local searches like “wing wednesday edmonton”. Alpha Booth at Collision Conference. I mention the search numbers because they are the same discipline I am selling — the difference between software that exists and software people find.
Sound like something you have?
More work
- KeystoneOS
Idempotent webhook ingestion keyed on provider event IDs, anonymous-to-identified event backfill, CREA RESO OData sync, and pgvector semantic search over listings.
- A major Canadian airline
Booking, seat maps, flight search and automated baggage handling, integrated against airline reservation systems under a contractual throughput SLA.
- Surefire Fundraising
A Laravel platform handling catalog, checkout and transactional email for an Edmonton client whose business was built on top of it.