All Work
AI PRODUCT / RO + EU SELF-INITIATED PRODUCT

Lumi AI.

An AI voice receptionist product for Romanian dental clinics, built end to end: product site, a hand-written WebGL orb, and a build pipeline that ships two crawlable languages from one deployment across two domains.

ProductWebGLSEO Engineering
Role
Product + Engineering
Timeline
March to June 2026, derived from file history
Live URL
trylumiai.ro ↗ / trylumiai.eu ↗
Lumi AI homepage with the WebGL orb

01 / THE REQUEST

Missed callsare lost patients.

Dental clinics in Romania lose bookings to unanswered phones during peak hours. The product: an AI receptionist that answers every call, day or night, and a site that has to sell that idea to two audiences in two languages without reading as two separate products.

02 / THE PROBLEM

One SPA,invisible to crawlers.

Locale is chosen by hostname: trylumiai.ro serves Romanian, trylumiai.eu serves the Kurdish-language build (src/i18n.ts:14). That works for a human visitor whose browser already resolved a hostname, but a crawler indexing a single-page app sees whatever the server renders first, which on both domains was the same static shell. Search engines would have seen only one language, no matter which domain they crawled.

03 / THE CHALLENGE

A shader orb,and a language fork.

The centerpiece is a hand-written WebGL 1 fragment shader, no three.js. It runs fractal Brownian motion through a rotation matrix to kill the axis banding a naive FBM produces, layers two levels of domain warping on top, and displaces an SDF sphere radius with live microphone input, with the bass isolated as the first 12% of FFT bins (src/components/LumiOrb.tsx:41-79,243-269).

The other half of the challenge is the language fork. A custom Vite plugin forks dist/index-en.html at closeBundle (vite.config.ts:5-25), and Vercel serves the right static HTML per domain based on a Host header match (vercel.json). One build, two domains, two crawlable language variants, no server-side rendering framework needed.

The .eu build adds a fourth language: a self-hosted Rabar Sorani face reachable at the URL segment kd but shipping the correct ckb lang attribute (src/lib/language-routing.ts:4-11), and metric-overridden local fallback fonts to suppress the layout shift Arabic-script font swapping causes (src/index.css:18-43). A prebuild script fails the build if the public AI-readable docs drift from the source data they describe (scripts/check-public-facts.ts:60-65), so a stale claim cannot ship.

04 / THE SOLUTION

What gotbuilt.

Hand-written shader orb

A WebGL 1 fragment shader with domain-warped FBM and a live-audio-driven SDF radius. No three.js runtime.

Hostname-based language fork

One Vite build, forked into crawlable static HTML per language at closeBundle, served by Host header.

Four-language delivery on .eu

Romanian, English, Arabic and a self-hosted Sorani face with correct lang attribution.

Fact-drift build gate

A prebuild script fails the build when public AI-readable docs disagree with source data.

05 / THE RESULT

Live ontwo domains.

BUILT WITH

React 19Vite 8TypeScriptTailwind 3.4.1Framer Motion 12WebGL 1Upstash Redis

Want an AI product built right?

Next project

Noor Clinics