![]()
๐ Technology Lifecycle Management for Static Intelligence Platform
๐ฆ Node.js 26 Active โข โญ๏ธ Node.js 26 LTS Promotion October 2026 โข โก Future-Ready Architecture
๐ Document Owner: CEO | ๐ Version: 1.5 | ๐
Last Updated: 2026-05-28 (UTC)
๐ Review Cycle: Annual | โฐ Next Review: 2027-05-28
๐ข Owner: Hack23 AB (Org.nr 5595347807) | ๐ท๏ธ Classification: Public
Riksdagsmonitor is a static HTML5/CSS3 website deployed to AWS CloudFront + S3 (primary) and GitHub Pages (disaster recovery), built with Vite, tested with Vitest and Cypress, and powered by Node.js 26. The platform provides Swedish Parliament transparency through interactive Chart.js and D3.js visualisations across 14 languages.
โก Upgrade Note (July 2026): The toolchain migration to TypeScript 7 has started. The project now runs the TypeScript 6 compatibility package (
typescript) side-by-side with a TypeScript 7 RC toolchain (typescript-7) so the build can validate the next compiler without breaking existing workflows. Node.js 26 remains the current runtime and will be promoted to LTS in October 2026; a Node.js 27 nightly compatibility CI job (continue-on-error: true) tracks the next-generation release. See the Node.js Migration Roadmap for the full plan.
This document defines the technology lifecycle management strategy โ covering the current stack, Node.js release schedule evolution, dependency EOL timelines, and migration plans โ to ensure stability, compatibility, and security throughout the project's operational life.
This strategy should be read alongside the Business Continuity Plan, Financial Security Plan, and Architecture Documentation for full technical and business context.
Primary Goal: Maintain Riksdagsmonitor on a supported, secure technology stack by proactively tracking dependency lifecycles and planning migrations before components reach end-of-life.
Key Principles:
The current Node.js release schedule is 10 years old, created during the io.js merger. A decade of usage data now shows:
By reducing concurrent release lines, the project can focus on better supporting the releases people actually use while making the schedule more predictable for enterprises.
Starting with Node.js 27.x, the Node.js project is moving from two major releases per year to one (see nodejs/Release#1113 for full background). Key changes:
| Aspect | Old Model (โค26.x) | New Model (โฅ27.x) |
|---|---|---|
| Major releases | 2 per year (April + October) | 1 per year (April) |
| LTS promotion | Even-numbered only (October) | Every release becomes LTS (October) |
| Odd/even distinction | Odd = Current-only, Even = LTS | No distinction โ all releases get LTS |
| Version numbering | Sequential | Aligned to calendar year (27 in 2027, 28 in 2028) |
| Alpha channel | N/A | 6-month alpha phase (OctโMar) with semver-major changes |
| Alpha versioning | N/A | Semver prerelease format (e.g., 27.0.0-alpha.1) |
| Total support window | ~36 months (LTS only) | 36 months from first Current release to EOL |
| Phase | Duration | Description |
|---|---|---|
| Alpha | 6 months (Oct โ Mar) | Early testing, semver-major changes allowed. Versioning: X.0.0-alpha.N |
| Current | 6 months (Apr โ Oct) | Stabilisation, bug fixes |
| LTS | 30 months (Oct โ Apr+30mo) | Long-term support with security fixes |
| EOL | โ | No further support |
For users who already only upgrade to LTS versions, little changes beyond version numbering. LTS support windows remain similar, and now every release becomes LTS.
To proactively catch Node.js compatibility issues, Riksdagsmonitor will adopt the following alpha testing approach:
| CI Matrix | Trigger | Failure Policy |
|---|---|---|
| Node.js LTS (current) | Every push, PR | โ Blocking โ must pass |
| Node.js Current | Every push, PR | โ Blocking โ must pass |
| Node.js Alpha (next) | Weekly scheduled | โ ๏ธ Non-blocking โ issues logged, not gating |
This allows early detection of breaking changes in Node.js alpha while keeping production deployments stable on LTS.
| Category | Technology | Current Version | EOL Date | Replacement Path |
|---|---|---|---|---|
| Runtime | Node.js 26 | 26.x | April 2029 (Maintenance end) | Node.js 27 LTS (2027) |
| Package Manager | npm | Bundled with Node.js | Follows Node.js | Follows Node.js upgrades |
| Language | TypeScript | 6.0.3 | Active (quarterly releases) | Track latest stable |
| Build Tool | Vite | 8.0.14 | Active | Track latest major |
| Transpiler | tsx | 4.22.3 | Active | Track latest stable |
| Category | Technology | Current Version | EOL Date | Replacement Path |
|---|---|---|---|---|
| Unit Testing | Vitest | 4.1.7 | Active (follows Vite) | Track with Vite major versions |
| E2E Testing | Cypress | 15.16.0 | Active | Track latest stable |
| Coverage | @vitest/coverage-v8 | 4.1.7 | Active | Track with Vitest |
| DOM Simulation | happy-dom | 20.9.0 | Active | Track latest stable |
| Category | Technology | Current Version | EOL Date | Replacement Path |
|---|---|---|---|---|
| Charting | Chart.js | 4.5.1 | Active | Track latest stable |
| Chart Annotations | chartjs-plugin-annotation | 3.1.0 | Active | Follows Chart.js |
| Data Visualisation | D3.js | 7.9.0 | Active | Track latest major |
| CSV Parsing | PapaParse | 5.5.3 | Active | Track latest stable |
| JSON Validation | Ajv | 8.20.0 | Active | Track latest stable |
| JSON Formats | ajv-formats | 3.0.1 | Active | Follows Ajv |
| Category | Technology | Current Version | EOL Date | Replacement Path |
|---|---|---|---|---|
| Linting | ESLint | 10.4.1 | Active | Track latest major |
| HTML Linting | HTMLHint | 1.9.2 | Active | Track latest stable |
| Dead Code | knip | 6.14.2 | Active | Track latest stable |
| API Docs | TypeDoc | 0.28.19 | Active | Track latest stable |
| TypeScript | Release Date | Status | Support Until |
|---|---|---|---|
| 6.0.3 | Mar 2026 | โ Active โ in use | Until 7.0 release (~12 months) |
| 5.9.x | Feb 2026 | Previous stable | Limited โ security patches only |
| 5.8.x | Dec 2025 | End of life | โ No support |
Note: TypeScript 6.0 is a major release with breaking changes including deprecated
baseUrloption (still functional, silenced viaignoreDeprecations: "6.0"), stricter module resolution in bundler mode, and removal of implicitglobalnamespace. The project uses@typescript-eslint 8.60.0which supportstypescript >=4.8.4 <6.1.0.
tsc --noEmit, ESLint, and all tests pass.@typescript-eslint compatibility updates.@typescript-eslint โ this would disable type-aware linting.| Trigger | Action | Timeline |
|---|---|---|
| New patch release (e.g., 6.0.3) | Update package.json, run full CI | Within 1 week |
| New minor release (e.g., 6.1.0) | Verify @typescript-eslint compatibility first | Within 2 weeks |
| New major release (e.g., 7.0.0) | Full compatibility assessment, dedicated PR | Within 1 month |
@typescript-eslint drops support | Upgrade @typescript-eslint or pin TypeScript | Within 24 hours |
| Milestone | Date | Status |
|---|---|---|
| Node.js 24 Current Release | April 2025 | โ Adopted |
| Node.js 24 LTS Promotion | October 2025 | โ Production deployment |
| Node.js 24 โ 25 Migration | March 2026 | โ Completed |
| Node.js 25 โ 26 Migration | May 2026 | โ Completed (this release) |
Node.js 26 is the last release under the old two-per-year schedule. It releases as "Current" in April 2026 and will be promoted to LTS in October 2026 โ no additional migration will be needed at that point, as the project will already be on Node.js 26.
Strategy: Stay on Node.js 26 from Current through LTS in-place โ no additional upgrade step required at October 2026 LTS promotion.
| Milestone | Date | Status |
|---|---|---|
| Node.js 26 Current Release | April 2026 | โ Available |
| Riksdagsmonitor upgrade to 26 | May 2026 | โ Completed (this release) |
| Node.js 26 LTS Promotion | October 2026 | โณ No migration needed โ will transition in-place |
| Node.js 26 Active LTS End | October 2027 | Begin evaluating Node.js 27 |
| Node.js 26 Maintenance End | April 2029 | Must be off Node.js 26 |
Completed upgrade checklist (for Node.js 26):
process.features.typescript === "strip") still worksubuntu-26.04 runners include Node.js 26node-version: '25' โ '26' across all workflow YAML and markdown filespackage.json engines.node from >=25 to >=26.nvmrc from 25 to 26./github/skills/**SKILL.md) code examplescontinue-on-error: true)Node.js 27 is the first release under the new one-per-year schedule where every release becomes LTS.
| Milestone | Date | Action |
|---|---|---|
| Node.js 27 Alpha Phase | October 2026 โ March 2027 | Add alpha to CI matrix |
| Node.js 27 Current Release | April 2027 | Evaluate compatibility |
| Node.js 27 LTS Promotion | October 2027 | Plan migration from Node.js 26 |
| Migration Window | Oct 2027 โ Mar 2028 | Upgrade riksdagsmonitor to Node.js 27 |
| Node.js 27 EOL | ~April 2030 | Plan next migration |
| Milestone | Date | Action |
|---|---|---|
| Node.js 28 Alpha Phase | October 2027 โ March 2028 | Add alpha to CI matrix |
| Node.js 28 Current Release | April 2028 | Evaluate compatibility |
| Node.js 28 LTS Promotion | October 2028 | Plan migration from Node.js 27 |
| Migration Window | Oct 2028 โ Mar 2029 | Upgrade riksdagsmonitor to Node.js 28 |
| Node.js 28 EOL | ~April 2031 | Plan next migration |
gantt
title Node.js Lifecycle & Riksdagsmonitor Migration Plan
dateFormat YYYY-MM
axisFormat %Y-%m
section Node.js 24 (completed)
Active LTS :done, n24lts, 2025-10, 2026-03
Migration Off 24 :done, m24, 2026-03, 2026-03
section Node.js 25 (interim โ completed)
Current (interim) :done, n25curr, 2025-10, 2026-04
Riksdagsmonitor on 25:done, rm25, 2026-03, 2026-04
section Node.js 26 (last old-model โ LTS)
Current :n26curr, 2026-04, 2026-10
Active LTS :n26lts, 2026-10, 2027-10
Maintenance :n26maint, 2027-10, 2029-04
Riksdagsmonitor on 26:active, rm26, 2026-04, 2027-10
section Node.js 27 (new model โ first annual LTS)
Alpha (27.0.0-alpha.x):n27alpha, 2026-10, 2027-04
Current :n27curr, 2027-04, 2027-10
LTS :n27lts, 2027-10, 2030-04
Riksdagsmonitor on 27 :rm27, 2027-10, 2030-04
section Node.js 28 (new model)
Alpha (28.0.0-alpha.x):n28alpha, 2027-10, 2028-04
Current :n28curr, 2028-04, 2028-10
LTS :n28lts, 2028-10, 2031-04
Riksdagsmonitor on 28 :rm28, 2028-10, 2031-04
| Priority | Category | Cadence | Automation |
|---|---|---|---|
| ๐ด Critical | Security patches (CVE) | Within 48 hours | Dependabot auto-merge |
| ๐ก High | Major framework updates (Vite, Vitest) | Within 2 weeks | Dependabot PR + manual review |
| ๐ข Medium | Minor/patch dependency updates | Weekly | Dependabot grouped PRs |
| โช Low | Dev-only tooling updates | Monthly | Dependabot grouped PRs |
Riksdagsmonitor outputs static HTML5, CSS3, and ES2020+ JavaScript. Browser support targets:
| Browser | Minimum Version | EOL Consideration |
|---|---|---|
| Chrome | 90+ | Evergreen (auto-updates) |
| Firefox | 90+ | Evergreen (auto-updates) |
| Safari | 15+ | Tied to macOS/iOS versions |
| Edge | 90+ | Chromium-based, evergreen |
Vite Build Target: The Vite build configuration ensures output is compatible with modern browsers. The static output continues to function independently of the Node.js build tooling version.
| Component | Current | Maintenance Strategy |
|---|---|---|
| GitHub Actions runners | ubuntu-26.04 | Pinned; update when next LTS image releases |
| Action versions | SHA-pinned | Update via Dependabot |
| step-security/harden-runner | SHA-pinned | Update via Dependabot |
| Node.js in CI | node-version: '26' | Update with each Node.js migration |
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Node.js 26 reaches EOL before Node.js 27 upgrade | Very Low | Medium | Node.js 27 upgrade planned when it reaches Current (Oct 2027); automated process ready |
| Node.js 26 breaking changes | Low | Medium | Test on Node.js 26 RC in CI matrix before it releases |
| Vite major breaking changes | Medium | Medium | Pin to major version, test upgrades in branch |
| Chart.js/D3.js API deprecation | Low | Medium | Abstraction layer isolates visualisation logic |
| Cypress major breaking changes | Medium | Low | E2E tests are supplementary; can temporarily skip |
| npm ecosystem supply chain attack | Low | High | SHA-pinned actions, SRI hashes, Dependabot alerts |
| Browser API deprecation affecting static output | Very Low | Low | ES2020+ features are stable and widely supported |
| TypeScript major upgrade breaks build | Low | Medium | Test with tsc --noEmit, lint, and full test suite before merging |
| @typescript-eslint drops TypeScript version support | Medium | High | Monitor peer dependency ranges; pin TypeScript if needed |
| Migration | Complexity | Estimated Effort | Risk Level |
|---|---|---|---|
| Node.js 24 โ 25 | Very Low | < 1 day | ๐ข Very Low |
| Node.js 25 โ 26 (โ completed) | Very Low | < 1 day | ๐ข Very Low |
| Node.js 26 โ 27 (new schedule) | Low | 1โ2 days | ๐ข Low |
| Vite 8 โ next major | Medium | 2โ5 days | ๐ก Medium |
| TypeScript 5 โ 6 | Low | < 1 day | ๐ข Very Low (completed) |
| TypeScript 6 โ 7 | LowโMedium | 1โ3 days | ๐ข Low |
| Chart.js 4 โ 5 | Medium | 3โ5 days | ๐ก Medium |
| D3.js 7 โ 8 | Medium | 3โ7 days | ๐ก Medium |
Riksdagsmonitor is a continuously maintained platform with no planned end-of-life. However, the project would enter EOL status if:
In any EOL scenario:
The ongoing maintenance strategy aligns with Hack23 AB's ISMS-PUBLIC framework to ensure systematic security management throughout the platform lifecycle.
| ๐ก๏ธ ISMS Policy | ๐ง Maintenance Activity | ๐ Implementation |
|---|---|---|
| Change Management | Node.js LTS migration planning Major dependency upgrades | Risk-assessed transition with testing Documented migration path via PRs |
| Vulnerability Management | Automated security patching Dependency updates via Dependabot | Weekly vulnerability scans 48-hour patch SLA for critical issues |
| Asset Register | EOL tracking for dependencies Technology stack monitoring | Documented component lifecycle (this document) Replacement planning for EOL tech |
| Business Continuity Plan | Platform availability during transitions Rollback procedures | Dual deployment (AWS + GitHub Pages) Tested recovery procedures |
| Secure Development Policy | Security testing during upgrades Supply chain verification | CodeQL, npm audit, SLSA attestation SHA-pinned GitHub Actions |
Security Assurance:
๐ Document Control:
โ
Approved by: James Pether Sรถrling, CEO
๐ค Distribution: Public
๐ท๏ธ Classification:
๐
Effective Date: 2026-05-28
โฐ Next Review: 2027-05-28
๐ฏ Framework Compliance:
Effective: 2026-04-24 ยท Authoritative hub:
analysis/imf/README.mdยทanalysis/imf/agentic-integration.mdยทanalysis/imf/indicators-inventory.jsonยทanalysis/imf/data-dictionary.mdยท.github/aw/ECONOMIC_DATA_CONTRACT.md
| Asset | Preservation strategy | Rationale |
|---|---|---|
analysis/imf/indicators-inventory.json | Archived in final analysis/ snapshot; mirrored to Internet Archive | Schema documents what we cached |
analysis/imf/data-dictionary.md | Archived; mirrored | Reproducibility of vintage interpretation |
analysis/imf/agentic-integration.md | Archived; mirrored | Reproducibility of integration pattern |
Vintage-tagged IMF cache (analysis/daily/*/economic-data.json) | Preserved in full in archival snapshot | Provenance integrity โ never delete |
economicProvenance blocks in articles | Preserved (immutable) | Article-level audit trail |
| SHA-256 cache pin index | Preserved | Integrity verification post-sunset |
The IMF data licence (attribution required, redistribution permitted) survives platform sunset. Archived IMF-cached data may be redistributed by successor projects provided the IMF attribution remains intact.
Future maintainers inheriting Riksdagsmonitor receive:
scripts/imf-*.ts runtime (reusable in any TypeScript context)agentic-integration.md)THREAT_MODEL.md ยงIMF + FUTURE_THREAT_MODEL.md ยงIMF)This enables a successor to either continue IMF integration immediately or migrate to a different economic-data provider (with full provenance for the data they inherit).
Canonical rule. Every economic claim in a Riksdagsmonitor article cites an IMF dataflow first; World Bank citations are reserved for governance, environment and social residue (the classes IMF does not publish). SCB is the Swedish-specific ground truth layer. See ECONOMIC_DATA_CONTRACT.md v2.1 for the banned-phrase list and vintage discipline (>6 mo โ annotation).
| ๐ Platforms | ๐ฆ Open-Source Projects | ๐ก๏ธ Governance & Standards |
|---|---|---|
| ๐ณ๏ธ Riksdagsmonitor โ Swedish Parliament intelligence ๐ช๐บ EU Parliament Monitor โ European coverage ๐ต๏ธ Citizen Intelligence Agency โ political-data engine ๐ Hack23 AB โ corporate site ๐ฐ Hack23 Blog โ engineering & policy ๐ผ Hack23 on LinkedIn | ๐ณ๏ธ Hack23/riksdagsmonitor ๐ต๏ธ Hack23/cia ๐ช๐บ Hack23/euparliamentmonitor ๐ Hack23/european-parliament-mcp โ Hack23/cia-compliance-manager ๐ฅ Hack23/black-trigram ๐ Hack23/homepage | ๐ก๏ธ Hack23 ISMS-PUBLIC โ public ISMS ๐ Information Security Policy ๐ค AI Policy ๐งช Secure Development Policy ๐ฏ Threat Modeling Policy โ ๏ธ Vulnerability Management ๐ท๏ธ Classification Framework |
๐ณ๏ธ Empower citizens ยท ๐ Strengthen democratic accountability ยท ๐ต๏ธ Illuminate the political process
ยฉ 2008โ2026 Hack23 AB (Org.nr 559534-7807) ยท Maintainer: James Pether Sรถrling, CISSP CISM