An iOS app that answers the Apostle Islands cruiser's nightly question: "Given the wind, where should we anchor or dock tonight — and can we stay a while?"
Built for Apostle Islands National Lakeshore (Lake Superior, Wisconsin): 21 islands, one of the largest lighthouse collections in the U.S., and weather that rewrites your float plan daily.
- Wind-aware planning map — an hourly wind-field overlay (direction arrows, speed-colored, in knots) across the whole archipelago on satellite imagery, with a time scrubber that plays the forecast forward 8 days.
- Ranked "where to stay" picks — every anchorage, NPS dock, and marina is scored for the selected night by matching the hourly wind/gust forecast against that spot's real geography: a 16-direction shelter profile plus open-water fetch (how far waves can build). Strong wind onto an exposed spot — a lee shore — caps the score outright.
- Multi-night outlook — each place shows a night-by-night strip a week out and a "good for N consecutive nights" badge, so a one-night wonder and a stay-all-week harbor are easy to tell apart.
- Trip-length ranking — pick a stay of 1–7 nights and every place is re-ranked across the whole window, worst night weighted heaviest; spots the forecast can't fully cover are excluded rather than half-rated.
- Plan filters — marinas behind breakwalls rate well in almost any wind, so the plan can be limited to anchorages, docks, marinas, or any mix (persisted across launches).
- Wave layer — Open-Meteo Marine wave heights as a third map layer (with direction arrows and a feet-scale legend) and a per-place wave chart with overnight max, honestly labeled as open-water values.
- Transparent data — a tap-away Data Sources sheet on the map credits every feed (wind, waves, alerts, places) with fetch time.
- The lore layer — 40 verified points of interest browsable on the map and in Explore: every light station (including the lighthouse built on the wrong island), the documented shipwrecks from Wisconsin Shipwrecks (Sevona, Pretoria, Lucerne, Fedora…), brownstone quarries, fish camps, Frog Bay Tribal National Park, sea caves, singing sands, and more — each with an original, fact-checked story and sources.
- Real places only — the place database is compiled from NPS boating guidance, marina listings, and published Lake Superior cruising references, with coordinates and shelter profiles verified against the actual geography. Every entry cites its sources in-app.
- Explore the islands — original write-ups of every island: lighthouses, brownstone quarries, singing sands, sea caves, shipwrecks, and the hermit of Hermit Island.
- Marine alerts — active NWS Small Craft Advisories / Gale Warnings for the surrounding nearshore zones surface as a banner.
- Offline-friendly — the last forecast is cached so ratings still render at anchor with no bars.
AnchorCore/ Swift package (platform-agnostic, tested with `swift test`)
Models, Compass, POI Place/Island/POI models, 16-sector compass math
Scoring ScoreEngine: hourly + overnight suitability, night & N-night stay ranking
OpenMeteoClient Batched hourly wind forecasts (free API, no key, knots, unixtime)
MarineAlerts NWS api.weather.gov active-alerts client
Resources/ places.json + islands.json + pois.json (the curated databases)
ApostleAnchor/ SwiftUI app (iOS 17+)
Plan tab MapKit map, wind-grid annotations, time scrubber, ranked sheet
Places tab Searchable, filterable catalog grouped by island
Explore tab Park + island stories
About tab Methodology, data sources, disclaimer
The scoring model, in one breath: effective wind blends speed with gusts; the place's shelter value for the wind's direction sets exposure; fetch amplifies exposure into wave risk; a deadband + power curve maps stress to 0–100; overnight hours (6 PM–9 AM, when you're actually swinging on the hook) drive each night's grade, weighted toward the worst hour; hard caps apply when strong wind blows onto an exposed shore.
Open ApostleAnchor.xcodeproj in Xcode 16+ and run the ApostleAnchor scheme, or:
xcodebuild -project ApostleAnchor.xcodeproj -scheme ApostleAnchor \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' buildCore logic tests:
cd AnchorCore && swift testThe app icon is generated by swift scripts/make_icon.swift <out.png>.
docs/index.html (GitHub Pages) is generated by python3 scripts/update_landing.py
from the same three databases the app ships — including the interactive
#explore map, which embeds the full catalog of places and lore sites with
filters, search, and story popups. Regenerate whenever places.json,
islands.json, or pois.json change so the web map never drifts from the app.
- Forecasts: Open-Meteo (hourly 10 m wind, gusts, direction)
- Alerts: NOAA / NWS marine zones
- Places: NPS Apostle Islands boating pages, marina/harbor listings, and published Lake Superior cruising references (cited per-place in the app)
Not for navigation. Ratings are planning guidance. Carry charts, check the NOAA marine forecast, and make your own seamanship decisions — Superior is cold, big, and changes faster than any forecast.