
Who
I live in the Blue Ridge ops lane. Visitors want a walking tour, a ghost walk, a cemetery afternoon, or a Cherokee heritage day without bouncing between five operator websites and a generic Viator card. Guides want a place to list and take a booking without building their own Next app.
WNC History Tours is for people hunting history experiences from Asheville to Cherokee, and for the small companies that run those walks.
If you build MarTech, local directories, or Stripe-backed booking surfaces, this post is the field notes on what shipped and what did not.
What
I built a tour booking platform shell for Western North Carolina history tours.
Stack on the box: Next.js 16.2.6, React 19, Convex, Clerk, Stripe (dependency + env slots), PostHog, Sentry, Resend, Tailwind v4, Bun, Vitest, Vercel config. Repo is private under HurleyUS/wnchistorytours.com. Package version 0.1.0. README still says Next 15.5.6; the lockfile moved on.

What exists in code:
- Amber/stone homepage with search form, city chips, category cards, featured tour grid
- Convex tables for
companies,tours,bookings,reviewswith search indexes - Tour queries (featured, search, by company/slug) and booking create/status mutations
- Seed mutation for three demo companies and five tours
- Clerk middleware in
proxy.tswith public matchers for the routes I planned to build - SEO (
sitemap.ts,robots.ts), error boundaries, HTTP security headers, Blacksmith/shipprep CI gates
What does not exist as app/ routes despite the nav and cards linking to them: /tours, /companies, /city/*, /category/*, /search, /tour/[company]/[tour], /list-your-business, booking checkout. No components/ folder. No Stripe checkout route.
Homepage falls back to hardcoded demo tours when Convex queries are still loading or empty. Category counts (24 walking, 12 ghost, …) are UI constants. The seed script drifts from the schema (rating vs averageRating, duration type, missing required company fields), so production readiness in that commit message is aspirational.

Where
Intended host: wnchistorytours.com. Layout OG, sitemap, and robots all point there. On pack day the domain returned Cloudflare 526 (origin TLS/unreachable). vercel.json also sets deploymentEnabled for main/master to false; auto-deploy from those branches is off.
Auth path is Clerk. Money path is declared Stripe in .env.example. Mail is Resend. Errors go to Sentry. Product events go to PostHog. Maps key slot exists for meeting points later.
Audience sits in Western North Carolina heritage tourism and with builders shipping local vertical directories next to products like BestWNC.
When
2026-01-08. Init. Same day: opportunities doc, homepage pass, Convex tour booking MVP (schema + bookings + tours + provider), PLAN updates, .env.example + seed. Six January commits. The product idea and the shell landed together.
January 31. Chore sync.
February. Upgrade to Next.js 16 and React 19. Tailwind v4 CSS-first. Clerk middleware and cn(). Strict TypeScript. Error boundaries. Sitemap and robots. Security headers. Auth check on bookings.updateStatus. Query .take(100) bounds. TypeScript fix PRs.
March. Vitest smoke coverage. More TS cleanup. Remove GitHub Actions; Vercel called out as CI. ESLint flat config.
May. Densest month (15 commits). shipprep standards, Blacksmith CI gate standardization (many near-duplicate gate commits), local preflight, deploy URL and health-check fixes. Platform reliability work while detail pages stay unbuilt.
2026-08-08 6:55 AM ET. c298e54 set X-Robots-Tag to index, follow on Vercel. HEAD. Thirty-seven commits on main.
That is the clock from empty repo to a hardened shell with an unfinished booking funnel.

Why
Directories and booking marketplaces fail two ways: vapor landers with no schema, or beautiful CI with no product routes. I did the honest middle (real Convex models and a real lander), then spent spring on Next 16, Clerk, SEO, and Blacksmith while the tour detail and Stripe checkout pages stayed on PLAN.md.
The domain is named. The robots header asks to be indexed. The origin was 526 when I checked. That gap is part of the story.
Sibling context: BestWNC is the wider WNC business directory. This repo is the narrower history-tour vertical. Same region, different job.
If you run walking tours in Asheville or Cherokee, would you list on a WNC-only history board, or is Viator still the only checkout that matters?
