Portfolio · concept build
Kamengrad — a house you build by scrolling.
Kamengrad is a website concept for a Belgrade construction company that builds turnkey, made from scratch: five pages, site footage that runs forwards and backwards with your scroll, a 3D model of the house with a technical drawing and a floor plan, projects that open, and a form that qualifies the enquiry. Plain HTML, CSS and JavaScript, no framework. Try it in the laptop below, then read how it was made. The site itself is in Serbian.
Kamengrad is a concept, not a client project. The company does not exist: the name, team, figures, projects, phone numbers and address are invented for the showcase. The photos come from Unsplash and Pexels, and both pieces of footage on the site belong to others and stand in for footage the company would shoot itself. The code, the 3D model and the design are real — that is the only part we claim. The enquiry form sends nothing and stores nothing.
At a glance
- Type — a website for a turnkey builder, aimed at a buyer still deciding who to trust with a house.
- Scope — five pages (home, about, services, projects, contact) plus a privacy policy. A scroll-driven construction film, a 3D model of a house, nine projects that open, and a form with two tap questions.
- Stack — HTML5, CSS and plain JavaScript, written from scratch. No framework, no bundler, no CSS library. The only third-party code is three.js, self-hosted and loaded on the services page alone.
- Language — Serbian, Latin script. Written in Serbian, not translated into it.
- Accessibility — text contrast over photos measured against a pure-white image, the worst case, and full
prefers-reduced-motionsupport.
The brief
We pictured the client who keeps showing up: a serious Belgrade builder, about thirty years in, working turnkey. Most of the work comes through word of mouth and listing directories, and the company's own website has been stuck somewhere around 2012. It is slow and cluttered, and there isn't one sentence on it that would convince anyone of anything.
The brief is easy to say and hard to pull off: build a site that feels like a firm you would trust to build your house without a second thought. Adjectives don't do that. Evidence the visitor can see for themselves does.
Where the competition falls short
Before drawing anything, we looked at how construction firms present themselves, from directory profiles to sites assembled in page builders. The same mistakes come up again and again.
| Usual | Kamengrad |
|---|---|
| The firm lives on someone else's turf: a directory profile, next to ten competitors. | Its own site and a name that sticks, from the mark to the domain. |
| A wall of text about "quality, professionalism and dedication". | Promises you can check: a fixed price, a deadline kept, the property registered in your name, a ten-year structural warranty. |
| A gallery of random photos with no data attached. | Every project opens: the photo, the specs, three sentences on what the problem was and how it was solved, and the same call to action. |
| A "process" of four icons and filler text. | A process you can watch: the house goes up on the home page as you scroll, and on the services page a model builds itself phase by phase. |
| The call to action buried in the footer. | One call to action, "Book a consultation", the same on every page, with what happens next right beside it: free, no obligation, a reply within one working day. |
| Zero technical groundwork for search. | Structured data, a sitemap, an FAQ marked up for search and an llms.txt, so AI search engines understand the firm too. |
A house built by scrolling
Every construction firm claims a clear process. Almost none of them show it. On Kamengrad's home page, in the section on how the company works, aerial footage of a building site pins to the screen, and the scroll decides the frame, not the clock. Scroll forward and the house goes up, from the dig through the foundations, the structure and the roof to the handover of the keys. Scroll back and it comes apart. Five phases light up alongside the film, and each one gets the same share of the scroll, however long it takes in the footage.
It is one video, not an image sequence, with a keyframe every half second so a seek never has far to go. The same footage as a WebP sequence would be around 11 MB; as video it is 2.98 MB on desktop and 1.10 MB on phones. Nothing downloads when the page loads: the film is fetched a screen before its section. Without JavaScript, with reduced motion or with data saver on, a photo of the finished house and the full list of phases stand in its place.
The footage there now belongs to someone else and stands in for the real thing. On a real project a drone flies the same saved route once a week, from the same spot, and those flights become the film. Only then may the copy beneath it say that the footage arrives with a weekly progress report.
A 3D model without a model file
On the services page, in a dark band headed "your house, before the first shovel", sits a model of a family house that turns under a mouse or a finger. It has three views: a scale model with a slider for the same five phases as the film, a drawing with lines and dimensions, and a floor plan, cut at 1.2 metres, with the name and area of every room.
The house is not a downloaded 3D file but data in the code: walls with openings, slabs and rooms. The scale model, the drawing, the plan and the construction phases all come out of that one description, so changing a wall changes all three views at once.
three.js is self-hosted and loads only once the section is a screen away: about 200 KB compressed, and zero bytes on every other page. The mouse wheel doesn't zoom; it scrolls the page, as it does everywhere else, and zoom sits on buttons. On a phone a horizontal swipe turns the model and a vertical one scrolls.
A sales funnel, not a brochure
Every screen answers the next question a buyer has before calling: what exactly do you do, can I trust you, what does it cost, and what if something goes wrong. On the home page that means, in order, the promise, the numbers, the people behind the firm, six services, four phases with real timeframes, the projects, six contractual commitments and three client voices. Every one ends in the same small step.
- One label everywhere. "Book a consultation" in the header, the hero, every band, the mobile menu and the form. It is checked automatically: a second label fails the check.
- "Learn more" opens the services page right at that service, with no slide down the whole page, and every service ends with a real example and a call to action that preselects the topic in the form.
- Projects open. Nine projects, each with its data and a short story. The same view opens from a direct link, from client testimonials and from the services page.
- A form that qualifies. Only a name, one way to reach you and consent are required. Two tap questions, what you are building and how far along you are, tell sales who to call first. After sending, a thank-you with your name and a call time worked out from office hours.
The look
We started deliberately dark: cinematic, heavy background, dramatic. It looked expensive on the first screen and started to tire the eyes three sections in. So we pulled back to what premium actually means: calm.
The final palette is ivory and graphite, with one accent, a weathered bronze, used sparingly. Dark bands stay only where drama earns its place: the hero, the film, the 3D model and the call to action. Light and dark are the same theme: dark sections simply redefine the same colour names, which is why switching the whole palette from dark to light was a one-file edit.
The signature is a 45° cut on the top-right corner, like dressed stone. It repeats on photos, project tiles, the model's frame and the main button. On the button the cut is drawn with a gradient rather than clipped, because a clipped corner would also cut off the keyboard focus ring.
The type is one family with a width axis: headings are drawn wider, for the visual mass of masonry, and body text at normal width. A third voice, monospace, is kept for technical data alone, dates, phases and labels, like the annotations on a drawing.
How it's built
From scratch. HTML, CSS and plain JavaScript — no framework, no bundler, no build step. The whole design system fits in one variable-driven CSS file. Fonts, images, footage and three.js are all self-hosted, and nothing is pulled from anyone else's server when a page loads.
Before every change the site runs 56 automated checks in a real browser: the fonts and the film, the mobile menu, the project filter, the form, the project view, the single call-to-action label, arriving at every service at two widths, and focus rings the 45° cut never clips. Alongside them run checks on heading structure, overflow at 320 pixels and the real dimensions of every image.
| What | How much |
|---|---|
| The whole site, 59 files | 12.4 MB |
| Footage: the hero, the film for desktop and the film for phones | 7.7 MB |
| Images and icons, 26 files | 3.0 MB |
| three.js, services page only | 834 KB · 200 KB compressed |
| Fonts — Archivo and IBM Plex Mono, six woff2 files | 229 KB |
| Our CSS and JavaScript, without the 3D model, compressed | 39 KB |
| First load of the home page, phone (390 px) | 1.65 MB · 29 requests |
| First load of the home page, desktop (1440 px) | 5.4 MB · 30 requests |
Source: file sizes on disk, and transfer measured in the browser on a first visit from a local server with the cache disabled, 3 October 2026. Of the 5.4 MB on desktop, 3.8 MB is the hero clip, which attaches only once the page has loaded, and only on screens wider than 768 pixels without data saver or reduced motion; phones never download it. The construction film is not part of the first load. Photos load straight away rather than lazily: that was a decision for the presentation, not an oversight, and a real project would weigh it again.
We measure Lighthouse on the published site and fill these in once we have. Until then there is a dash here, not an estimate.
Accessibility and craft
Contrast over a photo can't be calculated from colours, because the image changes underneath. So it was measured: every image is swapped for pure white, the text is hidden, and the real pixel under every line of text is read, at widths from 320 to 1920 pixels. The shading under the text was set from that measurement, not by eye.
Body text sits at 14.6:1 against its background; the accent at 5.3:1 on light and 6.7:1 on dark. The mobile menu keeps focus inside it, and Escape returns focus to the button that opened it. Every page has a single top-level heading and no skipped levels.
The Serbian is typeset as Serbian: no one-letter word is left at the end of a line, a number never parts from its unit, and the quotation marks are the Serbian kind, hung outside the text edge.
Under prefers-reduced-motion nothing moves: photos replace the hero clip and the film, and decorative hover movement is switched off too.
What this site doesn't have — and what a real one would
This is a concept, and everything that would sit behind the form does not exist. We say so because it is half the work on a real project, and none of it shows in a demo.
- No backend. The form checks its fields and shows a thank-you, but sends nothing and stores nothing. The thank-you in the laptop says when the company would call; that is text, not a scheduled call.
- No CMS. Projects, copy and team are written into the code.
- No footage or photos of its own. Everything is illustrative and comes from elsewhere.
- The map in the laptop is an image. On its own domain the site embeds a live OpenStreetMap map; exvisios.com's security policy refuses third-party frames, so the copy here shows the same view as a static image.
Were this a real job, the scope would include:
| What | Why |
|---|---|
| A form that really sends, with spam protection | Without it the site brings in nothing. The privacy policy already exists and describes what would be kept and for how long. |
| Drone footage on a saved route | Once a week, the same route, the same spot, the same time of day. Fifteen to twenty-five flights per building give the film on the site and a weekly report for the buyer. |
| Real photos of real buildings | A series from a single shoot per building. With it, each project can get a page of its own with a gallery. |
| The company's real data | Figures, phase timeframes, team and warranties, checked before launch. A site that promises a fixed price can't carry a single invented number. |
| The model of a real project | Because the house is described as data, modelling a real project means describing its walls and rooms, not new programming. |
| A CMS for projects | The company adds a new building itself, without calling the agency. |
What we deliberately left out
- Walls of words everyone uses and nobody checks.
- The three-icon feature grid with filler text.
- The endlessly scrolling logo strip.
- The cascade where everything pops in one by one as you scroll.
- A form with ten required fields.
- A gallery where nothing opens.
- A Ken Burns zoom on the hero photo, the most recognisable move in any template.
- Counters that count up from zero: until they fire, the site says "0 years of experience".
What this build proves
A construction company's website can show what others only claim: how a house gets built, what it will look like before the first shovel, and exactly what happens after the first call. Go into the site in the laptop above, scroll through the film on the home page, turn the model on the services page and send a test enquiry, then judge for yourself.
We follow the same method on every site: message and structure first, then design, then clean code that lasts. More on scope and pricing is on the web design page.
If you run a construction company and the work still only comes in through word of mouth, get in touch.