2026 · Concept build

BerthBook

A booking and berth-management dashboard concept for small marinas, replacing a phone line and a paper diary with live availability and a proper staff view of the harbour.

  • Product design
  • Nuxt build
  • API design
  • Security

This is a concept build, not a paid client engagement — Citriverse designed and built it to demonstrate the approach. See "About this case study" below for the full picture.

Try the working demo

The problem

Smaller marinas and harbours along the UK coast and inland waterways still manage visitor moorings the way they did thirty years ago: a phone line and a paper diary pinned up in the harbour office. It's slow for staff during a busy weekend, and a visiting boat owner has no way to check whether a berth is actually free until someone answers the phone.

What Citriverse built

A concept Vue and Nuxt application with two sides that share the same data:

  • A public booking portal where a boat owner enters their boat's length and beam and sees which berths genuinely fit, for the nights they want, with the price shown up front rather than "call for a quote"
  • A harbour office dashboard showing the full berth grid at a glance, letting staff block out maintenance slots and take walk-up bookings without double-booking a berth that's already held online
The availability screen listing nine pontoon C berths at £84.00 for two nights, £42.00 a night, each with a "Hold it" button. Below them, an expanded list of twenty-eight berths the boat does not fit, each giving a reason such as "Too long — this berth takes boats up to 9m".
A 15-metre boat is offered only the berths that physically take it, priced for the stay before anyone has to enquire. The berths left out say why they were left out.

Behind the two views sits a single source of truth for berth state, so a hold taken over the phone and a hold taken online can never clash.

The harbour office berth grid, fourteen nights across and one row per berth, with a message reading "Berth A2 is already taken for one or more of those nights." A legend labels the four cell states: free, held, booked and maintenance.
The harbour office trying to take a phone booking for a berth a visitor is holding online, and being refused by name. The refusal comes from a constraint in the database rather than a check in the code, so it holds whichever way round the two bookings arrive.

Technical depth

This is the kind of project the Build package exists for — a proper application, not a brochure site with a form bolted on:

  • A typed API layer built on Nuxt server routes, with request validation on every booking endpoint rather than trusting client input
  • A background job that releases expired holds automatically, so an abandoned booking doesn't sit blocking a berth indefinitely
  • Rate limiting on the public booking form, to stop a scripted flood of bogus holds from locking out real customers
  • A payment step designed to hand off to a real payment provider, stubbed here so the flow can be demonstrated without moving real money
  • Hardened response headers, a strict content security policy, and a dependency-patching routine as standard — the baseline every Citriverse build starts from, not something bolted on at the end because a client asked for it
The payment step showing berth C1, booking reference KQ-Y4FUMV, £84.00 total at £42.00 a night, a line reading "Held for 14:48 more", and a dashed panel headed "This step is deliberately stubbed."
The hold counts down while the booking is finished, and the payment step says plainly that it is a stub. A real deployment hands off to a payment provider at this point; nothing here takes a card number.

Design intent

The dashboard is built to load its full state in a single request and update the availability grid without a page reload, so a busy harbour office isn't waiting on spinners between bookings. Forms are built to be usable with a keyboard alone and to work at the small screen sizes staff actually use on a chandlery counter, not just on a designer's monitor.

Try it yourself

The demo is live, and every visitor gets a private copy of Kelsden Quay — so anything booked, blocked or broken in it belongs to that visitor alone, and the harbour is never left in a state the next person has to work around. Five things worth trying:

  • Search with a long boat, say 15 metres, and watch the small berths drop out of the results with the reason each one will not take that hull
  • Start a hold, then open the harbour office in a second tab and try to take that same berth over the phone — it is refused by name, and it is refused in either order
  • Block a berth for maintenance from the office grid, then search those dates on the public side and find it gone
  • Walk a booking through to the payment step and read what it says rather than clicking past it
  • Leave a hold for fifteen minutes without paying, then look at the grid again — a scheduled job will have released the berth

The harbour office login arrives with its demo credentials already filled in, so getting into the staff side takes one button press. Nothing in the demo asks for an email address or a phone number, and no card details are collected anywhere.

About this case study

BerthBook is a concept product, not a live SaaS business, a paid client engagement, or a company that exists. Citriverse is a new studio and this case study is here to show how a custom Build-tier application gets approached — from data modelling through to a working interface — not to claim an existing customer base, real marinas using it, or bookings actually taken.

Outcome

A working demo, not a mockup — every claim below is checkable in it.

  • The no-double-booking guarantee is a database constraint, not an application check, so no code path can bypass it
  • Expired holds are released by a real scheduled job, so an abandoned booking stops blocking a berth
  • The public booking form is rate limited, and every endpoint validates its input
  • A per-request content security policy nonce, so the page ships no inline script the browser will run unchecked

Try the working demo

Back to all work

Got a project that looks like this?

This one's a concept build, but the way it was scoped, designed and built is exactly how a real project runs. Describe yours and see where it lands.

Start a project