blessed_moon@studio
studio: Blessed Moon Studio
discipline: Strategy · Design · Engineering
stack: Next.js · Tailwind · WebGL
scene: ASCII moon · 5 keyframes
type: Space Grotesk / JetBrains Mono
accent: #ff6a1f
sound: muted
status: ready
B / S / MCASE_09 / 26

— Case study 09

F&A Móveis

A furniture catalogue where every measurement on the page is the real one

All work
f&a_móveis.capture● verified
F&A Móveis homepage hero with the Roupeiro Mônaco Plus and its real 2,30 × 2,40 m dimension lines

project overview

A catalogue site for a Rio de Janeiro furniture shop that sold entirely over WhatsApp from a dormant Facebook page. No cart, no checkout — every product page ends in a pre-filled WhatsApp message to the owner, and every centimetre shown on it is a real, sourced measurement.

shipped outcome

Live at fa-moveis.vercel.app with 13 real products — no illustrative filler left on the site — 3 from her own D'Doro line and 10 from a second Novo Horizonte supplier, priced against real supplier sheets and her own WhatsApp confirmations. 10 of the 13 carry a confirmed price; the remaining 3 show an honest 'Consulte o preço' rather than a guess. A production build measured Lighthouse 93 performance and 100 accessibility on /produtos, CLS 0, every product image under 32 KB against a 180 KB budget.

Role
Full-stack product engineering
Timeline
Ongoing
Year
2026
Team
Solo
The problem01

Fátima has run a neighbourhood furniture business for years with no website — just a Facebook page gone dormant since February 2022. She resells factory furniture, delivers it, and assembles it, and every sale already happened over WhatsApp. This was a paid client project on a tight budget where the demo had to come before the money: a working site built on her real brand and real stock, shown to her on her phone, was what won the job.

The approach02

The build is deliberately backend-less: a typed TypeScript catalogue in content/, no CMS, no database, no monthly bill. Every measurement is stored as a number in centimetres and formatted at the edge, never hand-typed as a string, and every wa.me link is built by one function reading her real phone number from a single content module. Nothing outside lib/catalog/source.*.ts is allowed to import a Shopify type, which is what makes a later Shopify upsell a one-module swap instead of a rewrite. Where a price wasn't confirmed, the page says so — 'Consulte o preço' — instead of shipping a plausible number.

The result03

Live at fa-moveis.vercel.app with 13 real products — no illustrative filler left on the site — 3 from her own D'Doro line and 10 from a second Novo Horizonte supplier, priced against real supplier sheets and her own WhatsApp confirmations. 10 of the 13 carry a confirmed price; the remaining 3 show an honest 'Consulte o preço' rather than a guess. A production build measured Lighthouse 93 performance and 100 accessibility on /produtos, CLS 0, every product image under 32 KB against a 180 KB budget.

— 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.

F&A Móveis homepage hero with the Roupeiro Mônaco Plus and its real 2,30 × 2,40 m dimension lines01 / 03
F&A Móveis homepage hero with the Roupeiro Mônaco Plus and its real 2,30 × 2,40 m dimension lines
F&A Móveis /produtos catalogue with category filters and real measurements on every card02 / 03
F&A Móveis /produtos catalogue with category filters and real measurements on every card
F&A Móveis product page for the Roupeiro Mônaco Plus, showing L × A × P measurements and the WhatsApp CTA03 / 03
F&A Móveis product page for the Roupeiro Mônaco Plus, showing L × A × P measurements and the WhatsApp CTA

— 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.

01

Scaffold on her real brand

Name, mark, the rose accent (#A87C7C), and a Didone serif were already hers, evidenced in her own Facebook video — the job was bringing an existing identity onto the web with better craft, never redesigning it from zero.

02

A typed catalogue, no CMS

content/produtos.ts, categorias.ts, ambientes.ts, and loja.ts became the single source of truth; components read only the domain Produto type, never a raw content import.

03

Real stock, real prices

The 27-product illustrative catalogue used to demo the concept was removed once real supplier stock replaced it — 3 D'Doro pieces from Fátima's own catalogue QR codes, 10 Novo Horizonte pieces priced from a supplier sheet with the same freight-and-tax markup used on an earlier sibling project.

04

The real-device checklist

A pass against the live deployment, not localhost, caught two defects invisible from a dev server: every WhatsApp message was shipping a literal localhost URL, and /produtos had no Open Graph card.

— System architecture

Clear boundaries, explicit responsibilities

Each layer has one job and a narrow contract. That keeps external services replaceable and product behavior testable.

Next.jsTypeScriptTailwind CSSRadix UIVercel
f&a_móveis.sys● online

roupeiro mônaco plus

240 × 230 × 55

l × a × p, em cm reais

preço

R$ 3.073 à vista

10 de 13 com preço confirmado

catálogo / 13

medida em cm[x]
preço confirmado[x]
wa.me único[x]
shopify fora do seam[x]
cms[ ]
da fábrica para a sua casa
Client

Next.js App Router

Server-rendered catalogue, product, and home routes — zero client components in the shipped build.

Catalogue

content/*.ts

Typed product, category, and store data — the only source any page or component is allowed to read.

Conversion

lib/whatsapp.ts

The one wa.me builder used by every product CTA, reading the phone number from content/loja.ts.

Hosting

Vercel

Fully static, no database, no auth — a production build fails on purpose if SITE_URL would resolve to localhost.

— What shipped

Product capabilities

01

Real measurements, formatted at the edge

Every dimension is stored as a number in centimetres and rendered as 'L × A × P' — never typed as a display string, never rounded by hand.

02

Honest pricing

10 of 13 products show a confirmed price; the other 3 say 'Consulte o preço' instead of a plausible guess.

03

One WhatsApp builder

Every product page, from any category, resolves through the same pre-filled wa.me link — no second place composes that URL.

— Engineering pressure

Challenges resolved

01

A localhost URL that shipped to production

An unset SITE_URL fell back silently to localhost, so the deployed site's own WhatsApp messages carried a dead link — caught by a real-device pass against the live URL, not the dev server, and fixed by failing the build outright on that exact misconfiguration.

02

Sourcing prices for stock that wasn't hers to guess

Novo Horizonte's 10 pieces needed real supplier-sheet numbers and the same freight-plus-tax markup logic already used on a sibling project — 3 items still show 'Consulte o preço' because that number wasn't confirmed yet, not because it was estimated.

03

Retiring the demo catalogue without losing the pitch

The original 27-item illustrative catalogue existed to win the job before real stock was ready; removing it once 13 real products existed meant the site never quietly kept selling furniture that wasn't actually in stock.

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