For curious neighbors

Local weather, made useful.

The public API serves current conditions and minute history. Approved neighbors can request the full 2.5-second wind feed through a shared Tailscale service.

01 · Public API

No key required.

Read-only endpoints use JSON, explicit units, ISO timestamps, and permissive CORS. Minute requests are capped at 31 days; larger windows use daily resolution.

GET/api/v1/current
GET/api/v1/history?from=&to=&resolution=minute
GET/api/v1/forecast
GET/api/v1/air-quality
curl https://coltonweather.com/api/v1/current

const response = await fetch(
  "https://coltonweather.com/api/v1/current"
);
const weather = await response.json();
02 · Response schema

Stable, versioned JSON.

Missing measurements are returned as null, never invented. Device IDs, exact coordinates, and private network details are omitted.

{
  "schemaVersion": "1.0",
  "mode": "live",
  "observedAt": "2026-07-25T23:14:00.000Z",
  "freshnessSeconds": 2,
  "conditions": {
    "temperatureF": 68.4,
    "humidityPct": 62,
    "windSpeedMph": 11.2,
    "windDirectionDeg": 247,
    "solarRadiationWm2": 426,
    "uvIndex": 4.2
  },
  "quality": {
    "fresh": true,
    "rapidFeedConnected": true
  }
}
03 · Rapid feed

Wind every 2.5 seconds.

The WeatherLink LAN broadcast terminates at the home collector. Tailscale then shares only that collector—not the camera, WeatherLink device, or home subnet.

  • WebSocket: wss://collector.<tailnet>.ts.net/v1/live
  • UDP: send {"type":"subscribe","ttl":60} to collector port 22222 and renew once a minute.
  • REST snapshot: /v1/current
04 · Freshness

Stale is a real state.

Every response includes source and receipt times. Wind and rain rapid packets are normally 2.5 seconds apart; the full current-conditions document is polled every 10 seconds. Clients should check quality.fresh andfreshnessSeconds.