A car broker who keeps his stock up to date from a chat window
The site for a one-person vehicle broker in Prague: stock served from a database, two languages for one market — and a car that goes live from a Telegram link.
- Web design
- UX design
- Frontend development
- SEO
- Performance
- Role
- Concept, design & development: DeNitro
- Scope
- 4 areas, 2 languages, stock from a database
- Stack
- Next.js, TypeScript, Postgres (Neon), Drizzle
Cartur brokers used cars between Germany and the Czech Republic — sourcing, import, sale — run by one person in Prague. The stock is small but never still: a car is on offer for a few weeks and then gone.
That rules out the usual website answer. Anyone who creates every vehicle as a hand-maintained page ends up maintaining nothing — and a broker who inspects and transports cars is not sitting in a CMS in the evening.
Then there is the language situation of the market: customers speak Czech and Ukrainian, but they buy in the same country, at the same price, in Kč. This is not a two-country setup, it is one market with two languages.
The stock belongs in a database, not in pages. Three tables: the vehicles with their numbers, the descriptions per language, the image gallery with the dimensions the image pipeline needs in order to reserve the space in advance. The mileage is deliberately not in the translation table — the Czech and the Ukrainian listing describe the same car and must not contradict each other about its figures.
A single condition decides visibility: the `published` field. It keeps a half-entered vehicle out of the grid, out of the sitemap and out of the structured data at the same time — instead of three places you can forget one by one.
Czech runs unprefixed at the root, Ukrainian under /uk with the language code uk-CZ rather than plain uk: this is Ukrainian for the Czech Republic, and prices stay in Kč in both languages.
The design follows a tight rule set written down in the repository: no small labels above headings — anything important enough belongs in the heading — and exactly one red action per view. Two red buttons side by side and neither of them reads as the next step any more.

Four areas: home, vehicle stock with a detail page per car, a guide in three chapters (importing from Germany, what it costs, how to inspect a used car before buying) and contact. The guide chapters live as typed data in the code rather than as free text — heading hierarchy, anchors and the article markup are derivable without executing the text.
Search requirements are part of the architecture, not a pass afterwards: canonicals, the hreflang pair across both languages, static rendering, and the vehicle markup as Car and Offer nodes. The list and the detail page read the same node — a car cannot claim one price in the grid and another on its own page.
Listing happens over Telegram. The owner sends the link to a marketplace listing into the chat; the vehicle lands in the database with its data and photos and goes live on release — grid, detail page, sitemap and structured data in one step. This is the part that makes the site maintainable at all: the operator's only task is pasting a link.
Layout without a fixed content width: every section is a field inset from the edge of the screen, and the page scales with the viewport instead of jumping between breakpoints. Headings are set in a narrow condensed face, body text in a quiet grotesque — both with a Cyrillic cut, which here is a requirement rather than a preference: the same components typeset Czech and Ukrainian.

The bot the inventory is kept in
The part of the project that has no web page: the inventory is not maintained in a back office but in a Telegram chat. Three screens from everyday use.
What was built
Everything that is in Cartur — conceived, designed and built by DeNitro.
- Four areas: home, vehicle stock, buyer's guide, contact
- Vehicle database with separate tables for figures, text and gallery
- Vehicle detail pages, pre-rendered from the database
- Bilingual CS/UK for one market, including the hreflang pair
- Telegram integration for listing a vehicle from a link
- Release logic: one condition for grid, sitemap and markup
- Three-chapter guide as a typed content model
- Car and Offer markup including the breadcrumb trail
- Image pipeline with dimensions and blur placeholders
What that changes
Four points where the work is readable in the interface itself. Figures on enquiries, revenue or rankings are deliberately absent — we do not publish our clients' business numbers.
Maintenance without a CMS
A vehicle goes live from a link in a chat. The operator opens no back office to do it.
One condition, three effects
`published` keeps an unfinished car out of the grid, the sitemap and the structured data at the same time.
Two languages, one stock
Figures are stored once, descriptions per language — the two listings cannot contradict each other about mileage or price.
Static despite changing stock
Pages are pre-rendered from the database and refreshed every five minutes instead of being computed on every request.
The stack behind Cartur — and the decisions that mattered enough to write down.
- Next.js App Router with TypeScript; stock pages are pre-rendered from the database and revalidated every 300 seconds.
- Postgres at Neon, connected through the Vercel Marketplace; schema and migrations via Drizzle.
- Three tables: vehicle data, per-language translations, and an ordered image gallery with width, height and blur placeholder.
- A single data module knows both the table shape and the UI shape; every read filters on the `published` field.
- Bilingual routing with no prefix for Czech and /uk for Ukrainian, hreflang uk-CZ, and a permanent redirect away from the redundant /cs.
- Structured data as Car and Offer nodes, shared by the list and the detail page.
“Mit den Jungs zu arbeiten war unkompliziert: schnell gemacht, sauber umgesetzt, und rausgekommen ist ein richtig gutes Produkt. Meinen Bestand pflege ich heute aus dem Chat — Foto rein, und das Auto ist online.”"Working with these guys was easy: done fast, built properly, and what came out is a genuinely good product. These days I keep my stock up to date from the chat — send a photo, and the car is online." (Our translation; the original is German.)
Where is your digital growth leaving money on the table?
In 15 minutes we look at where customers find you today, where the potential is being lost, and which lever is worth pulling first: website, SEO & GEO, conversion or automation. You leave with a clear next step — even if we are not the ones who take it with you.


