/// Case study · Visit Dundee

Visit Dundee: one platform, five city sites and an assistant called DeeDee.

A tourism site, a business directory, a music guide and a procurement site, all served by one Laravel application with one database.

  • Laravel platform
  • AI assistant
  • Integrations
  • Accessibility
The Visit Dundee home page
visitdundee.com, one of five sites served by the same application.

The brief

Dundee had several city websites that shared a lot of the same information: places, events, businesses, travel. Each one needed its own identity and audience, but keeping the same facts correct in several places by hand does not work for long.

What we built

One Laravel application, one database and one set of scheduled jobs serving five public sites, each with its own design and purpose:

A venue updated once is correct everywhere it appears. The platform runs Laravel 13 on PHP 8.5 with MySQL 8.4, behind the Bunny CDN. When we counted in September 2026 it had 623 routes and 4,426 automated tests, and continuous integration gates every deploy.

DeeDee, the city assistant

DeeDee is an AI assistant that answers questions about Dundee from the platform's own listings. It was designed around one rule: the model never writes a recommendation of its own. It proposes one action and names a place, and anything that the platform's own search did not return is refused. By September 2026 it could reach all 1,243 listings.

The page shows the grounded answer first and lets the conversational version arrive after. That took the page from 3.7 seconds to 0.31 seconds, and it still works with JavaScript switched off. Ask DeeDee.

A trip planner that only suggests what is open

The day planner builds a plan from experiences that are actually available, and fills the evening with the next event starting within 14 days. It is deliberately rule-based rather than AI: a plan has to be right, and rules are easier to check.

Live data from the city

The platform pulls in and joins up a long list of sources:

  • Events from Data Thistle and Skiddle, with duplicates across the two feeds merged
  • Buses from Xplore Dundee's timetable (772 stops and 24 routes when imported), so listings can show how to get there by bus
  • Trains from National Rail's live departures, so a gig page can show how to get home afterwards
  • Parking, with car parks and EV charging on the parking page, and a getting around page with weather, trains, buses and taxis
  • Places from OpenStreetMap, coordinates checked against the Food Standards Agency register, and company details from Companies House
  • Maps served from our own map tiles rather than a paid tile service

Search is built in: it understands plurals, ignores accents and knows that a visitor typing one word for a thing usually means another.

Accessibility and speed

In October 2026 an automated WCAG 2.2 AA audit across 35 pages on all five sites went from 837 failing elements to none. Directory caching that serves the cached page while it refreshes in the background brought the home page's time to first byte down from 2.2 to 2.8 seconds to between 0.46 and 0.55.

Apps

The same platform is wrapped as phone apps, so the apps and the websites can never disagree. The Visit Dundee and Dundee Connect apps are on the App Store.

Moving it home

The platform moved onto our own servers in September 2026. When we checked on 12 September, all 580 addresses in its sitemap answered correctly.

Got a platform in mind?

Send a few lines about what you are making. A real person replies, usually the same working day.