mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
Merge branch 'main' into feat/wsdot-camera-pack
Keeps main's 4,000 catalog-wide camera cap, which main pins in tests; WSDOT shares it round-robin with the other packs. The branch's earlier cap raise and its removal of main's cap tests are reverted in this merge.
This commit is contained in:
commit
24f14a77a3
392 files changed
+44700
-2170
No files matched your search
+289
-6
@@ -7,12 +7,122 @@
|
||||
diagonal, get a high-confidence heading; `BW` (Bothways) cameras use the
|
||||
shared id-hash fallback at low confidence. By default the 250 cameras nearest
|
||||
Seattle and Spokane load; `CCTV_WSDOT_MAX_SOURCES` sets the cap and
|
||||
`CCTV_WSDOT_ENABLED=0` turns the pack off. The default catalog cap
|
||||
(`CCTV_MAX_SOURCES`) rises from 4,000 to 5,500, and its ceiling from 5,000 to
|
||||
6,000: the per-pack defaults already summed to 4,954 before WSDOT (Statens
|
||||
vegvesen alone defaults to 900), so a default install was being trimmed. A
|
||||
test now sums every pack's default and fails if they exceed the cap
|
||||
(bassem chagra, #644).
|
||||
`CCTV_WSDOT_ENABLED=0` turns the pack off (bassem chagra, #644).
|
||||
|
||||
- Stop one retired bikeshare feed from reporting the whole layer as failed.
|
||||
City feeds are fetched independently, but failure was recorded in a single
|
||||
flag that only a successful *activation* cleared — and an already-loaded city
|
||||
never activates again. A dead feed re-entering camera range therefore latched
|
||||
LOAD FAILED permanently over a map still drawing every other city's stations.
|
||||
Failure is now tracked per city: a city that fails beside others still
|
||||
drawing marks the layer DEGRADED, polls that all fail over previously drawn
|
||||
points read STALE without advancing freshness, and LOAD FAILED is reported
|
||||
only when nothing is left to draw. A city that recovers clears its own
|
||||
failure, a failure is dropped once its city leaves range or the camera rises
|
||||
above the activation altitude, and late results from superseded requests are
|
||||
ignored.
|
||||
|
||||
Repointed the three feeds whose operators had moved: Reddy Bikeshare (Buffalo)
|
||||
to Social Bicycles, Tugo (Tucson) and Trinity Metro (Fort Worth) to PBSC.
|
||||
Dropped CoGo (Columbus) and Broward B-cycle (Fort Lauderdale), whose systems
|
||||
have wound down — CoGo's feed reports no stations and last moved a bike in
|
||||
March 2025. The three repointed feeds were verified live.
|
||||
|
||||
- Add Bike Share Toronto (1,069 stations) to the bikeshare registry. The system
|
||||
publishes the same PBSC GBFS v2 feeds as the Austin, Honolulu and Chattanooga
|
||||
entries, so it needs no new plumbing; a registry test now holds every city's
|
||||
feed URLs against the proxy host and path allowlists, so a city the proxy
|
||||
would refuse fails the suite instead of rendering an empty layer.
|
||||
|
||||
- GBFS v3 station names use English translations when available, then the first
|
||||
usable translation or short name. Empty or malformed names no longer appear as
|
||||
`[object Object]` or interrupt station loading; legacy string names remain
|
||||
supported in the globe and bike-share tools. Thanks to
|
||||
[Kristóf Kékesi](https://github.com/KristofKekesi) (#61).
|
||||
|
||||
- Overpass and military-installation disk caches no longer serve answers from a
|
||||
previously configured `OVERPASS_UPSTREAMS` instance after it is repointed.
|
||||
|
||||
- A Radio Browser mirror answering 204, 205 or 304, or a status outside
|
||||
200–599, no longer crashes the local dev/preview server. Null-body statuses
|
||||
get an empty body; anything else that cannot become a response fails that
|
||||
mirror so the next one is tried.
|
||||
|
||||
- Snow flakes sway within a fixed range instead of drifting sideways faster the
|
||||
longer the app runs; the Wind setting still scales the sway.
|
||||
|
||||
- The right rail ignores panels that other CSS hides, such as during an event
|
||||
view, so they no longer force one-panel-at-a-time layout or collapse visible
|
||||
panels. Panels the rail collapses itself are still restored.
|
||||
|
||||
- Coordinate searches refuse empty latitude or longitude components instead of navigating to an unintended location.
|
||||
|
||||
- Bing Aerial and Bing Labels request HTTPS tiles on HTTP localhost through
|
||||
their ion-backed providers, retaining ion and per-tile attribution without
|
||||
widening the Content Security Policy.
|
||||
|
||||
- Add New York City traffic cameras from the NYC DOT Traffic Management Center
|
||||
as an opt-in CCTV pack. NYC DOT requires a data-sharing agreement for the
|
||||
camera feed, so the pack is off unless `CCTV_NYC_ENABLED=1` is set by an
|
||||
operator who holds one; otherwise no request reaches NYC DOT. NYC DOT's
|
||||
requested disclaimer is in the Data attribution popover. The camera list is one keyless JSON request to
|
||||
`webcams.nyctmc.org/api/cameras`; frames are stills synthesized from each
|
||||
camera UUID on that same host, so a catalog field cannot steer the proxy
|
||||
off-host. Offline cameras are dropped. Once enabled, the 250 cameras nearest
|
||||
the five borough cores load and `CCTV_NYC_MAX_SOURCES` changes the cap. The catalog-wide ceiling is
|
||||
unchanged; extra cameras share it round-robin with the other packs.
|
||||
|
||||
- Street Level counts unique tiles before ranking so overlapping dateline halves
|
||||
in polar views do not waste slots in the 16-tile overview budget.
|
||||
|
||||
- Directions no longer shows a truncation notice for a route with exactly 200
|
||||
turns, and a roundabout at the 200th turn keeps its exit distance.
|
||||
|
||||
- Weather records keep missing conditions unknown and refuse summaries without a measured temperature.
|
||||
|
||||
- Tool string length validation counts Unicode characters correctly, including characters outside the basic multilingual plane.
|
||||
|
||||
- Director timeline seeks cross the dateline along the short longitude arc.
|
||||
|
||||
- Recent Imagery continues past malformed records in full catalog pages, respects the requested record limit, and reports results as truncated when that limit drops valid records.
|
||||
|
||||
- Regional articles retain unknown publication times when compact source dates do not identify a real calendar instant.
|
||||
|
||||
- Add Detroit (MoGo), Pittsburgh (POGOH), Aspen (WE-cycle) and Kona & Hilo
|
||||
(HIBike) to the GBFS bikeshare registry, the layer's first stations in
|
||||
Michigan.
|
||||
|
||||
- Treat explicitly current, complete empty vessel coverage as a successful update,
|
||||
clearing obsolete contacts while retaining stale or incomplete snapshots.
|
||||
|
||||
- Custom Street Level provider switches survive share links and stored state
|
||||
using URL-safe stable provider IDs and a shared boolean-switch codec; existing
|
||||
Mapillary links keep their meaning. Explicit provider toggles reach durable
|
||||
state without adopting unrelated live switch changes.
|
||||
|
||||
- Directions and Recent Imagery accept replaceable acquisition sources, including
|
||||
route transport, imagery catalog, thumbnails, tile templates and attribution.
|
||||
Explicitly removing either source leaves its layer unavailable; standalone
|
||||
defaults preserve the existing providers.
|
||||
|
||||
- Catalog source availability no longer modifies layer objects; unavailable
|
||||
tooltips use layer display names.
|
||||
|
||||
- Street Level with no providers uses the shared unavailable state and refuses
|
||||
activation before initialization, while keeping its layer identity visible.
|
||||
|
||||
- Application source configuration accepts replacements and explicit removal.
|
||||
Missing catalog feeds leave their layers unavailable without blocking startup
|
||||
or making fallback requests; malformed supplied feeds remain configuration errors.
|
||||
|
||||
- Street Level providers are optional in application composition. Omitting a
|
||||
Mapillary source no longer prevents startup; callers can inject a different
|
||||
provider list or an empty list without changing layer identities or share links.
|
||||
|
||||
- Vector tile sources take their allowed tile origin from the configured
|
||||
`tileJsonUrl`, so repointing only that URL at a mirror loads tiles from the
|
||||
mirror or fails visibly instead of silently using OpenFreeMap. Thanks to
|
||||
[daikaginza](https://github.com/daikaginza) (#935).
|
||||
|
||||
- MCP setup examples use the app's default port, `4173`. Thanks to
|
||||
[Huanyi Xie](https://github.com/xiehuanyi) (#934) and
|
||||
@@ -77,6 +187,133 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
- Add a keyless Air quality layer to the Weather group, with Environment and
|
||||
Climate Change Canada's AQHI as the first registered provider. Readings carry
|
||||
`{ provider, scale, value, band }` so another network can be added without
|
||||
inventing a shared numeric meaning across indices that do not share one; the
|
||||
row and readout both state that coverage is Canada only. The WEATHER card
|
||||
shows the band legend and the highest readings currently in view. AQHI is
|
||||
reported as an integer from 1 with an open-ended "10+", so readings round to
|
||||
that published form rather than the decimal precision the API returns.
|
||||
Readings older than six hours are dropped, and the layer reports `stale`
|
||||
through `getStats()` (also when every observation was dropped) so feed
|
||||
provenance cannot describe an aged feed as live. Voice can switch it on and
|
||||
query readings by value, band, station and observation time.
|
||||
|
||||
- Bound six upstream body reads (FIRMS CSV, CelesTrak TLE groups, adsb.lol
|
||||
`/v2/mil`, TomTom flow tiles, OpenSky `states/all` and adsbdb lookups) with
|
||||
streaming size caps that cancel the body at the cap or the route's deadline;
|
||||
the adsb.lol military poll gains a deadline of its own. An oversized OpenSky
|
||||
snapshot is not retried, and an OpenSky 429 starts its cooldown before the
|
||||
body is read.
|
||||
|
||||
- Keep later satellites when a TLE catalog entry is missing an orbital line.
|
||||
The parser skips the incomplete set and resumes at the next complete named
|
||||
set, instead of losing the rest of the group (#906).
|
||||
|
||||
- Satellite clouds keep Clouds only / Full as quick endpoints and add a continuous
|
||||
cloud-filter slider: 0% is Full, 100% is the existing brightness key, and
|
||||
intermediate values blend the keyed alpha. The slider commits on release to
|
||||
avoid restaging imagery for every drag event. Filter percentages round-trip in
|
||||
share links; legacy mode codes retain their old endpoint meanings. Background
|
||||
panel refreshes preserve the pending drag value until release. Contributed by
|
||||
[NotProniss](https://github.com/NotProniss) (#1084).
|
||||
|
||||
- Street Level: Panoramax is the fourth provider, keyless. Light its chip
|
||||
(orange; off by default, one provider at a time): from orbit dots show
|
||||
where the federated commons has pictures, and below about 60 km its
|
||||
sequences draw as lines from `api.panoramax.xyz` vector tiles. A click on a
|
||||
line opens that sequence's picture nearest the click without moving the
|
||||
camera, flat or 360°, with cones along the sequence around it and ‹ › /
|
||||
← → following the picture's own links. The 360° and since filters apply,
|
||||
in the lines and in the lookup. The caption names each picture's author
|
||||
and licence (CC BY-SA 4.0, Licence Ouverte 2.0…) and links to it in the
|
||||
Panoramax viewer. HD originals load once, only when the viewer is wider
|
||||
than the 2,048 px version (a panorama: expanded), and every download stops
|
||||
when the photo changes; an image whose header declares more than 64 MP is
|
||||
refused before it decodes. Share links carry it as
|
||||
`0.m.0_0.r.google-0*kartaview-0*panoramax-1` (`0.m.0_0.r.panoramax-1` works
|
||||
too). KartaView's photo viewer
|
||||
is now shared (`photoViewer.js`, `panorama.js`); in it, for KartaView too,
|
||||
Esc clears the selected drive before it collapses the panel. Lines are
|
||||
simplified and drawn within a point budget (a tile's unsimplified lines
|
||||
over Paris hung the tab), decoded in slices so the globe keeps moving,
|
||||
and kept; the cones' tiles have their own connection, and the open
|
||||
picture's tile draws its cones before its neighbours arrive.
|
||||
|
||||
- Flights and Military Flights highlight emergency transponder broadcasts in
|
||||
fleet billboards, 3D models and Cockpit contacts. Colors update when a status
|
||||
starts or clears. Emergency squawks outrank ADS-B priority statuses; GEV
|
||||
reports minimum fuel and lifeguard without red tint. Cockpit names the code
|
||||
or ADS-B status, and analyst/voice results retain broadcast provenance and
|
||||
the latest known contact time. One omitted ADS-B status poll during a source
|
||||
switch may retain the previous status if the squawk is unchanged; an explicit
|
||||
clear takes effect immediately. Broadcasts are not confirmed incidents.
|
||||
Contributed by [Leo Pechnicki](https://github.com/leopechnicki) (#856).
|
||||
|
||||
- Street Level: KartaView is the third provider, keyless. Light its chip
|
||||
(purple; off by default, one provider at a time) and zoom in below about
|
||||
6 km: the lines are the streets KartaView has photos of (z13–14 tiles from
|
||||
`api.kartaview.org`). A click on a line opens the photo nearest the click
|
||||
without moving the camera, flat or 360° (a small WebGL panorama: drag to
|
||||
look, wheel to zoom), with cones along its drive and ‹ › / ← → to step
|
||||
through it. The caption links to the full-size photo (KartaView's photo
|
||||
pages fail for signed-out visitors), and the globe credits "© KartaView
|
||||
contributors, CC BY-SA 4.0". Share links carry it in the provider
|
||||
switches (`0.m.0_0.r.google-0*kartaview-1`). Archived photos (KartaView
|
||||
answers 409) are skipped by the click and by ‹ ›. Shift+← →, ↑ ↓, + − and
|
||||
pinch look around a 360° photo. The open photo's marker is a purple view
|
||||
cone pointing along the drive (KartaView's own compass headings are often
|
||||
0 or far off). The IMAGERY (ALL / 360° / FLAT) and SINCE filters apply to
|
||||
KartaView as to Mapillary: its lines are filtered by KartaView's own
|
||||
server (its filtered PNG tiles, as a mask over the JSON lines), and the
|
||||
photo a click opens, and the cones, by each photo's projection and upload
|
||||
date. KartaView's SINCE is the upload date (all its server can filter by);
|
||||
a note under the slider says so while KartaView is lit (`sinceBasis:
|
||||
'upload'` in the provider contract).
|
||||
Mapillary's line coverage and sequence cones are now shared by both
|
||||
(`lineCoverage.js`, `sequenceCones.js`).
|
||||
|
||||
- Street Level: Google Street View is the second provider. On the Google 3D
|
||||
map (Google's terms keep it off other maps), light its chip (off by
|
||||
default: every panorama is billed to the Google Maps key, which needs the
|
||||
Maps JavaScript API) and click a street, or press OPEN STREET VIEW, to
|
||||
open Google's own panorama in
|
||||
the panel, with its arrows, the address and month in the caption, a link
|
||||
to Google Maps and FOLLOW. Share links carry it in the provider switches
|
||||
(`r.google-1`). One provider is lit at a time (lighting one switches the
|
||||
other off), Mapillary by default since it is free. Street View's panoramas
|
||||
are all 360°, so the IMAGERY and SINCE filters and the legend apply to
|
||||
Mapillary only and hide while GOOGLE STREET VIEW is lit; its globe marker
|
||||
is a Google-blue view cone.
|
||||
|
||||
- Add an experimental ChatGPT/Codex OAuth option for cloud voice in Provider
|
||||
Settings. API-key voice remains the default. Local sign-in can start from
|
||||
the auth button and reports completion, failure, timeout, or expired
|
||||
credentials. OAuth credentials stay on the server; local routes require
|
||||
loopback access and same-site requests. OAuth sessions retain usage data
|
||||
and show unknown cost; caption transcriptions are counted rather than
|
||||
priced into the API-key cap. The auth button keeps keyboard focus after a
|
||||
mode change, and pending sign-in does not discard text in the key fields.
|
||||
Thanks to [Shayan Khan](https://github.com/devv-shayan) for #621 and
|
||||
[TheSmokeDev](https://github.com/TheSmokeDev) for the credential handling
|
||||
from #653.
|
||||
|
||||
- **Docker install path.** `docker compose up` builds on CI's Node 24.14.0 image,
|
||||
pinned by digest, and serves the app on `http://localhost:4173` with no local
|
||||
Node install. The repo is bind-mounted and the container runs as the host user
|
||||
(never root), so `.env`,
|
||||
`.gev-cache`, and `.gev-logs` persist on the host exactly as they do under
|
||||
`npm run dev` — Provider Settings included. The launcher
|
||||
(`scripts/docker-start.mjs`) trusts the container's gateway address for that
|
||||
panel, since that is where Docker delivers the host's own browser from; the
|
||||
opt-in behind it, `GEV_KEY_SETUP_TRUSTED_PEERS`, takes exact addresses only
|
||||
and is unset (so loopback-only, unchanged) under every other launcher.
|
||||
Thanks to [jklaze](https://github.com/jklaze) for finding and diagnosing the
|
||||
container-to-host 403, and to [14traits](https://github.com/14traits),
|
||||
[PoBruno](https://github.com/PoBruno) and [milu70hub](https://github.com/milu70hub)
|
||||
for testing on Apple silicon, Docker Engine on Linux, and NAS hosts.
|
||||
|
||||
- Stdio servers from one install share a panel key so a page read from one
|
||||
process can make requests through another. Concurrent malformed-key repairs
|
||||
now select one winner; unavailable storage or a busy repair retains the
|
||||
@@ -101,6 +338,17 @@
|
||||
panel, resize it from any edge or corner, and double-click the header to dock
|
||||
it again. The position persists across reloads.
|
||||
|
||||
- Add Norway's city bikes to the Bike Share layer: Oslo, Bergen and
|
||||
Trondheim Bysykkel (Urban Sharing), Kolumbus Bysykkel in Stavanger and
|
||||
Farte Bysykkel in Skien/Porsgrunn (Entur Mobility), and Bysykkel
|
||||
Lillestrøm (JCDecaux), about 760 stations in all. Every feed is keyless
|
||||
GBFS. `gbfs.urbansharing.com`, `api.entur.io` and `api.cyclocity.fr` join
|
||||
the proxy allowlist; the last two are kept to their GBFS paths. The proxy
|
||||
now sends `Client-Identifier: gods-eye-view` on every request and
|
||||
`ET-Client-Name: gods-eye-view-bikeshare` to Entur, as the operators ask,
|
||||
and accepts Entur's extensionless feed paths. Attributed under NLOD and
|
||||
Licence Ouverte. `get_bike_share` covers the six systems too.
|
||||
|
||||
- Add Norway's road cameras from Statens vegvesen as a CCTV pack. The camera
|
||||
list is one keyless GeoJSON request to the agency's OGC API view of its
|
||||
DATEX 3.1 CCTV table, so no DATEX account is needed. Every working camera
|
||||
@@ -112,6 +360,41 @@
|
||||
largest cities) and `CCTV_VEGVESEN_VIDEO=0` keeps stills only. Attributed
|
||||
under NLOD 2.0.
|
||||
|
||||
- Import your own GeoJSON, KML, KMZ and GPX files from DISPLAY or by dropping
|
||||
them onto the app. Show, hide, fly to or remove each file for the session.
|
||||
GeoJSON/GPX draw on the ground; KML retains its styles and explicit heights.
|
||||
Large repeated-style exports use shared local pins, while recorded track
|
||||
vertices and segment gaps stay intact. Imports respect newer camera gestures,
|
||||
leave the shared clock alone, and report malformed or oversized files.
|
||||
File bytes stay on the device; rendered overlays may appear in shared map
|
||||
screenshots. Thanks to [Chase Mills](https://github.com/kapturner) (#925).
|
||||
|
||||
- GNSS Integrity (Events, voice-addressable, share token `3`) draws navigation
|
||||
accuracy scores from a keyless regional adsb.lol sample; aircraft-level analyst
|
||||
queries are unavailable for these aggregate cells. Cells do not intercept
|
||||
map clicks. Pan/zoom refreshes automatically; feed failures retain the display
|
||||
and explain the next retry. Aircraft-reported quality includes MLAT-positioned
|
||||
contacts after GPS loss, excludes TIS-B/MLAT-derived quality, and locates GPS-loss
|
||||
evidence at the last good GNSS position when available. Scores discount one
|
||||
bad aircraft per cell and retain 30 minutes of visited-view evidence; they
|
||||
do not confirm jamming. See [method and limits](DATA_SOURCES.md#gnss-integrity).
|
||||
Contributed by [Leo Pechnicki](https://github.com/leopechnicki) (#855).
|
||||
|
||||
- Live HLS cameras play on a page opened over plain HTTP from another machine
|
||||
(`HOST=0.0.0.0`). The client lease id came from `crypto.randomUUID`, which
|
||||
browsers only expose in secure contexts, so starting a live feed threw
|
||||
before playback. The id now falls back to a v4 UUID built from
|
||||
`crypto.getRandomValues`, which the server's lease check accepts.
|
||||
|
||||
- Move Google geocoding behind the local server. Forward and reverse lookups now
|
||||
go through `/api/google/geocode` and `/api/google/reverse-geocode` with the
|
||||
server key, joining Places and Street View. Google's Geocoding web service
|
||||
refuses referrer-restricted keys, so the previous browser call left
|
||||
`SECURITY.md`'s advice and working search mutually exclusive: the bundled
|
||||
browser key had to be unrestricted for search to work at all. That key now
|
||||
needs only the Map Tiles API and the Maps JavaScript API (Street View). Keyless sessions and the Photon/Nominatim
|
||||
fallback order are unchanged.
|
||||
|
||||
## [0.2.1] — 2026-10-02 — God's Eye View through Your Agent (with security fixes and other features)
|
||||
|
||||
- Ship each bundled data pack once. The region, marine, admin-boundary,
|
||||
|
||||
Reference in new issue
Block a user