Vila Etelka: a bilingual website for weddings, ceremonies, and celebrations
Vila Etelka
2026-07-31
Vila Etelka is a historic villa with a garden in Modra – Harmónia, in the foothills of the Little Carpathians, under half an hour from Bratislava. It is rented as a whole — for weddings, civil ceremonies, family celebrations, and small corporate events. It is not a hotel: it has no rooms of its own, and guests stay in a neighbouring hotel fifty metres from the gate. The previous website was static HTML plus a single PHP page, with the content wired straight into the files. We built a new bilingual site on Next.js and Sanity, where the content no longer lives in the code but in the CMS: texts and photographs can be changed without touching the code and without shipping a new build. The first release, covering all eight pages in Slovak and English, was handed over in a single day; revisions followed in several waves. The whole project took 13 working days.
Bilingual venue website + CMS
Project type
Enquiries for weddings, ceremonies, and celebrations; content separated from the code
Main goal
What we delivered:
- Eight pages in SK and EN with a language switcher
- Content separated from the code: every text and photo is a field in Sanity
- Four wedding spaces with capacities of 48 / 66 / 34 / 48
- A dedicated ceremony page that replaced the old wine list
- Gastronomy built around catering, not an in-house kitchen
- A 79-photo gallery with an accessible lightbox
- A timeline of the villa from the 19th century to today
- Enquiry form delivering email through Resend
- 19 permanent redirects from the old URLs
- EventVenue and LocalBusiness structured data, with no hotel schemas
- A GDPR cookie banner with three categories and a re-open settings control
- Vila Etelka s. r. o. company details with IČO and DIČ on the contact page
Selected screens and visuals
Visual project preview shows how the website looks on different devices. Responsive design ensures clear display on mobiles, tablets and desktops.
Screenshot 1 of 5
The non-trivial parts of the project
Building good-looking pages was the fast part — that took a day. The demanding work sat around it: carrying over everything Google already knew about the villa, making the bilingual setup legible to search engines, stating precisely what the venue is and is not, and keeping the copy accurate through several revision waves in which even basic facts about the place changed.
- Problem #1
After the domain switch, every old URL answered with a 404
Google still indexed /index.html, /svadby.html, /historia.html, /galeria.php, and the whole English /en/*.html branch, and third-party sites linked to them. Their ranking signal was quietly leaking away.
Our solutionWe did not guess the URL inventory — we pulled it from the Wayback CDX index for the domain and cross-checked it against the old navigation. We shipped 19 permanent redirects, including the non-obvious mappings: /karta.html, the wine list, now points to /gastronomia, and /en/list.html to /en/gastronomia.
Technologies and implementationWayback CDX inventory + permanent redirects in next.config
- Problem #2
The bilingual setup had to be correct for search engines, not just for the visitor
The villa hosts foreign guests, so English cannot be a watered-down echo of the Slovak. At the same time a search engine has to know which version of a page is Slovak and which is English — otherwise the two compete with each other and an English-language searcher is served the Slovak page.
Our solutionEach language has its own localized route — Slovak canonical and unprefixed, English under /en. Every page declares its language from the active locale, carries a canonical and reciprocal hreflang for SK / EN / x-default, and is listed in the sitemap. The English copy is a full human translation, not a machine rendering of the Slovak.
Technologies and implementationnext-intl, localized routes, hreflang and canonical
- Problem #3
The venue is not a hotel, and that could not be left ambiguous
The villa is rented as a whole and has no rooms of its own — guests stay in a neighbouring hotel fifty metres from the gate. It has no kitchen of its own either and works with a caterer, and it does not host funeral receptions. The old site blurred those boundaries: it mixed the impression of a hotel with that of an event venue, which attracted enquiries the villa cannot serve.
Our solutionWe built the page structure around what the villa actually offers: Ceremonies — Weddings — Celebrations — Gastronomy, with copy that promises nothing extra and names the neighbouring accommodation and the catering model outright. In the structured data we deliberately used EventVenue and LocalBusiness rather than Hotel or LodgingBusiness, so that search engines do not file the villa under lodging.
Technologies and implementationInformation architecture + JSON-LD EventVenue and LocalBusiness
- Problem #4
The content changed five times, and shipping a code release for every wording change made no sense
Every wave of feedback touched dozens of places at once — in both languages. If the copy lived inside the components, each changed sentence would mean a code edit, a build, and a deploy, plus the risk of overwriting a neighbouring block along the way.
Our solutionWe lifted the content out of the code and into Sanity — eighteen singleton documents, one per page and language, plus site settings. Each revision wave therefore went in as a content patch applied field by field: no rebuild, no deploy, and no risk of disturbing the neighbouring blocks. That is exactly how the four wedding spaces with capacities of 66 / 66 / 34 / 48 entered the site. It also leaves the site ready to be managed without a developer whenever that is needed.
Technologies and implementationSanity singleton schema + field-level content patches
- Problem #5
Revisions in several waves changed even the basic facts about the venue
One call established that the villa is not itself a “historic summer resort” — it is merely located in one — and that the partnership with the neighbouring hotel had ended, so the hotel name, email, and phone had to disappear from every page. The next day the “al fresco” capacity was corrected from 66 to 48. On a later call the first hero photograph was dropped, because its windows no longer match the venue and mislead guests; the “V tichu” line was cut; vocals and harp left the music offering while violin and saxophone joined it; and the contact page was to gain a line with the IČO and DIČ registration numbers.
Our solutionWe rewrote the phrasing across the whole site, purged the hotel name, email, and phone number from every page, and restructured the weddings page into four spaces with capacities of 66 / 66 / 34 / 48, later 48 for “al fresco”. The wine list disappeared and a new ceremony page took its slot; the “Svadba All Inclusive” popup was removed from the home page; gastronomy was rewritten around the catering model; and on a direct instruction we dropped the phrase “dôstojné spomienky”. The first hero photograph was replaced by a real image of the villa, vocals and harp gave way to violin and saxophone in the music offering, and the contact page gained a line for Vila Etelka s. r. o. with its IČO and DIČ registration numbers.
Technologies and implementationContent revision + patch scripts against live Sanity
Similar problems in your business? We will help you solve them with modern tech stack.
Final structure
Complete web structure designed for clear navigation and a simple path to contact or order. Each page has clear purpose and optimized navigation.
- Home
- About
- Weddings
- Ceremonies
- Celebrations
- Gastronomy
- Gallery
- Contact
- Cookie policy
Most important website sections
Each section solved specific business problem and increased conversions
- 01
Hero and three numbers
Above a photograph of the garden sits the kicker “V historickom letovisku · Modra — Harmónia”, then the boutique stamp, and immediately after the hero the three facts couples ask about first: ~30 minutes from Bratislava, 50 m to guest accommodation, 66 guests in the garden marquee.
- 02
The offering trio: ceremonies · weddings · celebrations
Instead of a service list, three equal cards that split the enquiry right on the home page. The ceremony card states what the villa actually supplies: the ceremony table, chairs, sound, and coordination.
- 03
Four wedding spaces with capacities
Open-air “al fresco” for 48 guests, the garden marquee for 66, the romantic arcade for 34, and the Oblúková sála for 48. Both the order and the numbers came from the client; the copy for the first two spaces is his own, word for word.
- 04
Gastronomy without an in-house kitchen
The page states openly that the villa has no kitchen of its own and works with a professional catering company. It separately explains that guests often bring their own pastries — the villa provides refrigeration capacity and service staff.
- 05
A gallery in natural proportions
79 photographs in a CSS-column masonry where each cell takes its aspect ratio from the real image dimensions in Sanity — portraits stay portrait. The lightbox has a focus trap, Esc to close, and arrow-key navigation.
- 06
Contact and enquiry
The Harmónia 3003 address in Modra, the phone +421 948 008 308, info@vilaetelka.sk, a map, and a “Napíšte nám” form with the date and event type. A separate line lists Vila Etelka s. r. o. with its IČO and DIČ registration numbers.
Project stack
Frontend and design system
App Router, server components, and a custom editorial design system in globals.css instead of a utility mix. Three typefaces with clearly separated roles and restrained scroll reveals.
- Hand-written globals.css
- Marcellus · Newsreader italic · Hanken Grotesk
- prefers-reduced-motion respected
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS v4
- framer-motion 12
Content and languages
Sanity as the single source of content: eighteen singleton documents, one per page and language, plus site settings. Components read the CMS with a literal fallback, so the site never renders empty. Slovak is canonical; English is a proper translation, not a machine version.
- 18 singleton documents
- Every text and photo is a field
- SK as default locale, EN prefixed
- Sanity 6
- next-sanity 13
- next-intl 4
- @sanity/image-url
Enquiries and deployment
The contact-page form sends a branded email through Resend, with the visitor in the replyTo field — replying from the inbox answers the couple directly. Validation runs on both the client and the server. Deployment is automatic: previews on branches, production from main.
- Server-side validation and input escaping
- replyTo set to the visitor
- Preview and production deploys
- Resend 6
- Vercel
- GitLab CI/CD
SEO, AI, and compliance
Structured data typed as EventVenue and LocalBusiness — deliberately not Hotel or LodgingBusiness, because the villa provides no lodging. Canonical and reciprocal hreflang on every page, a sixteen-URL sitemap, an llms.txt for AI answers, and a GDPR consent banner.
- JSON-LD EventVenue + LocalBusiness
- Hreflang SK / EN / x-default
- Cookie banner with three categories
- JSON-LD
- hreflang
- robots.txt & sitemap.xml
- llms.txt
- Cookie consent
Modern tech stack = fast website + easy maintenance + long-term support
Delivery process
We built the site in one go — a complete first release of every page in both languages on day one. The rest of the project was work with the client: several waves of revisions that brought the copy closer to the reality of the venue, and a technical migration at the end.
- Day 1 — 21 June
The complete first release
1 dayIn a single day we built the design system in globals.css, the Sanity schema, and all eight pages in Slovak and English. A design review of every page at 1440 and 390 px ran the same day; one outcome was fixing the amenities grid on the home page, where three items sat in a four-column grid and left an empty cell.
- Day 2–11
Deployment, CMS, and a language pass
10 daysWe deployed to Vercel, opened the studio to the client, and polished the UI. On 1 July the whole site went through a Slovak language pass — grammar, Czech-isms, wrong collocations, name declension, and quotation typography; the same fixes were applied to the live CMS content.
- 15–16 July
The first major wave of client revisions
2 daysThe call produced two governing changes: the villa is not a “historic summer resort”, it is only located in one; and the partnership with the neighbouring hotel had ended, so its name, email, and phone had to disappear. We restructured the weddings page into four spaces with capacities of 66 / 66 / 34 / 48, and the phrase “dôstojné spomienky” was dropped from the celebrations page. The next day we corrected the “al fresco” capacity from 66 to 48.
- 31 July
The second call and handover
1 dayThe client had the first large hero photograph removed, because its windows no longer match the venue and mislead guests, and dropped the “V tichu” line, since the place is not marketed as quiet. The music offering lost vocals and harp and gained violin and saxophone. The contact page gained a line for Vila Etelka s. r. o. with its IČO and DIČ, the form got the plain heading “Napíšte nám”, and the date placeholder lost the year. That was the handover, after 13 working days.
- After handover
Domain, form, SEO migration, and cookies
5 daysWe moved the domain to Vercel without touching the client mail records — MX, SPF, and subdomains stayed intact and were verified afterwards. We wired enquiry delivery through Resend and tested it four times, including against the live domain. Finally came the SEO migration with 19 redirects, robots, sitemap, structured data and llms.txt, the GDPR cookie banner, and a mobile hero fix where the kicker was overlapping the logo.
Project FAQ
Why does the site never offer accommodation?
Because the villa does not provide it. It is not a hotel and has no rooms of its own — guests stay in a neighbouring hotel fifty metres from the gate. The site says so plainly, and its structured data declares no lodging schemas either; we used EventVenue and LocalBusiness.
How is gastronomy handled if the villa has no kitchen?
The villa works with a professional catering company, and the gastronomy page explains this openly — it was rewritten for exactly that reason. It also notes that guests often bring their own pastries, for which the villa provides refrigeration capacity and service staff.
Can the content be edited without a developer?
Yes. Every visible text and every photograph is a field in Sanity, and the content is split into eighteen documents — one per page and language — so you open a specific page and edit exactly that. None of it requires touching the code or shipping a new build. That is how every revision wave went in, as content patches applied field by field, and the site is ready for self-service editing whenever that is needed.
What happened to the old website URLs?
We pulled the URL list from the Wayback CDX index for the domain, cross-checked it against the old navigation, and shipped 19 permanent redirects. The non-obvious cases were mapped by meaning: the wine-list page now points to gastronomy, and its English counterpart to English gastronomy. We verified in production that all 19 land on the correct target.
Why are there no prices or traffic statistics?
The villa publishes no price list — booking is by enquiry only, so the structured data declares no prices, opening hours, or ratings either; claiming them would be fabrication. No GA4 or GTM analytics are wired on the site, so we have no metrics to quote. The cookie banner already accounts for an analytics consent category, so it can be added at any time.
Do you run a wedding or event venue?
We build sites that describe your venue precisely — spaces, capacities, and dates you can edit yourself, in as many languages as you need. And if you are moving off an old site, we carry over what Google already knows about you.
Leave your contact (email or phone is enough)
Content fully in your hands • Bilingual • SEO carried over