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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# CHANGELOG

## 2026-11-10 - Ads where readers land (draft)

- The existing Adsterra native banner (placement 29055831) now also loads on crossing pages, after Latest lane reports, and on blog guides, after the "Crossing soon?" box. Before, only the home page loaded it, and the home page is 25% of visitors (Umami, last 30 days).
- The prescription-medication guide (EN and ES), 41% of visitors, places the slot mid-article after the four core rules (`<InArticleAd />` plus `inArticleAd: true` frontmatter) instead of at the end. On a 390px phone it sits at about 3,600px of 8,800 instead of 8,555px. One ad container per page.
- Ads sit below the answer on each page, never above the wait or the guide's core rules. No new provider, script or dependency. Embeds stay ad-free.
- Privacy notice (EN/ES, React and prerendered) now says the main dashboard, crossing pages and guides load Adsterra's script.
- Checks: full `npm test` passes after a prerendered build. Headless Chrome at 390px: one container on each page, the Adsterra script requested, no horizontal overflow. Creatives do not fill on localhost, so live fill and revenue are not verified.

## 2026-11-10 - Main screen, second pass (Phase 3, session 2, draft)

- One clock on the main screen: the map explorer no longer repeats "Fetched X min ago" under Latest reports. The header already shows the fetch time, and stale, offline and fallback states still show the explorer's own notice with its clock. Recorded history still shows the observation clock.
Expand Down
4 changes: 4 additions & 0 deletions DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -565,3 +565,7 @@ The bundled `/data/crossings.json` only refreshes on Vercel deploys, so as a fal
- Filters: region tabs logged 83 uses and the crossing-area dropdown 77, out of about 2.35k visits. Both are used at similar rates, so neither is cut. Search use is not tracked (no free text is sent), so there is no evidence either way for it. Revisit only with a no-text search-use count.
- Popular border crossings stays: 3 of the 20 most recent `crossing-open` events came from it, and 98% of visitors arrive from search engines, so its internal links matter more than the repetition costs.
- Context for priorities: the home page is 25% of visitors. The prescription-medication blog post is 41% and crossing pages most of the rest. Main-screen polish reaches a minority of visitors; crossing pages and the blog-to-waits path reach the majority (blog-to-waits: 7 events against 617 post visitors).

## 2026-11-10 - Ads follow readers onto crossing pages and guides

Adsterra reported 21 impressions and $0.03 for Nov 5 to 9 from the single home-page slot, while 75% of visitors land on guides and crossing pages that loaded no ad. The same native placement now renders below the answer on crossing pages and guides; long guides can opt into one mid-article slot instead of the end slot. Never above the wait, never in embeds, one container per page. The dormant Google switch in `DashboardAd` still covers only the dashboard slot; these pages use `AdsterraBanner` directly.
2 changes: 1 addition & 1 deletion public/data/aggregates/andrade.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/brownsville-b-and-m.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/brownsville-gateway.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/brownsville-los-indios.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/calexico-east.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/calexico-west.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/columbus.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/del-rio.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/douglas-raul-hector-castro.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/data/aggregates/eagle-pass-bridge-i.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"port_number":"230301","name":"Eagle Pass - Bridge I","state":"TX","timezone":"America/Chicago","lookback_days":30,"sample_count":252,"overall_median":60,"overall_best_hour":7,"overall_best_median":30,"by_hour":[{"day":1,"hour":5,"median":30,"samples":6,"window_hours":2,"raw_samples":0},{"day":1,"hour":6,"median":30,"samples":6,"window_hours":1,"raw_samples":0},{"day":1,"hour":7,"median":30,"samples":6,"window_hours":0,"raw_samples":6},{"day":1,"hour":8,"median":38,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":9,"median":60,"samples":10,"window_hours":0,"raw_samples":10},{"day":1,"hour":10,"median":60,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":11,"median":90,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":12,"median":105,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":13,"median":120,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":14,"median":120,"samples":10,"window_hours":0,"raw_samples":10},{"day":1,"hour":15,"median":120,"samples":14,"window_hours":1,"raw_samples":4},{"day":1,"hour":16,"median":120,"samples":14,"window_hours":2,"raw_samples":0},{"day":1,"hour":17,"median":120,"samples":4,"window_hours":2,"raw_samples":0},{"day":2,"hour":5,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":2,"hour":6,"median":30,"samples":7,"window_hours":1,"raw_samples":0},{"day":2,"hour":7,"median":30,"samples":7,"window_hours":0,"raw_samples":7},{"day":2,"hour":8,"median":30,"samples":11,"window_hours":0,"raw_samples":11},{"day":2,"hour":9,"median":30,"samples":9,"window_hours":0,"raw_samples":9},{"day":2,"hour":10,"median":45,"samples":13,"window_hours":0,"raw_samples":13},{"day":2,"hour":11,"median":75,"samples":8,"window_hours":0,"raw_samples":8},{"day":2,"hour":12,"median":105,"samples":6,"window_hours":0,"raw_samples":6},{"day":2,"hour":13,"median":120,"samples":7,"window_hours":0,"raw_samples":7},{"day":2,"hour":14,"median":120,"samples":11,"window_hours":1,"raw_samples":4},{"day":2,"hour":15,"median":120,"samples":11,"window_hours":2,"raw_samples":0},{"day":2,"hour":16,"median":180,"samples":4,"window_hours":2,"raw_samples":0},{"day":3,"hour":5,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":3,"hour":6,"median":30,"samples":7,"window_hours":1,"raw_samples":0},{"day":3,"hour":7,"median":30,"samples":7,"window_hours":0,"raw_samples":7},{"day":3,"hour":8,"median":45,"samples":15,"window_hours":1,"raw_samples":4},{"day":3,"hour":9,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":3,"hour":10,"median":45,"samples":13,"window_hours":1,"raw_samples":5},{"day":3,"hour":11,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":3,"hour":12,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":3,"hour":13,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":3,"hour":14,"median":45,"samples":8,"window_hours":1,"raw_samples":4},{"day":3,"hour":15,"median":45,"samples":8,"window_hours":2,"raw_samples":0},{"day":3,"hour":16,"median":45,"samples":4,"window_hours":2,"raw_samples":0},{"day":4,"hour":5,"median":30,"samples":3,"window_hours":2,"raw_samples":0},{"day":4,"hour":6,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":4,"hour":7,"median":30,"samples":7,"window_hours":1,"raw_samples":3},{"day":4,"hour":8,"median":30,"samples":12,"window_hours":1,"raw_samples":4},{"day":4,"hour":9,"median":30,"samples":13,"window_hours":1,"raw_samples":5},{"day":4,"hour":10,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":4,"hour":11,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":4,"hour":12,"median":60,"samples":13,"window_hours":1,"raw_samples":4},{"day":4,"hour":13,"median":60,"samples":14,"window_hours":1,"raw_samples":5},{"day":4,"hour":14,"median":60,"samples":11,"window_hours":1,"raw_samples":5},{"day":4,"hour":15,"median":60,"samples":6,"window_hours":1,"raw_samples":1},{"day":4,"hour":16,"median":60,"samples":6,"window_hours":2,"raw_samples":0},{"day":4,"hour":17,"median":60,"samples":1,"window_hours":2,"raw_samples":0},{"day":5,"hour":5,"median":30,"samples":3,"window_hours":2,"raw_samples":0},{"day":5,"hour":6,"median":45,"samples":7,"window_hours":2,"raw_samples":0},{"day":5,"hour":7,"median":45,"samples":7,"window_hours":1,"raw_samples":3},{"day":5,"hour":8,"median":45,"samples":11,"window_hours":1,"raw_samples":4},{"day":5,"hour":9,"median":90,"samples":12,"window_hours":1,"raw_samples":4},{"day":5,"hour":10,"median":90,"samples":12,"window_hours":1,"raw_samples":4},{"day":5,"hour":11,"median":90,"samples":17,"window_hours":1,"raw_samples":4},{"day":5,"hour":12,"median":90,"samples":9,"window_hours":0,"raw_samples":9},{"day":5,"hour":13,"median":45,"samples":8,"window_hours":0,"raw_samples":8},{"day":5,"hour":14,"median":45,"samples":9,"window_hours":0,"raw_samples":9},{"day":5,"hour":15,"median":45,"samples":10,"window_hours":1,"raw_samples":1},{"day":5,"hour":16,"median":45,"samples":10,"window_hours":2,"raw_samples":0},{"day":5,"hour":17,"median":45,"samples":1,"window_hours":2,"raw_samples":0}],"generated_at":"2026-11-10T18:33:06.031Z"}
{"port_number":"230301","name":"Eagle Pass - Bridge I","state":"TX","timezone":"America/Chicago","lookback_days":30,"sample_count":252,"overall_median":60,"overall_best_hour":7,"overall_best_median":30,"by_hour":[{"day":1,"hour":5,"median":30,"samples":6,"window_hours":2,"raw_samples":0},{"day":1,"hour":6,"median":30,"samples":6,"window_hours":1,"raw_samples":0},{"day":1,"hour":7,"median":30,"samples":6,"window_hours":0,"raw_samples":6},{"day":1,"hour":8,"median":38,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":9,"median":60,"samples":10,"window_hours":0,"raw_samples":10},{"day":1,"hour":10,"median":60,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":11,"median":90,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":12,"median":105,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":13,"median":120,"samples":8,"window_hours":0,"raw_samples":8},{"day":1,"hour":14,"median":120,"samples":10,"window_hours":0,"raw_samples":10},{"day":1,"hour":15,"median":120,"samples":14,"window_hours":1,"raw_samples":4},{"day":1,"hour":16,"median":120,"samples":14,"window_hours":2,"raw_samples":0},{"day":1,"hour":17,"median":120,"samples":4,"window_hours":2,"raw_samples":0},{"day":2,"hour":5,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":2,"hour":6,"median":30,"samples":7,"window_hours":1,"raw_samples":0},{"day":2,"hour":7,"median":30,"samples":7,"window_hours":0,"raw_samples":7},{"day":2,"hour":8,"median":30,"samples":11,"window_hours":0,"raw_samples":11},{"day":2,"hour":9,"median":30,"samples":9,"window_hours":0,"raw_samples":9},{"day":2,"hour":10,"median":45,"samples":13,"window_hours":0,"raw_samples":13},{"day":2,"hour":11,"median":75,"samples":8,"window_hours":0,"raw_samples":8},{"day":2,"hour":12,"median":105,"samples":6,"window_hours":0,"raw_samples":6},{"day":2,"hour":13,"median":120,"samples":7,"window_hours":0,"raw_samples":7},{"day":2,"hour":14,"median":120,"samples":11,"window_hours":1,"raw_samples":4},{"day":2,"hour":15,"median":120,"samples":11,"window_hours":2,"raw_samples":0},{"day":2,"hour":16,"median":180,"samples":4,"window_hours":2,"raw_samples":0},{"day":3,"hour":5,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":3,"hour":6,"median":30,"samples":7,"window_hours":1,"raw_samples":0},{"day":3,"hour":7,"median":30,"samples":7,"window_hours":0,"raw_samples":7},{"day":3,"hour":8,"median":45,"samples":15,"window_hours":1,"raw_samples":4},{"day":3,"hour":9,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":3,"hour":10,"median":45,"samples":13,"window_hours":1,"raw_samples":5},{"day":3,"hour":11,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":3,"hour":12,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":3,"hour":13,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":3,"hour":14,"median":45,"samples":8,"window_hours":1,"raw_samples":4},{"day":3,"hour":15,"median":45,"samples":8,"window_hours":2,"raw_samples":0},{"day":3,"hour":16,"median":45,"samples":4,"window_hours":2,"raw_samples":0},{"day":4,"hour":5,"median":30,"samples":3,"window_hours":2,"raw_samples":0},{"day":4,"hour":6,"median":30,"samples":7,"window_hours":2,"raw_samples":0},{"day":4,"hour":7,"median":30,"samples":7,"window_hours":1,"raw_samples":3},{"day":4,"hour":8,"median":30,"samples":12,"window_hours":1,"raw_samples":4},{"day":4,"hour":9,"median":30,"samples":13,"window_hours":1,"raw_samples":5},{"day":4,"hour":10,"median":45,"samples":13,"window_hours":1,"raw_samples":4},{"day":4,"hour":11,"median":45,"samples":12,"window_hours":1,"raw_samples":4},{"day":4,"hour":12,"median":60,"samples":13,"window_hours":1,"raw_samples":4},{"day":4,"hour":13,"median":60,"samples":14,"window_hours":1,"raw_samples":5},{"day":4,"hour":14,"median":60,"samples":11,"window_hours":1,"raw_samples":5},{"day":4,"hour":15,"median":60,"samples":6,"window_hours":1,"raw_samples":1},{"day":4,"hour":16,"median":60,"samples":6,"window_hours":2,"raw_samples":0},{"day":4,"hour":17,"median":60,"samples":1,"window_hours":2,"raw_samples":0},{"day":5,"hour":5,"median":30,"samples":3,"window_hours":2,"raw_samples":0},{"day":5,"hour":6,"median":45,"samples":7,"window_hours":2,"raw_samples":0},{"day":5,"hour":7,"median":45,"samples":7,"window_hours":1,"raw_samples":3},{"day":5,"hour":8,"median":45,"samples":11,"window_hours":1,"raw_samples":4},{"day":5,"hour":9,"median":90,"samples":12,"window_hours":1,"raw_samples":4},{"day":5,"hour":10,"median":90,"samples":12,"window_hours":1,"raw_samples":4},{"day":5,"hour":11,"median":90,"samples":17,"window_hours":1,"raw_samples":4},{"day":5,"hour":12,"median":90,"samples":9,"window_hours":0,"raw_samples":9},{"day":5,"hour":13,"median":45,"samples":8,"window_hours":0,"raw_samples":8},{"day":5,"hour":14,"median":45,"samples":9,"window_hours":0,"raw_samples":9},{"day":5,"hour":15,"median":45,"samples":10,"window_hours":1,"raw_samples":1},{"day":5,"hour":16,"median":45,"samples":10,"window_hours":2,"raw_samples":0},{"day":5,"hour":17,"median":45,"samples":1,"window_hours":2,"raw_samples":0}],"generated_at":"2026-11-10T18:49:28.442Z"}
Loading
Loading