Case study · Visit Naples & Visit Marco Island
Destination websites.
Every layer, built here.
Two destination guides on one AI-first platform: AI search on our own listings, a homepage that runs itself, deep directories and listing pages that sell. Here's how it's built, one layer at a time.


- 23
- days from first commit to live
- 2
- destinations on one codebase
- 9
- search tools behind the AI assistant
- 53
- purpose-built database tables
Layer 01 · AI search
Ask anything. Get real places.
"Waterfront seafood, a house for 8, happy hour downtown." That's how visitors search now. Ask Visit Naples sits in the homepage hero, behind quick questions like "Tonight" and "Date night", and in a launcher on every page.
The design rule: search our database first, then let the model choose from what it found. A general chatbot guesses, and recommends places that closed years ago. This one can only recommend listings that are in the guide today.
- Filters for cuisine, occasion, setting, price, area, distance, open now, and "skip the famous ones"
- Editor-written guides checked first: an editor's list beats a search
- Human check, per-visitor limits and a daily spend ceiling that switches to a cheaper model before it pauses
- Every answer logged with its cost and time to first card
- Eval suite: every guide findable by its own title, plus jailbreak, fake-staff and made-up-fact attacks
01 · Claude Haiku
Route
Reads the question and picks which searches to run. Most of the work happens before a bigger model is involved.
02 · Postgres
Search
Places, tours, editor guides, venues, rentals, events, deals, beach conditions and lookup by name. Real rows, not model memory.
03 · Streamed
Show
Listing cards appear the moment a search returns, before a word is written. Visitors read while the answer finishes.
04 · Claude Sonnet · Opus
Write
Sonnet writes the reply; Opus takes multi-stop plans. Every pick must be a listing the searches returned, or it is dropped.
How an answer is built. The model returns listing IDs, never facts; cards render from the database.
Layer 02 · The homepage
A homepage that runs itself.
It refreshes every 15 minutes, and most of it updates without anyone touching it. The hero changes with the time of day, from morning to midday to sunset. The events row is live. Every category row pairs editor-picked guides with a ranked grid of listings.

Category rows
Things to Do, Restaurants, Places to Stay and Shopping, each with editor-picked guides in its own layout and a filterable grid ranked by partner tier, with a live “View all” count.
Live feeds
Events from Events Naples, a deals carousel, and featured theater shows pulled straight from The Naples Players and TheatreZone.
Local voice
Areas to explore, Faces of Tourism, and an intro the editors change in the CMS. Marco gets its own top 10 FAQs, marked up for search.
Layer 03 · The content model
One record. Every site. Every list.
Everything that makes the sites smart lives in the content model. One Postgres database holds every business, guide, event and deal for seven sites in the network, with editorial judgment stored as data the AI and the pages can use.
10 content types
- Listings
- Areas
- Articles
- Pages
- Experiences
- Deals
- Events
- Rentals
- Shows
- People
One record, published per site. A restaurant exists once, then appears on Visit Naples, Naples Day or Naples Resident with its own path, rank, tier and SEO copy on each, and exactly one canonical page.
Editorial judgment, stored as data
- Cuisine
- Occasion & vibe
- Dining experience
- Price
- Meal
- Activity
- Experience type
- Stay type
- Shop type
- Venue type
- Beach amenities
- Beach parking
- Days
Curated lists with per-item framing. "Best waterfront restaurants" is ranked by an editor, and each pick carries its own heading, blurb and tip, falling back to the listing's own copy.
Images with focal points
A media library in Postgres: focal point, alt text and credit for every photo, served from Cloudflare Images.
Membership in one place
Four partner tiers unlock video, booking buttons, website links and ranking. One function decides what each tier shows.
Analytics per placement
Impressions, views and clicks for website, phone, map, booking and more, per listing and per page, list item and placement.
Layer 04 · Directories
Lists that do the filtering.
- Filters with live counts and name search, all in the URL, so a filtered view can be shared
- Page one is server-rendered for search engines; later pages come from an edge-cached API
- A map explorer that loads only when opened, with linked pins and cards and “Search this area”
- Partner tier, then rank, then name: the order partners pay for, kept exactly
- Area lists paginate on real URLs, each page canonical to itself
- Rental pages write their own titles and summaries from live inventory

Layer 05 · Listing pages
Every business gets a page that sells.
Open now or closed, worked out live. Reserve, call, website, directions, save and share up top, with a sticky call and booking bar on phones. And a “Featured in” panel that shows where the editors ranked it: #2 of 8 for brunch, #3 of 10 for the best restaurants right now.



- At a glance: hours (with an editor's note that overrides Google's), address, highlights and tags
- Tours and deals attached, then related guides, nearby places and more like it
- Structured data for businesses, attractions, tours, offers and lists
- Every outbound link tagged by placement, so partners see exactly where their clicks came from
- Beaches add their rank, essentials and today's conditions
Layer 06 · Live local data
Is it a good beach day? We score it.
A 0–100 beach score built from the National Weather Service surf forecast, NOAA tides, weather alerts, Florida's Healthy Beaches water tests and hourly weather, with the best time to go and a seven-day outlook. Red tide comes from Mote Marine Laboratory's daily beach reports beside FWC's water samples.

Events
Streamed from Events Naples, which reads venue calendars in a dozen formats and filters to what visitors care about.
Rentals
Synced daily from two local agencies’ booking systems, with photos moved to Cloudflare Images.
Hours and ratings
Refreshed monthly from Google, with editor overrides that survive every sync.
Layer 07 · A second destination
Marco Island. Same code, its own island.
No fork and no second build. The same app reads the hostname and becomes Visit Marco Island: its own brand, guides and listings, an assistant tuned for the island, and its own events network that never mixes with Naples.

- A shelling score, built from tide and onshore wind
- Its own NOAA tide station and red tide sampling area
- Its own events edition, Events Marco: island venues, the city and the chamber
- Its own analytics, deals and FAQ, from the same deploy

Layer 08 · Behind the scenes
The business runs on it too.
One CMS
Curation, listings, events, media, memberships, campaigns, inquiries and reports for every site in one admin.
Partner portal
Self-serve signup through Stripe. Partners see their own results per site, update their details and manage billing.
Native campaigns
Branded ad units built in the CMS, labelled sponsored, and measured on viewable impressions.
Fast by design
Every page server-rendered and cached at the edge, refreshed by tag the moment an editor publishes.
Built with an AI-first workflow. Next.js on Cloudflare Workers, Supabase Postgres and the Claude API, moved from Craft CMS with every live URL inventoried and key pages compared side by side before cutover. First commit September 23, 2026. Live October 16.
Read the case studies
Bring it to your destination
Take the whole platform or the layers your site is missing: AI search on your listings, an events feed, deeper directories, live local data, or several towns on one codebase.
One focused call
Not weeks of discovery. I've built every layer on this page, so we get to what your site needs quickly.
A working prototype early
Your team reacts to something real, on your own data, before the full build.
The engineer is your contact
No account layers. The person you talk to is the person building it.
Questions, answered
Who are destination websites for?
Tourism boards, visitor bureaus, chambers, destination publishers, and the agencies and contractors that build and run their sites. The work is the same: hundreds of listings, a constant flow of events, and visitors with very specific questions.
Can an AI assistant be trusted on a destination site?
Only if it is grounded in your own content. Ask Visit Naples searches the guide’s database first, can only recommend listings those searches returned, and renders every card from the database. Answers are logged with their cost and speed, rate-limited, and tested with an eval suite that includes jailbreak and made-up-fact attempts.
Can you work with our existing CMS and data?
Yes. Projects start from what you already have. Visit Naples and Visit Marco Island moved from a Craft CMS multi-site with every live URL inventoried; rentals sync from the booking systems agencies already use, and events come from venue calendars in a dozen formats.
How long does a rebuild take?
It depends on the size of the site and your review process, so the plan comes after a call. For reference, Visit Naples and Visit Marco Island went from first commit to live in 23 days.
Ready when you are
Let's build your destination.
Describe your site in the project planner and get a plan in about a minute, or email me and I'll reply within one business day.

