Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,75 @@
# CHANGELOG

## 2026-10-13 — Camera coverage beyond El Paso (prepared)

- Added a camera-area selector for all nine corridors. The camera area follows
an explicit dashboard area change, while its own picker does not change the
wait-time filter. Changing areas/crossings and collapsing remove the player.
- Added San Ysidro and Otay Mesa Caltrans U.S. road approach viewers, explicitly
distinguished from Mexico-to-U.S. inspection queues in visible copy, search
titles and no-JavaScript snapshots. Added four officially published Eagle
Pass Bridge II player views, without inferring their lane/orientation.
- Added external official camera-source paths for Nogales, Laredo and Pharr.
Pharr's source belongs only to port 230502, not nearby Anzalduas. Calexico,
Brownsville and Progreso show an explicit unverified-coverage state.
- Caltrans uses its published still images with manual refresh, original-image
timestamp guidance and error fallback. Both San Diego sources showed the
provider's Temporarily Unavailable placeholder during the browser check.
- Generalized source/disclosure/privacy copy for YouTube, Caltrans and
IPCamLive; retained source/fallback links. No paid camera license, video relay,
new dependency or production release. Provider playback is not established
by mocked tests; exact verification evidence belongs to PR #132.

## 2026-10-13 — Homepage camera access (prepared)

- Added a visible Camera feeds section beside the local-area controls. Visitors
can select one of five verified El Paso–Juárez bridges and open the existing
camera player directly on the homepage, without finding a detail-page link.
- Opening the section makes no player request. Selecting a view loads one
player; changing bridges or collapsing the section removes it. Coverage is
labeled explicitly, and English/Spanish copy and provider fallbacks are shared
with the crossing-detail component.
- Added desktop/mobile EN/ES release checks for discovery, bridge switching,
deferred loading, cleanup and viewport fit. Direct inspection found both Paso
del Norte players rendered but buffering in the cloud browser; live playback
and source uptime remain unverified. Final release evidence belongs to PR #132.

## 2026-10-13 — UX and crawlable-report QC (prepared)

- Captured the live competitor and BorderPulse homepage in the cloud browser.
The observed first-screen gap is local decisions versus border-wide charts.
Moved the summary/chart behind an accessible disclosure, added quick local
choices, and made corridor selection a shareable `?area=` URL with Back
navigation and canonical homepage identity preserved.
- Added familiar El Paso–Juárez crossing names and accent-insensitive aliases
for local search, headings and search titles without changing port identity.
- Homepage and all 42 canonical crossing pages now deliver visible report HTML
before JavaScript. The original retrieval timestamp, raw lane clocks, missing
reports and closure state stay explicit. Other routes do not inherit this
homepage snapshot; no new page inventory or guessed rich-result schema.
- Added snapshot/no-JavaScript assertions and expanded local-area browser
checks. No ranking, Core Web Vitals or acquisition improvement is claimed;
current Search Console reads were unavailable because the connected provider
reported an ended trial. Exact release evidence belongs to the pull request.

## 2026-10-13 — Local comparison and camera feature batch (prepared)

- Added nine named crossing corridors, remembered in browser storage and
compatible with existing state/search filters. El Paso–Juárez includes
Santa Teresa in New Mexico without treating the entire state as local.
- Added northbound comparisons for standard passenger, Ready Lane, SENTRI
and pedestrian lanes. Missing reports, closed ports/lanes and unverifiable
operating hours are excluded. Ties, fewer than two available reports and
stale/unknown/future snapshot times suppress a shortest-wait claim. Report
clocks remain separate from retrieval time; extra driving is not estimated.
- Added ten click-loaded camera views at five Juárez–El Paso bridges from
the official Fideicomiso directory, with view switching, closing, source and
playback fallback links, EN/ES provider disclosure and privacy copy.
- Added comparison eligibility tests and desktop/mobile EN/ES interactions
to the existing release gate. No new npm dependency, account, database,
subscription, email service or production workflow change. Publication and
validation evidence belongs to the scoped pull request.

## 2026-10-13 — Document language ownership

- Metadata cleanup preserves the document language during crossing data and
Expand Down
36 changes: 36 additions & 0 deletions DECISIONS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,41 @@
# DECISIONS

## 2026-10-13 · Camera coverage cannot substitute nearby roads for inspection queues

Use an explicit camera-area picker and distinguish embedded crossing views,
Caltrans U.S. road approach views, and external official source pages. Areas
with no verified source show that state instead of defaulting to El Paso.
Keep canonical port identity: the Pharr source is not Anzalduas. Camera source
review establishes provenance, not current playback or lane-specific conditions.

## 2026-10-13 · Camera access belongs on the homepage

The owner could not find feeds from the preview homepage. Give cameras their
own visible entry beside local-area selection, with explicit El Paso–Juárez
coverage and an inline bridge/view picker. Reuse the existing player and
disclosures; selecting a view remains the only action that loads the provider,
and bridge changes/collapse remove playback.

## 2026-10-13 · Local decisions lead; published reports remain useful without JS

Use familiar names as display/search aliases, preserving canonical CBP identity.
Keep the border-wide chart available behind a disclosure and make local area
selection shareable without creating duplicate indexable URLs. Deliver visible,
timestamped HTML inside the React root on the homepage and crossing pages;
createRoot replaces it with the refreshing app. Do not hide different report
content for crawlers, imply a published snapshot is live, or expand thin SEO
routes while current query/ranking evidence is unavailable.

## 2026-10-13 · Local comparisons use eligible lanes; cameras load on request

The owner requested competitor-inspired crossing features. Compare named
corridors and the same northbound lane type without estimating total trip time.
Suppress comparative winners on stale/unknown retrievals or unavailable hours;
camera views are orientation, not proof of lane-specific conditions. Load the
public YouTube player only after a user selects a camera; use official-source
and provider fallback links. Real alerts/community reports remain separate
backend work and do not override the ban on non-delivering notification CTAs.

Short log of *why* something is the way it is. Append-only. Future-you (or
the AI you're collaborating with) reads this when "wait, why did we…"
comes up.
Expand Down
24 changes: 24 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,30 @@ cross-border experience; it is a product hypothesis, not a claim of demand.

### Now: earn trust in the free entry point

- [~] QC the October 13 locality-first flow, shareable area URLs and familiar
crossing names, with a visible inline camera entry on the homepage. Deliver
useful visible homepage/crossing snapshots without
JavaScript, preserving timestamps and canonical identity. Validation and
preview evidence belong to PR #132; not published yet.
- [ ] Reconnect an existing authorized Search Console data path to measure
query/page impressions, clicks, CTR and area-to-crossing actions after release.
GSC Wizard reported an ended trial during QC; no subscription was started.

- [~] October 13 competitor feature batch: nine remembered local corridor
filters, comparisons of the selected eligible lane and click-loaded public
camera views across El Paso–Juárez, San Diego–Tijuana and Eagle Pass, with
external official source paths for Nogales, Laredo and Pharr. Prepared on the feature branch;
production publication is not implied. Keep raw CBP report times visible and
exclude closed/unverifiable hours, missing reports and stale winner claims.
- [ ] Verify permissible camera sources for Calexico–Mexicali, Brownsville and
Progreso, and real playback of the prepared viewers. Public source directories
and road approaches do not establish inspection-queue or live-stream coverage.
- [ ] Real email threshold alerts and community crossing reports: implement
only with a working delivery channel and shared storage. See
`docs/CROSSING-FEATURES.md` for the concrete follow-up contract, source receipts,
operating costs and validation requirements. No signup/report form until the
service actually accepts and delivers it.

- [x] Correct route hreflangs and bound metadata-navigation checks (PR129/130).
Production was verified on October 12 at `2b40cb2b`, including reciprocal
pairs and exact served assets. Those releases are complete; preserve them.
Expand Down
143 changes: 143 additions & 0 deletions docs/CROSSING-FEATURES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# Crossing feature batch — October 13, 2026

## Prepared implementation

The dashboard's crossing-area selector remembers one of nine named corridors.
Selecting a state clears that corridor; selecting a corridor clears the search
and state scope. Existing public routes, source data, collection, ads and
publication gates stay intact. Local comparisons include the selected lane
only; a shorter reported queue is not a shorter total journey.

Public camera players are available on Paso del Norte, Stanton-Lerdo,
Ysleta-Zaragoza, Tornillo and Bridge of the Americas detail pages. The regional
panel links directly to each page's camera section. No video, thumbnail or
provider request is made by this feature before a view is selected. Selecting
another view replaces the iframe; closing removes it. There is no video relay,
recording, paid routing call, new SDK or new secret. Availability is controlled
by the source and is not inferred from iframe load success.

The homepage also has a visible Camera feeds section with explicit El Paso–Juárez
coverage. Opening it exposes the bridge/view controls without creating a player.
Selecting a view loads the same component used on crossing pages. Changing the
bridge or collapsing the section removes the player. This path addresses the
owner's difficulty finding the feeds in the preview.

## Camera source receipts

Official directory: https://www.puentesfronterizos.gob.mx/camaras-en-vivo.php

The directory lists each orientation separately. On review, its CamStreamer
links resolve to the following YouTube player IDs; BOTA links point to YouTube
directly. These are public-source embeds, not scraped competitor video assets.
The displayed orientation is the official heading, not inferred travel direction.

| Canonical port | Official views | Player IDs |
| --- | --- | --- |
| 240202 Paso del Norte | North to south / South to north | IcvugJWPXz8 / 0Pg3S6s76IE |
| 240204 Stanton-Lerdo | North to south / South to north | CYhISA_wFQ8 / sOHFG6_3zAs |
| 240104 Ysleta-Zaragoza | North to south / South to north | GC5RY3zipa4 / KX-bm-Lhy3w |
| 240401 Tornillo | North to south / South to north | 0gT7jvaLCkg / 8u-hBawdG8c |
| 240201 BOTA | North / South | mp3RS0y77tY / CZM5TpXLzE8 |

Review the IDs against the directory when playback stops: livestream IDs can
change. The official directory remains the fallback. Santa Teresa has no
verified stream in this registry. City of El Paso's own directory reported
camera maintenance during review, so its streams are not advertised as working.
Playback itself could not be established by text retrieval; browser tests mock
or block providers and test the controls, not third-party stream uptime.

## Expanded camera coverage — October 13

The homepage camera-area picker includes all nine corridors. Six have reviewed
source paths: 14 video-player views and two camera snapshots at eight crossings
in three corridors, plus
official external-source links at five crossings in three additional corridors.
Calexico–Mexicali, Brownsville and Progreso have no source verified in this batch
and show that explicitly. A reviewed source is not a stream-uptime guarantee.

| Area | Canonical ports | Type and source receipt |
| --- | --- | --- |
| San Diego–Tijuana | 250401 San Ysidro; 250601 Otay Mesa | Caltrans U.S. road approaches; not the northbound inspection queue in Mexico. Official list: https://cwwp2.dot.ca.gov/vm/streamlist.htm |
| Eagle Pass | 230302 Bridge II | Four iframe players published at https://www.eaglepasstx.gov/335/International-Bridge-2-Cameras ; alias IDs: 67231a475ead1, 639ba5d96b3f6, 639ba81bb4b49, 68f3f8b846277. Views are numbered because lane/orientation is unconfirmed. |
| Nogales | 260401 DeConcini; 260402 Mariposa | External municipal directory: https://heroicanogales.gob.mx/webcams-garitas ; municipal source publication: https://heroicanogales.gob.mx/acciones/fortalecen-acceso-ciudadano-a-camaras-de-garita-mariposa |
| Laredo | 230401 Bridge I; 230402 Bridge II | External municipal directory: https://www.cityoflaredo.com/services/bridge-cameras . Indexed official listing was retrieved; page fetch returned 403 during review, so no embed/playback is claimed. |
| McAllen–Reynosa | 230502 Pharr | External official bridge site: https://bridge.pharr-tx.gov/ advertises its Live Bridge Camera link. The viewer fetch timed out during review; no embed/playback is claimed. This source must not be assigned to Anzalduas (230503). |

Caltrans viewer pages inspected in the browser:
- San Ysidro: https://cwwp2.dot.ca.gov/vm/loc/d11/c214sb5viadesanysidro.htm
- Otay Mesa: https://cwwp2.dot.ca.gov/vm/loc/d11/c100i905siemprevivat.htm

The viewer's video poster fields publish the snapshot URLs used in the app:
- https://cwwp2.dot.ca.gov/data/d11/cctv/image/c214sb5viadesanysidro/c214sb5viadesanysidro.jpg
- https://cwwp2.dot.ca.gov/data/d11/cctv/image/c100i905siemprevivat/c100i905siemprevivat.jpg

These images load after view selection and refresh only on explicit request;
request time is not displayed as capture time. Failed loads expose a visible
error and an official video-viewer link. The provider's own Temporarily
Unavailable placeholder remains visible when returned as an image. Both sources
showed that placeholder during this review; playback/uptime is not claimed.

Caltrans publishes these viewers through its official live-camera list and
describes its own information as generally public domain in
https://dot.ca.gov/conditions-of-use . Keep attribution and provider links.
BorderTraffic's public page requires licensing for commercial use of its
content; its free personal-use views are not copied or embedded here. No
license was purchased and no provider was contacted.

Area/crossing selection alone creates no provider iframe. Selecting one of the
reviewed embedded views loads that provider's page; source-only options are
ordinary outbound links. Existing detail cards, titles and visible static
snapshots use the correct source and distinguish road approaches from queues.

## Next: real email threshold alerts

The existing product has no database or email delivery provider. Do not collect
addresses or show a signup success until the full path exists. Prepare an
explicit provider/storage choice and cost cap before provisioning anything.

- Pilot one corridor. Subscription specifies canonical port, eligible lane,
threshold, language and email. Confirm the email before activation.
- Durable storage needs subscription ID, email, confirmed status, port/lane,
threshold, confirmation/unsubscribe token hashes, and last delivery time.
- Reuse the current validated CBP collector; do not add a per-subscriber polling
loop. A scheduled evaluator compares only open, reporting eligible lanes.
- Trigger on crossing from above to below the threshold, at most one email per
subscriber per day. On stale/missing data, send nothing. Recovery must not
manufacture a threshold crossing from an unknown previous observation.
- Idempotent delivery ledger prevents retry duplicates. Unsubscribe is present
in each email; remove/suppress addresses after bounce or complaint.
- Validation: closed browser receives the confirmed test email; threshold
transition, stale feeds, duplicate cron runs, unsubscribe and provider errors
are tested. Never call an open-tab-only banner an alert.
- Costs are unknown until the provider and expected volume are selected.
Calculate confirmed subscriptions × maximum deliveries/day, storage volume,
cron frequency and provider rate limits. Target no new monthly spend for the
pilot; alert at a reviewed cap and fail closed before paid overages.

## Next: community crossing reports

A public community feed needs shared storage and an abuse-control path; a
local browser timer alone cannot provide community reports.

- Collect canonical port, direction, lane, actual duration, completion time and
submission time. Do not require precise GPS, document data or free text.
- Optional timer uses absolute start/end timestamps, survives reload in local
browser storage, and stops only on explicit completion. A saved local record
is labeled as such until a server confirms publication.
- Validate numeric bounds, allowed port/lane combinations and recency on the
server. Rate-limit and deduplicate submissions; cap retention and volume.
- Public read model shows report count, lane, time range and a summary with a
sample floor. Keep community observations separate from official CBP waits.
- Do not claim improved estimates until held-out completed crossings show it.
Compare error by bridge/lane and quiet/busy periods; avoid validating on the
observations used to calibrate the model.
- Validation: submission appears in a second browser; expired, implausible,
duplicate and rejected reports never create a misleading public estimate.

## Competitor operating-cost observations

Fila de Puentes credits Fideicomiso, CBP, TxDOT and public streams on its About
page, and Fili's explanation states a daily message limit. Public embeds and
message limits can reduce bandwidth/inference cost. Revenue, funding, actual
traffic, model/provider and operating expenses remain unknown. Absence of a
visible paid plan or ad unit does not establish that its costs are high.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"scripts": {
"dev": "vite",
"test": "npm run test:ads && npm run test:writer && npm run test:refresh && npm run test:publish && npm run test:hours && npm run test:trust && npm run test:mdx && npm run test:metadata && npm run test:audit && npm run test:bundle && npm run test:routes",
"test:metadata": "node --test scripts/test-faq-scope.mjs scripts/test-hreflang.mjs",
"test:metadata": "node --test scripts/test-faq-scope.mjs scripts/test-hreflang.mjs scripts/test-crossing-snapshot.mjs",
"test:ads": "node --test scripts/test-ad-slot-diagnostics.mjs",
"test:publish": "node --test scripts/test-publish-data.mjs scripts/test-public-crossings.mjs",
"publish:validate": "node scripts/validate-publish-data.mjs",
Expand Down Expand Up @@ -35,7 +35,7 @@
"news:classify": "node scripts/build-curation-queue.mjs",
"test:bundle": "node scripts/check-bundle-size.mjs",
"test:audit": "node scripts/check-audit.mjs",
"test:trust": "node --test scripts/test-trust-state.mjs",
"test:trust": "node --test scripts/test-trust-state.mjs scripts/test-local-comparison.mjs",
"test:mdx": "node --test scripts/test-mdx-frontmatter.mjs",
"test:writer": "node --test scripts/test-generated-writer.mjs",
"test:refresh": "node --test scripts/test-data-refresh.mjs"
Expand Down
Loading
Loading