Ku·re·te — a fast, static dashboard that tracks the Kubernetes release lifecycle — support windows, end-of-life dates, and the next release — with countdowns that tick live in the browser.
Built with Astro and Bun. No backend, no Node.js — deploys to GitHub Pages or Cloudflare Pages as plain static files.
Kurete is a syllabic acronym of KUbernetes RElease TimelinE (KU·RE·TE).
It's also the Japanese word 暮れて (kurete), the te-form of 暮れる (kureru) — "for the day to grow dark, for dusk to fall, for a year or season to draw to its close." That's a fitting meaning: This dashboard is, at heart, about the sunset of every release, the end-of-life moment when a version's day finally closes. 暮れる is that moment.
- Timeline (Gantt) chart of Active Support and Maintenance Support windows for recent, current, and upcoming releases, with a live "today" marker.
- Supported-releases table colour-coded like a traffic light — green / yellow (deadline within 90 days) / red (passed) — for both support phases.
- Upcoming release panel for the next minor version: a live countdown to GA plus the full release-cycle milestone schedule (freezes, KubeCons, etc.).
- End-of-life archive of every release back to v1.0 (2015), with a "time since EOL" counter for historical documentation.
- Live countdowns to the next release, the next end-of-life, and the next patch day — updated every second, client-side.
- System-aware light / dark theme (mode-watcher style): defaults to following your OS appearance and tracks it live, with a one-click cycle through system → light → dark. Fully responsive, accessible, and zero client frameworks (just a small vanilla-JS enhancement script).
The primary source is the official data that backs https://kubernetes.io/releases/:
| Source | Repository | Provides |
|---|---|---|
data/releases/schedule.yaml |
kubernetes/website |
Supported releases, patch history, upcoming patch days |
data/releases/eol.yaml |
kubernetes/website |
End-of-life dates + final patches (back to 1.2) |
releases/release-<next>/README.md |
kubernetes/sig-release |
The next, not-yet-released minor and its milestones |
data/releases/<v>/released.txt |
kube-api.ninja by xrstf | Exact historical release dates, and releases 1.0–1.1 absent from the official archive |
The official sources drop a release's release date once it reaches EOL, so
that gap is filled from kube-api.ninja (exact dates). Releases older than the
official archive (1.0, 1.1) are sourced entirely from kube-api.ninja. The only
remaining derived value is each EOL release's active↔maintenance split
(release date + ~12 months); on the rare occasion an exact release date can't be
fetched, it falls back to the ~14-month policy and is flagged in the UI with ≈.
Exact release dates are cached in the committed snapshot (and reused from the official schedule captured while a release was still supported), so kube-api.ninja is generally only queried for the one-time historical backfill.
bun run fetch → scripts/fetch-data.ts → src/data/snapshot.json → Astro build
bun run fetchdownloads and normalizes the sources intosrc/data/snapshot.json.snapshot.jsonis committed so the build is reproducible, works offline, and never breaks if the upstream repos are unavailable.- If a fetch fails, the previous snapshot is kept and the build continues (the footer shows "served from cache").
bun run buildruns the fetch first, thenastro build, so every deploy ships fresh data.
bun install # install dependencies
bun run dev # dev server at http://localhost:4321
bun run fetch # refresh src/data/snapshot.json from upstream
bun run build # fetch + production build into dist/
bun run preview # serve the production build locally
bun run check # type-check (astro check)The site is host-agnostic. Base path and canonical URL are read from environment variables at build time:
| Variable | Default | Use |
|---|---|---|
BASE_PATH |
/ |
Sub-path the site is served from (e.g. /my-repo) |
SITE |
https://example.github.io |
Canonical origin for metadata |
A workflow is included at .github/workflows/deploy.yml:
- Push this project to a GitHub repository.
- In Settings → Pages, set Source to GitHub Actions.
- Done. The workflow builds with Bun and deploys on every push to
main, daily at 06:00 UTC (to keep countdowns fresh), and on manual dispatch. It setsBASE_PATH/SITEautomatically viaactions/configure-pages.
Connect the repo in the Cloudflare dashboard with:
- Build command:
bun run build - Build output directory:
dist - Base path: leave unset (served from root)
Cloudflare detects Bun automatically from bun.lock. To keep data fresh, add a
Deploy Hook
and trigger it on a schedule (e.g. a GitHub Action curl-ing the hook daily).
bun run build # outputs to dist/
# upload dist/ to Netlify, S3, Vercel, nginx, ...scripts/fetch-data.ts # build-time data fetch + normalization
src/
data/
types.ts # snapshot type definitions
snapshot.json # committed data snapshot (generated)
releases.ts # view model + timeline chart geometry
lib/
dates.ts # date math, durations, status, colors (shared)
countdown.client.ts # live countdowns / colors / today line / toggles
components/
TimelineChart.astro # Gantt chart
ReleaseTable.astro # supported + recent EOL table
UpcomingReleases.astro # next minor + milestones + patch days
EolReleases.astro # historical EOL archive
layouts/Base.astro # shell, global styles, theming
pages/index.astro # the page
- Countdowns and traffic-light colours are computed client-side from ISO dates, so they stay correct between rebuilds; server-rendered values are the no-JS fallback.
- This project is not affiliated with the Kubernetes project. Kubernetes and its logo are trademarks of the Linux Foundation.