← All work
Daitoku Ramen Food House Design + Full-Stack Build 2026

Daitoku Ramen Food House

The restaurant lived on rented platforms. This build gave it ground it owns.

Role
Designer, Full-Stack Developer
Year
2026
daitokuramen.com
Live
Rented ground to owned

Two rented platforms were the restaurant's entire web presence: a FoodPanda listing and a Facebook page.

Problem
Rented platforms decided the menu layout, the prices shown, even the opening hours. Nothing online belonged to the restaurant.
Built
First owned site, solo end to end: five-collection CMS, seven public routes, a journal, live at daitokuramen.com since 5 July 2026.
Result
Live since 5 July 2026, on a scaffold redeployed from the Platinum build.

Daitoku Ramen Food House is a ramen restaurant in Angeles City, Pampanga, run by the same family of businesses behind Platinum Trucks & Equipment. This build was solo end to end: research, spec, schema, backend, admin, design system, motion, copy, deploy. Design started in February 2026, development ran through the middle of the year, and the site went live at daitokuramen.com on 5 July 2026.

daitokuramen.com at launch. Permanent dark, type-led, with the logo's red on every conversion surface.
Build law

Two constraints shaped everything downstream, and the repo enforces both.

Build law 01

The site never transacts

0 forms, carts, or accounts

Ordering, payment, and delivery already work on FoodPanda, so rebuilding them would add legal liability for nothing. Every visitor path ends at FoodPanda, Facebook, a call, or directions.

Build law 02

Ship finished with zero assets

0 usable assets at design time

There were no logo files, no photography, and no verified hours. Every media slot renders a designed panel of seigaiha, a repeating Japanese wave pattern, instead. A real upload replaces it with zero code changes, and deleting it brings the placeholder back. The contract held until photos landed two days before go-live.

Daitoku Ramen Facebook page before the owned site
Daitoku Ramen FoodPanda listing before the owned site
Daitoku Ramen owned home page in a mobile viewport

The FoodPanda listing and Facebook page beside the live home page.

  • 77 Menu items, one database record each
  • 7 Public routes, full structured data
  • 2 Production incidents, documented below
  • 1 Developer, end to end
The incident log

Two production incidents, told straight.

Demos hide this part. Both incidents are in the repo with dates and reasoning, so anyone reading the history can see what broke and what closed it.

Incident 01 2026-07-04

Re-seeding renumbered the whole menu

What happened
The first seed run used implicit autoincrement ids, numbering the database assigns on its own, and journal posts reference menu items by id. Re-running the seed renumbered all 77 items, and a mid-article embed resolved to the wrong bowl with no error and no crash, so an article about tantanmen was selling a different item.
The fix
The seed now inserts explicit ids 1 through 77 and resets the sequence, so re-seeding lands identical ids every time and cross-table references survive.
What it left behind
This kind of bug stays hidden in a demo and surfaces in production content. It got caught before launch because every write path is checked against the rendered result rather than the API response.
Incident 02 2026-07-05

Admin briefly open during cutover

What happened
During cutover to the custom domain I edited the Cloudflare Access policy, the login gate in front of the admin, and left the new domain unmatched. For a window the admin was publicly reachable, until I fixed the policy.
The fix
The dashboard edit closed it the same day, and the engineering answer made it unrepeatable. The worker now independently verifies the signed Access token on every admin request, fail-closed, so a misconfigured or deleted policy degrades to a 403 instead of an open admin.
What it left behind
Both incidents taught defence in depth, and both are dated and reasoned in the repo's decisions log.

After deploy I put the codebase through a static security review and it returned 16 findings. I closed 10 of them in code, and the rest are documented as accepted risk with the reasoning written down.

The build

The spec came first, the plain build next, the design last.

  1. 01

    Research and a spec before any code

    Research ran as a tiered competitive pass: the PH-local tier to establish the floor, then the AFURI and Ippudo class for what good looks like. Out of it came the positioning, deliberately above the local floor and type-led because there was no photography to lean on. A full technical spec followed, with an open-questions section that names every unknown.

  2. 02

    Five tables, and nothing else

    Posts, menu items, promos, media, settings. Every collection earns its place against one test: does the family need to change this without a deploy? A price correction is a form field, and every save purges the affected edge cache, so "fix the price now" means now. The scaffold came proven from the Platinum build, same stack and same admin boundary.

    The Daitoku admin dashboard with journal pipeline, promo windows, and the five manage cards
    The unglamorous half that keeps the site honest. Every collection is reachable from one screen, with counts against each.
  3. 03

    Plain first, structured data from day one

    Seven public routes went up structurally complete and visually plain, so semantic HTML and full Restaurant, Menu, and Article markup before any design effort. One database row holds one price everywhere, so the menu page, the bestseller strip, and the journal's mid-article embed render the same record and a price edit can't go stale anywhere.

  4. 04

    Design system under a separation contract

    With zero real assets, typography, one strong colour, and the seigaiha wave motif had to carry the brand, and every media slot ran the placeholder contract from build law 02. Every colour, type, and spacing value resolves through one tokens file, so the owner's two calls, permanent dark and a rebrand to the logo's two colours, stayed value changes and never needed rebuilds. Red owns conversion everywhere, and the green stays decorative.

    Daitoku Ramen menu page with designed seigaiha media slots
    Daitoku Ramen signature bowls section with designed media slots
    Daitoku Ramen empty journal hub launch state

    Seigaiha panels sit in every slot a photo will eventually fill, so the zero-asset launch still looks designed.

  5. 05

    Motion that can switch itself off

    Award-site feel was the owner's ask, so the public layer got a cinematic hero, a full-screen nav takeover, and scroll choreography, all behind a reduced-motion gate with a CSS safety that re-reveals content even if JavaScript never runs. The same phase rewrote all 77 menu descriptions in an ingredient-led house voice and caught a tamago described as taro milk.

  6. 06

    Three posts, one bowl each

    Journals that launch empty advertise staleness, so launch meant writing: a broth-picker guide, a tantanmen explainer, and a first-order guide. Each one covers a single bowl and points at a single conversion. Body copy never carries a price, and the live embed stays the only price surface. The posts outgrew the template, so the article page became a three-column reading layout with a 700px measure.

    Daitoku Ramen journal hub at launch
    Daitoku Ramen tantanmen journal article with live menu embed

    The journal at launch, with three posts and the live menu-item embed as the only price surface.

The work

Public pages and the admin that keeps them honest.

Outcome

Live and built to outlast its launch.

No conversion numbers exist yet, since the site launched day one with zero marketing spend and no announcement, so this page carries scope and craft instead. A well-made brochure site already sits above the local floor, and this one has a working content engine behind it.

The build repeats, which is the part that carries forward. Platinum established the stack and Daitoku redeployed it against a different domain, so the setup has now carried two businesses.

The next brochure-plus-CMS build for a small business starts from a known-good admin and a build law that keeps scope from creeping into liability.

  • Live In production on a custom domain
  • 10 of 16 Audit findings closed in code, the rest accepted with reasoning
  • 2 Production incidents recovered, documented, made unrepeatable
  • 3 Launch posts, one bowl each
The site has been live at daitokuramen.com since 5 July 2026, and both production incidents are dated and reasoned in the repo's decisions log.
Live problems

What's on the bench right now.

The site is in daily use, so the work never fully closes. Two problems are open on the bench and one is solved and written up. Open a card to read where each stands.

Live 01 UI/UX research
Admin, menu

Menu prices, and what FoodPanda shows

  • Keep menu prices updated from the admin as the in-store menu moves.
  • FoodPanda lists different prices than the restaurant charges in-store, so the question is whether the site should say so.
Open question

Tell visitors that FoodPanda's prices differ, or let them find out on their own? The current lean is that the site carries the actual in-store prices and lets FoodPanda's listing speak for itself.

Live 02 In development
Admin, journal

A better tutorial for writing journal posts

  • Clearer in-admin guidance for creating blog posts, from draft to publish.
  • Done means staff can publish a post without a developer in the room.

Solved 03 Solved
Admin, media

Uploading a photo meant leaving the page

  • Adding a photo to a menu item or journal post forced a detour: leave the half-finished form, upload under Media, reload, come back, and find the file in a text-only dropdown.
  • Every media field now has Upload new and Choose existing in place, so the form is never abandoned mid-task.
  • Deleting a file now lists every place it's used first.

Live 01
Admin, menu

Menu prices, and what FoodPanda shows

Where this stands

The admin already edits menu prices, so what's left is keeping the site in step with the printed in-store menu as it moves. The harder half of the problem is FoodPanda, which lists different prices than the restaurant charges at the counter.

Approaches being weighed

  • Say it plainly on the site: delivery prices differ from in-store prices.
  • Carry only the in-store prices and let FoodPanda's listing speak for itself.
  • The trade-off is honesty against hosting a price comparison the site never asked for.

Open question

Tell visitors that FoodPanda's prices differ, or let them find out on their own? The current lean is that the site carries the actual in-store prices and lets FoodPanda's listing speak for itself.

Live 02
Admin, journal

A better tutorial for writing journal posts

Where this stands

The admin has guidance for writing journal posts, but it assumes a developer is nearby. The draft-to-publish steps are being rewritten inside the admin itself, where staff actually are when they need them.

The measure of done

Staff can take a post from draft to published with no developer in the room. Until that happens on its own, this stays open.

Solved 03
Admin, media

Uploading a photo meant leaving the page

The problem

The admin kept uploads and content on separate pages. To put a photo on a menu item or a journal post, staff had to leave the form, upload the file under Media, wait for a reload, come back, and pick the file out of a dropdown that showed nothing but text descriptions.

The editor is thinking add this photo to this item. The interface was answering create a library file first, then point at it. The screen was describing the storage model instead of the task, and it put unsaved work at risk on every trip.

The dropdown was its own problem. Asking someone to recall a photo from a written description instead of recognizing it by sight goes against a basic usability principle, recognition over recall. For images especially, that is backwards.

What I looked at

I compared how the editors people already know handle this exact moment. Shopify puts upload and choose-existing inside the product form itself, and it separates remove from this product from delete from the store. WordPress does the same at the point where an author inserts an image. Both keep a central library for housekeeping, but neither makes it a required stop. Jakob's law applies here, since staff spend most of their screen time in other tools, so the admin should behave the way those tools taught them to expect.

Government form guidance was useful for the unglamorous parts: keep a plain file input working underneath any enhancement, state the file rules before upload rather than after failure, and make waiting, success, and error states readable to everyone, including screen readers.

I also weighed the opposite direction, dropping the shared library and attaching files straight to each record, and rejected it. Reuse is real here, the same bowl photo appears on the menu and inside a journal post, and Tesler's law says that complexity has to live somewhere. One managed library beats the same file pasted into five records.

What was chosen and why

One picker on every media field, with Upload new or Choose existing right there in the form. Choosing shows searchable thumbnails, newest first, so picking works by recognition. Uploading shows an honest waiting state and puts errors beside the field they belong to, so the system's status stays visible.

The record still saves only when the editor says so. A new upload attaches to the field immediately, but nothing about the menu item or post is committed behind the editor's back. That keeps control where it belongs.

Remove and delete were split deliberately. Remove clears one field on one record. Delete permanently only unlocks once a file is used nowhere, and the library lists every place a file appears first. That is error prevention, so the destructive path shows its consequences up front.

The old dropdown stays underneath as a fallback. If the enhanced picker ever fails to load, the form still works the way it always did.

Outcome

The task now matches the sentence in the editor's head: open the record, add the photo, save. It happens without a page change, a reload, or retracing steps.

I won't dress this up with numbers that were never measured. The gains here are structural. The detour is gone, unsaved work no longer has to survive a round trip, and deleting a file can no longer break a published post without warning. The next measure is watching restaurant staff use it.