A mobile-first PWA for real-time sailing and current conditions in NYC Harbor — designed to check while walking to the dock.
Real-time sailing conditions: wind, tides, barometric pressure, weather, and forecast.
Five consecutive hourly surface current forecast images for Manhattan Waters from Stevens NYHOPS, starting from the current hour.
Interactive Leaflet map with OSM + OpenSeaMap nautical chart as the base layer and the NYHOPS current forecast georeferenced on top. Includes 13 USCG buoy markers (G1, G5, G7, G9, G11, 31, 33, Y-A, Y-C, R26, R28, R30, R32) at verified coordinates.
Short-range weather outlook for NYC Harbor over the next 4, 8, or 12 hours.
- Hourly forecast from Open-Meteo HRRR: temperature (°C/°F), condition, precipitation probability, cloud cover, visibility in nautical miles, and thunderstorm probability when available. Rule-based plain-language summary (e.g. "Rain likely", "Thunderstorm caution"). Model freshness metadata with estimated next update.
- NWS Marine Zone Forecast (ANZ338 — New York Harbor): official USCG/NWS coastal waters forecast with wind in knots, wave heights, and visibility in nm. Today & Tomorrow always shown; Extended Outlook (Wed–Thu) in a collapsible card. High-wind periods highlighted.
- Observed radar: RainViewer past-2h animated radar on a Leaflet map, 10-minute steps, play/pause/prev/next controls. Clearly labeled as observed — not a future forecast.
Forecast coordinate: G1 buoy (40.6797°N, 74.0288°W), central Upper Bay.
Weekly USCG District 1 LNM filtered to NYC Harbor. Shows active notices (shoaling, bridge work, marine events, buoys off-station) relevant to the immediate sailing area: Ambrose Channel, Verrazzano Narrows, Upper/Lower Bay, Governors Island, Buttermilk Channel, Kill Van Kull, Great Kills, Sheepshead Bay, Hudson River south of W42nd St. Also provides direct links to the current and recent weekly PDFs with honest availability status (not yet posted / scanned PDF unavailable).
Wind speed, temperature, and tide status in a quick-read banner strip.
- Current sustained speed, gusts, and direction (cardinal + degrees)
- 2-hour horizontal wind speed chart — sustained (green), gusts (orange), rolling average (dashed), 12-knot reference line
- Toggle to view full NOAA station page in-app
Inspired by the B&G Advanced WindPlot display on Zeus/Vulcan chartplotters:
- Vertical time axis — current time at top, 2 hours ago at bottom
- TWD panel (left) — wind direction with rolling average and shaded deviation from mean
- TWS panel (right) — wind speed with gusts overlay and rolling average
- Time markers at NOW, -30m, -60m, -90m, -120m
- Reveals wind shift patterns and trends at a glance
- Current pressure in mbar
- Trend indicator (Rising/Falling/Steady with rate)
- 3-hour and 6-hour pressure change with color coding
- 6-hour pressure chart from NOAA 6-minute data
- Current status: Flooding / Ebbing / Slack with color coding
- Visual progress bar with Rule of Twelfths current strength indicator
- Countdown timer to next tide, 6-event lookahead
- Sunset time and tide phase at sunset
- Current temp in °C and °F with feels-like
- Weather description with icon
- Thunderstorm risk indicator (CAPE-based)
- Water temperature
- 18-hour forecast from NOAA HRRR via Open-Meteo
- Columns: Time, Wind, Gust, Dir (cardinal), Dir (degrees), Temp, Rain
- Current hour highlighted with color-coded wind speeds
- Interactive Windy radar embed (lazy-loaded on tap)
- Quick links to Windy and AccuWeather
| Data | Source | Resolution | Update |
|---|---|---|---|
| Wind (current + history) | NOAA CO-OPS — Robbins Reef | 6-minute | 6 min |
| Barometric pressure | NOAA CO-OPS — Robbins Reef | 6-minute | 6 min |
| Tides | NOAA CO-OPS — The Battery | High/Low events | Daily |
| Water temp | NOAA CO-OPS — The Battery | Point reading | 6 min |
| Forecast | Open-Meteo — HRRR model | 3 km / 15-min | Hourly |
| Radar | Windy embed | — | Real-time |
| Surface currents | Stevens NYHOPS — Manhattan Waters | ~500m / hourly | Daily |
| Marine zone forecast | NWS OKX — ANZ338 New York Harbor CWF | Text product | Twice daily |
| Observed radar | RainViewer | 10-min frames | Real-time |
| Nautical chart tiles | OpenStreetMap + OpenSeaMap | — | Continuous |
All dashboard APIs are free, require no API key, and support CORS.
The LNM digest uses the USCG NAVCEN PDF (public) and GitHub Models (GPT-4o-mini via built-in GITHUB_TOKEN) — no external API key required.
- Fork or clone this repo
- Settings → Pages → Source: select
mainbranch, root folder (/) - Live at
https://yourusername.github.io/repo-name/
- Open the URL on your phone (Chrome or Safari)
- Tap "Add to Home Screen"
- Opens like a native app — no browser chrome
NYHOPS forecast images are RGBA PNG files — only the current velocity arrows are opaque pixels; all other areas are fully transparent. This allows them to be georeferenced directly over any Leaflet tile layer using L.imageOverlay with the Manhattan Waters bounding box [[40.632, -74.102], [40.785, -73.943]]. Frame numbers map as: frame = 25 + ET_hour.
All charts use devicePixelRatio-aware canvas setup for crisp rendering on Retina/high-DPI mobile screens.
The vertical plots mirror the B&G Advanced WindPlot paradigm where time flows top-to-bottom. A rolling average line provides the reference — deviation from the average is shown as a shaded area, making wind shifts immediately visible.
NOAA returns timestamps in local time without timezone info. The app dynamically detects the current Eastern Time UTC offset using Intl.DateTimeFormat and appends it before parsing.
The forecast uses Open-Meteo's minutely_15 endpoint sourced from NOAA HRRR (3km, hourly refresh) rather than GFS (22km). HRRR is far more useful for local harbor conditions.
├── index.html # Wind & tide dashboard
├── weather.html # Weather forecast (Open-Meteo · NWS ANZ338 · RainViewer radar)
├── nyhops.html # NYHOPS surface current forecast images
├── nyhops-overlay.html # NYHOPS currents on interactive Leaflet chart
├── lnm.html # Local Notice to Mariners digest
├── lnm_current.json # Auto-generated weekly notices (committed by CI)
├── manifest.json # PWA manifest
├── scripts/
│ ├── fetch_lnm.py # PDF download + GitHub Models extraction
│ └── requirements.txt
└── .github/workflows/
└── lnm-update.yml # Runs every Friday noon ET
No server, no build step, no node_modules. The LNM update is the only automated step (GitHub Actions).
MIT — use it, modify it, sail with it.
For planning only — not for navigation.