Leo
Leo
All posts
DailyBite — a social snack app built Swiss-first
SocialMay 20266 min read

DailyBite — a social snack app built Swiss-first

The Znüni is a Swiss daily ritual. No app had ever treated it as a product. Here's how I built one — real supermarket data from five chains, a gamification layer that works, and a product designed for young Swiss people from the first migration.

React NativeSupabaseExpoSwissGamificationpg_cron

Every morning at 09:00, Swiss Lernende stop what they're doing and eat. The Znüni — the mid-morning snack break — is a daily ritual. It's so embedded in Swiss work and school culture that most people don't even think about it. They just do it.

Nobody had built a product around it. No app that treats the Znüni as a social moment, helps young people discover what to eat, and makes the daily supermarket run a little more interesting. DailyBite is that app.

What it does

Every morning at 09:00, DailyBite pushes one combo — two or more real products from your nearest supermarket, with real prices. You mark it as done (Gmacht?), rate it, earn XP, build a streak. Other users create and share their own combos in a community feed. A weekly leaderboard shows who's been eating the best.

Migros, Coop, Aldi, Lidl, Denner — the five supermarkets that actually matter in Switzerland. Real product images from store CDN APIs. Real prices in CHF. Not a recipe app. Not a calorie tracker. A snack discovery app, built for people who have 20 minutes and a few francs.

The data problem

Showing real products from five different Swiss supermarkets is harder than it sounds. Each store has a different API, a different data format, and a different attitude toward third-party access. The solution was to build a unified pipeline that lands everything in one normalized products table — and have the app only ever read from that.

  • Migros — reverse-engineered internal API. A Supabase Edge Function (sync-migros-products) hits it nightly at 02:00 UTC, scheduled via pg_cron. The app never calls Migros at runtime.
  • Aldi — self-scraped and imported into the same table.
  • Coop, Lidl, Denner — static dataset loaded into the same schema.

Every source normalizes to the same shape:store_chain,name,brand,image_url,price,is_available. On top of that sits a full-text search RPC with German stemming and pg_trgm trigram similarity — so when users search for products to build a combo, typos still work.

Why gamification makes sense here

Gamification is usually a band-aid for a product that isn't inherently interesting. DailyBite is different: the Znüni is already a daily habit. The cadence exists without the app. What gamification adds is a feedback loop and a reason to care which combo you pick.

XP for rating a combo (+10), making one (+15), creating your own (+15). Streaks for showing up every day. Badges — Znüni-Profi, Wochensieger, Sparfuchs — that are grounded in Swiss snack culture, not generic trophy icons. A weekly leaderboard that resets on Monday so it stays competitive. The system works because it maps onto something people already do every morning, not because it invents a new behavior from scratch.

Built Swiss-first, not Swiss-compatible

The target audience is young people — Lernende, students, people in their first jobs. The Swiss apprenticeship system puts hundreds of thousands of 16-to-20-year-olds in workplaces with a morning break and a few francs to spend. That's the core user.

Every product decision reflects that. The UI is in Swiss Standard German — no ß, Du-form throughout, Swiss supermarket names as they're actually written. The gamification text uses Swiss slang (Gmacht?, Znüni-Profi) instead of neutral English approximations. The store selection is exactly the five chains young Swiss people walk past every day. This isn't a general European food app with a Swiss flag added — it was designed for one country from the first database migration.

Tech stack

  • React Native / Expo — iOS and Android from one codebase.
  • Supabase — Postgres, Auth, Edge Functions, pg_cron for the nightly sync.
  • Next.js 15 — marketing website and content hub, deployed on Vercel.
  • German full-text search — tsvector with German stemming + pg_trgm trigram similarity on the products table.

Where it is now

Open beta on iOS and Android. The daily pick is live, the community feed is running, and real users are building streaks. The product works — the next step is getting it in front of more Lernende.