login successful · uptime 06:42:18

Shane
Anthony

shane@agency186:~$ whoami full-stack developer, systems builder, 13-service platform operator shane@agency186:~$ cat /etc/motd One developer. Seven domains. Zero shortcuts. shane@agency186:~$

pg. 01 — cover

Shane
Anthony

One developer. Seven domains. Zero shortcuts.

a working notebook →

7live domains
13services
60automations
119db tables
[ SCROLL ↓ ] keep reading →

01 :: SCALE

What one developer ships when nobody's counting.

5
applications glued into one ecosystem
Marketing site, Hono API, Nexus CRM, Groups, Miles concierge. One VPS, one stack, one person.
119
postgres tables across three dbs
tt_fresh_db (52), nexus_crm (54), groups_db (13). Drizzle ORM. 78 enum types.
60
n8n automations in three tiers
Daily social pipeline, lead scoring, passport expiry, departure pipelines, booking cascade.
13
docker containers on one vps
Ubuntu 24.04 · 2 CPU · 8GB. Traefik v3, 7 domains, auto-SSL, key-only SSH, fail2ban.

02 :: WORK

Production code. Live users. Actual revenue.

FLAGSHIP traveltamers.com ● LIVE

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.

  • Astro 5 + React 19 marketing site, 43 partner pages
  • Hono 4 API — 33 routers, Zod validation, Redis rate-limiting
  • Miles AI concierge on Claude, Ollama fallback on-box
  • Nexus CRM (Fastify + BullMQ + Socket.io, 54 tables)
  • 60 n8n automations, fire-and-forget with 3-retry backoff
Astro 5React 19HonoPostgreSQL 16DrizzleClaudeDockerTraefikn8n
[ DEEP DIVE ] read the write-up →
TravelTamers homepage
Fig. 1 — the concierge that never sleeps
CRM nexus.traveltamers.com ● LIVE

Nexus

Custom CRM with 54 tables, 5-tier RBAC, pipeline management, email campaigns, service desk, and Socket.io real-time. 5 Docker containers.

Fastify 5React 19BullMQRedisSocket.io
[ GUIDE ]architecture →
SOCIAL groups.traveltamers.com ● LIVE

Groups

Trip-planning platform for travel groups. 13 tables, itinerary legs, voting, comments, Replicate FLUX for cover-image generation.

Express 5PostgreSQLEJSReplicate
[ GUIDE ]architecture →
Pickleball at Sea
pickleball-at-sea

Pickleball at Sea

Tournament management for cruise-ship pickleball. Registration, brackets, scoring.

Express · SQLite
Refined Vacations
refined-vacations

Refined Vacations

Eco-adventure travel brand. Hand-built PHP site with custom booking funnel.

PHP · MySQL
SlackQuest
slackquest

SlackQuest

AI-powered trivia for Slack workspaces. Question generation, scoring, leaderboards.

Next.js 14 · Supabase
Miles AI concierge
miles-ai

Miles (AI Concierge)

Claude-powered chat widget. Silent lead capture. Ollama fallback on-box.

Claude · Ollama
Eclipse 2027
eclipse-2027

Eclipse 2027

Campaign microsite for the Iceland/Spain total eclipse. Content hub, ROI calculator.

Astro · MDX
filename-as-spec

Filename-as-Spec

A methodology for eliminating AI hallucination. The spec IS the filename — the model can't miss it. Architect-agent, code-agent, validator, orchestrator. Six domain matrices.

Python · MCP · Claude
n8n automation hub
n8n-hub

n8n Hub

60 workflows across 3 tiers. Daily social pipeline, lead scoring, passport alerts.

n8n · Claude · Perplexity
Supplier intelligence scraper
supplier-intel

Supplier Intelligence

Playwright scraper + classifier. 115 vendors, 4,115 cruise sailings, weekly refresh.

Playwright · Python

03 :: SYSTEMS

What happens after someone fills out a form.

01
Form Submit
traveltamers.com contact form posts to the Hono API. Zod validation. Idempotency key SHA-256'd into Redis.
02
Slack Alert
Webhook fires a rich-text card to #leads within 300ms. Channel auto-created per prospect.
03
Miles Researches
Claude reads the inquiry, calls Perplexity for real-time pricing, drafts three itinerary options with sources.
04
Nexus Sync
Fire-and-forget POST to the Nexus CRM. 3-retry exponential backoff. Deal enters the pipeline.
05
Stripe + Calendar
When the deal closes, Stripe bills, Google Calendar invites go out, and the trip prep n8n flow spins up.

Zero manual steps. Every lead triggers a cascade. Every cascade is observable in Sentry.

04 :: ABOUT

I run a travel agency by day. Every other hour I'm shipping code — the platform that runs it, the CRM that tracks it, the AI concierge that answers at 2am, the automations that file the paperwork before I wake up.

My stack is whatever gets the thing into production: Astro and React on the front, Hono and Fastify on the API tier, PostgreSQL everywhere, Docker on the VPS, Traefik at the edge, n8n for glue, Claude for judgment, Ollama for the fallback. I've touched most of this in the last eighteen months and I don't plan to stop.

What I actually do: I take a problem nobody else wants to own end-to-end — the kind where the solution lives across six services, three databases, two AI providers, and a Friday-night deploy — and I own it. Database schema to TLS cert, I own it.

I build the entire operating system, not just the app on top.

05 :: CODE

Production snippets from live systems. Not tutorials.

integrations/src/index.ts
// 33 routers across 8 domains. All auth paths are timing-safe.
import { Hono } from 'hono'
import { rateLimit } from './mw/rate-limit'
import { idempotency } from './mw/idempotency'

const app = new Hono()
  .use('*', rateLimit({ redis, window: 60, max: 120 }))
  .use('/api/*', idempotency())

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)
// ... 28 more routers

export default app
// Drizzle schema — 52 tables in tt_fresh_db alone
import { pgTable, uuid, text, timestamp, jsonb } from 'drizzle-orm/pg-core'

export const bookings = pgTable('bookings', {
  id:         uuid('id').defaultRandom().primaryKey(),
  contactId:  uuid('contact_id').references(() => contacts.id),
  status:     bookingStatusEnum('status').notNull().default('pending'),
  vendor:     text('vendor').notNull(),
  metadata:   jsonb('metadata').$type<BookingMeta>(),
  createdAt:  timestamp('created_at').defaultNow(),
})
// Fire-and-forget sync with 3-retry exponential backoff
export async function syncToNexus(deal: Deal) {
  const delays = [0, 1000, 3000, 8000]
  for (const [i, wait] of delays.entries()) {
    if (wait) await sleep(wait)
    try {
      const r = await fetch(`${NEXUS}/deals`, {
        method: 'POST',
        headers: { 'X-Api-Key': env.NEXUS_KEY },
        body: JSON.stringify(deal)
      })
      if (r.ok) return r.json()
    } catch (e) {
      sentry.captureException(e, { extra: { attempt: i } })
    }
  }
}
#!/bin/bash
# Deploy to VPS. 5 parallel health checks. Auto-rollback.
set -euo pipefail

PREV=$(docker ps --format '{{.Image}}' | grep tt-api)
docker build -t tt-api:$GIT_SHA .
docker tag tt-api:$GIT_SHA tt-api:latest
docker compose up -d --no-deps tt-api

# 5 parallel checks, 90s timeout
for check in http db redis queue sentry; do
  ./bin/check-$check.sh &
done
wait || { docker tag $PREV tt-api:latest; docker compose up -d tt-api; exit 1; }

echo "✓ deploy ok: $GIT_SHA"

06 :: CONTACT

I take on 2–3 projects at a time. If you need a platform built end-to-end, I'm probably your person.

> Transmission received. Replying within 24 hours.
> ERR: transmission failed. Email shane@agency186.com directly.