Project Name:

G! sa Marikina

Quick Glossary (for international judges)

Term Meaning
Marikina A city in Metro Manila, Philippines, with about 450,000 residents.
Barangay The smallest administrative division in the Philippines. Think of it like a neighborhood or ward with its own elected officials. Marikina has 16 official barangays.
Karinderya A small, family-run eatery serving home-cooked Filipino meals at low prices.
Taglish A natural mix of Tagalog (Filipino) and English that most Filipinos use in everyday conversation.

Inspiration

My friend sells cookies in Marikina. Good ones. Ube crinkles, chocolate chip, red velvet. She wakes up every morning and posts the same photos to five different Facebook groups. By lunchtime, those posts are buried under a hundred others. So the next morning, she does it again. And again. And again.

She's been doing this for over a year. She has loyal customers who buy every week, but she has no way to point a new customer to a single place that says "this is my business, here's what I sell, here's what people think of my food." No website. No permanent link. Just an endless cycle of reposting into a feed that forgets her by noon.

She's not alone. This is how hundreds of small food businesses operate in Marikina. Home bakers, milk tea shops that operate out of a garage, karinderyas that have been feeding a neighborhood for decades, street food carts that only exist between 3pm and sold-out. They all make good food. None of them can be found online unless you happen to be scrolling the right Facebook group at the right hour.

On the other side, residents who actually want to find food nearby have no tool for it. You can't search "best milk tea in Sta. Elena" and get a result. You can't filter by barangay. You can't read real reviews from your neighbors. You just scroll, and hope.

Google Maps doesn't solve this. It doesn't have menus, it doesn't have founder reviews, and it doesn't know that a home baker operating out of a kitchen in Malanday even exists. Delivery apps don't solve it either. GrabFood and FoodPanda take a 30% cut that most home-based sellers can't afford, and a lot of these spots don't do delivery in the first place. They're pickup-only, walk-in-only, or order-via-Facebook-Messenger-only.

There was nothing built specifically for how food actually gets discovered in a city like Marikina. So I built it.

What it does

G! sa Marikina gives every food business in the city one permanent page. That page has photos, a menu with prices, a location on the map, phone and social contact buttons, and real reviews from real residents. Business owners submit once and stop reposting. Residents browse, search, and discover without scrolling a feed.

The platform works at three levels:

Discovery. Residents explore food spots by category (cookies, milk tea, street food, home-cooked, resto, bakery), by barangay, or on a live interactive map. There are curated collections like Top Rated, Hidden Gems, and Just Added. A "Near Me" feature sorts by walking distance when location is shared.

The Barangay Polygon Map. This is the feature I'm most proud of. Click any barangay in Marikina and its real geographic boundary lights up on the map. The camera flies to fit that shape. Only the food spots actually inside that barangay stay visible. These boundaries are sourced from real OpenStreetMap administrative data, not rough circles or guesses. It knows where Sta. Elena ends and Santo Nino begins.

G!, the AI Food Concierge. A floating chat widget that understands Taglish. Ask "Saan may masarap na milk tea?" and it answers with a real business from the platform, the price, and a link to the listing page. It only knows what's actually on the platform. If nothing matches, it says so instead of making something up. It will never recommend a business that doesn't exist.

For business owners: a submission form that takes two minutes, an owner dashboard showing review count and average rating, and the knowledge that their page is discoverable by search engines (every listing has structured data for Google).

For moderation: an admin panel where I can approve or reject new submissions and handle reported reviews.

How I built it

The constraint from the start was: build something real, not a mockup. Real data in a real database. Real auth. Real map boundaries. Real AI grounded in real listings. Ship it to a production URL.

I started by validating the idea through a structured brainstorming session to make sure the problem was specific enough and the approach was the right one. Then an architecture review to lock in the tech decisions before writing code.

The stack choices were all driven by one rule: free tier, works at demo scale, can grow later without a rewrite.

  • Next.js 16 because it handles static pages (listings, categories) and dynamic routes (reviews, admin) in the same app without separate backend infrastructure.
  • MapLibre GL + OpenStreetMap because the map is a core feature, not a nice-to-have, and paying for a map API at zero revenue makes no sense. MapLibre renders GeoJSON polygons natively, which made the barangay boundary feature possible without a third-party service.
  • Supabase for the database because it gives me PostgreSQL, auth hooks, and a dashboard without managing a server.
  • Gemini for the AI concierge because the free tier is generous, Tagalog and Taglish support works out of the box, and the streaming API means responses feel instant in the chat widget.
  • Clerk for authentication because it gives me sign-in, sign-up, and role-based access (consumer vs. business owner vs. admin) with pre-built components that took minutes to integrate.

The barangay boundary data came from querying OpenStreetMap's Overpass API for admin-level-10 relations inside Marikina's bounding box, then running a custom script to stitch the returned line fragments into valid closed GeoJSON polygons.

Challenges I ran into

The map boundaries and the business locations didn't match. I had placed each listing's coordinates by hand early in the project. When I added real barangay boundaries from OpenStreetMap, every single pin ended up outside the barangay it was supposed to be in. Clicking "Sta. Elena" would correctly highlight the shape, but the businesses inside it would sit just outside the line. I had to write a script that checks whether each point is actually inside its polygon, found that all seven were wrong, and computed correct positions inside each barangay.

Getting clean boundary data was harder than expected. The public map data for Philippine barangays doesn't come as neat shapes ready to draw. It comes as hundreds of disconnected line fragments that have to be stitched together in the right order to form a closed boundary. On top of that, several barangay names (like "San Roque") exist in multiple cities across Metro Manila, so I had to verify I was pulling Marikina's San Roque and not Quezon City's.

The AI had to be kept honest. Early versions of the chatbot would sometimes recommend spots that don't exist on the platform, or make up details about a menu. I rewrote the system prompt to be strict: only reference the exact businesses in the data, include real prices, and if nothing matches the question, say so. It took several iterations to get it to consistently refuse off-topic questions while still sounding natural in Taglish.

Building solo means every bug is yours. There's no one to hand off a task to. When the production deploy broke because of a missing environment variable, or when a dependency update wiped half the installed packages, I had to stop feature work and fix infrastructure first. The discipline of committing small changes and testing each piece before moving to the next was the only thing that kept the project moving forward.

Accomplishments I'm proud of

  • Every listing pin on the map is mathematically verified to sit inside its correct barangay boundary. Not "close enough." Actually inside.
  • The AI concierge has never hallucinated a business in any test. If it doesn't know, it says "I don't have a match for that" and points to the search page.
  • The full platform loop works end-to-end: a business owner submits, the admin approves, residents find it on the map, they leave a review, the owner sees their rating go up.
  • Built the entire thing solo in under two weeks, from idea validation to production deployment, while maintaining code quality (typed end-to-end, validated inputs, proper error handling).
  • The design doesn't look like "a developer made this." It has a real visual identity, consistent spacing, and intentional typography. Food photos are the hero, not feature grids with icons in colored circles.

What I learned

  • Building for one specific city forces decisions that a generic "food app" never has to make. Which barangays exist? What's the actual boundary of Sta. Elena? Where do the street food carts actually set up? Specificity turns a vague idea into a real product.
  • Placeholder data is a trap. The moment you add real features on top (barangay boundaries, geolocation sorting, AI recommendations), fake coordinates and made-up addresses create visible breaks that take real effort to fix.
  • Keeping an AI honest is a design problem, not just a prompt engineering problem. The system prompt matters, but so does what data you give it access to, and what you tell the user it can and cannot do.
  • The biggest time saver wasn't a tool or a library. It was planning before coding. The architecture review caught three structural problems that would have been painful bugs if I'd found them in production instead of in a document.

What's next for G! sa Marikina

Immediate (before real launch):

  • Connect the catalog to the database so approved submissions appear on the public site automatically (right now the demo catalog is static data)
  • Add photo uploads so business owners can upload their own images
  • Onboard 20 to 30 real Marikina food businesses with real photos

Growth:

  • Extend barangay boundary coverage to all 16 official Marikina barangays (currently 6, matching the demo listings)
  • Add a "Claim your business" flow so existing listings can be taken over by verified owners
  • Email notifications when a business gets a new review (Resend is already configured, just needs the trigger)

Vision:

  • The architecture is city-agnostic. The boundary data, the listing schema, and the AI grounding are all decoupled from "Marikina" specifically. Fork the repo, swap the GeoJSON for a different city, seed new listings, and it launches as G! sa Antipolo, G! sa Pasig, or G! sa Cainta. Same code, different city. That's the long-term goal: a food discovery platform template that any community can adopt.

Built With

Share this project:

Updates

Submission history