Estate platform · 2026
Villa TimTavio
The operations platform for a private estate on the Oaxacan coast — a guest PWA, an estate manager’s dashboard, an owner intelligence dashboard and a NestJS API, in one Turborepo. The villa hosts one party at a time, and that single fact shapes the whole design.

Overview
The estate hosts one party at a time. There is no multi-tenancy, the kitchen cooks for one table, and a scheduling conflict means one vendor being asked to be in two places at once. Three audiences needed serving from one system: guests who should never see an interface that feels like software, an estate manager who needs to know what is happening right now, and an owner who needs to see the estate as a business.
One Turborepo holding four apps over shared packages. `api-types` is the contract every frontend consumes, `api-client` is the single list of endpoints, and `ui`, `dashboard-ui` and `theme` keep four surfaces looking like one product.
Role
Full-stack — PWA, dashboards and API
Timeline
2026 · shipped
Stack
Guest PWA
The guest experience
From an authenticated welcome to a confirmed chef’s-table request — every guest screen keeps to the calm, editorial tone of the estate itself. Installable, offline-first, and personal to the party in residence.





Estate manager
The manager’s dashboard
The day-to-day: bookings and the guest manifest, a searchable record of preferences and history, and the vendor roster — approvals and conflicts surfaced before they become problems.




Owner access
Owner intelligence
The estate as a business — occupancy and revenue trends, experience demand, and where to put money next. The same data as the manager’s view, reframed for decisions.



The challenge
What made it hard
Three audiences with opposite needs. Guests want arrival details, dining and their folio; the estate manager wants approvals, a kitchen run sheet and vendor scheduling; the owner wants occupancy, revenue and where to invest next. Building three products would have meant three drifting copies of the same domain.
A request passes through six hands between asking and being charged for. Guest submits, manager approves, staff prepare, staff mark it ready, the window passes, the charge lands on the folio. Every one of those transitions is visible to somebody different, and any of them can fail.
The estate already ran on tools that worked — Lodgify for reservations, Breezeway for staff tasks, WhatsApp for vendors. Replacing them would have been rejected; ignoring them would have left the platform lying about the state of the estate.
Approach
How it was built
The domain is two explicit state machines rather than a set of booleans. A guest moves pre-arrival → checked-in → settled → departing → checked out, each transition with a named trigger — a magic link opened before the check-in date, the manager marking arrival, two hours elapsing. An experience request moves pending → confirmed → in progress → ready → completed, or drops out to cancelled. Because the states are named, every surface can render the same truth in its own language: the guest sees “staff preparing now,” the manager sees an ETA, the folio waits for “completed” before it charges anything.
Authentication is split by audience and by risk. Guests never create an account — they get a magic link or a six-digit code, and the API mints a short-lived JWT scoped to one booking, re-validated against the party manifest on every request so removing someone revokes access immediately. Staff accounts are created by the owner, never self-registered, with optional authenticator-app 2FA. The owner’s own 2FA is mandatory with no remember-this-device escape, because that login reaches the financials.
Conflicts are answered, not just reported. When a request collides, the manager sees which guest holds the space and when it frees up, or the vendor’s next open slot — so the reply is “the pool is free from 9pm,” not “try another time.” Similar requests can be approved or declined in a batch.
Existing tools stay the source of truth. Bookings come from Lodgify and the platform never invents a reservation; staff tasks go to Breezeway; vendors are still booked by hand over WhatsApp and the platform records that conversation rather than pretending to replace it. Stripe, Resend, Cloudinary, Pusher and Web Push fill in the rest, and any missing integration degrades instead of crashing.
Outcome
What shipped
Four applications and one API running as a single product: an installable guest PWA, the estate manager’s operational dashboard, an owner intelligence dashboard built around service heat maps and buy-versus-rent analysis, and the API underneath all three.
The estate’s real workflow — not a replacement for it — encoded in software the staff actually use.
Want something like this?
Tell me what you're building and I'll tell you honestly how I'd approach it. Replies within hours.
Prefer email? Write to me directly at — it reaches the same inbox.