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
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.
Two constraints shaped everything downstream, and the repo enforces both.
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.
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.
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
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.
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.
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 spec came first, the plain build next, the design last.
- 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.
- 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 unglamorous half that keeps the site honest. Every collection is reachable from one screen, with counts against each. - 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.
- 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.
Seigaiha panels sit in every slot a photo will eventually fill, so the zero-asset launch still looks designed.
- 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.
- 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.
The journal at launch, with three posts and the live menu-item embed as the only price surface.
Public pages and the admin that keeps them honest.
Permanent dark on the owner's call, the logo's red as the one interactive accent, kanji only as honest typography. Exactly one loud band per page.
Five collections behind Cloudflare Access with fail-closed JWT verification. Built so a price fix never waits on a developer.
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.
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.
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.
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.
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.
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.