Route 1
A car rental brand that needed a website, not a booking system — because the booking system already existed and belonged to someone else.

The interesting part
was already bought.
The reservations ran on Caren, the platform the business already managed its fleet, rates and contracts on. Rebuilding search, availability, pricing and payment in a new site would have meant a second source of truth for the fleet, a second place for rates to be wrong, and a payment integration to certify — for a brand site with a three-week window.
So the scope became honest very early: everything except reservations. That sounds like a smaller project, and it is, but it moves the difficulty rather than removing it. If the site is not the booking engine then it has to be genuinely good at the thing it is — content the business can change without a developer.
Three decisions that
shaped everything else.
Every one of these follows from deciding not to build the booking engine.
Buy the reservations, build the brand
The booking flow is the vendor's widget, mounted on a page. There is a fieldset in this repo called `booking_system` with no fields in it — the stub of a native booking system that was scoped and deliberately never built. It is the most honest artefact in the project.
Flat files instead of a database
Statamic stores content as markdown and YAML in the repo. No database, no migrations, no separate backup story, and content changes arrive as commits you can read in a diff. For a site whose entire job is publishing text, a database would have been infrastructure bought for nothing.
Vue as islands, not an app
Two components — an FAQ accordion and a testimonial carousel — mount onto server-rendered HTML. Content reaches them by being serialised straight into props from the template, so there is no JSON endpoint and no API layer for a site that does not need one.
Pages composed from blocks
Five blueprints and four reusable fieldsets over a nested page tree, with a repeater of sections that carries its own layout toggles — background on or off, border on or off — resolved into Tailwind classes in the template. Marketing composes a page from blocks and controls how each one looks without touching code.
A rich-text field that accepts a script
Inner pages have a code-snippet field, which is how the vendor's booking widget gets onto a page at all. It means an editor can move the booking form, or add it to a new landing page, without a deploy. It also means the site trusts whatever gets pasted into it — a deliberate trade for a small team where the only people with CMS access are the ones who own the brand.
Type scale on bare elements
The global type scale is applied to unstyled heading elements in CSS rather than as classes in templates, so rich text authored in the CMS comes out correctly styled without an editor knowing anything about the design system. Brand colour and a nine-step neutral ramp sit in the Tailwind config, which is what made the second brand a config change rather than a rewrite.
The build that proved
itself three months later.
The genuinely hard problem on this project was not technical, and pretending otherwise would misrepresent it. There is no availability logic here, no pricing engine, no payment integration and no double-booking to prevent — all of that is the vendor's, by choice. The hard part was deciding that, and then building the remaining seventy percent well enough that the decision paid off.
It paid off in April. A second Icelandic car rental brand needed a site, and this codebase was redeployed as that brand in nine days — same starter, same blueprint structure, same components, a new palette and new content. The blueprint-and-fieldset content model and the CSS-level type scale were what made that possible; if the design had been hardcoded into templates, the second brand would have been another three weeks.
What I would not claim is that everything shipped clean. The testimonial carousel was built, then commented out of the homepage with a note that it broke page scrolling, and it stayed that way. Placeholder testimonials and two lorem-ipsum blog posts went live. The site was structurally finished before it was actually finished, which is a distinction that is easy to lose when the launch date is the goal.