Repository navigation
[product] Validate a BorderPulse team workflow and prepare app hosting #101
Description
Activity
2026-09-29 product and cost readout
Observed use: Umami showed 2,012 visitors and 2,685 views in the last 30 days. San Ysidro had 129 page visitors and Otay Mesa 121. In the last seven days,
compare-openoccurred twice andcrossing-shareonce. These are small, recent signals; no conversion or paid-demand claim follows from them. The San Ysidro comparison needs its existing 30-day pilot window.Pilot improvement: PR #102 adds canonical WhatsApp/copy sharing and a three-choice usefulness prompt to comparison pages, with no new service or recurring cost. Read
compare-shareandcompare-feedbackbeside visits after friends try it. A feedback choice is stated usefulness, not an observed crossing. No customer outreach was sent.Hosting reality:
mainstill serves the public Vite app through GitHub Pages and builds aggregates from Git history. PR #87 has a protected Vercel preview, a public-data function, and an explicit snapshot-history artifact, but those changes are not merged or public. The original history/build concern remains onmain; the artifact in #87 is the concrete proposed fix. Extract or resolve that infrastructure before a Vercel cutover. Preserve the free ad-supported experience and existing URLs.Budget: The signed-in Vercel Pro team showed $2.43 of $20 included usage credit for Sep 13–Oct 13 when checked today. This is team-wide preview usage, not a production BorderPulse estimate. A new Vite preview is affordable to evaluate within that observed headroom; recurring data-only deployments every 15 minutes would be a poor architecture and could consume the credit. Measure a production-parity preview, set a spend ceiling, then bring the cutover and any new spend to Sebastian as a concrete decision.
B2B gate: Keep the manual corridor-workflow hypothesis. Ask five relevant businesses about the recurring downstream decision, current workaround, cost of delay, and who would pay. Build accounts, alert storage, Supabase, and billing only after a repeated job and written pilot commitment. Border-crossing friends can validate the free decision experience; they do not substitute for business buyers.
Additional live preview readback (Sep 29, 5:33 p.m. PDT): the existing protected Vercel preview loaded the dashboard, and
/api/public/crossingsreturned a CBP-derived 42-crossing payload fetched at 2026-09-30T00:33:03Z. The preview still displays an opt-in “Enable a single ad” panel, while the current public site serves automatic Adsterra support. That ad divergence must be fixed and reviewed before any public-host cutover. The preview is a technical proof, not a production-equivalent release.Vercel candidate from current public app — 2026-09-29
PR #103 isolates the free app, automatic Adsterra UI, five-minute cached official CBP function, static fallback, and explicit 30-day snapshot history from the large unmerged #87 branch. It adds no new provider or recurring service.
Preview deployment
dpl_Epab1BZF8xU7iWuQgsgv7eptqBQXis Ready, targetpreview, withapi/public/crossingslisted as a deployed Node function. Authenticated browser readback at 2026-09-29 17:46 PDT loaded the current dashboard and displayed the automaticADVERTISEMENTplacement. Opening/api/public/crossingsreturned 42 official crossings withfetched_at=2026-09-30T00:46:22.769Z. The Vercel build consumed 387 in-window explicit snapshots and generated 42 aggregate files. This is a preview readback, not a production cutover or evidence of ad revenue.The first PR CI run caught a Node-side
import.meta.envaccess in the new client selector. Commitb7e9c161guards that path; CI rerun is pending. No new provider, production deployment, custom-domain change, or live billing occurred. The public site remains GitHub Pages.Remaining before a domain decision: green CI at current head; confirm frontend uses the function and static fallback on the current preview build; review actual Vercel project usage after this preview; define a low-frequency historical aggregate publish path so 15-minute data commits never cause 2,880 Vercel builds/month; obtain Sebastian's explicit production approval.
PR #103 verification update: GitHub
release-checkspassed at current headb7e9c161(run). The protected preview is Ready atdpl_Epab1BZF8xU7iWuQgsgv7eptqBQX. Browser readback showed dashboard “Data fetched: Sep 29, 5:46 PM PDT,” matching the new live endpoint and newer than the bundled static snapshot (00:22Z). The current Adsterra script host was present in the document alongside theADVERTISEMENTplacement. Static fallback behavior is code-reviewed, but a simulated upstream outage has not been exercised on this preview. No domain or production deployment changed. PR #102 and PR #103 are open and mergeable; production remains an owner approval gate.Billing guardrail readback (2026-09-29): Vercel team Billing shows $2.43 of $20 included credit consumed in the Sep 13–Oct 13 cycle, upcoming invoice $20, and $0 current on-demand spend. Its Spend Management budget is $200 on-demand with Pause Off. That budget applies to all team projects, including DIGITO; it is an alert setting rather than a BorderPulse-only hard cap. No billing setting was changed. Before a public domain move, Sebastian should choose a team-wide guardrail with awareness that turning on Pause can also make DIGITO unavailable; we should also observe actual BorderPulse production-equivalent traffic and build usage. This is why the Ready preview and green PR #103 do not yet justify cutover.
Current-head preview: After CI passed at
b7e9c161, Vercel deployeddpl_CJKSaKTdyBx8gZtis7CQUxZhFSFdto this protected preview. Browser readback showed the dashboard at “Data fetched: Sep 29, 5:57 PM PDT” and the endpoint returned 42 official crossings withfetched_at=2026-09-30T00:57:28.227Z. The current automatic ad script andADVERTISEMENTplacement are present. This supersedes the earlier preview URL for PR #103 review. Still preview only; no production domain cutover.2026-09-29 growth and Adsterra pass
Observed baseline: Umami shows about 2.02k visitors and 2.69k views in the last 30 days, with 86% bounce. The largest listed entry points are a border-medication guide (583 visitors), the dashboard (252), San Ysidro (129), and Otay Mesa (121). The same 30-day Events view shows 8
favorite-toggle, 2compare-open, and 1crossing-shareevents. These are event counts, not unique users or proven repeat use. September retention cohorts mostly show low single-digit next-day return; the site mixes one-off search visits with commuter use, so that alone is not a product verdict.Adsterra: The publisher account lists one Active BorderPulse Native Banner unit. Its September 28–29 domain-filtered statistics show 17 impressions, 0 clicks, and $0 revenue. The public dashboard loads that unit and labels it as an ad. The observed creative included dating-style clickbait even with adult ads off. The Adsterra period and Umami 30-day period differ, so they should not be used as a conversion ratio. Adding the same unit to guides and crossing pages would extend that creative to the pages earning visitors' trust; review quality and a safer format or controls before expanding placement. Keep the existing automatic ad support in place.
Product action: PR #104 fixes the inert favorite star on crossing detail pages and adds a bilingual guide-to-current-waits/share path. It uses the existing local favorites and Umami stack; channel-level UTM tags can distinguish visits from copied and WhatsApp guide links without identifying a sender or recipient. PR #102 separately prepares comparison sharing and feedback. Both are reviewable; neither is a measured growth result or a public release.
Next readout after approval and release: compare guide
blog-to-waitsactions,blog-shareactions versus tagged arrivals, detail-page favorite adds and repeat visits where measurable, and Adsterra creative/impression/revenue trends. The first decision is whether people reach useful current waits and come back; ad expansion comes after an acceptable creative-quality check. No new ad unit, service, account, production deploy, or customer outreach was made in this pass.sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsSebastian decision / clarification (2026-09-29): BorderPulse can run fully on Vercel; PR #103 demonstrates the app, live current waits, and existing automatic Adsterra placement in a protected preview. The public
borderpulse.comswitch is a separate production step, not yet done or approved.Before proposing that switch, finish these two concrete tasks: (1) make the 30-day history publish reliably at a controlled frequency, independent of the 15-minute current-wait refresh, so data-only updates do not trigger a Vercel build each time; (2) measure production-like Vercel usage and propose a spending guardrail for the shared team that accounts for DIGITO. Then present a specific cutover plan and cost bound for Sebastian's approval. No Next.js rewrite is required for this hosting move.
Ads: Keep existing automatic Adsterra active. Sebastian has seen the dating/bikini-style creatives and accepts them as a temporary tradeoff for the everyday-crosser audience; he wants to revisit creative quality eventually. Do not describe these creatives as porn or prioritize an ad-format change ahead of the two migration tasks. No ad settings, deployment, billing settings, or domain settings changed by this note.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsVercel usage breakdown (read 2026-09-29, Sep 13–Oct 13 team cycle): The earlier $2.43 was a team-wide snapshot; the Usage screen now shows $2.46 of the $20 monthly credit consumed and a $20 total invoice (no on-demand charge in this readout). About $2.28 is Build CPU Minutes (11 hours); the remaining ~$0.18 is mostly function/deployment storage, with small origin-transfer and ISR-read charges. CDN requests and fast data transfer show $0 under the included Flat Rate CDN tier.
Filtering by project shows DIGITO $1.51, BorderPulse $0.27, and other team projects together ~$0.68. BorderPulse's $0.27 is preview activity, mostly ~$0.26 build CPU, not a forecast for public traffic. This confirms why 15-minute data commits must not cause a Vercel build each time.
Margin interpretation: The existing $20 Pro subscription is shared overhead, not a new $20 BorderPulse fee. Incremental BorderPulse cost could stay inside the unused shared credit, but a public-traffic margin cannot be stated until measured. Current Adsterra evidence (17 impressions, $0 for Sep 28–29) does not establish ad yield. A paid B2B workflow could create comfortable infrastructure margins if a buyer pays enough to cover incremental hosting, data/alert delivery, payment costs, and support; willingness to pay remains unvalidated. No billing setting or production deployment changed.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsPlanned Vercel public-host move (2026-09-29)
Decision: Vercel is the target host for the public BorderPulse app. This is a hosting/product-operations plan, not a domain switch or approval of extra spend. The paid B2B pilot can be validated separately; it is not a prerequisite to moving the free site.
Data path
- Keep the existing GitHub Action collecting and validating CBP snapshots about every 15 minutes, including its compact 30-day history artifact. GitHub remains the internal data writer; it need not remain the public website host.
- On Vercel, use PR Prepare free BorderPulse app for a cost-controlled Vercel preview #103's cached official-CBP function for current waits and its timestamped static fallback. Keep the current automatic Adsterra placement.
- Publish the updated 30-day charts and other build-bundled files (including exchange-rate data) on a controlled daily Vercel deployment, plus a deployment when app code changes. Never trigger a Vercel build from every 15-minute data commit.
- Proposed implementation: a dedicated GitHub Actions workflow checks out the latest validated data, builds the Vercel output, and deploys it with
vercel deploy --prebuiltin preview first; switch to production only after cutover approval. Keep the Vercel project free of automatic per-commit deployments. This route needs a scoped Vercel credential stored as a GitHub secret; review and authorize that access during implementation. Do not put the token in source or logs.
Gates before switching
borderpulse.com- Bring Prepare free BorderPulse app for a cost-controlled Vercel preview #103 onto current
main, reconcile Make crossing comparisons shareable and measurable #102/Connect guide readers to live waits and saved crossings #104 as appropriate, and inspect the resulting Vercel preview. Confirm EN/ES routes, current-wait freshness, 30-day chart dates/coverage, exchange-rate freshness, fallback timestamps, automatic ads/privacy, sharing, and canonical URLs. Confirm the daily job advances historical data and a failed data job does not publish bad output. - Measure a period of the controlled daily preview deployments and team usage. Latest readback: $2.46 of $20 shared Pro credit, mostly $2.28 build CPU; BorderPulse preview usage $0.27. Target $0 new on-demand spend during the pilot. The current $200 team-wide alert with Pause Off is not a BorderPulse cap; do not enable automatic team pause without accounting for DIGITO. Present a specific maximum tolerated overage to Sebastian before cutover.
- Present the exact domain/DNS change, a recent good Pages deployment, a rollback path, and the measured cost for Sebastian's production decision. Do not change billing settings, DNS, or the public host as part of planning.
After approved cutover
- Keep the GitHub Pages deployment available during the initial observation window. Check current waits, history, ads, routes, errors, and Vercel usage immediately and daily for the first week. If freshness or cost breaches the agreed threshold, restore the public domain to Pages while investigating.
- Continue the free-user/friend pilot and Adsterra measurement. Add Supabase, Sentry, accounts, and billing only when the specific team workflow and cost warrant them.
This plan uses the existing Vite app; no Next.js rewrite or new paid service is required for the host move.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsLaunch implementation is ready for review; public production remains GitHub Pages.
- Product release Release comparison sharing, guide-to-waits and working favorites #106: integrates Make crossing comparisons shareable and measurable #102/Connect guide readers to live waits and saved crossings #104 sharing, fixed-choice comparison feedback, favorites and bilingual guide-to-waits/sharing. Fixed false save success when browser storage is blocked. 406 route checks, targeted EN/ES desktop/mobile interactions and GitHub release checks pass. Awaiting Sebastian's Pages production approval; this release does not depend on Vercel.
- Hosting Publish Vercel bundles daily without rebuilding on data commits #107: integrates Prepare free BorderPulse app for a cost-controlled Vercel preview #103, retains the 15-minute collector, and adds a disabled-by-default daily prebuilt publisher at 08:17 UTC. Data-only commits do not trigger builds. Freshness/history/FX validation and a publication manifest guard each upload; live API failures preserve honest fallback timestamps. 18 publication/function tests, four refresh tests, full route checks, Vercel packaging and GitHub checks at b65c6f8 passed. Subsequent head 4a5012c adds verification documentation only.
- Working protected preview: https://borderpulse-1aclctmdc-sbc1-codes-projects.vercel.app — deployment dpl_4dt2z2rNsmkrEsTw3VJv1WX8WTLx is Ready, has no production alias, and uses prebuilt artifacts. Browser readback: 42 live CBP crossings fetched 2026-09-30T05:02:02.700Z, 403 bundled historical observations, comparison history, canonical sharing, FX and automatic Adsterra. Manifest source ba320b1; deployment metadata b65c6f8 adds docs/audit validation only.
- Measured usage: BorderPulse $0.27; shared team $2.46 of $20 included credit, mostly build CPU. Immediate post-upload reading is unchanged but can lag one hour; this does not establish zero marginal cost or production fit. No new spend approved.
- Exact cutover/rollback: Publish Vercel bundles daily without rebuilding on data commits #107's docs/REFRESH-OPERATIONS.md records Vercel API rank-1 apex A targets 216.150.1.1 and 216.150.16.1; www CNAME 84c88a1a10d2756f.vercel-dns-016.com. Captured Pages rollback is apex 185.199.108–111.153 and www sbc1-code.github.io, TTL 3600. Recheck before approval; nameservers/mail remain intact. No domains attached or DNS changed.
Next: approve/ship #106 on Pages. After separate approval, merge #107, wait for one successful matching collector/history run, store a scoped Vercel deployment token as Actions secret VERCEL_TOKEN, and enable preview-only publication. Observe two scheduled runs, advancing manifests, no intervening data-only Vercel deployments, and actual usage deltas before the final production/domain decision. Daily automation is currently off. The new credential/preview activation approval is pending; no token was created or copied. Free waits, existing Pro, automatic ads and accepted creatives remain. #87 stays separate; no Supabase/Sentry/paywall/rewrite.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsRelease and migration pause closeout — Sebastian asked to leave the IONOS/domain step until tomorrow because the password is unavailable.
Live product: #106 merged at 4ff34bc. Pages deployment https://github.com/sbc1-code/borderpulse/actions/runs/36672345454 succeeded. Direct tests against https://borderpulse.com passed EN/ES desktop/mobile favorites (including persistence and storage failure), comparison copy/feedback, guide sharing/UTMs and guide-to-waits navigation. The new features are publicly live on Pages. The 15-minute collector continues; later Pages run 36673135848 also succeeded.
Approvals recorded: Sebastian explicitly approved Vercel production plus the borderpulse.com DNS cutover, and creation/storage of the deployment credential. Do not ask for the same decisions again when this work resumes. #107 merged at 9ef32cc. A project-scoped token named borderpulse-github-daily-publisher was created for BorderPulse only (90-day expiry; Vercel list displays December 29, 2026) and stored as encrypted Actions secret VERCEL_TOKEN. No credential value appears in source or logs.
Current state: borderpulse.com and www.borderpulse.com are attached and verified in the existing Vercel project; www is configured for a 308 redirect to the apex. Public DNS is still Pages. No Vercel production deployment completed. Existing preview remains available. Project has no Git integration, avoiding per-data-commit Vercel builds; existing deployment protection remains.
Publish blocker/fix: first production Actions run https://github.com/sbc1-code/borderpulse/actions/runs/36672822869 passed data validation but failed before build at vercel pull: CLI 50.1.6 reads team-level resources, denied by the project-only token. #109 pins official CLI 61.1.0, whose project-resolution code supports owner-lookup fallback; both release checks pass. #109 is OPEN and UNMERGED, and the actual authenticated publication still needs retesting. Keep the narrow token; do not broaden its scope as a shortcut. Failure issue #108 should auto-close after a successful publish.
Paused safely: VERCEL_PUBLISH_ENABLED=false was read back after the pause; VERCEL_PUBLISH_TARGET=production remains the approved target. Resume: merge #109, ensure fresh matching collector/history data, enable and verify the Actions production publish, then complete IONOS sign-in and replace only the documented apex/www website records. Verify anonymous HTTPS, domain redirects, live API/fallback, history/FX, ads and interactions before declaring Vercel cutover complete. Keep Pages rollback. No new spending authorized; usage/cost and scheduled-run observations remain unproven.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsApproved Vercel cutover completed — September 30, 2026, approximately 3:55 p.m. Pacific.
Publication: PR #109 merged at a60e3cd (includes prior merged PR #110). Actions run 36786247850 succeeded at authorization, data validation/provenance, CLI 61.1.0 environment pull, Node 24 prebuilt build, full npm test release checks, final freshness validation, and production upload. Vercel deployment dpl_GuWfEBhW9r8tGAiE7VXCWLVuFZE8 is READY. VERCEL_PUBLISH_ENABLED=true; target=production. Issue #108 automatically closed on recovery.
IONOS: apex A records are 216.150.1.1 and 216.150.16.1; www CNAME is 84c88a1a10d2756f.vercel-dns-016.com, TTL 3600. Authoritative DNS and Vercel domain config agree, with misconfigured=false and no conflicts. Nameservers, MX, SPF, DKIM, DMARC, Google verification, and autodiscover were preserved. Initial www TLS mismatch was diagnosed as a missing certificate; official Vercel cert issuance succeeded once, then anonymous https://www.borderpulse.com/ verified HTTP 308 to https://borderpulse.com/ with valid TLS. Apex anonymous HTTPS serves Vercel HTTP 200.
Public verification: publication manifest confirms the deployed SHA; bundled CBP fallback has 42 crossings fetched at 22:22:29 UTC, history has 476 snapshots reaching August 31 through September 30, and FX USD/MXN is 18.0243 fetched at 22:22:29 UTC. Live /api/public/crossings separately returned 42 crossings fetched at 22:46:46 UTC, with the UI subsequently showing updated live snapshots. Dashboard, crossing page, comparison, EN/ES mobile, no horizontal overflow at 390px, favorites persisting after reload, crossing copy, guide copy with UTM tags, guide-to-current-waits navigation, and unknown-route HTTP 404 were checked. Automatic Adsterra script and rendered native creative were observed; no ad settings changed or ads clicked. Browser error log was empty on the checked comparison page; Vercel production error/fatal runtime query returned no matching logs.
Collector run 36787996168 succeeded at 3:52 p.m. Pacific. The 15-minute collector stays enabled. Daily bundled publication remains 08:17 UTC (1:17 a.m. Pacific in daylight saving time), ignores data-only pushes, and retains provenance/freshness gates. Next two scheduled production observations and actual first-week usage/cost remain pending. No new spending, pricing changes, auth weakening, or new services were introduced.
Rollback: preserve Pages deployment and collector during initial observation. Restore the four apex A values 185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153 and www CNAME sbc1-code.github.io (TTL 3600), after confirming a successful Pages deployment. Recent Pages jobs are pending/canceled; run 36788053371 was pending at verification. A code merge/collector success is not proof of Pages publication. Pause Vercel publication with VERCEL_PUBLISH_ENABLED=false if rolling back. Keep mail/nameservers intact.
Current Focus's BorderPulse Status/Next paragraphs were updated and read back. Credential renewal metadata remains in existing records; no secret values were read into the report. PR #87 remains separate. Hosting cutover is complete; scheduled-run and production-cost observation are operational follow-ups.
sbc1-code commented
on Sep 30, 2026 OwnerAuthorMore actionsMigration continuity note: the public site/API are on Vercel, GitHub Actions owns collection and prebuilt daily publication, and IONOS retains the domain/DNS. Scheduled publication verification is currently 0/2; the successful manual cutover run does not count. No existing publication-monitoring automation was found, and none was created under the no-duplicate instruction. The existing October 28 pilot readout remains separate; first-week cost review remains future work. Sebastian reported slow/outdated data on the San Ysidro–Otay Mesa comparison and other pages. Live API health checks returned 42 crossings in about 0.24 seconds with no recorded runtime errors, while code review found one-time page fetches outside the dashboard, optional feeds blocking current waits, and a second service-worker API cache. A focused refresh fix is being tested; this note does not yet claim it is released.
Goal
Grow BorderPulse from its public, free, ad-supported wait-time app into a reliable product with a useful team workflow. Keep the public wait-time experience and its automatic Adsterra support intact while validating a specific paid use case.
Current verified baseline (2026-09-29)
borderpulseproject is not connected to Git and serves previews; it is not the public site's host./data/crossings.json, while 30-day aggregates are reconstructed from Git history during a site build. A simple host switch would risk stale data or incomplete historical aggregates.Market signal to test
Work list
Decision gates