1// every bid, live, for everyone watching 2Stream<Auction> watch(String id) => _db 3 .doc('auctions/$id') 4 .snapshots() 5 .map(Auction.fromSnapshot); 6 7// a transaction: two bids at once can’t both win 8Future<void> bid(String id, Money amount) => 9 _db.runTransaction((tx) async {10 final a = Auction.fromSnapshot(await tx.get(_db.doc('auctions/$id')));11 if (amount <= a.highestBid) throw const BidTooLow();12 tx.update(a.ref, {'highestBid': amount.value, 'leader': uid});13 });
Live bids · KNET
Simplified illustration — client code is private
Bidder appAuctionCubitFirestore
Live auctionsStores & servicesKNET
Drawn reconstruction
$ saheel auction --live✓ bid accepted · leader updated✓ 10 service types online✓ store review approved
Drawn reconstruction
The problem
A marketplace for Kuwait’s horse community: horse stores, 10 service types, events, and live auctions where every bid has to land in real time for everyone watching — in Arabic and English, paid with KNET, and approved by both app stores.
What I built and owned
Live auctions with real-time bidding on a Firebase back end.
Horse stores, 10 service types and events in one bilingual Arabic RTL / English app.
KNET payments.
Owned the full App Store and Google Play review cycle: permissions, background modes and the demo account.
Client product. The App Store page is linked; backend and admin tools are not shown.