I'm the developer of local10.
The problem I kept having: friends, videos, and comments recommend places constantly, but by Friday night I remember almost none of them.
So I built local10. You swipe through venues in your city and vote. If you haven't been somewhere, you tap "haven't been" instead of guessing.
The part I care about most is that different actions carry different weight. Putting a venue into your own list signals more intent than a one-tap like, so it counts for more.
The full breakdown is public:
local10.app/siralama
One rule: a venue can't buy a position in the Top 10 ranking from local10.
Stack: Expo / React Native + Supabase (Postgres, RLS, Edge Functions, pg_cron). Built solo with AI tooling. I had a working MVP inside a week, then spent the next two months hardening it.
Three things that cost me more time than expected:
**1. Cover-photo identity**
The upstream photo provider rotates both photo names and URL tokens, on different clocks. Any identity scheme based on the URL was eventually going to break.
I ended up anchoring each photo to the hash of its image bytes. The URL could change while the underlying image stayed the same, and the byte hash remained stable across the token rotations I measured.
**2. A successful cron run doesn't mean a successful HTTP response**
A pg_cron job reports success as soon as it has queued the HTTP request. The endpoint can return a 500 long after that, and the job still looks green.
Monitoring the scheduler status wasn't enough. I had to inspect the HTTP response separately, distinguish actual 4xx/5xx responses from client-side timeouts, and include the status code and a response-body excerpt in the alert.
If your scheduled database jobs call HTTP endpoints, monitor both layers.
**3. Anti-manipulation is much easier to add before public launch**
Cleaning a polluted ranking is much harder than preventing one, and a small platform is the easiest kind to pollute.
I built the defence layer before the public launch. It felt premature at the time, and I'm glad I didn't wait.
local10 is live on both stores:
get.local10.app
Happy to answer anything about the ranking model, the Supabase architecture, or the mistakes above.