Yacht & Tours started as a very typical booking platform problem. Boats, dates, prices, availability, payments. None of that is new. What usually fails is how these pieces are glued together once the system grows and traffic becomes unpredictable.
I built the platform using Elixir and the Phoenix framework, with LiveView handling most of the UI. The main reason was not hype, but fit: the problem space is highly concurrent, stateful, and real-time by nature. Elixir’s concurrency model and Phoenix’s process isolation make it much easier to keep the system responsive under load.
The frontend is mostly server-driven. LiveView allows the UI to update instantly when filters change, prices are recalculated, or availability shifts without relying on heavy client-side state or constant API polling. Search results, calendars, and booking flows all react in real time while keeping the client lightweight.
Search, availability, and pricing are treated as core infrastructure, not secondary features. Instead of querying the database on every request, the platform relies on an ETS in-memory cache for high-speed lookups. Boats are indexed in memory for filtering by location, capacity, equipment, availability, and price, allowing complex searches to stay fast even as the fleet grows.
Pricing logic is intentionally centralized. Seasonal rules, base rates, discounts, mandatory fees, and extras are all resolved through the same calculation path. This avoids a common issue in booking platforms where search prices, quotes, and final bookings disagree because they’re calculated in different places.
The primary data store is MongoDB, chosen for its flexibility with deeply nested documents like boats, pricing rules, extras, and booking metadata. Mongo acts as the source of truth, while ETS is used as a read-optimized layer. Writes go to the database; reads for search and filtering come from memory. Changes are propagated in near real time.
Availability and bookings follow a clear lifecycle. Booking states transition predictably from request to confirmation to payment, and availability is derived from accepted and paid bookings. This keeps double bookings from happening without relying on fragile locks or delayed cron jobs.
Real-time behavior is a first-class concern across the platform. Booking requests, messages, status changes, and availability updates are delivered immediately to the relevant users. This reduces response time, avoids race conditions, and removes the need for constant manual refreshes.
Payments are integrated directly into the flow using Stripe, with support for automatic invoice generation and archiving. This keeps financial operations consistent and auditable, instead of being handled through external tools or manual processes.
The system is designed to coexist with external software rather than replace it. Many boats are managed through third-party tools, so Yacht & Tours includes synchronization with the MMK booking system. Imported listings, availability, and updates are kept aligned so the platform never displays outdated information.
Overall, Yacht & Tours is intentionally conventional in what it offers and opinionated in how it’s built. It’s a standard booking platform implemented with modern, real-time architecture, clear separation between write and read paths, and infrastructure choices that prioritize correctness, performance, and long-term maintainability.
Windsurf
All my projects and even this website is build using Windsurf Editor. Windsurf is the most intuitive AI coding experience, built to keep you and your team in flow.
Get in Touch
If you need a developer who delivers fast, reliable, real-world solutions, reach out. Let’s turn your idea or project into something that works.