Premium furniture & interiors
Umporta
The public site umporta.com and a private iPad tool for showroom consultants run on one system: the catalogue, the client visit, the lookbook, and a sale that an administrator confirms.

The home of Yılka and Orix in Uzbekistan, with everything built around them.
Umporta does not sell furniture; it finishes rooms. A sofa arrives from Istanbul, an armchair from Bursa, and the doors, kitchens, mouldings and walls around them are made at Umporta’s own factory outside Tashkent, since 2006, from an Italian wood-based material, all in one tone. We built the system that carries that promise: the public brand site and a private tool for the consultants in the Yunusabad showroom.
Product strategy · UI/UX design · Full-stack engineering · Offline iPad tool
Only the founder could really sell.
That is how the owner’s brief put it. The task was stated plainly: turn his way of selling into a system, so the business stops depending on one person.
The system is built for showroom consultants working in it from several tablets at once.
Online the difficulty is the same: Umporta’s value is not an item but the finished room around it. A storefront with a product grid, a price and a cart would have described a different business, and a smaller one.
We chose the room over the product grid, and the visit over the cart.
We built the site the way the showroom actually works. The idea comes first, then the houses it is built from, then rooms assembled around one chosen piece, and only then an invitation to come in.
Structure discovery around finished rooms, not a conventional product grid.
Make showroom visits and measurement calls the primary paths instead of forcing a cart.
Build the consultant tool as an iPad app that keeps working without a network.
Keep private prices out of public code, so they cannot reach the site.
This is Umporta’s design, rebuilt from its own code.
The window below is not a picture. The fonts, colours, radii, a partner spread from the public site and the consultant tool’s material picker with its bronze ring are rebuilt live from Umporta’s source. Beside it are screenshots of the public umporta.com to compare against.
Yılka
Стамбульский дом мебели и интерьерной архитектуры с 1952 года: глубокая посадка, набивка вручную, благородный лён, бархат и мрамор — целые интерьерные сцены, а не отдельные предметы.
Реализованные виллы и резиденции в Дубае, Катаре, Саудовской Аравии и Центральной Азии. В Узбекистане — эксклюзивно в UMPORTA.
This is not a screenshot: it is live HTML and CSS rebuilt from Umporta’s source. Pick a material, and the bronze ring traces it as it does in the consultant tool.
- Fonts
- Italiana · 400
- Cormorant Garamond · 300–700
- Manrope · variable
- Colours
- --paper #f6f0e4
- --ivory #fbf8f1
- --cream #efe7d6
- --ink #1c1813
- --walnut #3d2f22
- --bronze #8b6f47
- --burgundy #5e2a26
- --mute #968874
- --ink-body rgba(28, 24, 19, 0.74)
- --line rgba(28, 24, 19, 0.14)
- Radius
- 3px · .nav .cta
- 50% · .sw
- Motion
- cubic-bezier(0.22, 0.61, 0.36, 1)--ease-signature
- 700 msdrawRing()
- Source
- app/globals.css
- lib/fonts.ts
- app/[locale]/(public)/web.css
- app/consultant/consultant.css
- lib/consultant-card.ts (DEFAULT_SWATCHES)
- components/consultant/ProductScreen.tsx
- lib/brands.ts


We closed the places where a sale could quietly break.
One product serves two opposite environments: a public brand site and a private, offline-first showroom system for consultants.
- Surfaces
- Public website and private consultant iPad PWA
- Core
- Next.js, strict TypeScript, Supabase and one validated catalogue model
- Resilience
- Custom service worker, local visit state and a reconnecting outbox
The showroom keeps working offline
The catalogue is cached, an active client visit survives a reload, and outgoing actions wait locally until the connection returns.
The server owns every sale
The server recalculates totals, an administrator confirms the order, stock follows the confirmed state, and repeated submissions cannot create a second sale.
Prices cross an explicit firewall
Public code does not import private pricing. A consultant controls whether a client artefact includes prices, and the server validates that choice again.
Catalogue data stays canonical
The source catalogue remains read-only. Idempotent sync steps create application assets, mirror imagery and validate the resulting model before it ships.
An order does not drift with the exchange rate
Every sale stores its amount in dollars and in sum. The rate is written into the order when it is drawn up. The total in soʻm (UZS) is computed from that rate alone, at confirmation and at every later change to the order. Each payment carries its own recorded rate and is converted to dollars at that rate.
Tomorrow’s rate cannot change yesterday’s order.
The soʻm rate comes from three sources
The system takes the official rate of the Central Bank of Uzbekistan; if that fails, a free exchange-rate service; after that, the rate set in the system’s settings. An administrator’s manual rate outranks all three. A rate outside 8,000–25,000 sum per dollar is discarded as a fault.
A rate of 1 sum to the dollar from a failing service never reaches a client.
The storage changed while the showroom kept working
The new database was installed alongside the old files but kept switched off, so the showroom’s work did not change.
The storage changed; every sale kept its number.
A catalogue from unreadable PDFs
The catalogue was assembled from supplier PDFs whose text could not be read, so the pages were parsed from the image. When it was assembled it held 234 records; 144 had their names checked against the Orix and Yılka websites. Doubtful records are marked and go for review. The first rule is to invent nothing. An empty, marked field is better than a guess.
Where the source is silent, the catalogue shows a marked empty field, not a guess.
A new field cannot go missing
An automated check reads the code and requires each of the 24 fields that one database update added to a sale to be named in all five places: write, update, read, export and format validation. A second check creates a separate empty database for the run, fills it with records in the old format, applies the change and confirms nothing was lost.
A field added to a sale cannot vanish silently on write or export, and old records survive the move.
7 database migrations · 10 tables · 34 pages · 13 server routes · 158 commits. Counted by us from the repository on 26 September 2026.
If the showroom loses its connection, the sale is still not lost.
If the showroom loses the internet, the visit carries on: the catalogue is already on the tablet and actions wait for the network. A second tap cannot create a second sale; the server recalculates the total and an administrator confirms it. Private prices cannot reach the public site, and tomorrow’s exchange rate cannot rewrite yesterday’s order.
Want a system like this for your business?
Describe the problem in two or three sentences. We reply the same working day and suggest a time to talk.
Reach usDiscuss your project on Telegram
- We reply the same working day, Tashkent time.
- You write to Nodirkhon; he brings in whichever of us your problem needs.