The Dune
Overview
The public site for a proposed ocean spa on the Jæren coast, built to persuade and to survive scrutiny.
Details
At a glance
- Project type
- Project-development site, two languages
- My role
- Set the content doctrine, designed the site, wrote and structured the content, and built and deployed it.
- Category
- Web experiences
- Status
- Live2026
What I did
- Wrote the doctrine the whole site is held to, starting with never faking missing information
- Designed the site and its status and citation system
- Wrote and structured the content in Norwegian and English
- Built the application, the audit tooling and the production deployment
Built with
- TypeScript: Application and content code
- Next.js: Application framework, with every route prerendered
- Tailwind CSS: Interface styling
- Vercel: Hosting and deployment from the main branch
Open thedune.no(opens in a new tab)Discuss a project like this
Next project
Boligplass
The need
The Dune is a proposed ocean spa, hotel and public landscape at Borestranda on the Jæren coast: around a hundred rooms, open all year, put forward as a new architectural landmark for the region.
It is not a hotel you can book. It is a proposal, and the site had to serve two audiences who want opposite things from the same page. Investors and the public want to feel the place. A municipal planner, a landowner and a county officer want to know exactly what has been approved, what has not, and who says so.
Decision
Never fake missing information
- Context
- A project at this stage has almost nothing settled. No land control, no municipal approval, no appointed architect, no completed feasibility study. The easy site implies all four and is quietly fatal: one planner who spots one invented figure stops taking the project seriously, permanently.
- What I decided
- Nothing that does not exist is shown as existing. Every future deliverable appears as a placeholder saying what it will be, why it matters and where it stands. Five status labels run across the whole site, every claim can be traced to a register of fifteen named sources, and the words are constrained: proposed, under study, working assumption, subject to. Never approved, secured, guaranteed or backed.
- Trade-off
- The site cannot make the confident claims a promotional site would make, and writing it took far longer than writing marketing copy. In exchange it can be sent to a municipality without being checked first, which is the only thing it actually needs to do.

Feeling the place
The other half of the job is persuasion. The site opens on the coast at dusk and moves the way an arrival does, from inland shelter out to the open Atlantic, because that movement is the architectural idea rather than a decorative sequence.
The rules hold inside the pictures too. West is always the sea. The roof is a constructed walkable landscape drawn below the crest of the natural ridge, never the protected dune itself. The beach stays public in every image and every line of copy. And each illustration carries its own caption saying it is an early concept, not a final design.

How it works
- Norwegian gets real Norwegian addresses, so the vision page is /no/visjon and not /no/vision. Rather than keeping two route trees in step, every page in both languages is served by one catch-all route over a single table of slugs.
- Every route is prerendered. There are 24 of them across the two languages, and they are static files by the time a visitor arrives.
- No animation library. The movement is CSS driven by one shared observer, which lets every section stay a server component and ship no code of its own.
- No content system yet, on purpose. The content is typed modules already shaped to the schema a system would need, so adding one later is an adapter rather than a rewrite.
- Status labels and citations are components, not prose. A claim cannot be written without the label and the source that belongs to it.
- An audit script walks every route at three widths and checks for overflow, heading order, missing alt text and console errors, and also renders each page with motion reduced and with JavaScript switched off. It reads its route list from the live sitemap, so a new page cannot slip past it.
Where it stands
The site is live on its own domain in both languages, and the audit passes clean across all 24 routes at every width, including with motion reduced and with JavaScript off.
Two things are open before it goes out widely. The Norwegian is written in bokmål rather than translated, but has not yet had a native professional pass. And the partner enquiry form validates correctly and then cannot send, because the mail host blocks the cloud addresses the site runs on. It tells the visitor plainly that nothing was sent, which is the right failure: a form that shows success for an enquiry that went nowhere would break the same rule the whole site is built on.