Lints Markdown risk registers: all ten NIS2 Article 21(2) measures (a)-(j) covered, and every risk row has an owner, a 1-5 score, a treatment and a review inside 12 months. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
Open VSX (Cursor, VSCodium)npmDocker Hubnpx @readystack/nis2-risk-register-lint <file> docker run --rm -v "$PWD:/w" getreadystack/nis2-risk-register-lint /w
Team? One key for every ReadyStack linter, 5 seats, $149 once
Scan every register in the workspace in one pass and export a dated audit evidence file that maps each finding to its Art. 21(2) letter.
One payment, one licence key for this tool. The key is shown right after payment.
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.

6 findings in one NIS2 risk register: that is what Risk Register Lint returned for the sample register of an EU grid operator, the kind of Markdown table a CISO or security lead at an essential or important entity keeps in Git and hands to an auditor.
The six findings, measured on 2026-09-28:
The clean sample register, ten rows that cite all ten letters, returns 0 findings.
NIS2, Directive (EU) 2022/2555, Article 21(2) lists ten risk-management measures: (a) risk analysis and information system security policies, (b) incident handling, (c) business continuity and crisis management, (d) supply chain security, (e) security in acquisition, development and maintenance including vulnerability handling, (f) assessing the effectiveness of the measures, (g) cyber hygiene and training, (h) cryptography and encryption, (i) human resources security, access control and asset management, (j) multi-factor authentication and secured communications.
Article 20 makes the management body approve these measures. Article 34 lets authorities fine essential entities up to at least EUR 10,000,000 or 2 % of worldwide annual turnover, and important entities up to at least EUR 7,000,000 or 1.4 %. When a supervisor asks how you manage supply chain risk and the register has no row for it, the gap is on paper.
Paste the register into a chatbot and it will tidy the table. It will not reliably count which of the ten letters are present, and it does not compare your review column with today's date. A Markdown linter checks pipes and alignment, not content.
Risk Register Lint finds any Markdown table whose header has an Owner and a Treatment column, then locates the other columns by name: ID, Art. 21(2), Likelihood, Impact, Last review. It runs 16 rules:
The row rules follow ISO/IEC 27001: risk owners (6.1.2), likelihood and consequences (6.1.2), treatment options and owner approval of residual risk (6.1.3), and assessment at planned intervals (8.2).
The date matters. Run the clean register as of 2026-12-01 instead of 2026-09-28 and row R4, last reviewed 2025-11-04, turns stale at 392 days: 1 finding where there were 0.
The free version checks one register completely, all 16 rules, with line numbers, in VS Code or in the browser page, which runs the same engine. Nothing is uploaded. The full version scans every register in a workspace in one pass and exports a dated audit evidence file that maps each finding to its Art. 21(2) letter.
It checks structure and coverage, not whether a control is adequate. That judgement stays with you and your auditor.
It reads a Markdown risk register and runs 16 rules: ten check that every NIS2 Article 21(2) measure (a) to (j) is cited by at least one risk row, and six check each row for a named owner, a 1-5 likelihood and impact, a valid treatment, a real review date and a review inside 365 days. Each finding carries a line number.
It is for CISOs, security leads and compliance engineers at EU essential and important entities under NIS2, such as energy, water, transport, health and digital infrastructure operators, who keep their cybersecurity risk register as a Markdown table in a Git repository and want it audit-ready before a supervisor or certification auditor reads it.
A Markdown linter checks table syntax, not content. A chatbot can rewrite the table but does not reliably count which of the ten Art. 21(2) letters are cited and does not compare your review column with today's date. Risk Register Lint does both deterministically: the sample register gives the same 6 findings on every run.
Free: one register, all 16 rules, with line numbers, in VS Code or the browser page. On the sample register it finds 6 findings: 2 missing measures (d) and (h), 1 owner TBD, 1 likelihood written as high, 1 score 20 risk accepted, 1 review 455 days old. The licence key adds a workspace-wide scan and a dated audit evidence export.
NIS2 Article 34 lets authorities fine essential entities up to at least EUR 10,000,000 or 2 percent of worldwide annual turnover, and important entities up to at least EUR 7,000,000 or 1.4 percent. Article 20 makes the management body approve the Article 21 measures, so a gap in the risk register reaches the board, not only the security team.
A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Risk Register Lint — NIS2 Art. 21(2) checks the file you open against 16 rules, each naming its legal or official basis, from a rule set dated 2026-09-28, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →