TravelTamers.com

A full-stack travel agency platform. Five interconnected applications, 119 database tables, 60 automated workflows, and an AI concierge — all running on a single VPS.

TravelTamers homepage
5Applications
52DB Tables
33API Routes
60Automations
43Partner Pages
Astro 5 React 19 Hono TypeScript PostgreSQL 16 Drizzle ORM Docker Traefik v3 n8n Claude API Ollama Tailwind CSS 4 Zod HubSpot Slack API Stripe Google APIs Sentry Playwright Replicate FLUX Perplexity

The Five Applications

1. Marketing Site

Astro 5 + React 19 + Tailwind CSS 4. Static site with React "islands" for interactive components. 43 partner pages, 25 destinations, 12 experiences, blog with category filtering, and a group trips calculator. Self-hosted fonts. GSAP animations. Pagefind search. Auto-generated sitemap and RSS feed. Served via Nginx with long-term caching on _astro/ assets.

TravelTamers homepage hero Eclipse Voyages page Travel Journal The old way is broken

2. Hono API Server

Hono 4.7 + TypeScript + Drizzle ORM + PostgreSQL. 33 routers mounted on a single instance. Three auth domains: public (Slack events, Miles chat, forms), internal services (X-Webhook-Secret), and authenticated API (X-API-Key or Bearer). Every input validated with Zod schemas. Custom error classes. Timing-safe secret comparison on all webhooks. Redis-backed rate limiting with in-memory fallback. Idempotency middleware via SHA-256 hash + Redis SET NX EX.

// 33 routers across 8 domains — integrations/src/index.ts
app.route('/api/companies', companies)
app.route('/api/contacts', contacts)
app.route('/api/deals', deals)
app.route('/api/bookings', bookings)
app.route('/api/buddy', milesChat)
app.route('/api/vendors', vendors)
app.route('/api/commissions', commissions)
app.route('/api/intelligence', intelligence)
app.route('/api/analytics', analytics)
// ... 24 more routers

3. Miles — AI Concierge

Claude API with Ollama fallback. A chat widget embedded across the site. Handles travel inquiries with a warm, knowledgeable personality. Auto-detects when a user has provided enough info (name, email, phone) and silently fills in the contact form. Falls back to Ollama (llama3.2:3b on the VPS) when Claude is unavailable. Context-aware responses based on the page the user is visiting.

"Miles is the concierge who never sleeps. A visitor asks about Japan cherry blossom cruises at 2am, Miles researches via Perplexity, suggests three options, and by the time I wake up the contact form is filled and a Slack channel is waiting."

4. Nexus CRM

Fastify 5 + React 19 + PostgreSQL + Redis + BullMQ. A custom CRM with 54 tables, 5-tier RBAC, pipeline management, email campaigns, service desk, knowledge base, and Socket.io real-time notifications. Runs across 5 Docker containers (API, web, worker, database, Redis). Fire-and-forget sync from the main API with 3-retry exponential backoff.

Nexus CRM companies list Nexus CRM dashboard

5. n8n Automations

60 workflows in 3 tiers. Tier 1 (launch blockers): social media content pipeline, form submission processing, Slack channel creation, passport expiry alerts. Tier 2 (first month): lead scoring, proposal generation, engagement tracking, departure date pipelines. Tier 3 (growth): trip recommendation engine, safety alerts, referral automation, quarterly newsletters. Integrations: Slack, Claude, Ollama, Perplexity, Replicate FLUX, Buffer, Google Calendar, Resend.

The Social Media Pipeline

Every day at 7am ET, a 7-step automated pipeline generates social media content:

Database Architecture

Three PostgreSQL databases running on the VPS, each purpose-built:

Deployment

13 Docker containers on a single VPS. Ubuntu 24.04, 2 CPUs, 8GB RAM, 96GB disk. Traefik v3 handles reverse proxy and auto-SSL for 7 domains. GitHub Actions CI/CD with 5 parallel check jobs and automatic rollback if health checks fail. Backups every 6 hours with 30-day retention. fail2ban, UFW, key-only SSH, root login disabled.

Visit TravelTamers.com →