01 /MOOD-ATLAS

mood-driven atlas · OSM-native · zero proprietary APIs

Tell the atlas the mood.

Pick a vibe — the atlas filters to fit.

/DATE-NIGHT

amenity:restaurant + cuisine:italian|french|japanese|spanish|mediterranean

6 places

02 /COOKBOOK

Optional Spoonacular ingestion · Redis cache · static-seed fallback

Cookbook.

Static seed of three reference dishes. The real product ingests recipes via Spoonacular when configured, falling back to the seed otherwise.

Weeknight Veggie TacosMexican

Weeknight Veggie Tacos

25measy89%

/ Mexican

Weeknight Veggie Tacos

time

25m

effort

easy

popular

89%

Lemon Herb Farro BowlMediterranean

Lemon Herb Farro Bowl

35mmedium78%

/ Mediterranean

Lemon Herb Farro Bowl

time

35m

effort

medium

popular

78%

Creamy Tomato RigatoniItalian

Creamy Tomato Rigatoni

40mmedium84%

/ Italian

Creamy Tomato Rigatoni

time

40m

effort

medium

popular

84%

Miso-Glazed SalmonJapanese

Miso-Glazed Salmon

30mmedium95%

/ Japanese

Miso-Glazed Salmon

time

30m

effort

medium

popular

95%

Thai Coconut Curry SoupThai

Thai Coconut Curry Soup

35mmedium82%

/ Thai

Thai Coconut Curry Soup

time

35m

effort

medium

popular

82%

More this week

More this week

Coming soon

/ COMING-SOON

More this week

03 /COOK

step-sync · ticking timers · mise-en-place checklist

Cook with a real timer.

Ingredients

  • coconut milk· 1 can (400ml)
  • lemongrass· 2 stalks, bashed
  • firm tofu· 200g, cubed
  • red chili· 1, sliced
  • cilantro· small handful
Mise en placegingergarlicshallotlime
  • 01BROTH · Bash garlic, shallot, and ginger so they burst open and release flavor.
  • 02Heat coconut oil in a heavy pot over medium until shimmering.
  • 03Sauté aromatics until fragrant — about 90 seconds, do not let them brown.
  • 04Pour in coconut milk and add lemongrass; bring just to a simmer.
  • 05Lower heat. Add chili and tofu, season with fish sauce or salt.
  • 06Simmer gently for 6 minutes so the tofu absorbs the broth.
  • 07Taste — add lime juice to brighten, sugar if it is too sharp.
  • 08Finish with torn cilantro and a swirl of chili oil. Serve over rice.

Tip: Bash the lemongrass with the back of a knife — bruising releases far more aroma than slicing.

Thai Coconut Curry Soup

Thai · Comfort Bowl

Thai Coconut Curry Soup

35 min · simmer phase

04 — /THE-KITCHEN

OSM-first · optional Spoonacular · self-hostable · real seed data

Built honest. Free APIs first.

OSM-first restaurant search, optional Spoonacular for recipe ingestion, MapLibre by default — proprietary tile keys are opt-in, never required. Self-hostable end to end.

Backend

  • Ruby 3.2
  • Sinatra
  • Puma
  • Sidekiq
  • JWT + bcrypt
  • aws-sdk-s3

Frontend

  • Next.js 14
  • React 18
  • TypeScript
  • Tailwind CSS
  • MapLibre GL
  • @tanstack/react-query

Maps & Geo

  • MapLibre GL JS
  • OpenFreeMap (here)
  • swisstopo (product)
  • OSM Overpass
  • OSM Nominatim

UI System

  • Tailwind CSS
  • Framer Motion
  • SBB Lyne icons (product)
  • Lucide React

Data

  • Redis
  • Spoonacular API (optional)

Testing

  • RSpec
  • Jest
  • React Testing Library
  • Playwright

Infra

  • Docker Compose
  • Sidekiq scheduler
  • Self-hostable

This portfolio page uses

Live MapLibre GL JS map served from OpenFreeMap (free, no signup, no API key) — vector tiles built from OpenStreetMap (ODbL). Charcoal + saffron + a warm terracotta #c75d3a accent. No proprietary keys, nothing phoned home.

Principles

  • ·OSM-native restaurant search — Overpass + Nominatim, no API key, no rate-limit-of-shame
  • ·Optional Spoonacular for recipe ingestion — works fully on static seed without it
  • ·MapLibre default with optional Mapbox / MapTiler / OpenFreeMap — your tile choice, not ours
  • ·Step-by-step cooking mode with real ticking timers — built, not borrowed
  • ·Self-hostable end to end — Docker Compose up, you own the data
  • ·Product UI borrows SBB Lyne icons — Apache-2.0 design system, glyphs only, none of the SBB brand color

Portfolio: OpenFreeMap · OpenStreetMap (ODbL) · MapLibre GL JS (BSD-3) · Product also borrows SBB Lyne (Apache-2.0, icons only, system not brand)

Next Project

ContextBay