18 KiB
Forefront Broadband Map Implementation Plan
For Hermes: Use subagent-driven-development skill to implement this plan task-by-task.
Goal: Build an internal Ops-hosted broadband availability map for ZIPs 75154 / Red Oak, Texas and 75146 / Lancaster, Texas showing address-level 300+ Mbps availability for AT&T, Spectrum, Rise Broadband, Brightspeed, Frontier, and Forefront Wireless if Forefront data is provided.
Architecture: Use FCC BDC fixed broadband availability as the reproducible baseline, normalize it into a local spatial database, and expose a small API + Leaflet/MapLibre web UI. Provider websites are validation sources, not the bulk-data foundation, because they are often CAPTCHA/ToS limited and not designed for bulk qualification.
Tech Stack: Python/FastAPI, PostgreSQL + PostGIS or SQLite/GeoPackage for MVP, DuckDB for bulk CSV processing, Tippecanoe/PMTiles or GeoJSON for map layers, Leaflet or MapLibre GL JS, Caddy reverse proxy under Ops.
Current Context / Assumptions
- Target area: ZIPs 75154 / Red Oak, Texas and 75146 / Lancaster, Texas. Scope for 75146 is the full ZIP.
- Minimum plan speed: 300 Mbps download or higher.
- Initial competitors: AT&T, Spectrum, Rise Broadband, Brightspeed, Frontier.
- Forefront Wireless should be added if we can get service-area GIS, tower/AP sector data, customer install data, or an address qualification/export file.
- App is internal first under
ops.itpropartner.com, not public customer-facing on day one. - Provider qualification access is limited to public web pages plus FCC/government data.
- Results should include available details where sources provide them: speed, technology, price, install fee, contract terms, order URL, and phone number.
- Services below 300 Mbps should be shown as excluded under 300 Mbps rather than treated as qualifying results.
- Manual sampled validation is acceptable if provider websites block automation.
- Initial validation address:
927 Pierce Road, Red Oak, TX 75154, geocoded via OpenStreetMap/Nominatim to32.5177279, -96.7677135. - FCC BDC data is provider-reported and useful as a baseline, but it must be labeled as reported availability, not guaranteed installability.
Verified Source Findings
FCC Broadband Data Collection / National Broadband Map
- The FCC Broadband Data page says the National Broadband Map provides information about services available to individual locations as reported by ISPs.
- FCC public data APIs exist for downloadable BDC files, but require an FCC username and generated API token.
- API docs identify:
GET /api/public/map/listAsOfDatesGET /api/public/map/downloads/listAvailabilityData/{as_of_date}GET /api/public/map/downloads/downloadFile/{file_id}
- Availability download list supports filtering by category, subcategory, technology type, state/provider, etc.
- Rate limit in the FCC API spec: 10 calls per minute.
FCC fixed broadband availability files
The FCC BDC download specification defines fixed broadband availability CSV fields including:
frnprovider_idbrand_namelocation_idtechnologymax_advertised_download_speedmax_advertised_upload_speedlow_latencybusiness_residential_codestate_uspsblock_geoidh3_res8_id
Technology codes include:
| Code | Technology |
|---|---|
| 10 | Copper Wire |
| 40 | Coaxial Cable / HFC |
| 50 | Fiber to the Premises |
| 60 | Geostationary Satellite |
| 61 | Non-geostationary Satellite |
| 70 | Unlicensed Terrestrial Fixed Wireless |
| 71 | Licensed Terrestrial Fixed Wireless |
| 72 | Licensed-by-Rule Terrestrial Fixed Wireless |
| 0 | Other |
Fabric / address limitation
- Public BDC availability records key on
location_id. - The FCC help docs say to obtain address, coordinate, building type, and other location details beyond Location ID, access to the Broadband Serviceable Location Fabric is required.
- Fabric access requires a license through FCC/CostQuest and can take up to ~2 weeks after entity info/request submission.
- Without Fabric, we can still use
location_id, block GEOID, H3 cell, ZIP/county/geography summaries, and geocoded user input — but exact address-to-BSL matching will be imperfect.
Census Geocoder
- Census Geocoder provides public REST geocoding for U.S. addresses.
- Single record endpoint form:
https://geocoding.geo.census.gov/geocoder/returntype/searchtype?parameters - Batch mode supports up to 10,000 records per batch file.
- Useful for converting user-entered addresses to lat/lon and census geography, but it does not return FCC Fabric
location_id.
What Needs To Be Built
1. Data ingestion pipeline
Purpose: Pull, normalize, and refresh broadband availability data.
Components:
-
scripts/fcc_list_vintages.py- Calls FCC list-as-of-dates API.
- Selects latest availability vintage.
-
scripts/fcc_download_availability.py- Downloads Texas fixed broadband availability data by technology/provider where available.
- Saves raw ZIP/CSV files under
data/raw/fcc/YYYY-MM-DD/. - Logs file IDs, provider IDs, source URL, download timestamp, hash.
-
scripts/import_fcc_bdc.py- Imports CSVs into staging tables.
- Filters target providers.
- Filters
max_advertised_download_speed >= 300. - Normalizes technology codes.
- Produces clean availability table.
-
scripts/import_fabric.pyonly if Fabric license/data is obtained- Imports county-level Fabric CSVs for Ellis County / Dallas County as needed.
- Joins BDC
location_idto Fabric address/lat/lon.
-
scripts/import_forefront.py- Imports Forefront service data if provided.
- Accepted input formats: CSV address list, customer/install export, tower coordinates + sector azimuth/beamwidth/radius, KMZ/KML, GeoJSON, shapefile, or coverage polygon.
2. Spatial data store
MVP choice: SQLite + GeoPackage if dataset stays small.
Better production choice: PostgreSQL + PostGIS.
Tables/views:
| Table/View | Purpose |
|---|---|
raw_fcc_downloads |
downloaded file metadata and hashes |
fcc_availability_raw |
raw BDC rows |
provider_map |
provider aliases and FCC provider IDs |
availability_clean |
normalized 300+ Mbps availability rows |
fabric_locations |
BSL address/lat/lon/building fields if licensed Fabric is available |
forefront_coverage |
Forefront-specific service areas/data |
address_lookup_cache |
user address → lat/lon/geography/cache result |
source_evidence |
URL, source type, confidence, retrieval timestamp |
3. Backend API
FastAPI endpoints:
| Endpoint | Purpose |
|---|---|
GET /health |
service/database status |
GET /providers |
list providers and metadata |
GET /address?q=... |
geocode address and return availability |
GET /availability?lat=...&lon=... |
coordinate-based lookup |
GET /tiles/{z}/{x}/{y} or static PMTiles |
map layer data |
GET /sources |
data source versions, hashes, timestamps |
POST /admin/refresh |
manually trigger data refresh, internal only |
Address lookup logic:
- Normalize user-entered address.
- Confirm address is inside/near ZIPs 75154 or 75146.
- Geocode via Census Geocoder first; fallback to Nominatim only if Census fails.
- If Fabric data exists: match nearest/normalized BSL and join by
location_id. - If no Fabric data: use nearest H3/block/provider footprint approximation and label confidence lower.
- Return 300+ Mbps providers as qualifying and show sub-300 Mbps services as excluded under 300 Mbps when source data exposes them.
4. Frontend web app
Internal Ops page:
- Map centered on ZIPs 75154 and 75146.
- Search box for address.
- Provider filter toggles.
- Result cards showing:
- provider
- max download/upload
- technology
- residential/business flag
- latency flag
- source
- confidence
- vintage date
- price, install fee, contract terms, order/contact URL, and phone number if verified/available
- Source badge system:
- High: official provider address qualification or FCC BDC + licensed Fabric exact BSL match
- Medium: FCC BDC without Fabric exact address match, provider coverage map, GIS polygon
- Low: third-party directories, affiliate ISP comparison pages, inferred/SEO pages
5. Admin / refresh workflow
- Scheduled refresh when FCC releases new BDC data, likely twice per year.
- Manual refresh command.
- Data version page showing current vintage and import hashes.
- Rollback to previous imported vintage.
Data Acquisition Plan
A. FCC BDC data — primary baseline
Need: FCC BDC API credentials.
Steps:
- Create/use FCC CORES/BDC login.
- Generate NBM API token from
https://broadbandmap.fcc.gov/login→ Manage API Access. - Store username/token in server
.env. - Call
listAsOfDatesto discover newest availability date. - Call
listAvailabilityData/{as_of_date}with filters:- category: State or Provider
- technology_type: Fixed Broadband
- state: Texas / FIPS 48 where applicable
- Download Texas fixed broadband data files.
- Build provider ID map for AT&T, Spectrum, Rise, Brightspeed, Frontier.
- Import and filter:
state_usps = 'TX'max_advertised_download_speed >= 300- provider brand/provider ID in target list
- geography intersects ZIP 75154 / Red Oak region
Expected quality: Medium to high, depending on whether we can join to Fabric.
Problem: BDC availability data alone uses location_id; exact address display requires Fabric.
B. FCC/CostQuest Fabric — needed for exact address-level results
Need: Fabric license/access for relevant counties/area.
Steps:
- Determine license path:
- Forefront as broadband provider if eligible; or
- IT Pro Partner / client as other entity if challenge/research purpose fits.
- Request Fabric for required geography:
- At minimum: Ellis County and nearby ZIP 75154 area.
- ZIP 75154 may cross/neighbor multiple jurisdictions, so verify county boundary before final request.
- Import Fabric county CSVs.
- Join
fabric_locations.location_id = fcc_availability.location_id. - Build address-level searchable layer.
Expected quality: High.
Known delay: FCC help docs say delivery may take up to about two weeks after entity info/request submission.
If we do not get Fabric: MVP can still work, but confidence drops. It becomes “reported availability near/within this area,” not exact install qualification.
C. Provider websites — validation and enrichment only
Providers:
- AT&T
- Spectrum
- Rise Broadband
- Brightspeed
- Frontier
Use cases:
- Spot-check known Red Oak addresses.
- Collect official order/contact URLs.
- Confirm whether FCC-reported service appears orderable.
- Capture screenshots/evidence manually or semi-automated if allowed.
Do not rely on scraping these sites for bulk data unless terms/API access allow it. Expect CAPTCHA, anti-bot controls, and inconsistent outputs.
D. Forefront Wireless internal data
Need from Forefront, ideally one or more:
| Data | Value |
|---|---|
| Tower/AP coordinates | Build RF/source layer |
| Sector azimuth, beamwidth, downtilt, frequency, height | Estimate coverage polygon |
| Service radius / install rules | Qualification model |
| Existing customer/install addresses | Validate coverage and demand |
| Failed install / no-LOS addresses | Exclusion/weakness layer |
| CRM/export of leads | Sales planning overlay |
| KML/KMZ/shapefile/GeoJSON coverage | Fastest map layer |
Forefront data should be kept separate from FCC/provider public data so we do not mix internal truth with public reported coverage.
E. Boundaries/geocoding/base maps
- ZIP 75154 and 75146 boundaries: Census TIGER/Line ZCTA or local GIS.
- Address geocoding: Census Geocoder primary.
- Base map: OpenStreetMap tiles or self-hosted tiles if public use grows.
- Optional local GIS: Ellis County parcels/address points if publicly downloadable.
Implementation Phases
Phase 0 — Decisions and access
Objective: Remove ambiguity before building.
Confirmed by Germaine:
- App audience: internal.
- Forefront should be included as a layer/reference provider.
- Include available service details where public/FCC/provider sources expose them.
- Lower-speed services should be shown as excluded under 300 Mbps.
- Manual sampled validation is acceptable if provider websites block automation.
Still needed before build:
- FCC BDC username/token, or approval to create/request one.
- Decision on whether to pursue FCC/CostQuest Fabric access.
- Any Forefront coverage/install data when available.
- Confirm temporary URL if/when deployed; default assumption remains
ops.itpropartner.com/forefront-broadband-map/. - No access protection is needed yet for the prototype.
Phase 1 — FCC data proof-of-concept
Objective: Prove we can pull and parse target provider records.
Tasks:
- Build FCC API client.
- Pull latest availability vintage list.
- List Texas fixed broadband downloads.
- Download target files.
- Import to DuckDB/SQLite.
- Filter to providers and speeds >=300 Mbps.
- Produce first table: provider, technology, count of qualifying locations, max speeds, vintage.
Validation:
- Verify source file hashes.
- Verify row counts before/after filtering.
- Verify provider IDs/brand aliases manually.
Phase 2 — Geography narrowing
Objective: Limit data to ZIP 75154 / Red Oak.
Two paths:
- With Fabric: exact BSL address/coordinates → ZIP/spatial filter.
- Without Fabric: use block GEOID/H3/ZIP boundary approximations → lower confidence.
Validation:
- Test against 5–10 known Red Oak addresses.
- Confirm inside/outside ZIP behavior.
Phase 3 — API and UI MVP
Objective: Build usable internal prototype.
Tasks:
- FastAPI service with
/health,/address,/providers,/sources. - Static frontend with map and search.
- Provider filters and result cards.
- Source confidence badges.
- Deploy behind Caddy under Ops.
- Password protect if internal-only.
Validation:
- Search known addresses.
- Compare returned providers against FCC map/provider websites.
- Confirm every result shows source + confidence + vintage.
Phase 4 — Forefront layer
Objective: Add Forefront’s own service intelligence.
Tasks depend on data received:
- If coverage polygons/KML exist: import directly.
- If tower/sector data exists: generate approximate sector polygons.
- If customer/install data exists: add point layer and anonymized heatmap.
- If failed installs/no-LOS exists: add negative evidence layer.
Validation:
- Review with Forefront ops/sales.
- Confirm no sensitive customer PII appears in public/internal UI unless approved.
Phase 5 — Data refresh and reporting
Objective: Make it durable, not a one-off demo.
Tasks:
- Add refresh script.
- Add import logs.
- Add rollback support.
- Add export/report:
- CSV of addresses/providers if address list supplied.
- Coverage gap report.
- Competitor overlap report.
Validation:
- Run refresh twice idempotently.
- Verify no duplicate rows.
- Verify previous vintage can be restored.
Files Likely To Change / Be Created
If this becomes a real build, create a dedicated project repo/folder, likely:
/root/projects/forefront-broadband-map/
README.md
.env.example
docker-compose.yml
backend/
app/main.py
app/config.py
app/db.py
app/routes/address.py
app/routes/providers.py
app/routes/sources.py
app/services/geocode.py
app/services/availability.py
app/services/source_quality.py
tests/
frontend/
index.html
src/main.js
src/styles.css
scripts/
fcc_list_vintages.py
fcc_download_availability.py
import_fcc_bdc.py
import_fabric.py
import_forefront.py
build_tiles.py
data/
raw/
processed/
docs/
data-sources.md
source-confidence-policy.md
operations.md
Also keep canonical project note in:
/root/projects/itpp-infrastructure/projects/forefront-broadband-map.md
Source Quality Ranking Policy
| Rank | Source Type | Use |
|---|---|---|
| 1 | Provider official address qualification API/page result | Highest confidence for individual address, if accessible and timestamped |
| 2 | FCC BDC + licensed Fabric exact BSL join | Strong reproducible baseline; still provider-reported |
| 3 | FCC BDC without Fabric exact address join | Good area/provider signal; not exact address certainty |
| 4 | Official provider coverage map/page | Useful validation; often broad/incomplete |
| 5 | Local/county GIS address/parcels | Good for geocoding/boundaries, not service availability |
| 6 | Third-party ISP directories/comparison sites | Context only; do not use as truth |
| 7 | Inferred RF/coverage model | Planning signal only until validated by installs/tests |
Risks / Constraints
- Fabric access is the hard gate for clean address-level accuracy. Without it, exact address qualification is weaker.
- Provider-reported FCC data can be wrong. Must display source/vintage/confidence.
- Provider websites are not reliable bulk data sources. Use for validation, not scraping-first architecture.
- ZIP boundaries are messy. Need ZCTA/parcel/geocode handling and outside-scope warnings.
- Forefront RF coverage may not equal installability. Line-of-sight, foliage, CPE height, and sector load matter.
- PII risk. Forefront customer/install data must be anonymized or access-controlled.
Open Questions
- Can Forefront obtain/provide FCC Fabric access, or should we request it separately?
- Which Forefront data format will come first: coverage polygons, tower/AP/sector/customer/install/no-LOS data, or address-level serviceability list?
- Should business-only and residential-only services be shown separately when the source distinguishes them, or merged into one availability card?
- What confidence threshold is acceptable for showing a provider as “available” versus “reported/possible”?
- No access protection is needed yet for the prototype; revisit only if the app later exposes sensitive Forefront/customer data.
Recommended Next Move
Do Phase 1 first: prove FCC BDC ingest and produce a filtered provider/speed table for ZIPs 75154 and 75146. In parallel, start Fabric access because it is the likely schedule bottleneck.
If Fabric access is delayed, build a useful internal MVP with clear confidence labeling, then upgrade it to exact address-level matching once Fabric arrives.