← All work AI + satellite data · iOS & Android

Shaka — one score for the whole ocean.

Spearfishers check five different sites — swell, tides, visibility, wind, fish counts — before every dive, and still guess. Shaka fuses satellite and forecast data from NASA, NOAA, and Copernicus into a single dive score for hundreds of spots, and uses AI to turn messy fishing-report chatter into a trustworthy regional summary.

RoleSolo — product, design & engineering
PlatformiOS & Android
StackFlutter · Kotlin · PostGIS
StatusDeployed · ~789 spots

The problem

Planning a dive day is a fragmented research loop. Before getting in the water, a spearfisher cross-checks swell, tides, visibility, wind, water temperature, and what's being caught nearby — typically across five or more sites. Even after all that, the decision is still a guess, because nothing ties the ocean physics to a specific entry point.

And the human intel is noisy: a forum post mentioning a tuna used as frozen chum can read like a catch report if you parse it naively. So the problem isn't just aggregation — it's trustworthy synthesis of satellite truth and messy human reports, with honesty about what's unknown.

Who it's for

Spearfishers and shore/boat divers deciding where and when to go — mostly the evening before or the morning of. It's a field tool, used on a phone at the coast, not a desktop dashboard. Power users dig into satellite layers and animated forecast maps; anglers check regional dock totals and AI-written trend summaries.

Product & journey

From map to decision

  • Explore — a full-screen map with score-colored markers and a horizontal carousel of spots (a Surfline-style 70/30 split).
  • Spot detail — three tabs: Conditions (the score breakdown, swell, tides, satellite visibility), Forecast (7-day), and Guide (marine-protected-area rules and regulations).
  • Reports — regional chips across the West Coast with AI-written key insights and species catch trends (a 3-day window vs the prior 3 days).
  • Charts — an animated ocean-forecast map and a NASA satellite-imagery viewer.
  • Profile — saved and custom-pinned spots, unit preferences.

Architecture

A Kotlin/Ktor backend on Railway ingests from many sources on staggered schedules, scores every spot, and serves a PostGIS-backed REST API. A separate Python pipeline downloads Copernicus and ECMWF fields and encodes them as map tiles served from a Cloudflare CDN. The Flutter app renders the map, the scores, and the animated layers.

NASA · NOAA Copernicus Dock totals forum scraper Ingest · score Kotlin · Groq AI REST API + PostGIS Flutter app iOS · Android
Staggered prefetch: tides hourly, weather every 3 h, satellite every 6 h, intel every 2 h.

Craft & challenges

The scoring engine

The 0–100 Shaka Score weights four factors, and decays its confidence honestly as the forecast horizon lengthens:

35%
Visibility (chlorophyll-a)
28%
Swell
22%
Wind

The remaining 15% is a solunar factor. When a satellite input is unavailable, the score says so rather than faking calm conditions.

  • Satellite pipelines — OAuth into Copernicus with a circuit breaker for a service that dislikes concurrency; ERDDAP bbox queries with progressive expansion; a Python pipeline that turns ocean fields into WebP tiles for an animated map.
  • Geospatial at the core — spots stored as PostGIS geography with radius queries for "what's near me."
  • AI as a trust layer — a Groq-hosted model (with an OpenAI fallback) classifies what was actually caught and writes terse, mobile-friendly summaries; the numeric dock totals are never AI-rewritten.
FlutterMapLibre GLKotlin · KtorPostgreSQL + PostGISPythonCopernicus / NOAA / NASA GIBSGroqCloudflare R2Railway

Selected screens