Back to cases
The hostel’s garden terrace in the evening: wooden tables and chairs, candle lanterns and strings of bulbs between the trees
Cabbage Hostel · Belgrade · 2026 · demo

I rebuilt a hostel website around the questions guests ask

A 48-bed hostel in Belgrade, opened by friends of mine. The old site showed the rooms in photos; the new one answers guests’ questions before they book and passes the dates, guests and room on to the booking system.

119
URLs: 17 page types in seven languages. The old site’s sitemap had 86
92 → 97
home page accessibility score in Lighthouse
14
reviews checked word for word against the platforms. None of the old site’s 12 quotes matched exactly
0 → 4
booking details the site passes to Cloudbeds: language, dates, guests and room. The old one passed none

The site hasn’t launched: the second-version demo is hidden from search engines, and the hostel’s domain still runs the old site. There are no results yet — below are the old site’s baseline metrics, which I’ll compare against.

Whose projectMine: I built it on my own initiative; the hostel didn’t commission it
The hostel48 beds: six dorms and an apartment, a coworking space on the top floor. Opened by friends of mine in 2023; I was with them at every stage
WebsiteMy friends built the first site themselves on the Duda website builder. In 2026 I decided to help them and improve it all: the new one is custom Python code, with no site builder or framework
My roleProduct, decisions and sign-off are mine; the code is written with Claude Code to my briefs

My part

Research

An audit of the old site, the baseline metrics, a review of 25 hostel websites and a check of what Cloudbeds can do.

Website

Structure, copy in seven languages, the room filter and comparison, the group room plan, design system, logo and icons from the designer’s source files. I wrote the phone-first layout, the generator and the Netlify functions with Claude Code to my briefs and signed them off myself.

Facts

The fact file, checking reviews and ratings against the platforms, and routes from the transport map.

ProductContentDesign systemPythonNetlifyCloudbedsPhone first7 languagesMicrosoft ClaritySearch ConsoleSpeculation RulesView Transitions

I build websites now and then. If you need one like this, email max@kottov.net and I’ll tell you whether I can take it on.

01 · Start

Nearly everyone arrives on a phone, from ads on Instagram and Facebook

I took the baseline before the redesign: 30 days of Microsoft Clarity data to 16 October and three months of Google Search Console data to 13 October. Four Meta ad campaigns brought about 8,000 of the 9,574 sessions: someone sees a post, taps it and opens the site inside the social app.

Phone
94%
of sessions are on a phone. 84% of page views happen inside the Instagram and Facebook in-app browsers.
Depth
1.32
pages per session. Active time: 13 seconds of a 52-second visit.
Speed for real visitors
8.7 s
until the main content appears (LCP). Layout shift 0.34; 12% of sessions hit JavaScript errors.
Search brings almost no new guests · Search Console, July — October 2026
268 of 317
clicks from Google in a quarter came from searches for the hostel’s name. For “hostel belgrade” the site ranks seventh and gets fewer than one click per hundred impressions.
What else the audit of the old site found
Facts contradicted each other

Kitchen from 7:00 and from 8:00, luggage until 21:00 and until 23:00, laundry €8 and €5 — it depended on the page.

One booking link

All 86 pages sent guests to the same Cloudbeds URL, with no language, dates or chosen room. Guests had to enter it all again.

Ratings without a date

The home page showed 9.2, 4.7 and 9.1. The platforms now show 8.7 on Booking.com, 4.5 on Google and 8.7 on Hostelworld.

Markup

Exactly one H1 heading on only 28 of 86 pages. 755 of 2,486 images had no alt text.

02 · Before and after

First screen: a photo of a room and three platform ratings, with the date form a little further down

Phone screenshots: the old site on 1 November, as guests see it, with the cookie banner at the bottom; the second version of the new one on 5 November 2026. The home page opens with a photo of a dorm with a balcony — I brought it back from the old site — and the Booking.com, Google and Hostelworld ratings with review counts. Below come the photo tour, a WhatsApp button and the date form with the “from €10” price. The booking button appears at the bottom edge once you start scrolling and hides while the form is on screen.

The old home page on a phone: a full-screen dorm photo with the heading and booking button on top, and a black cookie banner at the bottom
Before · home
The new home page on a phone: a photo of a dorm with the balcony door open, with the heading “Your Belgrade home, full of new friends” and the Booking.com, Google and Hostelworld ratings with review counts on top
After · home
The old rooms page on a phone: a full-screen dorm photo, the heading, the start of the text and a cookie banner
Before · rooms
The new rooms page on a phone: the heading “Hostel rooms & dorms in Belgrade from €10”, what every bed has, the “Choose your room” and “Choose dates” buttons and a photo of a dorm with a balcony
After · rooms
Before and after
Old site on a website builder
  • 86 URLs in the sitemap, seven languages
  • every button uses the same booking link
  • review quotes nobody checked
  • facts differ from page to page
  • a single H1 on 28 of 86 pages
→
New site in code
  • 119 URLs: 17 page types in seven languages
  • new pages: events, getting here, a before-you-arrive guide
  • booking receives the language, dates, guests and room
  • 14 reviews found on the platforms, quoted in full
  • facts from a single source, disputed ones flagged
  • one H1 per page and alt text for every image
  • all 87 old URLs from the old site’s source lead to the new ones
  • on phones, buttons at least 44 px, fields at least 52 px, filters without swiping
03 · Answers

Every common question gets its own block or page

My redesign brief set out five guest scenarios: choose a dorm, find a women-only room with an en-suite bathroom, move between pages without losing the dates, learn the price and cancellation terms, and work out what to do when arriving late. The site map follows from them.

Guest’s questionWhere the answer is
“Who sleeps in the dorm, and where’s the bathroom?”
RoomsA card for each of the six room types: who sleeps there, how many beds, the size, where the bathroom is. A filter and a comparison table
“How do I get here from the airport?”
Getting hereFrom the airport, the railway station and the bus station: bus and trolleybus numbers, stops, and buttons for Google, Apple and Yandex Maps
“There are thirty of us — will we fit?”
GroupsA plan of the 48-bed house spreads the group across whole rooms, and the request goes to WhatsApp as ready-made text
“Can I live and work here for a month?”
Coliving and coworkingThe top-floor coworking space is open around the clock. Pick 7, 14 or 30 nights and booking opens with those dates
“What’s on in the evening?”
EventsNine kinds of evening with photos and posters: live music, films, a treasure hunt, a rooftop barbecue. Announcements go on Instagram
“Can I cancel my booking?”
Before you arriveThe two rates and what each allows, a guide built from the trip dates, late arrival and luggage storage
“Is there a lift?”
FacilitiesThe house floor by floor: there’s no lift and the floors are linked by stairs — and guests see this before booking
Site map · new pages

Choose and book

  • Home
  • Rooms
  • Reviews
  • Photos and house tour
  • Facilities and prices

Longer stays and groups

  • Coliving and coworking
  • Groups
  • Events
  • Volunteers
  • About the hostel

Arriving and house rules

  • Getting here and what’s nearby
  • Before you arrive
  • House rules
  • Kitchen rules
  • Official information
  • Privacy policy
  • Site map

Plus a “not found” page in every language. Wherever possible, page URLs match the ones Google has already indexed for the old site, and the remaining old URLs redirect to the new pages.

The “8-bed mixed dorm” room card: three photos, a “mixed” tag, 8 beds, shared bathrooms on the floor, 18 m², and the “Check the price for your dates” and “Lower bunk” buttons; above the card, a filter by room type

Room card. Who sleeps there, how many beds, where the bathroom is, the size. The “Lower bunk” button goes straight to that Cloudbeds category: a lower bunk costs a little more than an unassigned bed.

The “Compare rooms” table with two rooms marked — the mixed dorm for 8 and the women’s dorm for 6 with an en-suite bathroom; rows: beds, who it’s for, bathroom, size, price, lower bunk and a “Check price” button

Comparison. Mark two or three rooms and the table shows only those.

The “Getting here” block: three options from the airport with bus numbers and stops, trolleybus 40 from the railway station, buses 35, 95 and E6 from the bus station; under each, Google Maps, Apple Maps and Yandex Maps buttons

Getting here. From the airport, the railway station and the bus station: lines and stops. The routes were checked against the transport map on 22 October, and the date is on the page.

The group request form: dates, number of people, type of group, whole rooms, leaders in the apartment; on the right, the “Preliminary room plan” with every room in the house and the total “48 beds · 6 dorms + apartment”

Groups. Enter the number of people and the plan on the right spreads them across whole rooms. Nothing goes to a server: WhatsApp or the email app opens with the text already written.

The “Stay a week or a month” block: a 7, 14 or 30 nights switch, arrival date, guests, where to sleep, a notes field, the “See prices for these dates” button and a quote request via WhatsApp or email

A week or a month. Length of stay, arrival date, guests and room, and Cloudbeds opens with those details. The site doesn’t make up long-stay prices: Cloudbeds shows them, or the team sends a quote.

The “House, floor by floor” diagram laid out like a staircase: the roof terrace, the top-floor coworking space, two dorm floors with living rooms, the garden terrace by the entrance and the basement cinema room; the caption says there’s no lift

The house, floor by floor. Where the coworking space, lounges and cinema room are. There’s no lift, and guests learn this before they book.

The “Evenings we hold” block: a filter by kind and four cards — live music with a cellist, a theatre night on the terrace, and Just Dance and treasure hunt posters in the site’s greens

Evenings. Nine kinds: photos from past evenings and posters. The posters come from a template in the site’s colours — one 4:5 file for both Instagram and the page.

04 · Booking

Dates picked on any page reach Cloudbeds

The hostel took bookings in Cloudbeds before and still does. What changed is what the site sends there. One function builds the booking link, and the site adds everything the guest has already chosen.

Dates and guestson any page
Roomor a lower bunk
Languagein the link path
Cloudbedsstraight to free beds for those dates
Language
In the path
Cloudbeds ignores the language parameter and opens in English. Only the path works: /ru/reservation/. Cloudbeds has no Serbian, so the Serbian version leads to the English one.
The trip
Remembered
Dates, guests and the room are stored in the browser. Someone picks dates and three guests on the rooms page, goes to events, then to the Russian version — and the booking links already carry those dates and three guests.
Group
9+
Up to eight people can book online. From nine, the form offers a group request instead of Cloudbeds.
Inside Instagram and Facebook · 84% of page views

Here the form warns up front that booking will open in the browser and explains what to do if nothing happens: tap “···” and choose “Open in browser”.

Why booking isn’t built into the page
Embedding is a paid Cloudbeds option

A booking window on top of the site is part of the Premium Embeds package, which the hostel doesn’t have. Cloudbeds retired the old iframe embed in early 2026.

The code is ready

One build flag switches the window on. If the Cloudbeds script doesn’t load within 4 seconds, the button works as an ordinary link.

05 · Facts

Not one figure that can’t be checked

Opening hours, prices, room sizes, walking times and ratings live in one file, and pages in all seven languages take them from there. Every fact has a status: checked, disputed or unknown. The site shows disputed facts marked “being confirmed” and leaves unknown ones out.

How it looks on the site
  • Kitchen 8:00–22:00 · being confirmed. Sources differ, so until the team confirms, the label sits next to the hours.
  • Breakfast and parking prices aren’t published, so the site doesn’t name them and suggests asking the team.
  • Event dates stay hidden until the hostel starts keeping a schedule. Announcements go on Instagram.
  • Ratings come with the platform, the number of reviews and the date checked.
  • Walking times and transport lines were checked against routes on 22 October.
Reviews
14
reviews on the site, all found on Google and Hostelworld and quoted in full. Of the old site’s 12 quotes, six don’t exist on the platforms at all, four more were stitched together, padded out or paraphrased, and two from Booking.com can’t be verified.
The “8.7 out of 10 on Hostelworld” block: the average of 126 guests’ ratings and bars for seven categories — security 9.6, cleanliness 9.4, facilities 9.3, value for money 8.6, location 8.2, staff 8.1, atmosphere 7.4

Ratings by category. Hostelworld data as of 23 October. The lowest score, 7.4 for atmosphere, is on the page too.

First-version AI assistant · how it was designed

It was meant to answer from the same fact file as the pages

  • Only from the fact file. If something wasn’t there, it would say it didn’t know and give the WhatsApp number and phone.
  • Disputed facts would come with a caveat. For kitchen hours and luggage storage, it would suggest checking with reception.
  • The server, not the model, would build the booking link. The model would name the dates, number of guests and room; the server would check them and build the Cloudbeds link. This was done in code but never deployed to the demo.
  • No personal data. The conversation would stay in the browser tab and never be stored on the server. No more than 20 questions per 10 minutes from one IP address.
Why the second version doesn’t have it

On the first-version demo the “Ask the hostel” button went up on 23 October, but the assistant never worked: the model key was rejected, so it replied that it was unavailable.

In the second version it’s replaced by an “Ask us on WhatsApp” link to the reception number. The link sends nothing by itself and doesn’t promise an instant reply. The assistant’s code is kept in the project archive.

06 · Build

A Python generator, one stylesheet and one script, no frameworks

The site is built as static pages: there’s no database or admin panel on the server, and pages are served as ready-made files. Each of the seven languages has its own text file with shared keys. If a translation is missing a line, the build stops and names it.

What it’s made of

Build

  • site.py generator: 17 page types, hreflang, canonical tags, Hostel and FAQPage markup, sitemap.xml
  • copy: seven files, with English setting the keys
  • data: facts, evenings and reviews in separate files
  • the QR code for the printed kitchen rules is generated at build time, with no outside services
  • site icons and social previews in seven languages, generated from the designer’s vector logo
  • non-breaking spaces in Russian and Serbian

In the browser

  • one app.js: the trip, booking links, filters, comparison, gallery, forms to WhatsApp
  • one styles.css, mobile first
  • more than 50 analytics events marked up; I’ll add the analytics tags together with the cookie consent banner
  • the page a guest is about to open loads in advance, and moving between pages is smooth
  • animation switches off with the “reduce motion” setting
  • an “offline” page in seven languages: if the connection drops, a guest who has visited before sees it instead of a browser error

Netlify

  • static files, headers, 301s for old URLs, a 404 in every language
  • Instagram feed through its own function: images are served from the site’s own domain, so the guest’s browser never contacts Instagram
  • weekly Instagram token renewal and storage in Netlify Blobs are ready and waiting for the account to be connected
Design system

Warm paper, white cards, dark green buttons, lime used sparingly. Montserrat for headings, Noto Sans for text. Colours, spacing and corner radii are tokens in one document, so a new page can’t bring its own colours.

In the second version the logo comes from the designer’s vector source files, in its green variant; the site icons and social previews are built from it too.

The cabbage

The brand mark is a cabbage. The logo’s leaves unfold when it comes into view, dark sections get a wavy leaf edge, and a cabbage with eyes blinks at the bottom of the page. The leaves of the logo also stand for the staircases in the house.

All the animation runs without libraries and switches off when “reduce motion” is on.

126
pages, 404s included, checked at widths of 320, 390 and 1100 px — nothing spills off the screen
0
broken links, images or anchors across all 126 pages
87
old URLs from the old site’s source lead to the new pages
44 px
the minimum for buttons and filters on phones; input fields start at 52 px
Requests on the home page
88→21
Old site versus the second version.
Home page weight, MB
1.8→0.9
The old site: 1.7 to 1.9 MB.
Accessibility
92→97
Lighthouse score out of 100. Three points are lost on the grey labels in the “Arriving” block on the home page: contrast 4.24 against the required 4.5.

Lighthouse 13.5, mobile profile, one laptop, three runs of each home page: the old site on 1 November, the second version on 5 November 2026. I don’t compare the speed score: in the lab it jumps from run to run. I’ll compare field data after launch.

Timeline
16.10
A snapshot of the old site and a review of 25 hostel websitesThe first demo: every page in seven languages.
17.10
Evenings and the cabbage animationThe events page and leaves that unfold on screen.
21.10
CloudbedsPrices and category IDs for all six room types, and a test of embedding booking in the page.
22.10
Redesign, page by page18 work sessions on a shared design system, one per page. In the evening, an end-to-end check: 114 pages at five widths and five guest scenarios.
23.10
AI assistant, Instagram feed, the house floor by floorPlus social previews in seven languages.
25.10
Animated logo and a migration auditThe last release of the first version.
27.10
Self-hosted fonts and a site map pageThey missed the first-version demo and went into the second.
02.11
Second version: phone firstAll 17 templates in seven languages: larger buttons and fields, filters without swiping, a short first screen, a collapsible footer. No AI assistant — a WhatsApp link instead. A separate demo URL; the first version is untouched.
03.11
Logo from the designer’s source files, an “offline” pageSite icons and social previews in seven languages, page prefetching and smooth transitions between pages.
How I built it

I wrote the code with Claude Code to my own briefs. What to build, which facts go on the page and which pages to sign off — those calls were mine.

Each page was built in its own session: a brief, a check in the browser and a list of what to confirm with the hostel. The second version went the same way: a separate pass over each template on a phone.

07 · Next

What’s left before launch doesn’t depend on the code

The site builds, the scenarios pass and the old URLs still work. It’ll move to the domain once four questions are settled.

A lawyer

Reviews the draft privacy policy against Serbian data protection law and the GDPR. I won’t switch on analytics without it.

The hostel team

Needs to confirm the disputed facts — kitchen hours, luggage storage, the laundry price, late check-in — and send replacements for outdated details.

Native speakers

Proofread the Serbian and Turkish: the translations were done without them.

The domain

A production build open to search engines, moving cabbagehostel.com to Netlify, and the sitemap in Search Console.

What I’ll check after launch
Check 1
Speed for real visitorsLCP, INP and layout shift against the old site’s 8.7 s, 530 ms and 0.34.
Check 1
Whether people read past the first pagePages per session and active time; the old site had 1.32 and 13 seconds.
Check 2
Whether they get to bookingVisits to Cloudbeds against 173 sessions with a “Book” click in 30 days, plus bookings from Cloudbeds’ own data. This is the key question of the case.
Check 2
Whether search brings new guestsClicks on generic searches (49 a quarter before), and positions for “hostel belgrade” (seventh) and “coliving belgrade” (twelfth).
How I’ll compare
  • Year on year: each month against the same month last year. Hostels are seasonal, so I won’t compare autumn with summer.
  • Ads separately from search. Almost all traffic now comes from Meta, so how its share changes matters more than the total number of visits.
  • Field data only. Lab speed scores don’t count towards the result.

The old site showed the hostel. The new one answers the guest, from where the dorm bathroom is to which bus to take from the airport. I’ll test that after launch through pages per session and click-throughs to booking.

Baseline metrics: Microsoft Clarity, 30 days to 16 October, and Google Search Console to 13 October 2026. Old site audit: the 86 pages in its sitemap, 22 October. Lighthouse 13.5, mobile profile: the old site on 1 November, the second version on 5 November. Reviews and ratings checked against the platforms on 22–25 October. Layout and link checks of the second version: 2–3 November. Screenshots: the second-version demo cabbage-hostel-v2.netlify.app, 5 November, and cabbagehostel.com, 1 November. Cover: the hostel’s garden terrace, a photo from its website.

← Back to cases