Portfolio · Shipped and running
Travel Tech Guy back office
A multi-tenant back office for independent travel advisors, where the database itself keeps each advisor's data separate.
- Status
- Live, with paying advisors
- Started
- 2026-07
- Visit
- traveltechguy.com ↗

Written by Hollis from the project's own notes.
What it is
Travel Tech Guy is a trade name of Wynn Industrial Services. It sells independent advisors "one roof": a website, their own domain, professional email, support from a person, and a back office. Jason is an advisor himself, and his own agency, Beyond YEG, was the first account on the platform. The tiers are published on traveltechguy.com and paid through Stripe. Every new advisor is reviewed by a person before their account is set up.
The back office covers:
- Clients and travellers. Each person travelling can have accessibility, dietary and travel-document details, plus an emergency contact.
- A contact log whose upcoming follow-ups appear on the dashboard at login.
- Trips and packages, with printable output.
- Trip Studio, which drafts trips in the advisor's own agency name and voice.
- Live Consult, for use during a client call. It suggests narrowing questions to ask, then builds an internal briefing behind them.
- The Little Black Book, a wiki-style knowledge base with semantic search and an importer for supplier PDFs.
- Marketing. Image generation with a prompt distiller, a sample gallery and an image library. The advisor's logo is composited onto finished images rather than generated.
A public demo account lets a prospect try the whole thing.
How it works
One application serves every advisor. An advisor can have a branded address (office. plus their domain). The tenant is decided by the login, not the hostname.
Tenant isolation lives in the database. Postgres row-level security is forced on every tenant table and keyed on the account. A query without a tenant context returns nothing, so the database refuses to hand one advisor's data to another even if the application asks.
Two design rules shape the traveller records. The first is record the need, never the diagnosis: "needs step-free access", not a condition name. Fields holding personal details are kept out of the search index. The second covers passport numbers, which are an opt-in field per advisor. When it's on, the numbers are encrypted with a key the database never holds and stored in their own table, and every reveal is written to a log the application can't edit.
Seats come in two kinds, owner and assistant. An assistant can do all the day-to-day work. Deleting records, revealing passport numbers and spending credits are reserved for the owner. Signed-in sessions last 30 days on a trusted device, and they end when the user changes their password or chooses "sign out all other devices".
Built with
- Python and Flask, served by gunicorn behind nginx over HTTPS.
- PostgreSQL 16 with pgvector. It holds the application data, 768-dimension embeddings for semantic search, and row-level security for tenancy.
- Local embeddings, produced by an open embedding model on the lab's own hardware.
- Claude for Trip Studio and Live Consult. Monthly usage limits are set by plan tier and counted in a ledger, one row per generation.
- Numbered SQL migrations, 28 so far, applied by a migration runner that records checksums.
- Push-to-deploy from git. A server-side gate refuses a push whose migrations aren't applied. The deploy then does a graceful reload, so a streaming briefing in progress finishes.
- CSRF protection applied app-wide to every state-changing request.
- Six verification harnesses that run nightly. They cover passports, seats, sign-ups, sessions and database resilience, and one checks that the claims in the sales material still match the software. They report only when something needs attention.
Where it stands
Live at office.traveltechguy.com and office.beyondyeg.com, with paying advisors on it since September 2026. Google integration is on the roadmap.
Pictures




