Building HELM: An Interactive Operations Dashboard for Multi-Platform Booking & Crew Management
What Was Done
We built HELM (Historical Event Lifecycle Map), a self-contained, single-file interactive operations visualization dashboard deployed to helm.queenofsandiego.com. HELM provides a force-directed graph view of Queen of San Diego's entire business flow—from marketing channels (email campaigns, web search, referral partners) through booking platforms (Viator, Boatsetter, GetMyBoat) to operational execution (crew dispatch, sail management, financial settlement). The dashboard includes live health diagnostics that probe backend systems and color-code nodes based on system status.
This addresses a critical need: engineering leadership needed a single visual reference that could drill down from high-level flow (how do customers reach us?) to operational detail (which crew members are assigned to this sail?), all connected to the underlying infrastructure and GAS automation pipelines.
Technical Architecture
Node & Edge Model
HELM uses a force-directed physics simulation (vis-network library) with three node categories:
- Source nodes: Email campaigns, organic search, partner referrals, paid ads
- Platform nodes: Live integrations (Viator, Boatsetter, GetMyBoat) plus greyed-out future platforms
- Operational nodes: Crew dispatch system, expense tracking, health monitoring dashboards, financial settlement
Each node stores metadata (function signatures from Google Apps Script files, system health thresholds, drill-down detail panels). Edges represent data or control flow—for example, a Viator booking event triggers the processViatorbooking() GAS function, which connects to crew dispatch.
Health Diagnostics
Rather than static topology, HELM probes backend systems in real time. Each operational node (crew dispatch, expense tracker, financial settlement) has an associated health check:
- Nodes glow green when their backend systems respond within SLA (typically <500ms)
- Nodes glow yellow for degraded response (500ms–2s)
- Nodes glow red for failures or timeouts (>2s or HTTP 5xx)
- A system health bar at the top aggregates all probe results
The health check polling loop runs every 30 seconds, allowing engineers to spot operational issues at a glance without jumping between monitoring dashboards.
Infrastructure & Deployment
S3 & CloudFront Setup
HELM is served as a static HTML file with embedded CSS and JavaScript—no backend required, which minimizes operational overhead.
- S3 bucket:
helm.queenofsandiego.com(created in us-west-2, matching existing JADA infrastructure) - Bucket policy: Restricted to CloudFront Origin Access Control (OAC) only; no public read access
- Object:
index.html(approximately 85KB, including vis-network CDN link in script tags)
CloudFront distribution created with:
- Origin: S3 bucket with OAC (not legacy Origin Access Identity)
- Viewer protocol: Redirect HTTP → HTTPS
- Cache behavior: 60-second TTL for index.html to allow rapid updates without stale data
- TLS certificate: ACM wildcard cert for *.queenofsandiego.com (existing)
DNS & Domain Routing
Route53 alias record created:
helm.queenofsandiego.com ALIAS d1234example.cloudfront.net
This allows the CloudFront distribution to be updated or rotated without changing DNS records.
Key Build Decisions
Single-File HTML Over Microservices
We chose a self-contained HTML file (no separate API, no build step) because:
- HELM is a reference tool for engineers, not a customer-facing app—uptime requirements are lower than production booking flow
- It eliminates backend complexity; all network requests are either CDN fetches (vis-network library) or health probes to existing GAS endpoints
- Engineers can view source, copy the file locally, and modify visualizations without CI/CD overhead
vis-network Over D3/Cytoscape
vis-network was selected for its:
- Physics engine that automatically arranges nodes without manual layout (force-directed simulation)
- Built-in interactivity: drag nodes, zoom, pan, search
- Low learning curve—no data binding framework required
- CDN availability; no npm build step needed
Dark Navy/Gold Aesthetic
The color scheme matches JADA's brand and improves readability on engineer monitors. Gold edges highlight active data flows; dim grey edges show potential-but-inactive paths (future integrations).
Health Probes vs. Static Status
Rather than hard-coding "system is healthy," each node makes a real HTTP request to a backend endpoint (or GAS Apps Script trigger) and evaluates response time + status code. This trades minimal latency (30s polling window) for accuracy—if crew dispatch is actually slow, HELM will show it in red, not green.
Implementation Details
File Structure
/Users/cb/Documents/repos/sites/helm/index.html
Contains:
<style>block: CSS grid layout, node styling, health bar, detail panel<script type="text/javascript">block: vis-network initialization, physics config, node/edge definitions, health polling loop, drill-down logic<div id="network">: Canvas container for force-directed graph<div id="detail-panel">: Collapsible sidebar showing selected node's GAS functions, related dashboards, recent health history
Key Functions in the Script
initNetwork(): Sets up vis-network instance, physics simulation, click handlersmakeVisNode(nodeId, label, category): Creates a node with appropriate styling (color, size, icon)pollHealth(): Fires every 30 seconds; makes HTTP HEAD/GET requests to health endpoints for each operational nodeupdateNodeHealth(nodeId, status): Updates node glow color based on probe resultshowDetail(nodeId): Populates detail panel with GAS function signatures, dashboards, crew assignments
GAS Integration
HELM references function signatures extracted from Queen of San Diego's Google Apps Script files:
processViatorbooking(),processBoatsetterbooking(), etc. (fromgas_booking_integrations)