Joe Bruechner
Projects

Swell

The question Swell answers is whether today is a good day to be on the water. It pulls marine forecasts, tide, and live buoy and station readings into one conditions read, runs them through a rule engine that gives a plain go or no-go, and backs that with point-to-point navigation on a custom nautical chart and a safety layer that works with no signal.

v1 · in progress2026

Interested? Reach out — I'd love to share the source or answer questions.

Built with
iOSSwiftKotlinPostgreSQL / PostGISRedisGoogle Cloud
01

The Idea

Most weather apps hand you the numbers and leave the judgment to you. But if you're deciding whether to take a boat, a board, or a kayak out, the numbers only matter once they've turned into a verdict, and that's where a normal forecast app stops. Swell starts there. It reads wind, waves, swell, tide, barometer, water temperature, and visibility for a specific spot and gives back a plain answer to whether it's a good day to go out.

I'm building it solo under Silmaril Studio, the whole thing: the iOS client, the backend that assembles the data, the cloud it runs on, the design language. I'm not chasing the longest feature list. I want the core read to be genuinely good first, then navigation and safety built around it, without the app ever turning into a dashboard.

02

See It Work

An iOS app for people who go out on the water: read the conditions, find your way, and handle it when something goes wrong.

The conditions read, running on device: the go/no-go call and the wind, barometer, and visibility views behind it.
03

The App So Far

v1 is built core-first. The conditions read shipped first because it's the spine of the app; onboarding comes last, built as a live tour of features that already exist instead of a reel of marketing screens. The shell landed on three tabs, three jobs, no overlap:

  • Home — depth on one spot: the quick read of what it's doing at your home base, with a minimap that drops you straight into the map, already centered there.
  • Map — one surface, two modes. Conditions mode carries the weather overlays and time-scrubbing; Navigate mode carries the nautical chart, waypoints, the route line, and a distress sheet that's always one tap away. Weather and nautical detail fight for the same pixels, so the mode switch is what keeps each one clean.
  • Saved Locations — breadth across spots: everywhere else you keep an eye on, as conditions cards, each one a tap from the full forecast.
  • A go/no-go call you can actually read, a 24-hour and 7-day forecast, point-to-point navigation, and a safety layer (Mark My Position, a distress sheet, float plans) that stays free and ungated.
04

Architecture

The hardest part is the conditions assembler. One backend service fans out across NOAA CO-OPS, NDBC, NWS, USGS, and Open-Meteo's Marine and Forecast APIs at once, reconciles whatever comes back into a single snapshot per location, and caches it in Redis. I wrote it in Kotlin with Ktor for exactly this: structured concurrency keeps the fan-out clean, with real cancellation and no orphaned requests when one provider drags, which is fussy to get right anywhere else.

Turning a saved place into the nearest data station is a PostGIS nearest-neighbor query against Cloud SQL Postgres. The service runs on one Cloud Run instance that reaches private-IP Postgres and Memorystore over Direct VPC egress, with no serverless connector and no auth proxy in the path. The nautical map is server-rendered raster tiles, handed to the iOS client through MapKit's MKTileOverlay.

The client is local-first. iOS serves the conditions snapshot straight from a local SwiftData store, then refreshes in the background and updates quietly, so the read never waits on the network. You can use the whole app as a guest; accounts and cross-device sync are the last thing I'm adding before release, not a gate at the front door. That same data feeds the widgets, the watchOS complication, Live Activities, and the Siri intents.

05

Why I'm Building It

Partly I'm building it because I want it to exist: something that gives me a read I trust before I head out, instead of a screen of numbers I have to interpret myself. But mostly it's the most complete thing I've built alone. A concurrent data backend, a geospatial database, a polished native client that stays honest offline, a real design language, all of it mine. I like that I have to hold the whole stack in my head and make every layer good, not just the one I'm best at.

The honesty part is what I care about most. An app that's confidently wrong about the water is worse than no app, so Swell is upfront about what it actually knows, degrades gracefully when a source goes dark, and keeps the safety features working with no signal. That's harder and less flashy than piling on features. It's the bar I'm holding this to.