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.
- Role
- Product + Engineering
- Timeline
- March to June 2026, derived from file history
- Live URL
- trylumiai.ro ↗ / trylumiai.eu ↗
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.
- Livetrylumiai.ro (2 locales) and trylumiai.eu (4 locales)
- Build windowMarch to June 2026, derived from file history
- Handed offN/A, in-house product, ongoing
- Owns the codeBilal Studio
BUILT WITH
Want an AI product built right?
Next project
Noor Clinics