2026 · Our own product
Saare Together
A shared checklist app for iPhone. You make a list, share it with someone using their Gmail address, and both of you can add items, tick them off and delete them. It syncs on its own, and it keeps working when you've got no signal — the groceries still get added in the aisle, and sort themselves out when you're back in range.
Built with no backend
The decision that shaped everything else was to run the whole thing without a server. Every list is an ordinary Google Sheet sitting in the user's own Google Drive, and sharing a list is a Drive permission rather than a row in some database of ours. That one choice carries a long way: there's no server of ours to breach, nothing of theirs for us to hold, no hosting bill sitting underneath a one-time purchase, and no honest reason to charge a monthly subscription for a shopping list.
What that cost us
A fair bit, and on purpose. The app asks Google for the narrowest permission
it can — drive.file, which only lets it see files it made itself
or that you handed to it deliberately. The catch is that a list somebody else
created is invisible to it, so getting a shared list into the app meant
building a separate picker page, hosted on this domain, where you grant access
to that one file and nothing else. The easy way was to ask for the run of the
whole Drive, and we turned it down. Broad access means an annual third-party
security assessment, and more to the point it means asking to see every file
you own so we can sync a shopping list.
Under the hood
The app keeps its own local database, so it's fully usable with no connection and syncs up when it gets one. Where two people have changed the same list, the merge is worked out row by row rather than file by file, and the logic for it was written as plain functions and tested on its own before it ever touched the network. That's why two people adding items at the same moment both keep theirs, instead of one of them quietly losing out.
- SwiftUI
- Core Data
- Google Drive API
- Google Sheets API
- OAuth 2.0
- Google Picker
- Test-driven
- Offline-first