Oishi's entire web presence was a Linktree-style page and a one-screen Canva site. Its menu and four price tiers lived only inside JPEGs, reservations arrived by phone, and delivery ran through a third-party app. Its real differentiator — a genuine, checkable anti-waste discount — had nowhere on the internet to be said out loud.
— Case study 08
Oishi Cozinha Japonesa
A rodízio's anti-waste pricing, built as the whole site's thesis

project overview
A marketing site for a São Gonçalo rodízio restaurant with 17K Instagram followers and no website — every price, hour, and menu item is real, and the one thing the site exists to say is a real discount: R$ 20 off per person if the whole table finishes what it orders.
shipped outcome
Live at oishicozinha.vercel.app across five routes — home, cardápio, two rodízio chapters, reserva, and contato — where every price tier renders both numbers and the real condition, the reservation form ends in a pre-filled WhatsApp message, and the still-open questions about hours and party limits stay visibly marked rather than silently answered.
- Role
- Full-stack product engineering
- Timeline
- Ongoing
- Year
- 2026
- Team
- Solo
The whole site is built around one sentence already true of the business: 'Coma tudo o que pedir. Pague menos por isso.' Every rodízio tier always shows both prices together with the condition spelled out, never the discounted number alone — R$ 74,90 struck through, R$ 54,90 live, 'sem desperdício' underneath. Reference photography couldn't carry the site — 44 real photographs were graded by mean luminance with ffmpeg, and two-thirds measured too dark for a full-bleed hero — so the design is type-led and colour-led instead, with the brand's own sampled hinomaru gradient (#9A1114 → #E71B23) doing the work a professional photo shoot usually would. Every fact that wasn't confirmed — an exact phone digit, reservation party limits, a neighbourhood detail — renders as an honest '[a confirmar]' inline rather than a plausible guess.
Live at oishicozinha.vercel.app across five routes — home, cardápio, two rodízio chapters, reserva, and contato — where every price tier renders both numbers and the real condition, the reservation form ends in a pre-filled WhatsApp message, and the still-open questions about hours and party limits stay visibly marked rather than silently answered.
— Interface evidence
The product, not a placeholder
These are the verified interface captures from the project build. Scroll inside taller frames to inspect each complete page.





— Delivery process
From operating constraint to shipped system
The work is sequenced around risk. Domain rules and failure states come before interface polish; automation arrives before handoff.
Measure before designing
44 reference photographs were graded by mean luminance with ffmpeg before any layout decision — 15 survive full-bleed, 20 work only in a framed panel, 9 are thumbnail-only, and none show the room or the team.
Sample the brand instead of choosing it
The hinomaru's red is a real vertical gradient sampled from the logo itself, not a stock 'Japanese red' — measured at 3.17:1 contrast on the ground colour, which is why it's reserved for fills and display type rather than body copy.
Build the two-price component once
Every rodízio tier renders through one component that always shows both prices and the verbatim condition — never the discounted number alone, never the full price without the offer beside it.
Register every allowed fact
A data-inventory document tracks every price, hour, and detail the site is allowed to state, each with its source — anything not in that register doesn't reach the page; it renders as '[a confirmar]' instead.
— System architecture
Clear boundaries, explicit responsibilities
Each layer has one job and a narrow contract. That keeps external services replaceable and product behavior testable.
rodízio chisai
R$ 74,90 R$ 54,90
sem desperdício — mesa toda
fotos usáveis
15 de 44, medidas
saídas / 3
Next.js App Router
Five static routes — home, cardápio, rodízio/[slug], reserva, contato — no server data, no database.
GSAP + Lenis + Motion
Scroll-scrubbed cinema on the home route, smooth native scroll everywhere, component-level hover and reveal motion.
Typed TS, no CMS
Menu, prices, and facts live in src/content/, gated by the same 'never invent a fact' rule enforced across the codebase.
lib/contato/whatsapp.ts
The one wa.me builder every CTA on the site resolves through — delivery and reservations both terminate here.
— What shipped
Product capabilities
The two-price component
Every tier always shows the full price, the anti-waste price, and the real condition together — never one number alone.
Luminance-graded photography
Every photo on the site is shown at the size its own measured brightness actually supports, never stretched past its tier.
Honest unresolved facts
An unconfirmed hour, phone digit, or reservation rule renders as a visible '[a confirmar]' instead of a plausible placeholder.
— Engineering pressure
Challenges resolved
A phone number that disagreed with itself
WhatsApp deep links and two social posts gave one number; two printed flyers gave another. The conflict is contained to one builder function so the site can ship around it without resolving it everywhere it's used.
Designing without a photo shoot
Two-thirds of the 44 reference photographs measured too dark or too inconsistent for a photography-led design, so the entire visual system had to carry the brand through type and colour instead of imagery.
Keeping the discount honest, not just prominent
The anti-waste price only applies if the whole table finishes its food — showing R$ 54,90 without that condition would be a false price, so the condition is structurally part of the same component, never separable copy.
verified project destinations
next transmission
Need a system this deliberate?
Bring the operating problem. We will shape it into a clear product brief and a buildable next step.
Start a project