Skip to content

Latest commit

 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Apostle Anchor ⚓️

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.

What it does

  • 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.

Architecture

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.

Building

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' build

Core logic tests:

cd AnchorCore && swift test

The app icon is generated by swift scripts/make_icon.swift <out.png>.

Landing page

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.

Data sources

  • 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.

Releases

Packages

Contributors

Languages