All work

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
[01] Starting point

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.

[02] Approach

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.

Vehicle stock on cartur.cz: a BMW X3 M40i xDrive with a photo gallery, the price in Kč and the key technical figures beside it.
The stock: every row comes out of the database rather than out of a hand-maintained subpage — price, mileage, year, fuel, transmission and drivetrain are stored once as figures and read identically in both languages.
[03] Execution

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.

Vehicle detail page on cartur.cz with an image gallery, the Czech description, expandable sections and the price card with its purchase action.
The vehicle page that goes with it: twelve photos out of the same gallery table, the description per language, the expandable sections for service history, equipment and technical data — and on the right the price card with the status „Skladem“ (in stock).
Automation

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.

  • A Telegram chat with the „Cartur Cars“ bot: the card for a BMW X3 M40i xDrive with price, year, mileage and a link to its page, and below it buttons for price, description, status and „hide from the website“.
    One vehicle in stock: 1,025,000 Kč, 2022, 92,890 km, 12 photos — and under it the actions that would otherwise need a back office. „Skladem“ is the status; „Na webu: ano“ means the page is live.
  • The same bot while a new Audi A4 40 Avant is being entered: every vehicle field as its own tappable button, with a message above saying everything is filled in and ready to publish.
    While a car is being entered the bot walks through the fields — make, model, year, mileage, price, fuel, transmission, body, location. Once they are set it reports „Vše vyplněno — můžeš publikovat“: ready to go live.
  • A notification in the same chat about a new review on the website, with stars, the vehicle, and buttons for „hide from the website“ and „all reviews“.
    Not only vehicles: when a review arrives on the website it lands in the same chat — seen before anyone goes looking for it, and with one button to take it down again if something is wrong.
Scope of work

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.

Technical

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.)

ArturInhaber, Cartur

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.