Agora.AI
Shopping list priced across 13 supermarkets
Version 3 of the iOS and Android app over a real-time shopping list and a matching and pricing API, with voice input, price comparison, a store finder, digital flyers and family sharing
-
Strategy
Reads stream live from the database and every change is a command to the pricing API, with an optimistic interface that hides the round trip
-
Design
Tonal scales around brand blue #006EAC, a bundled RobotoFlex variable type scale, fully bilingual Greek and English
-
Client
SMART SHOPPING IKE
Agora.AI
Transforming Grocery & Household Shopping with Voice AI and IoT. Write your list. See where it’s cheapest.
Agora.ai is a grocery-savings app for the Greek market. Users write their shopping list the way they would on paper, or simply say it out loud: “2 packs of pasta no.6“. The platform turns every line into real products across 13 Greek supermarket chains, pre-selects the cheapest match, and prices the whole list two ways: as a combined basket, with each item bought where it’s cheapest, and as a per-store basket, with the entire list bought at one chain. Before leaving the house, the shopper knows what to buy, where, and what it will cost. We built Version 3 of the app, one Flutter codebase live on the App Store and Google Play as “Agora“.
Thirteen supermarkets, and none of them on your list
Shoppers who want to save money compare flyers, apps and shelf prices by hand, chain by chain. A shopping list is a few loose words, like “pasta” or “milk”, while a price belongs to one specific product at one specific chain. Bridging the two by hand is exactly the job nobody has time for.
The app had to accept messy human input, typed or spoken, match it to real products at every chain, and price it in several ways at once. It also had to feel as instant as writing on paper, even though every single line needs a trip to the server and back.
A list that prices itself
The list lives in Cloud Firestore and streams to the phone in real time. Every change the user makes (add, swap, quantity, tick, complete, share) is sent as a command to the Agora AI REST API. The API does the matching, the price ranking and the per-store lists on the server and writes the results back into the stream. Around that loop sit the discovery features: a live offers feed, a supermarket map, a digital flyer reader, favourites, the government Household Basket browser and personal spending analytics.
Getting started takes seconds: email, Google or Sign in with Apple. Account setup is transactional. If any step of provisioning fails, the sign-in is rolled back, so nobody ends up with a half-made account. A nine-step interactive tutorial then walks new users through the list, using demo items added through the real API so they see real prices.



Type it, or just say it
One basket, or one store
Every alternative, side by side
In the aisle
Offers, flyers and the nearest branch
The offers feed shows the 300 biggest current discounts, with personal keyword tabs such as γάλα or coffee that ignore Greek accents. A map finds every branch of every chain within 3 km and hands off to Apple Maps or Google Maps for directions. The flyer library shows each chain’s current promotional flyers, flags new ones, and opens them in a zoomable reader. Users can choose which chains to follow and get a notification when a new flyer comes out.
Shopping for a household
Users can invite other Agora users by email to share their list. Members appear in real time. Tapping a family member switches the active list, and everyone with access can add, swap and tick items. The app also includes the Greek Ministry of Development’s Household Basket price-cap programme, browsable chain by chain, and a spending view broken down by category.
Instant, even though the server decides
The app separates reading from writing. Firestore snapshots handle every read, and every write is a REST command to the domain API, which owns the matching, pricing and list building. The main list and each store’s list stream in parallel, are combined on the device, and are debounced by 500 ms, so a burst of server writes becomes one smooth update.
The optimistic layer is what makes the app feel instant. Placeholder rows are never removed when the HTTP call returns, only when their real counterpart appears in the stream, and that swap happens inside the stream listener, in a single frame. Quantity taps are applied locally, collected per item for two seconds and sent as one request, with an automatic rollback if the server says no. On every change, a totals engine recalculates the combined total, each chain’s share of the combined basket, and the whole list priced at every chain.
The client follows MVVM with a separate use-case layer, so list behaviour is plain, testable Dart. Widgets rebuild at row level, so changing one item repaints one row, not the whole list. The dependency graph is scoped to the signed-in user and rebuilt on account switch, so nothing leaks between accounts. A typed error model tells “the server said no” apart from “we never reached the server”. A single store-name normaliser resolves every way the data sources spell a chain (Greek, Latin, accents, abbreviations) to one code and one logo. The codebase also supports white-label builds, each bound to its own Firebase project.
Version 3, rebuilt from the list up
Mobile was ours from the ground up: a full refactor to MVVM with use cases in February 2026, then a performance and stability pass in September 2026, which included bundled fonts, bounded caches, listener-leak fixes, typed errors and a shared HTTP client with timeouts. A team of 15.
Fully bilingual, with around 660 strings in each of Greek and English and full parity between them. Switching language also switches the speech-recognition language. Account deletion is built into the app, as both stores require. The current release is 3.0.2 (build 343).
Stack
- Mobile: Flutter · Dart · Provider (MVVM) · RxDart
- Identity: Firebase Authentication (email, Google, Apple)
- Real-time data: Cloud Firestore
- APIs: Agora AI REST API (v3) · Operations API
- Push: Firebase Cloud Messaging
- Storage: Firebase Storage
- Maps & location: OpenStreetMap · Geolocator
- Voice: Platform speech recognition (el-GR / en-US)
- Charts: fl_chart
- Design: Figma design tokens