Skip to content
Sunset Beach, NC
Get Support

Limits and what it doesn't know

Sunset Beach covers one beach — Sunset Beach, North Carolina — and nothing transfers to the next beach up the coast. It is not a safety service: the beach has no lifeguards, and rip risk, surf height and swim advisories are forecasts and periodic samples, not observations of the water in front of you. No instrument at this beach measures waves or water level; wave numbers come from a buoy 50 miles offshore or a 25 km model, and surge is borrowed from a South Carolina pier. Several sources are scraped by courtesy and can break; several are rate-limited and fall back to a last-known-good copy; one (eBird) needs a key; one (the seaturtle.org nest database) is never republished. Fishing limits are read by hand and dated. This page lists all of it, in the app’s own words where it has them.

What the app itself says it doesn’t know

Section titled “What the app itself says it doesn’t know”

The Sources screen (Beach info › Sources) carries a section titled “What this doesn’t know” with these seven lines, verbatim:

  • No wave sensor exists at Sunset Beach. Wave numbers come from a buoy ~50 miles offshore or a ~25km model cell; the beach-specific figure is the NWS surf height.
  • Live shark positions aren’t available; OCEARCH has no open data feed, so historical OBIS records stand in.
  • Ships offshore aren’t tracked. An AIS feed boxed 55 miles around this beach returned nothing across two live tests, so the app links out to public trackers instead.
  • Bird migration is radar over the whole of Brunswick County, and only after dark. It measures volume, never species.
  • Concert line-ups per week aren’t published, only the weekly pattern — those dates are marked “series”.
  • Individual nest hatch dates aren’t published; the Turtle Watch posts season totals only.
  • Beach-score weights are opinionated guesses, not tuned against outcomes.
GapWhat is shown instead
No wave observation at the beach. NDBC 41024 sits off the beach but has no wave sensor.Live waves from NDBC 41013 (Frying Pan Shoals, ~50 mi SE); forecast waves from Open-Meteo Marine’s ~25 km cell; the beach-specific number is the NWS surf height for “Ocean Isle Beach West”. The Coastal Waters Forecast (AMZ252) is a human forecast for the water inside 20 nm — still not the surf.
No water-level sensor at the beach. CO-OPS 8659897 lost its instrument in 2008 and serves predictions only.The tide card is a harmonic prediction. “Against the prediction” borrows only the anomaly (observed minus predicted) from CO-OPS 8661070 Springmaid Pier, about 24 nm down the coast; the absolute level and that pier’s flood thresholds are never shown.
Swim advisory sampling is weekly, so a clear result can be most of a week old, and bacteria spike after rain.The card shows the sample date and its age. Sewer spills within 10 nm in the last 14 days render as a line inside the card between samples — and render nothing when empty, which is normal.
A shellfish closure has no start or end date — the state’s layer carries none.The card says what the state says now and when the state last edited the layer. Nothing here is permission to harvest.
The tropical outlook is basin-wide. A formation chance for a wave off Africa is not a forecast for this beach.Local impacts arrive through NWS alerts, which the app carries separately.
No live whale, shark or dolphin positions exist publicly. OCEARCH has no open feed; iNaturalist has a handful of cetacean records in eight years.NOAA’s right whale slow zones and calving habitat, historical OBIS records, and iNaturalist sightings — each labelled as what it is, not as animal positions.
iNaturalist measures observers, not animals, and blurs every sea turtle’s location deliberately.The panel says so; obscured records are not drawn as points; group tallies cover a 200-record page (sampleSize), not the whole window.
Bird migration is a county aggregate, sampled every two hours after dark. A short sharp peak between samples is missed; daytime readings are invalid by design.Last night’s peak and what is aloft now, with a citation to BirdCast; the forecast half is not public, so the app links out.
The catch report is one pier, and it is yesterday’s. The pier shuts December to March.The date is stated; the seasonality almanac stands in over the winter.
No per-nest hatch dates. The Turtle Watch posts season totals; the standardised nest database confirms the gap rather than closing it.A computed NC season model says which phase the season is in and what to do (lights out, fill holes, gear off the beach).
Ships are not tracked — a 55-nm AIS box returned zero messages in two live tests.A curated note on what actually passes and links to three public trackers.
ISS and satellite passes are not offered.Nothing — recorded as a decision so it isn’t researched again.

Every source has a refresh lifetime (2 minutes for NWS alerts, 5 minutes for buoys, up to 30 days for a regulatory boundary) and a fallback window during which a last-known-good copy may be shown, labelled “Cached” — 1 day by default, longer where a stale answer beats none (30 days for water quality, the pier report and proclamations; 7 days for launches, eBird and shellfish closures; 3 hours for surge). Past that window a panel goes “Unavailable”. /api/conditions itself can be up to two 5-minute cron ticks old before it is rebuilt. Full detail on How fresh the data is.

UpstreamLimitWhat the app does
Launch Library 2~15 requests/hour per IP, anonymous; Cloudflare’s egress addresses are shared, so 429s happen regardless of the app’s own rate4-hour cache coordinated globally through KV (5 minutes while a visible launch is imminent); on failure, falls back to The Space Devs’ lldev mirror — whose data may lag, and the source name says so — then to a last-known-good copy for up to 7 days. An optional LL2_API_KEY (Patreon-gated, not free) would move it off the shared bucket.
iNaturalistRate-limits the Worker for the same shared-address reason6 h / 24 h / 7 d caches coordinated through KV; fallback 7 / 14 / 30 days.
eBirdRequires a free API key (EBIRD_API_KEY); returns 403 without oneWithout a key the panel reads “Not configured” rather than broken, and nothing else degrades.
Open-Meteo (marine, forecast, air quality)Free tier is non-commercialUsed as-is; the app is a personal/family build.

These are HTML pages read by courtesy rather than by API, cached hard so they are hit a handful of times a day, and they fail soft:

  • Sunset Beach Fishing Pier events page (Thursday concert series) — if the layout changes, unparsed lines are shown as raw text rather than dropped, and the events panel notes “Pier page loaded but no concert entries were recognised — the layout may have changed.”
  • Sunset Sound Waves schedule page — the Wednesday Town Park series is reconstructed from the town’s stated weekly pattern because the town’s own calendar feed carries only the season opener; every generated date is marked inferred in the API and “series” in the app, and the season end is assumed to be Labor Day because it isn’t published.
  • Sunset Beach Turtle Watch home page — season totals; if none are found the panel says “Season totals weren’t found on the page — the layout may have changed.” and the season model still shows.
  • N.C. DMF proclamation list — three pages of a server-rendered view; a page that fails costs its fifteen rows, and pagesRead says so.
  • The pier’s daily report is RSS, not scraped, but is read over plain HTTP because the host’s certificate is issued for another name.
  • NHC CurrentStorms.json — returns an empty array in a quiet Atlantic, so a storm parser written against it would be a guess; the app reads the Tropical Weather Outlook instead and links to NHC.
  • NWS gridpoint lightningActivityLevel and probabilityOfTropicalStormWinds — present as keys with empty values arrays here (the first has never carried a value at this gridpoint; the second is populated only when a tropical system threatens), and with no unit key; each would render as a confident nothing.
  • Open-Meteo 15-minute precipitation — accepted but cosmetic at this latitude (each quarter is the hour ÷ 4), so “when rain starts” is by the hour.
  • BirdCast birds_passed — a fixed multiple of the migration rate with undocumented units.
  • seaturtle.org nest counts — the project withholds permission to reference its data without written consent, so /api/health publishes only whether its count agrees with the Turtle Watch scrape, and no figure from it appears anywhere.
  • The pier report’s tide lines — CO-OPS gives the same pier’s tides to the minute.
  • OCEARCH, Movebank, AISStream, satellite passes — see above.

Size and bag limits are not fetched. They are read by hand off the N.C. Division of Marine Fisheries proclamations that set them and stamped with a date (asOf 2026-07-01, verifiedOn 2026-08-08 in the current build). What is fetched is the list of finfish proclamations in force, so the app can flag a fish whose governing document is newer than the curated number and link you to it. The state’s own summary table was wrong in two places when checked, which is why it isn’t scraped. None of it is legal advice: confirm against NC DMF before you keep a fish.

The activity scores, the sunset model and the almanac window weights are “opinionated guesses tuned against nothing but judgement about this beach”. The Worker now keeps a daily record of what it forecast against what happened (/api/calibration) so they can one day be tuned; until then treat a rating as a considered opinion. See How the app judges things.