Building TourChamp: A Crew Portal That Runs Itself

How we built a self-service crew portal so tour managers stop playing email tag with 50 people about passport scans.

Building TourChamp: A Crew Portal That Runs Itself

Building TourChamp: A Crew Portal That Runs Itself

We've talked about what TourChamp does and why spreadsheets break. This post is about how we built it -- the technical decisions, the stack, and the feature that changed everything: the Crew Portal.

The Problem Nobody Talks About

Tour managers aren't IT people. They're logistics people who happen to need software.

The original TourChamp was admin-only. Tour managers entered every passport number, every visa expiry, every insurance document. For a 50-person crew, that's hundreds of documents to manually track, chase, and update.

The crew portal flipped this. Crew members manage their own credentials. Tour managers review and approve.

The Stack

Rails 8.1 with SQLite. Yes, SQLite in production. For an app that manages dozens of crew members (not millions of users), SQLite is fast, simple, and eliminates an entire deployment dependency. No Postgres to configure, no connection pooling to tune.

Hotwire (Turbo + Stimulus) for the interactive bits. Credential status updates, compliance checks, real-time dashboard changes -- all server-rendered with Turbo Frames. Zero JavaScript framework overhead.

shadcn/ui for Rails -- this was a game-changer. We get polished, accessible UI components without writing a React app. Buttons, alerts, badges, dialogs -- all server-side rendered with Tailwind. The compliance dashboard looks like a modern SaaS product because it is one, just without the 200MB node_modules folder.

Solid Queue for background jobs. Credential expiry checks run nightly. Email reminders go out automatically. No Redis required.

Kamal for deployment. Docker-based, zero-downtime deploys to a single server. The whole thing runs on a $12/month DigitalOcean droplet.

The Crew Portal

Here's how it works:

1. Crew Gets Invited

Tour manager adds crew members to a tour leg. Each crew member gets an email with a magic link to set up their portal account. No passwords to remember -- they authenticate via email link each time.

2. Crew Uploads Their Docs

The portal shows exactly what's needed: passport (front page scan), visa (if required for tour countries), insurance document, and emergency contact info.

Each item has a status badge: missing, uploaded, approved, or expired. Crew members see their own compliance score as a percentage.

3. Smart Validation

This is where it gets interesting. When a crew member uploads a passport, TourChamp doesn't just store it. It checks:

  • Expiry date vs. tour dates -- Does the passport expire before the tour ends?
  • 6-month rule -- Many countries require 6 months validity beyond entry date. TourChamp knows which ones.
  • Page availability -- Each foreign country stamp uses a passport page. If you've got 3 blank pages and 12 countries to visit, you need a new passport.
  • Schengen calculation -- How many days has this crew member already spent in Schengen in the last 180 days?

All of this runs automatically on upload. The crew member sees their status change in real-time via Turbo Stream. The tour manager gets a notification only if something needs attention.

4. Tour Manager Reviews

The dashboard shows crew grouped by compliance status:

  • Complete (green) -- All docs valid, all checks passed
  • Incomplete (yellow) -- Missing documents, but nothing critical yet
  • Important (orange) -- Issues that need resolution before tour start
  • Critical (red) -- Showstoppers: expired passports, visa problems, Schengen limits

Tour managers only deal with orange and red. Green and yellow handle themselves.

The Passport Page Tracking

This feature came from a real tour. A crew member had a valid passport -- correct expiry date, correct visa -- but only 2 blank pages left. The tour visited 8 countries. Each country stamp uses one page. They would have run out of pages mid-tour.

TourChamp now tracks page availability on every passport. It calculates page consumption based on the tour route (each foreign country = 1 page minimum). If pages run low, it flags it as a renewal item with a 14-day lead time before tour start.

Small feature. Massive impact.

Email Campaigns

We built a lightweight email campaign system directly into TourChamp. Tour managers can send credential reminder blasts to all crew with incomplete docs, schedule automated reminders at 7, 14, and 30 days before tour start, and track who's opened, uploaded, or still ignoring you.

Templates are pre-built. One click to send "Hey, your passport scan is missing" to 15 people. No more copying and pasting individual emails.

Teams and Departments

Crew members belong to teams: Band, Video, Lighting, Production, Stage, VIP, PixMob, Merch, Catering. Different teams may have different tour leg assignments. Crew rotations happen by team. Department heads can view their team's compliance without seeing everyone else's data.

The Chat Channels

Each tour leg gets its own chat channel. Crew can communicate about logistics, ask questions about visa requirements, or coordinate travel. It's not trying to replace WhatsApp -- it's a focused, tour-scoped communication channel that lives alongside the compliance data.

When someone asks "do I need a visa for Switzerland?" in chat, the answer is already on their dashboard. But sometimes people need to hear it from another human.

What We'd Do Differently

SQLite was the right call for this scale. But if TourChamp ever needs to support multiple concurrent tours for different organizations, we'd move to Postgres with row-level tenancy.

shadcn/ui for Rails is still young. Some components needed customization. But the alternative -- spinning up a React frontend -- would have tripled the development time for a marginally better UI.

The magic link auth works great for crew who use TourChamp once per tour. If crew were logging in daily, we'd add passkey support.

The Result

Tour managers went from spending 11 hours per week on credential management to 2 hours. Crew members spend 15 minutes total uploading their docs. The system catches issues 30-60 days before they become border emergencies.

The whole thing is a single Rails app on a single server. No microservices. No JavaScript framework. No complexity budget blown on infrastructure.

Just Rails doing what Rails does best: making boring CRUD apps that solve real problems really well.


TourChamp is built and maintained by Loadout. If you're managing international tours and want to stop worrying about crew compliance, get in touch.