Roamgap: Smart Holiday Optimizer
Spend the fewest days of leave for the longest continuous time off
Project Overview
Roamgap answers one question: given where you are and how many days of paid leave you have, when should you take them? Feed it a country and a PTO budget, and it returns the calendar windows that maximise continuous time off per day of leave spent—stacking your days against public holidays and weekends so a handful of well-placed days off become a week or more away.
It's my current flagship and most ambitious build to date: a spec-first monorepo, live at roamgap.ike.work. It launched free first and has since grown its multi-country and group-planning layers; the paid tier went live in July 2026, charging card / M-Pesa through my WiraPay payment service.
How It Works
- Optimiser. The core engine scores every candidate window across a horizon and ranks them by continuous days off per PTO day spent—the "bridge day" math that surfaces the long weekends and stacked breaks people usually miss.
- Planner. Turns a chosen window into a concrete plan: which exact dates to book, which are holidays, which are weekends, and how many leave days it actually costs.
- Itineraries. Combine selected windows from any search into a single trip—overlap detection, merging adjacent or overlapping windows, nudging either end by a day, and saving the result to your account.
- Shareable by default. Every search lives in its URL, so an optimisation is a link you can send—no account required to use the core tool.
What's Built
Both apps are live (soft-launched June 2026): the optimiser, planner, accounts, multi-country overlap, and group planning all ship today. The paid tier is live and selling (13 July 2026) — card / M-Pesa via WiraPay, with its first paying subscriber the same day the rail opened. AI-assisted planning is still ahead.
Optimiser & planning
- Optimiser + planner — country-aware ranking of time-off windows against real public-holiday data, with a shareable-URL MVP and no sign-in required.
- Itineraries — combine windows from any search; stateless compute (analyse / merge / recompute) plus user-scoped saving, with a local draft that works while signed out.
- Calendar export & email alerts (planned) — push a chosen plan to your calendar and get notified when a good window opens.
Accounts & privacy
- Firebase auth + saved searches — sign in, then save, list, and delete searches.
- Privacy by construction — self-serve data export, delete, and restore; durable sub-processor delete queues; a cookie-consent gate and sub-processor disclosures.
- Internationalisation — an i18n foundation with
en-KE/en-USlive and further locales scaffolded.
Live & beyond accounts
- v1 go-live (done) — both apps live in production, soft-launched June 2026.
- Multi-country overlap — an overlap engine that finds shared time-off windows for couples and small groups, URL-shareable.
- Groups — lean social trip-planning on top of the overlap engine, with invite links.
- Paid tier (live) — pricing, checkout, and billing charge through my WiraPay payment service (Paystack underneath, card + M-Pesa); enforcement and the checkout gate flipped on 13 July 2026, first paying subscriber the same day.
Architecture
Roamgap is a monorepo of two independently-disciplined apps:
- Web (Next.js 16, React 19, Tailwind v4) — the UI and a public REST API. It owns rendering, discoverability, and the accounts experience, and proxies every optimise / plan / data call to the backend.
- Backend (NestJS 11, Firestore, Redis) — auth, persistence, holiday data, and the optimiser/planner algorithm. The algorithm lives here only; the web never reimplements it.
Both validate at every boundary with Zod 4 and mirror a single shared domain schema, so the contract between them can't quietly drift.
How It's Built
The engineering discipline is as much the point as the product:
- Spec-first, test-first. Each app's
specs/is the source of truth—if code disagrees, the spec changes first. Web work runs spec → Figma → failing test → implementation; the backend runs spec → failing test → implementation. - Pure, tested algorithm core. The optimiser/planner is pure functions under unit tests, kept clear of framework and I/O concerns.
- Discoverable by design. With near-zero paid acquisition, organic and AI search are the growth strategy—so every page ships a Markdown twin, JSON-LD, and a sitemap entry, alongside an
llms.txtand an OpenAPI surface. - Quality gates enforced. Typecheck, lint, and tests (Vitest / Jest, plus Playwright) gate both apps in CI;
npm run checkis green on each before anything is "done."
Roadmap
- Phase 1 — MVP (complete) — optimiser + planner, shareable URLs, no account.
- Phase 2 — Accounts (complete) — Firebase auth, profile / DSAR, saved searches, itineraries.
- Launch (v1) (live) — both apps hosted and live on the free + accounts feature set, soft-launched June 2026.
- Phase 3 — Paid (live, 13 July 2026) — entitlements, historical data, calendar export, email alerts, charged through WiraPay → Paystack (card / M-Pesa), selling in production.
- Phase 4 — Multi-country (built + merged) — an overlap engine and URL-shared collaboration.
- Phase 4½ — Groups (built + merged) — social trip planning layered on the overlap engine, with invite links.
- Phase 5 — AI destinations — AI-suggested trips, cached per window.
- Phase 6 — B2B — a team / HR dashboard, a public API, and seat pricing.
Skills Demonstrated
- Algorithm design — a pure, tested optimisation core that ranks time-off windows by yield per leave day.
- Full-stack architecture — a Next.js 16 frontend + REST API over a NestJS service, with a strict proxy boundary and a mirrored, Zod-validated domain schema.
- Spec-driven delivery — specs as the source of truth, a Figma-in-the-loop frontend flow, and CI quality gates across two toolchains.
- Production concerns up front — GDPR / DSAR flows, internationalisation, observability, and a discoverability surface treated as core growth infrastructure.
Roamgap is live at roamgap.ike.work.