Client work4 May 2026 to 30 Aug 2026Web

Teowkee

A heritage beef noodle restaurant, online in six languages. The owner keeps it current from a spreadsheet, the till system owns the menu, and every build writes 130 static pages.

A departure board flips the words beef noodle soup through the site's six languages.

  • English: Beef noodle soup
  • Bahasa Malaysia: Mi sup daging
  • 简体中文: 牛肉面
  • 繁體中文: 牛肉麵
  • 日本語: 牛肉麺
  • Bahasa Indonesia: Mi sup daging sapi

Site locales

How the menu gets onto the site

One noodle, three spellings: 面麵麺. The Chinese and Japanese boards share 牛肉 and flip only the last character.

No runtime CMS. Production is static files built from git.

Two sources, one build

The owner keeps the site current without calling me. A spreadsheet holds what the owner writes and the till system holds the menu, prices and photos, while git keeps the code and design. Every build turns them into static pages in all six languages.

The owner edits

Spreadsheet

Everything the owner writes, job openings included. An importer checks every row with zod before it can ship.

Source of truth

Till system

  • Menu
  • Prices
  • Photos

A headless browser reads the till's public ordering page. The first full refresh brought in 54 items and 49 HD photos.

Every build

Build

  1. Validate every row
  2. Regenerate typed data
  3. Render six languages

A bad row fails validation instead of shipping.

Output

130static pages per build, in six languages

  • Review

    A GitHub Action opens a labelled pull request for every content change, so each one is a reviewable diff.

  • Job openings

    The owner posts in a Careers tab and opens a bookmarked build hook. The change is live about 2 minutes later.

  • Branches

    Prices are rows keyed by item and branch, so refreshing one branch never touches another's.