← Back to web work
Web Development · Product Design · Case Study · 2026

Tiki Tommy Live
Real-Time Decision Engine
for South Padre Island

10 pages. 20 verified venues. A beach conditions tool. A functional save system. A monetization layer. Zero fake data. Live preview at ttlnew.netlify.app.

10Pages
20Verified venues
9Ad placements
0Fake data points
Overview

The gap in the South Padre Island digital market — and how Tiki Tommy fills it.

The South Padre Island tourism landscape is fragmented across platforms with competing agendas. SPADRE.com has raw utility and SEO density but no brand experience. VisitSouthPadreIsland.com has clean storytelling but no real-time decision layer. TripAdvisor and Expedia handle reviews and booking. Nobody handles the moment that actually matters: a visitor already on the island at 2pm on a Saturday who needs to decide where to go in the next hour.

Tiki Tommy Live was built for that person. Not for pre-trip planning. For the group standing in the hotel parking lot with a full day ahead and no plan. The site's product identity is precise: "Competitors help users plan the trip. We help them live it." Every design, content, and technical decision flows from that positioning.

The result is a 10-page static site — no framework, no build step, no CMS, no server-side logic — that handles live camera streams, a verified venue directory, an interactive map, a localStorage save system, a beach conditions tool, a partner inquiry form, and a monetization layer. It deploys from a folder upload to Netlify, opens anywhere, and passes the same technical standards as a professional medical practice website.

"Competitors help users plan the trip. We help them live it."


Product Identity

Not a booking site. Not a review site. Not a tourism directory.

A competitive analysis of the South Padre Island digital space identified a consistent blind spot: every existing platform serves pre-trip intent. Hotels, itineraries, reviews, bookings — all of it assumes a user planning days or weeks ahead. Tiki Tommy Live targets a different behavioral moment entirely. The user is on the island. They have 1–3 hours. They want one screen to answer one question: what should I do right now?

This identity drives every content decision. The homepage H1 isn't "Welcome to South Padre Island." It's "Pick the next move." The six scenario cards don't say "Browse categories." They say "I need food," "I have kids," "I have no car," "I need a rain plan." Those are decision-state triggers. The explore URL parameter system — `?filter=Food`, `?q=family`, `?q=rain`, `?filter=Transit` — means every scenario card, mini-plan link, and condition-board tap navigates to a pre-filtered result. The visitor never sees an empty state or an unfiltered directory. They see the right answer to the question they're in the middle of asking.


Architecture

10 pages. One CSS file. One JS file. One data file. No framework.

The full design system — tokens, components, three responsive breakpoints, focus-visible rules, prefers-reduced-motion — is one minified CSS file. All interactive features are handled by two JavaScript files: `locations.js` (the 20-venue data object) and `main.js` (a 203-line IIFE handling every interactive feature on the site). No React, no build step, no npm, no external dependencies of any kind.

10
HTML pages
203
Lines of JS (main)
762
Lines of JS (data)
19
WebP images
3
Self-hosted fonts
0
External scripts
5
Sitemap entries
9
Ad placements

Page inventory

Core

Home

Six situation cards, live panel, six venue cards, four mini-plans, sponsor strip.

Core

Live

Four YouTube embed slots, official checks routing to Conditions, venue cards.

Core

Explore

20 venue cards, text search, 14 filters, URL parameter hydration, empty state.

Core

Map

Google Maps embed, 20 interactive emoji pins, detail panel, location list.

Core

Conditions

NOAA iframe, five-color flag guide, six beach access points, Island Metro, turtle rescue.

Core

Saved

localStorage list, full venue cards, remove, clipboard copy, route link, clear.

Business

Partners / Advertise

Six placement types, Netlify form, sponsor grid, who-fits section.

Internal · noindex

Roadmap

Pre-launch checklist and data rules. Not for public search.

Utility · noindex

Thank You

Form success confirmation page.

Utility · noindex

404

"That island path drifted off course." Two nav paths back.


The Data Layer

20 verified venues. Zero fake ratings, fake waits, or fake crowd numbers.

The most important content decision in the project was the data standard. Every venue card carries a "Verified listing" badge with a source label — Official site, SPI Chamber, Visit SPI, Cameron County — indicating exactly where the information was confirmed. Two venues from the original prototype data set were excluded entirely: Pier 19, reported permanently closed after the 2022 fire, and a Taco Cabana Express that couldn't be verified on the island. That decision is documented in `BUSINESS_DATA_AUDIT.md` so anyone maintaining the site knows why those names are missing.

Each of the 20 entries in `locations.js` carries: name, short name, emoji, category, type description, vibe label, best-for summary, image, lat/lng, map pin coordinates, address, phone, website, source, verification status, price note, hours note, crowd note, description, Tiki move tip, tags array, action prompt, Google Maps URLs, and a pre-built search text string for client-side fuzzy matching. This isn't a list of business names. It's a structured data object designed to power every surface on the site — search, filter, map panels, saved cards, and clipboard exports — from one verified source.

Venue directory — all 20

VenueCategoryVibeSource
Louie's BackyardNightlife🔥 Big bay energyOfficial site
Padre Island Brewing CompanyBrewery🍺 Chill local pourOfficial site / Visit SPI
Yummies BistroBreakfast☕ Morning moveSPI Chamber
Blackbeards' RestaurantFood🏴‍☠️ Island classicOfficial site
Clayton's Beach Bar & GrillBeach Bar🏖️ Big beach partyOfficial site / Visit SPI
Sea Ranch Restaurant & BarSeafood🍽️ Polished dinnerOfficial site / Visit SPI
Mahi NicSeafood🐟 Dockside seafoodVisit SPI
Ceviche CevicheQuick Bite🥑 Fresh fast biteFacebook / public listings
Wanna Wanna Beach Bar & GrillBeach Bar🌴 Barefoot beach barOfficial site / Visit SPI
Lobo Del Mar CafeFood🎸 Waterfront musicOfficial site / Visit SPI
Grapevine Cafe & CoffeehouseBreakfast🥞 All-day breakfastOfficial site / Visit SPI
Cafe On The BeachBreakfast🌊 Oceanfront breakfastOfficial site / Visit SPI
Sea Turtle Inc.Wildlife🐢 Turtle rescue stopOfficial site / Visit SPI
SPI Birding, Nature Center & Alligator SanctuaryWildlife🦆 Boardwalk wildlifeOfficial site / SPI Chamber
Laguna Madre Nature TrailTrail🌅 Quiet sunset walkVisit SPI
Isla Blanca ParkBeach🏝️ South-end beach dayCameron County / Visit SPI
Gravity ParkActivities🎡 Night ride energyOfficial site / Visit SPI
South Padre Island Adventure ParkActivities🐎 North-end adventureOfficial site / Visit SPI
Beach WaterparkFamily💦 Family splash dayOfficial site / Visit SPI
Island MetroTransit🚌 Free rideCity of SPI / Visit SPI

JavaScript

203 lines that run the entire interactive product.

Every interactive feature — navigation state, save system, search, filtering, map pins, saved page rendering, clipboard copy, URL parameter hydration — is handled by a single 203-line IIFE. No jQuery. No React. No state management library. No external dependencies.

Navigation state. Reads `data-page` from `document.body`, matches nav links, sets `.active` and `aria-current="page"` on the correct link. Handles `thank-you.html` → `partners.html` active mapping. Manages hamburger toggle with `aria-expanded`.
Save system. `localStorage` with `try/catch` on both read and write — Private Browsing safe. Save buttons update `aria-pressed` and `aria-label` between "Save [name]" and "Remove [name] from saved" on every state change. `escapeHTML()` on all dynamic string output — XSS protected throughout.
Search + filter with URL hydration. On `explore.html`, reads `window.location.search` on load and applies `?filter=` and `?q=` parameters before the page renders. Every scenario card, condition-board tap, and mini-plan link pre-filters the explore page for the relevant situation. Fourteen filter categories with `aria-pressed` state. Text search matches against a pre-built search string that includes all relevant keywords.
Map pin system. 20 emoji pins positioned via CSS percentages on a Google Maps embed. Clicking any pin updates the detail panel — name, vibe, description, hours, tip, address, and all three action buttons — by reading from `window.TIKI_LOCATIONS`. The map embed `src` updates to center on the selected location.
Saved page full flow. `renderSaved()` builds full venue cards from localStorage names matched against the locations data, with address, phone link, Maps directions, website, and remove button. "Copy plan" writes a formatted text list to clipboard via `navigator.clipboard.writeText()` with a `window.prompt()` fallback. Route link updates to point to the first saved spot.

The Conditions Page

The decision that separates this from every other tourism site in the space.

Every competitor either ignores beach safety utility entirely or links visitors off-site to NOAA, the city transit page, or the official tourism board. A user following those links leaves the site, opens a government page, gets confused, and either comes back or doesn't. The original build of Tiki Tommy Live had the same problem — six utility tool cards linking to `visitsouthpadreisland.com`, `ndbc.noaa.gov`, `myspi.org`, and `southpadre.com`. The solution was to build every utility feature in-house and eliminate every link that left the domain.

What conditions.html contains — fully in-house.

NOAA marine forecast. An iframe pulling the NOAA/NWS NDBC text forecast for the Lower Texas Coast, embedded with `loading="lazy"`, `sandbox="allow-same-origin"`, and a title attribute. The CSP was updated to include `https://www.ndbc.noaa.gov` in `frame-src`. The page includes honest labeling that this is NOAA source material, not a Tiki Tommy forecast, with a clear fallback note if the frame doesn't load in restricted contexts.

Beach flag guide. Five-color reference (Green / Yellow / Red / Double Red / Purple) built entirely in HTML and CSS. No external source. The flag system is a permanent public safety standard — built once, stays correct.

Beach access points. Six Gulf-side access points (Harbors #1, Gulf Circle #3, Sea Island Circle #4, Treasure Island Circle #11, Good Hope Circle #21, plus a decision rule) as static orientation cards. South-to-north, labeled by use case.

Island Metro. Route summary, dispatch hours, office hours, verified address, and phone number (`tel:9567618178`) — sourced from verified public listing data, built as a static card. No link to myspi.org.

Sea Turtle Inc. emergency. The rescue line (`tel:9562434361`) with call-first instructions and a 911 note for immediate human danger. A native phone link that works without leaving the browser.

The conditions page is public, indexable, and in the sitemap. It's in the desktop nav as a link between Saved and Advertise on every page. It's in every page footer. It's the destination for every homepage and live-page utility link that previously pointed off-site. The condition-board slots on the homepage — previously decorative label displays — are now interactive links to `conditions.html#flags`, `conditions.html#transit`, and `tel:9562434361`. The live site at `ttlnew.netlify.app` confirms all of this working in production.

A visitor can check the beach flag meaning, read the marine forecast, pick an access point, figure out the free bus, or call sea turtle rescue without leaving the Tiki Tommy experience. Every time a user leaves a site to look something up, there's a real probability they don't come back.


Monetization

Nine ad placements built in before the first sponsor is sold.

Every placement is native to the design — not retrofitted. The business case is visible to stakeholders from the first review without the product feeling like an ad farm to visitors.

Desktop side rails. Two tall vertical banners on large screens (1600px+) in the empty margin space outside the 1180px content column. Hidden on tablet and mobile — the app-like flow stays clean. Sold individually or as a run-of-site pair.
Explore sponsored card. A clearly labeled "Sponsored · ☀️ Featured partner slot" card inside the Explore grid. Styled identically to venue cards but explicitly marked. Participates in the search and filter system.
Map featured pin. A boosted location callout in the map decision flow. Premium placement for venues visitors physically route to.
Live stream sponsor slot. The fourth YouTube embed slot designated as "Paid placement" — rotating sponsor stream, venue feed, or event preview.
Saved-plan offer. Offer card on saved.html appearing once a visitor starts building a plan. High-intent, moment-specific — ideal for coupons, happy hour, tour bookings.
Homepage spotlight + category sponsor. Homepage sponsor strip and category ownership (Food, Beach, Family, Nightlife, Transit) for recurring monthly packages.

A `sponsor-inventory.json` scaffold in `assets/data/` documents all nine placements. A future backend replaces this static file with managed sponsor records, campaign dates, click and impression tracking, slot availability, and creative uploads.


Technical Standards

The same checklist as a professional medical practice website.

Accessibility. Skip links before header on all 10 pages. `aria-current="page"` by JS. `aria-pressed` on filters and save buttons. `aria-label` dynamic updates. `aria-expanded` on hamburger. 15 `:focus-visible` rules. `prefers-reduced-motion`. Zero images missing alt. Zero iframes missing title. `lang="en"` on all 10 pages.
Security. Full CSP in netlify.toml: `script-src 'self'` (enforceable — zero external scripts), `frame-src` explicitly listing YouTube, youtube-nocookie, Google Maps, and NOAA. X-Frame-Options DENY. nosniff. Referrer-Policy. Permissions-Policy restricting camera, microphone, geolocation, payment. `form-action 'self'`. `frame-ancestors 'none'`. One-year immutable asset cache.
SEO. OG, Twitter Card, and canonical on all 10 pages. `noindex` on 404, thank-you, roadmap, saved. Sitemap with 5 indexable pages on absolute production-ready URLs. robots.txt with absolute Sitemap reference. Unique titles. One H1 per page. theme-color on all 10 pages.
Forms. `data-netlify="true"`, honeypot, hidden form-name, five label/id pairs, type="email", type="submit", thank-you.html action destination.
Performance. All 19 images WebP. Three fonts self-hosted woff2 — no Google Fonts CDN call. `loading="lazy"` on below-fold images. PWA manifest. No external JavaScript.
Data safety. `escapeHTML()` on all dynamic innerHTML. `localStorage` try/catch. `cleanTel()` strips non-numeric characters. `mapsUrl()` uses `encodeURIComponent()`.

Live Site Verification

Confirmed working at ttlnew.netlify.app before production DNS cutover.

Homepage scenario cards navigate to correctly pre-filtered Explore results via URL parameters.
Condition-board slots link to `conditions.html#flags`, `conditions.html#transit`, and `tel:9562434361`.
All utility tool cards on the homepage route to `conditions.html` anchors — zero links to external utility sites.
Conditions page live with NOAA iframe, five-color flag guide, beach access cards, Island Metro, and Sea Turtle emergency line.
Conditions in desktop nav and every page footer across all 10 pages.
All 20 venue cards rendering with address, phone, directions, verified badge, Tiki move, and category tags.
Map page with 20 interactive emoji pins, detail panel updating on pin click, Save button functional.
OG, canonical, and theme-color confirmed on live homepage.
One pre-launch item: The four YouTube embed slots on live.html use a placeholder video ID. Swap for approved SPI beach camera stream IDs before public promotion. The CSP, iframe structure, titles, and lazy loading are ready — it's a four-line change.

Takeaway

What this project demonstrates.

Tiki Tommy Live demonstrates three things in combination that are each harder than they look individually.

First: a product identity held consistently across 10 pages and 203 lines of JavaScript. The "real-time decision engine" positioning isn't a headline — it's the reason every scenario card uses first-person situation language, the reason search results are pre-filtered from the homepage, the reason the conditions page exists instead of linking visitors off-site.

Second: a data standard that earns trust rather than assuming it. Twenty venues verified against official sources. Two excluded because they couldn't be confirmed. Ratings, wait times, and crowd levels marked as pending rather than invented. A `BUSINESS_DATA_AUDIT.md` that documents every exclusion decision so future maintainers understand the standard they're maintaining.

Third: technical execution that survives scrutiny from any audience — UX reviewer, front-end developer, security auditor, product manager evaluating the business model. The site is accessible. The CSP is real and enforceable. The monetization layer is structured. The save system is XSS-safe. The beach conditions tool doesn't link out. None of these things are visible to a casual visitor. All of them are visible to the people who matter.

Every time a user leaves a site to look something up, there's a real probability they don't come back. The conditions page solves a UX problem and a trust problem at the same time.

TIKI TOMMY LIVE · SOUTH PADRE ISLAND · WEB DEVELOPMENT CASE STUDY · 2026 · TTLNEW.NETLIFY.APP