Screenshots
Click an image to enlarge it.
About the app
Every day, in every neighbourhood, bakeries throw out bread at closing time, cafes throw out pastries, grocery stores throw out fresh produce. None of it has gone bad — it has simply run out of time. Vakti Geçmeden connects those products, before they hit the bin, with people who want to buy them at half price. The business cuts its losses, the user gets fresh food cheaply, and nothing goes to waste.
The user side is boiled down to three steps: discover, reserve, pick up with a QR code. Once the user turns on location, they see nearby surprise bags in a map or list view and filter by category, distance and price; they pick a bag and choose a pickup time; they stop by the business and collect it by showing their QR code. Reserving is free and takes thirty seconds — because every extra step here means one more bag that doesn't get rescued.
The most critical part on the technical side is stock. The inventory here melts away over the course of the day: every bag has a pickup window and an expiry moment, and the listing closes itself once the time is up. A reservation isn't a sale, it's a hold — two people must not be able to reserve the same last bag at the same moment, and an uncollected reservation has to return to stock. The QR code is single-use and verified on the server, so it can't be reused by sharing a screenshot.
The other half of the product is the business side. Businesses go through approval, publish their own bags, and manage pickup times and stock. On the user side there is following a business, getting a notification when it publishes a new bag, ratings and reviews. On top of that I added a social layer: posts, a following feed and a discover tab — to stop waste reduction from being something you do on your own.
Finally, there is an impact dashboard showing the estimated environmental equivalent of every product rescued: how many kilograms of carbon, how many litres of water, how many kilometres of driving. It is an estimate calculated with fixed conversion factors, not an exact measurement — but it is far more convincing than an abstract “you did a good thing” message.
Key features
- Location-based discovery: map and list views of nearby surprise bags
- Category filters: bakery, grocery store, cafe, restaurant and greengrocer
- Distance and price filters — a deal list sorted by location
- Last-minute deals: bags expiring today with a countdown of the time left
- Free reservations: pick a bag, choose a pickup time and hold the stock
- Single-use QR pickup — a collection code verified on the server
- Verified businesses: every business is checked before it goes live
- Business page: products, about, posts and the rating distribution
- Following and notifications: get told when a business you follow publishes a new bag
- Social feed: a community tab with posts, likes and comments
- Impact dashboard: products rescued, money saved and the estimated carbon/water equivalent
- Business dashboard: publishing bags, pickup times and stock management
Technologies used
109 technologies · 12 categoriesLanguages and Platform
- Dart
- Flutter
- One codebase, two platforms
- iOS and Android releases
- Material and Cupertino design languages
- Handling platform differences
UI and Application Layer
- Widget tree architecture
- Stateless / Stateful widgets
- State management
- MediaQuery / LayoutBuilder
- Navigator and route management
- Theming and design system
- Virtualisation with ListView.builder
- Custom animations and transitions
Backend and Data
- Firebase Firestore
- Firebase Authentication
- Firebase Storage
- Cloud Functions
- Firestore security rules
- NoSQL data modelling
- Firestore transactions
- Composite index design
- Firestore offline cache
- Batch writes
- Cursor-based pagination
- Denormalisation
- Counter fields
- Cloud Functions triggers
- Scheduled jobs
Location and Maps
- Location services (Flutter plugin)
- Google Maps integration
- Location permission flows
- Map marker management
- Geohash geo queries
- Distance and radius calculation
- Map–list view switching
Reservations and QR Pickup
- QR code generation
- QR scanning with the camera
- Camera permissions
- Single-use collection code
- Server-side code verification
- Atomic stock holds (transactions)
- Reservation timeouts
- Pickup times and time zones
- Scheduled Cloud Functions
Notifications and Social Layer
- Firebase Cloud Messaging
- APNs (iOS)
- Android notification channels
- Notification permissions
- Follow-based notification triggers
- Image picker and compression
- Like and comment counters
- Business verification workflow
- Impact metric calculation
Async and Architecture
- Future / async-await
- Stream and StreamBuilder
- Heavy work on Isolates
- MVVM
- Repository layer
- Separate service layer
- Error handling and retries
- Environment separation (dev / prod)
Networking and Data Transfer
- HTTP client
- JSON serialisation
- Retries and timeouts
- Offline state handling
- Image caching
- File upload progress
- Connectivity listening
Security and Privacy
- Secure local storage
- HTTPS
- Auth token management
- Session refresh
- Permission rationale strings
- Account deletion flow
- Server-side authorisation checks
UI States and Accessibility
- Dark theme (ThemeData)
- Text scaling
- SafeArea
- Empty / loading / error states
- Skeleton loading
- RefreshIndicator
- Keyboard and focus management
- Deep linking
- Accessibility with Semantics
Testing, Debugging and Measurement
- Widget Inspector
- Performance overlay
- Memory profiling
- Console and Logcat
- Testing on real devices
- Testing across screen sizes
Tools and Release Process
- Flutter SDK
- Dart DevTools
- pub / pubspec dependency management
- Xcode (iOS builds and signing)
- Android Studio
- CocoaPods (iOS plugins)
- Gradle (Android builds)
- Git
- App Store Connect
- Google Play Console
- TestFlight
- Play Console internal testing
- flutter build ipa / appbundle
- Version and build numbering
- Signing and provisioning profiles
- App Store review process
- App Privacy / Data Safety form
- Store assets and ASO copy
Idea, design, interface, code, app store release and post-release maintenance — I ran the entire process end to end on my own. No team, no agency, no outsourcing.
Development notes
- Languages and approachBuilt with Flutter and Dart, shipping to iOS and Android from a single codebase. I have been writing mobile apps since 2020; until then I wrote each of my apps natively and separately in Swift, Java and Kotlin. In 2026 I moved to a single codebase.
- StatusThe app is in app store review; development and release preparation are ongoing.
- DependenciesA number of open-source packages from the Flutter plugin ecosystem are in use; dependencies are managed with pub, and the platform-side builds with CocoaPods and Gradle.
- Time-limited inventoryBags expire over the course of the day. A reservation is not a sale but a stock hold; an uncollected reservation returns to stock once it times out.
- Testing and debuggingTested on real devices, across different screen sizes and under poor network conditions.
- Release preparationApp Store Connect and Google Play Console setup, the privacy declaration, store assets and the review process are all handled by me.
- Product ownershipIdea, design, development, brand identity, website and marketing — the whole process is mine.
Let's talk about Vakti Geçmeden
I would be glad to walk you through the technical details, the problems I ran into and how I solved them.