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
33 changes: 33 additions & 0 deletions .github/workflows/sync-transmission.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Sync Transmission Lines

on:
schedule:
- cron: '0 6 1 * *' # 1st of each month at 6am UTC (HIFLD updates irregularly)
workflow_dispatch: {} # Manual trigger

jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- name: Sync transmission lines from HIFLD
run: npx tsx scripts/sync-transmission-lines.ts
- name: Install tippecanoe
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq libsqlite3-dev zlib1g-dev
git clone --depth 1 https://github.com/felt/tippecanoe.git /tmp/tippecanoe
cd /tmp/tippecanoe && make -j$(nproc) && sudo make install
- name: Rebuild tiles
run: bash scripts/build-tiles.sh
- name: Commit & push if changed
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add data/transmission-lines.json public/tiles/transmission-lines.pmtiles
git diff --staged --quiet || (git commit -m "data: update transmission lines (HIFLD)" && git push)
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ public/data/territories/
# Power plants JSON in public/ is copied from data/ at build time
public/data/power-plants.json

# Transmission lines JSON in public/ is copied from data/ at build time
public/data/transmission-lines.json

# Transmission lines GeoJSON can be large (regenerate from sync script)
data/transmission-lines.geojson

# PMTiles archives (built by scripts/build-tiles.sh via tippecanoe)
# Track the .pmtiles files but ignore any extracted/legacy tile directories
public/tiles/*
Expand Down
7 changes: 5 additions & 2 deletions app/(shell)/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import Link from "next/link";
const dataSources = [
{ name: "EIA-860", description: "Annual Electric Generator Report — 15,082 power plants, generator details, fuel types, and capacity data" },
{ name: "EIA-861", description: "Annual electric power industry report — utility ownership, customers, sales, and revenue data" },
{ name: "HIFLD", description: "Homeland Infrastructure Foundation-Level Data — electric service territory boundaries" },
{ name: "HIFLD", description: "Homeland Infrastructure Foundation-Level Data — electric service territory boundaries and 52,000+ transmission line segments" },
{ name: "CEC", description: "California Energy Commission — CCA territory data and California-specific utility information" },
{ name: "FERC", description: "Federal Energy Regulatory Commission — ISO/RTO boundaries and wholesale market data" },
{ name: "State PUC Records", description: "State Public Utility Commission filings — rate structures and regulatory data" },
Expand All @@ -15,7 +15,7 @@ const dataSources = [
const dataHighlights = [
{ label: "Grid Operators", value: "3,132", icon: "⚡" },
{ label: "Power Plants", value: "15,082", icon: "🏭" },
{ label: "Grid Infrastructure", value: "ISOs, RTOs, BAs", icon: "🔌" },
{ label: "Transmission Lines", value: "52,000+", icon: "🔌" },
{ label: "Territory Boundaries", value: "3,000+ GeoJSON", icon: "🗺️" },
];

Expand Down Expand Up @@ -65,6 +65,9 @@ export default function AboutPage() {
<Link href="/grid-operators">
<Badge size="lg" shape="pill" variant="info">Browse Grid Operators →</Badge>
</Link>
<Link href="/transmission-lines">
<Badge size="lg" shape="pill" variant="error">Browse Transmission Lines →</Badge>
</Link>
<Link href="/power-plants">
<Badge size="lg" shape="pill" variant="warning">Browse Power Plants →</Badge>
</Link>
Expand Down
1 change: 1 addition & 0 deletions app/(shell)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export default function ShellLayout({ children }: { children: ReactNode }) {
{ id: "home", label: "Home", href: "/" },
{ id: "explore", label: "Explore", href: "/explore" },
{ id: "grid-operators", label: "Grid Operators", href: "/grid-operators", activePatterns: ["/grid-operators"] },
{ id: "transmission-lines", label: "Transmission", href: "/transmission-lines" },
{ id: "power-plants", label: "Power Plants", href: "/power-plants" },
{ id: "about", label: "About", href: "/about" },
];
Expand Down
18 changes: 18 additions & 0 deletions app/(shell)/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export default function LandingPage() {
// Power plant count is hardcoded to avoid importing the 8.7 MB JSON
// into the pre-rendered page. Updated by sync-power-plants script.
const powerPlantCount = 15082;
// Transmission line count is hardcoded for the same reason. Updated by sync-transmission-lines script.
const transmissionLineCount = 52244;

return (
<div className="h-full overflow-y-auto">
Expand Down Expand Up @@ -49,6 +51,7 @@ export default function LandingPage() {
{ label: "ISOs & RTOs", value: `${isoCount + rtoCount}` },
{ label: "Balancing Authorities", value: `${baCount}` },
{ label: "Power Plants", value: powerPlantCount.toLocaleString() },
{ label: "Transmission Lines", value: transmissionLineCount.toLocaleString() },
{ label: "Programs", value: programCount.toLocaleString() },
].map((stat) => (
<Card key={stat.label} variant="outlined">
Expand Down Expand Up @@ -109,6 +112,21 @@ export default function LandingPage() {
</Card>
</Link>

<Link href="/transmission-lines" className="block group">
<Card variant="outlined" className="group-hover:border-brand-primary transition-colors h-full">
<Card.Content className="py-6">
<div className="text-lg font-semibold text-text-heading mb-1">Transmission Lines</div>
<p className="text-sm text-text-muted mb-3">
Explore {transmissionLineCount.toLocaleString()} high-voltage transmission lines (69kV–765kV)
across the US from the HIFLD dataset.
</p>
<span className="text-sm font-medium text-brand-primary">
Browse transmission lines &rarr;
</span>
</Card.Content>
</Card>
</Link>

<Link href="/explore?view=programs" className="block group">
<Card variant="outlined" className="group-hover:border-brand-primary transition-colors h-full">
<Card.Content className="py-6">
Expand Down
Loading