Track Accumulated Cyclone Energy (ACE) for the 2026 Atlantic and Eastern Pacific hurricane seasons in real time. Updated hourly during hurricane season from official NOAA data.
翻譯準備中
資料Python · HTMLGitHub @jeremypfi上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證追蹤大西洋與東部太平洋颶風季的累積氣旋能量(ACE),資料來源為 NOAA HURDAT2 資料庫。即時儀表板、季節歷史與紀錄,請至 aceofcanes.com 查看。
AI 翻譯
Tracks Accumulated Cyclone Energy (ACE) for the Atlantic & Eastern Pacific hurricane seasons from NOAA HURDAT2 data. Live dashboard, season history, and records at aceofcanes.com.
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Atlantic & Eastern Pacific Hurricane ACE Tracker
Tracks Accumulated Cyclone Energy (ACE) for Atlantic and Eastern Pacific hurricane seasons with storm-by-storm data from 1991 onward. Publishes a web dashboard rebuilt hourly during hurricane season from NOAA/NHC data. It's a hobby data site, not a forecast: for watches, warnings, and forecasts, go to the National Hurricane Center.檢視完整 README ↗Atlantic & Eastern Pacific Hurricane ACE Tracker
Tracks Accumulated Cyclone Energy (ACE) for Atlantic and Eastern Pacific hurricane seasons with storm-by-storm data from 1991 onward. Publishes a web dashboard rebuilt hourly during hurricane season from NOAA/NHC data. It's a hobby data site, not a forecast: for watches, warnings, and forecasts, go to the National Hurricane Center.
| Page | URL |
|---|---|
| Current Season Dashboard | https://aceofcanes.com |
| Season History (1991–present) | https://aceofcanes.com/history.html |
| Records Since 1991 | https://aceofcanes.com/records.html |
| What Is ACE? (explainer + calculator) | https://aceofcanes.com/what-is-ace.html |
| JSON API & RSS docs | https://aceofcanes.com/api.html |
Rebuilt hourly May–November and every 3 hours December–April. Hurricane seasons: Eastern Pacific May 15 – Nov 30, Atlantic Jun 1 – Nov 30. Each basin shows when its storm data is from ("Best-track data as of …"), which can lag the page build by a few hours; the build time is in the footer.
Florida (Cat 1) · Louisiana (Cat 3)). Storms that never made landfall are labeled Fish Storm. For the current season, landfalls come from the preliminary track and are marked est. until NHC's post-season reportGFS 18Z Sep 26), and a model whose latest run is more than 24 hours behind the newest run for that storm is left offAccumulated Cyclone Energy (ACE) measures total hurricane season activity by combining storm intensity and duration. It's calculated by squaring the maximum sustained wind speed (in knots) at each 6-hour synoptic time when the system is at tropical storm strength or higher, then summing across all storms.
Formula: ACE = Σ(V²max) × 10⁻⁴
A long-lived major hurricane contributes far more ACE than a brief tropical storm. NOAA uses seasonal ACE totals to classify activity levels.
| Classification | ACE |
|---|---|
| Extremely Active | ≥ 159 |
| Above Normal | 126 – 159 |
| Near Normal | 73 – 126 |
| Below Normal | < 73 |
git clone https://github.com/jeremypfi/ace-tracker.git
cd ace-tracker
pip3 install -r requirements.txt
python3 ace_tracker.py
Generates in data/:
ACE_Dashboard.html — current season dashboard (open in any browser)history.html — all-seasons history pagerecords.html — storm records since 1991what-is-ace.html — ACE explainer and calculatorapi.html — JSON API and RSS docs (every field, examples)python3 test_ace_tracker.py # unit + smoke tests
python3 test_ui.py # browser tests (needs requirements-dev.txt + `playwright install chromium`)
python3 verify_pr.py # unit tests + syntax check + a full live tracker run + browser tests
All tests must pass before committing. Use the /pre-commit skill in Claude Code for the full checklist.
Full field-by-field docs with examples: aceofcanes.com/api.html.
https://aceofcanes.com/api/v1/season.json has both basins' current season: ACE totals, classification, counts, rank, every storm with its landfalls and track points, and yearly ACE since 1991. Wind is in knots, current-season values are preliminary, and the version field is 1. Fields may be added to v1, but a rename or removal will ship as /api/v2/.https://aceofcanes.com/feed.xml adds an item for each named storm as it forms.https://aceofcanes.com/storm/<name>-<year>.html (for example storm/polo-2026.html), with the track map, forecast cone and model tracks while active, ACE, landfalls and its own share card. Each storm's url is in the JSON.ace-tracker/
├── ace_data.py # Data fetch, ACE calc, plain-text report generation
├── ace_html.py # Dashboard, history, records, and What Is ACE? page rendering
├── ace_feeds.py # JSON API (api/v1/season.json) and RSS feed (feed.xml) builders
├── ace_assets.py # CSS and JS blocks shared by the dashboard and storm pages
├── ace_storm_pages.py # One page per current-season storm (storm/<name>-<year>.html)
├── ace_cards.py # Live season share card (og/season-<hash>.png, drawn with Pillow)
├── ace_tracker.py # CLI entrypoint — wires the modules above together
├── test_ace_tracker.py # unit + smoke tests
├── test_ui.py # Playwright browser tests against the fixture site
├── ui_fixture_site.py # Builds the whole site offline from fixtures/ for test_ui.py
├── fixtures/ # Saved NHC feeds + HURDAT2 snippet for offline fetcher tests
├── verify_pr.py # Consolidated PR check: tests + syntax check + a live tracker run + UI tests
├── smoke_test.py # Pre-deploy structural checks on the built data/ folder
├── freshness_check.py # Live-site staleness check behind the site-alert issue
├── requirements.txt # Python dependencies
├── ace.png # Site logo (favicon + OG image)
├── ace_preview.png # 1200x630 social share card (copied into data/ at publish time)
├── landfall_cache.json # Cached landfall geocoding results (gitignored, built by CI)
├── CNAME # Custom domain for GitHub Pages (aceofcanes.com)
├── robots.txt # Search engine crawl rules
├── sitemap.xml # Sitemap for search engine indexing
├── CLAUDE.md # Project instructions for Claude Code
├── CONTRIBUTING.md # Contribution guidelines
├── images/ # Reference/marketing images
├── .claude/skills/ # /pre-commit, /season-start, /verify-data
├── .github/
│ ├── workflows/
│ │ ├── tests.yml # CI: runs tests on push/PR (Python 3.11, 3.12)
│ │ ├── publish.yml # Scheduled: generates, smoke-tests and deploys the dashboard hourly in season
│ │ └── freshness.yml # Hourly: starts a missed publish; opens/closes a site-alert issue if the site goes stale
│ ├── dependabot.yml # Automated dependency updates
│ └── CODEOWNERS # @jeremypfi must approve all PRs
├── SECURITY.md
└── data/ # Published as the site (html generated + gitignored; ace.png and vendor/ committed)
├── ace.png
├── ACE_Dashboard.html # copied to index.html at publish time
├── history.html
├── records.html
├── what-is-ace.html
├── api.html
├── vendor/ # Self-hosted Leaflet 1.9.4 and Chart.js 4.5.1, with licenses
└── cones/ # NHC forecast cone images, fetched fresh each run (gitignored)
include_btk=True in Tropycal), updated continuously during active stormsTWOAT.xml / TWOEP.xml) parsed every run for active disturbances with development potentialHistorical storms (completed seasons) use the official HURDAT2 'L' landfall markers, which record the exact time and position of each landfall. These markers aren't added to the real-time best-track data until the post-season analysis, so active-season storms use a geographic fallback: track points are checked against Natural Earth shapefiles using exact point-in-polygon containment. Those landfalls are shown as est., and only landfalls at tropical-storm strength or stronger count toward the landfall ACE share. Results are cached in landfall_cache.json and persisted via GitHub Actions cache so geocoding only runs for new or updated storms. The Natural Earth shapefiles themselves (~20 MB) are also cached by the publish workflow (key naturalearth-10m-cultural-v1; bump the suffix to force a fresh download).
Key constants, mostly in ace_data.py (OUTPUT_FOLDER is the one exception — it stays in ace_tracker.py since only main() uses it):
| Constant | Purpose |
|---|---|
START_YEAR | Earliest year included in historical data (default: 1991) |
OUTPUT_FOLDER | Where HTML files are saved (default: data/) — defined in ace_tracker.py |
LANDFALL_CACHE_PATH | Path to the landfall geocoding cache (default: repo root) |
BASINS | Normal ACE values and average storm counts per basin |
BACKUP_DATA | Fallback season data used if NOAA is unreachable |
SPAGHETTI_MODELS | Forecast models drawn on active-storm maps |
SPAGHETTI_MAX_RUN_LAG_HOURS | A model whose latest run trails the storm's newest model run by more than this is left off the map (default: 24) |
Script can't fetch data
The tracker falls back to BACKUP_DATA automatically. You'll see:
✗ Error loading Tropycal data → Using backup data (yearly totals only)
Landfall cache miss on first CI run
The landfall_cache.json is built on the first run and cached by GitHub Actions. The first run after a fresh clone will geocode all historical storms (~1 min extra). Every subsequent run reads from cache.
"Dropped N malformed row(s) … from HURDAT2 file" warning NOAA's HURDAT2 file sometimes ships rows with unparseable lat/lon fields, which would crash Tropycal's parser for the whole basin. The tracker drops those rows and names the storms they belong to, and says whether any is from 1991 onward. As of Sept 2026 they are AL211969 and AL231975: "all before 1991, so no effect on this site's data."
setuptools pin
requirements.txt pins setuptools>=84.1.0,<85. The floor is a security fix (GHSA-xmj3-9gf7-h52w). The cap and the Python 3.13+ exclusion in CI date from when Tropycal imported pkg_resources. Tropycal 1.5.2 no longer does, so both are due for a retest.
data/vendor/ with their licenses. To upgrade one, add a new versioned folder there, update the path and integrity hash in ace_html.py, and test_ace_tracker.py checks the file matches the hash.Questions or issues? Open an issue on GitHub or reach out to @jeremypfi
history.html#pacific&decade=2010s)aria-sort, aria-expanded, aria-pressed), a visible focus ring on every page, and text and badge colors that meet WCAG AA contrast in both themes