An operating platform for an outfitter on a 45-mile island.
Wise Old Man of Isle Royale is a local-first platform for an outdoor outfitter — trip planning over the National Park Service's public route data, cashier/POS, rentals, guide scheduling, pickup orders, a customer portal with photo moderation, and an inventory ledger that audits every movement of every dollar, seat, and bear canister.
illustrative product mockup · trip planner with linked outfitting cart and Square-sandbox cashier
A small business with a real planning problem nobody's built for.
An Isle Royale outfitter serves customers who fly to a remote port, take a six-hour ferry, and then spend a week hiking between thirty-six NPS campgrounds on a 45-mile island with no cell service. The platform plans those trips against the NPS's public trail geometry and campground mileage matrix, factors in seasonal advice on insects and rain, and ties the resulting itinerary directly into the outfitter's inventory of rentals, guide hours, and pickup-order fulfillment.
The entire build is local-first. Square runs in sandbox, shipping is mocked, accounting is off, email lands in Mailpit, file storage is MinIO. Production credentials are blocked at the platform layer in local mode — by design, until the business is ready to flip individual integrations live. Every inventory, money, seat, guide, rental, waiver, review, photo, and integration state change writes an audit row.
Small business, serious posture.
Local mode is not a flag, it's a wall
Local mode blocks production-like integration settings at the platform layer. Square defaults to sandbox, shipping to mock, accounting off, NPS to fixture, storage to MinIO, email to Mailpit. Going live on any single integration is a separate, deliberate, audited toggle.
Audit-everything by design
Every state change in inventory, money, seats, guides, rentals, waivers, reviews, photos, and integrations writes an append-only audit_logs row. No raw card data is ever stored. No live shipping labels, accounting records, or customer emails are generated in local mode.
Trip planning on real public data
NPS campground amenities, public trail geometry, and the campground mileage matrix are imported on demand. The planner suggests date-aware routes — comparing route days against the trip window and returning seasonal advice for insects, temperature, and rain.
Six business domains, one ledger
Inventory, booking, rentals, guides, gear-and-weight, and finance are shared TypeScript modules with behavior tests written before implementation. Itinerary, route-data, safety, and platform sit alongside them. Each domain is its own surface; the audit log is the single source of truth across all of them.
Boring infrastructure, opinionated guardrails.
- apps/web · React + Vite
- apps/api · Fastify + TypeScript
- apps/worker · local queue jobs
- packages/shared · domain rules
- Turbo orchestrator
- Postgres + PostGIS
- Valkey (Redis-compatible)
- MinIO (S3-compatible)
- NPS public route data importer
- Append-only audit_logs
- Mailpit (SMTP capture)
- Square — sandbox mode
- Shipping — mock mode
- Storage — MinIO mode
- Playwright + Vitest coverage gate
Running an outfitter, clinic, or shop with no margin for ledger drift?
The audit-first, local-first posture transfers cleanly to any small operator who can't afford an integration accidentally going live in the wrong direction.
Start the conversation →