Work / 02 of 06

food-lib.gr

REST API · Greek food catalogue

Thousands of Greek foods with per-100 g nutrition, searchable in Greek, greeklish or English as you type.

Visit food-lib.gr
Role
Solo: data, API, admin panel and website
Years
2026
Status
Live
Stack
Laravel · Meilisearch · React
food-lib.gr on desktop and mobile

The brief

Coach needed a Greek food database with per-100 g nutrition and search that understands Greek. I built it as a product of its own: a JSON API sold with metered keys, which Coach also uses.

What I built

  • A Laravel 13 API on MariaDB, Meilisearch and Redis, running in Docker behind Caddy.
  • An admin panel for the catalogue, and a public review queue for food contributions.
  • Images on Cloudflare R2, and a marketing site on Vercel with a live search demo.
  • CI that runs tests and Pint, builds an image and deploys over SSH, with migrations run on boot.

Decisions

  1. 01

    Search that speaks Greek

    Diacritic folding, typo tolerance and a greeklish field in the index, so "bira" finds Μπύρα. Semantic search is opt-in, with a relevance threshold that was measured rather than guessed: a food logger that confidently returns the wrong product writes wrong macros into someone's day.

  2. 02

    Metering that's fair

    API keys are resolved before the rate limiter, so customers are limited by their plan rather than their IP. The monthly quota runs after it, so a burst that gets throttled is never charged against the month.

  3. 03

    Revalidating cached data

    Reads use tagged Redis caches and ETags for revalidation. Free-text search is left uncached.

  4. 04

    Backups that are tested

    A nightly database dump plus encrypted offsite snapshots to R2. A verify step restores a real file and compares checksums, because a backup that has never been restored isn't a backup.