Same engine. A brand entirely its own.

Haramara is a specialty coffee and sourdough café in Cuernavaca, sister to Pacífica Panadería on the same street. It runs the same commerce engine: storefront, customer app, POS and Wallet loyalty. Nothing about it looks shared: a dark carbon, clay and brass identity, and a site that is fully bilingual without a translation plugin.

ES · EN · WordPress + WooCommerce · Expo customer + POS apps · Apple Wallet loyalty

Haramara shares an engine with its sister bakery down the street. Nothing about it looks shared.

  • The engine is the reuse

    The same core plugin architecture, apps, loyalty and Wallet system as Pacífica. The brand layer is entirely Haramara’s own: tokens, type, patterns, copy.

  • Bilingual by rewrite, not by plugin

    The English site is a virtual mirror at /en/: rewrites plus a language layer render every page from one translation dictionary. No duplicated page tree, nothing to drift.

  • Dark by design

    Carbon, clay and brass. Italiana display over Petrona text. Five atmospheric día patterns that walk the café’s day from horno to cierre.

The website

One site, two languages, no plugin.

Seven pages and a sixteen-product catalog, mirrored in English without duplicating a word of content.

  • A virtual /en/ mirror: rewrites strip the prefix, flip the locale and pass the render through a translation layer
  • One translation dictionary drives the entire English site
  • hreflang alternates on both languages, so search engines index the pair correctly
  • A dark token palette (carbon, espresso, walnut, clay, brass, bone) with Italiana and Petrona type
  • Seventeen patterns, including five atmospheric día sections: horno, filtrados, cueva, ocaso, cierre
  • A 16-product WooCommerce catalog: espresso, cold brew, filtrados, salados and especiales
  • Pickup ordering with a 2-hour lead time, Wednesday to Monday

In the pocket

The café, in the customer’s pocket.

The same app engine as Pacífica’s, wearing Haramara’s dark UI.

  • Four tabs: Carta, Canasta, Mis pedidos and Lealtad
  • Store API checkout sharing the web’s pickup slots, with checkout details persisted on device
  • Live order tracking: a push notification at every status change
  • A loyalty QR card with Add to Apple Wallet: the pass is built and signed in pure PHP
  • An APNs push on every stamp or redeem, so an installed pass refreshes itself

The counter

The same counter system, tuned for the café.

The six-tab tablet POS from the shared engine, adjusted where the café differs.

  • Entrantes: incoming orders with push alerts and slide-to-accept
  • Pedidos: a live pickup board by slot, driving status transitions
  • Mostrador: walk-in sales in cash or card, decrementing stock without touching slots
  • Inventario: recounts and salidas internas, with destinations tuned to this café: Malva, empleado, merma, otro
  • Lealtad: QR scanning to stamp and redeem
  • Corte del día: the daily close by channel and payment method, top sellers, valued salidas

What the second deployment proved.

Reuse is a claim until a second brand ships on the engine. Haramara is the proof.

  • Brand is data, not a fork

    Everything Haramara-specific lives in tokens, patterns, dictionaries and seed files. The engine stayed the engine, and both projects keep improving it.

  • 33 checks before deploy

    An end-to-end REST matrix exercises ordering, walk-ins, inventory guards, employees, loyalty and the Wallet web service: 33 checks on this project alone.

  • Fails honestly

    When Wallet certificates aren’t configured, the pass endpoints answer with a clean 503 and the app hides the button. No pretending, no half-working features.

  • Updates without the store

    GitHub Actions deploys the site per path; the apps take over-the-air updates through EAS between releases.

Under the hood

The stack, plainly.

Web
WordPress FSE theme theme.json tokens Italiana + Petrona WooCommerce Store API (MXN)
Bilingual
Virtual /en/ mirror Locale-aware rewrites Single translation dictionary hreflang alternates
Apps
Expo SDK 57 React Native 0.86 React 19 Shared TypeScript api-client Expo push EAS builds + OTA
Loyalty and Wallet
HMAC-signed QR tokens Pure-PHP .pkpass + PKCS#7 Apple PassKit Web Service APNs HTTP/2 Graceful 503 dark-state
Quality and delivery
PHPCS + PHPStan level 6 TypeScript strict checks verify-api.sh (33 checks) GitHub Actions Scoped rsync deploys

Straight answers.

Is this just Pacífica re-skinned?

It is deliberately the same engine, and deliberately not a re-skin. The identity, type, color system, page set and copy are Haramara’s own, and the business rules diverge where the café diverges: a 2-hour pickup lead, a Wednesday-to-Monday week, its own salida destinations. That split, engine versus brand, is our methodology. The Pacífica case study shows the engine at full depth.

Bilingual without a translation plugin?

Yes. /en/ is a virtual mirror: rewrites and a language layer render every page in English from one translation dictionary, with hreflang alternates for search. There is no second page tree to fall out of sync. Translation plugins were evaluated and rejected: they are weakest exactly where block themes live.

How does the loyalty card stay current in Apple Wallet?

The pass registers with a PassKit Web Service, and every stamp or redeem fires an APNs push, so the installed pass refreshes its own counters. The system counts stamps and redemptions; what a full card earns stays a human decision at the counter, deliberately not encoded.

Have a brand that deserves its own build?

Tell us what makes yours different. We’ll tell you what stays engine and what becomes brand.