Skip to content

v0.2.11

Choose a tag to compare

@github-actions github-actions released this 20 Oct 13:41
6c78f3a

What's Changed

  • docs: every way into a fresh instance, not just Resend by @simonorzel26 in #159
  • seo: front-load and trim meta titles and descriptions on ranked pages by @simonorzel26 in #163
  • fix(security): hardening pass from the 2026-09-10 audit by @simonorzel26 in #164
  • partner: ACS Teilnehmer badge and five programme logos by @simonorzel26 in #165
  • landing: partner logo strip, all seven marks in one colour by @simonorzel26 in #166
  • chore(i18n): drop the dead landing.regLine key by @simonorzel26 in #167
  • platform-admin: Graphs tab, supplier questionnaire completeness by @simonorzel26 in #168
  • platform-admin: weekly insights panel on the Graphs tab by @simonorzel26 in #169
  • platform-admin: stop the insights panel repeating itself by @simonorzel26 in #170
  • fix(ci): pull the minio images from quay.io, not Docker Hub by @simonorzel26 in #173
  • fix(auth): a correct sign-up code has to end with the person signed in by @simonorzel26 in #172
  • fix(auth): resend-verification honours the sign-up quality gate by @simonorzel26 in #174
  • Journey: a guided path for companies where one person implements NIS 2 by @simonorzel26 in #176
  • NIS 2 framework: incident handling after the inventories, and the four non-negotiables first by @simonorzel26 in #175
  • Sign-off: a past signature no longer locks everyone else out by @simonorzel26 in #178
  • Make a redeploy cheaper than a first build by @simonorzel26 in #177
  • gdpr: correct five citations and credit Art. 32 from the NIS 2 work that earns it by @simonorzel26 in #180
  • Unsubscribing from one email stops all optional email by @coryhighsea in #179
  • Referral requests: a form where the mailto was, and somewhere to count them by @simonorzel26 in #181
  • chore(deps-dev): bump react-email from 6.9.3 to 6.9.5 by @dependabot[bot] in #171
  • grc-data-model: content CC BY 4.0, code MIT (AI use expressly permitted) by @simonorzel26 in #182
  • Platform-admin scoreboard: discharged duties, paid referrals, drop-off, invite lists by @simonorzel26 in #183
  • Cap static generation at one worker, so the builder stops being OOM-killed by @simonorzel26 in #185
  • Centre the guided path on the section dividers, and crop the hero tighter by @simonorzel26 in #186
  • Billing foundation: Qonto invoicing, VAT checks and the order page by @simonorzel26 in #190
  • Billing accounts and company membership (multi-company, release A) by @simonorzel26 in #191
  • Several organizations per login: switcher, add another, invites (multi-company, release B) by @simonorzel26 in #192
  • Tenant isolation hardening by @simonorzel26 in #193
  • Hotfix: organization and onboarding forms fail on billingAccountId by @simonorzel26 in #194
  • Order service: one placeOrder, /bestellen on tRPC, billing page (slice 4) by @simonorzel26 in #195
  • MinIO from Chainguard: MinIO's own images can no longer be pulled by @simonorzel26 in #196
  • Slice 5: access gate, per-person grandfathering, one-time pricing launch by @simonorzel26 in #197
  • Slice 6: door two (close on the call) and account setup links by @simonorzel26 in #198
  • Remove the AI question from organization onboarding by @simonorzel26 in #199
  • Legal pages can be copied again by @simonorzel26 in #202
  • Block further orders on the server after an unclear Qonto answer by @simonorzel26 in #200
  • Report: print each not-applicable reason with its date and signer by @simonorzel26 in #201
  • Slice 9: cancel, the Subscriptions tab, and 2.400 for grandfathered people by @simonorzel26 in #204
  • Legal pages: correct the TOMs to the code, drop xAI by @simonorzel26 in #206
  • TOMs: one US service left, not two by @simonorzel26 in #207
  • Paid terms, AVV and order acceptance (draft for review) by @simonorzel26 in #205
  • Pricing page: the paid offer, the grandfathered price, what you get by @simonorzel26 in #203
  • Pricing page: platform admins see the paid offer before the launch by @simonorzel26 in #208
  • Guided form, slice 1: schema for BSI controls and control decisions by @simonorzel26 in #187
  • Journey: one order everywhere, prerequisites win; Durchgang walks the first ten items by @simonorzel26 in #189
  • Landing page: hero for the 50 to 150 ICP, behind the launch flag, admins preview by @simonorzel26 in #209
  • Pricing page: three tiers, the paid one in the middle by @simonorzel26 in #210
  • Close CRM: keep every account up to date in Close, on a schedule inside the app by @coryhighsea in #211
  • Close sync: read the new contact from the create-lead response Close really sends by @simonorzel26 in #212
  • Promo link that grandfathers on sign-in, and translated slugs for pricing and ordering by @simonorzel26 in #213
  • Tighten sign-in callback check, atomic OTP attempts, per-IP login limit by @simonorzel26 in #216
  • Certificates for every course, and more than one admin per organization by @coryhighsea in #214
  • Say "too many attempts" when a rate limit blocks; drill verifyOtp on Postgres by @simonorzel26 in #217
  • Server-attributed risk acceptance, member-checked approvers, own-folder file keys, admin-only new companies by @simonorzel26 in #222
  • Sign-off integrity: intake authorization, approved rows, removed members by @simonorzel26 in #221
  • Supplier portal: keep each side's data on the shared relationship row by @simonorzel26 in #218
  • Keep platform-admin actions out of tenant audit logs; audit trail for reviewers and admins by @simonorzel26 in #220
  • Training: quiz lessons complete only by passing; lesson locale allowlist; AI and upload limits by @simonorzel26 in #223
  • Instrumentation: keep the CRM import inside the nodejs branch by @simonorzel26 in #225
  • Durchgang for paid accounts only by @simonorzel26 in #226
  • Requirement page: Reopen, not Sign off, on a signed row that needs review by @simonorzel26 in #229
  • Supplier register: lock the supplier's clause answers on linked rows; localized upload limit message by @simonorzel26 in #228
  • Supplier invites: the customer's address on the relationship, one row per inviting customer by @simonorzel26 in #227
  • BSI default corrections (Durchgang shot 1 of 7) by @simonorzel26 in #231
  • Rate limits counted in Postgres instead of per process by @simonorzel26 in #230
  • tRPC transport: no internal error text, batch cap, JSON-only mutations; vendor input checks; blank env as unset by @simonorzel26 in #233
  • Invite redirect, CSV formulas, newsletter link protocols, no analytics on token pages by @simonorzel26 in #234
  • Supplier portal mail: no attacker-written text, per-company budgets, invite re-send cooldown by @simonorzel26 in #235
  • Close tab in the platform admin: sync settings, progress, runs, and Run now by @simonorzel26 in #238
  • Bound intake answers; erasure deletes the organization's files and scrubs addresses by @simonorzel26 in #236
  • Auth: pin the Google account, revoke on sign-out, 12-hour session cap, no account enumeration by @simonorzel26 in #237
  • Import isSuppressedSendId from mail/delivery (fixes 4 unit tests on main) by @simonorzel26 in #239
  • Durchgang core: script, copy, item state, one BSI 200-3 module (shot 3a of 7) by @simonorzel26 in #232
  • Guided step illustrations: brand theme, Recraft prompt and SVG finishing script by @simonorzel26 in #224
  • Privacy policy: Close as our sales system (CRM), in all ten languages by @simonorzel26 in #240
  • Durchgang copy for the other seven v1 items (shot 3b of 7) by @simonorzel26 in #241
  • Correct NIS 2 facts in the CEO course, wiki and guidance (all locales) by @simonorzel26 in #242
  • Durchgang shot 4: the walk on real data, assets named and rated, old /durchgang removed by @simonorzel26 in #243
  • Order page: the invoice they will receive, beside the form by @simonorzel26 in #245
  • After the order: confirmation with the way into the Durchgang; invoice email links the invoice by @simonorzel26 in #246
  • Erasure: email the certificate to the erased person by @simonorzel26 in #247
  • Order page: a paid account goes to its billing page by @simonorzel26 in #248
  • Delete account from the user menu, with the erasure certificate emailed; review fixes by @simonorzel26 in #249
  • Erasure hardening: re-sign-in for self-deletion, IP and browser scrubbed, admin notes redacted by @simonorzel26 in #251
  • Order form country picker; journey rail and sections keyed uniquely by @simonorzel26 in #252
  • Account deletion and privacy paragraph in seven more languages; operator lines on ethik and finanzierung by @simonorzel26 in #253
  • Session: refuse a token by account id, not by sign-in time; lock what self-erasure counts; no query params in the tRPC log by @simonorzel26 in #254
  • Daily deadline run scheduled inside the app, like the Close sync by @simonorzel26 in #258
  • Platform admin: how many people have been erased by @simonorzel26 in #260
  • Self-service deletion for accounts with invoices; the certificate names what tax law keeps by @simonorzel26 in #261
  • Deleting an account cancels its open licence; Billing opens for a draft organization by @simonorzel26 in #262
  • Privacy policy: billing data, Qonto, and invoices kept after account deletion by @simonorzel26 in #263
  • Intake: merge a save into answers read under a row lock by @simonorzel26 in #244
  • CEO course: the right NIS 2 articles, and the CIR only for CIR providers, all locales by @simonorzel26 in #259
  • Customer emails: one layout that names the sender, billing letters with the document's facts, a refund confirmation by @simonorzel26 in #274
  • One letter when a licence holder deletes their account, and a sale email to the operators by @simonorzel26 in #276
  • Remove two mail exports nothing uses by @simonorzel26 in #277
  • Replies to the nudge, course follow-up and newsletter reach contact@nisd2.eu by @simonorzel26 in #278
  • Email footer names the company's seat, Köln by @simonorzel26 in #279
  • Durchgang: the guided walk through every NIS 2 item, in one PR by @simonorzel26 in #275
  • Sidebar: the walkthrough shown as coming soon by @simonorzel26 in #280
  • Free accounts land on an offer inside the portal, not a full-page order form by @simonorzel26 in #281
  • The walkthrough is the NIS 2 walkthrough, at /durchgang/nis2 by @simonorzel26 in #282
  • Portal breadcrumb in the visitor's language; the gate redirects instead of logging FORBIDDEN by @simonorzel26 in #283
  • Keep webpack's build cache in memory, so the Coolify build stops being OOM-killed by @simonorzel26 in #284
  • The walkthrough in English at /walkthrough/nis2, its home inside the portal, the sidebar link for platform admins only by @simonorzel26 in #285
  • The courses open inside the portal's own sidebar by @simonorzel26 in #286
  • The training portal keeps its own sidebar, reached from the portal switcher by @simonorzel26 in #288
  • A picture for every course and every lesson by @simonorzel26 in #289
  • The walkthrough's approval signs off the requirements, and the journey shows what waits for it by @simonorzel26 in #287
  • The offer gets its own layout, so entering the portal from another portal no longer loops by @simonorzel26 in #290
  • A sign-off never credits another requirement of its own framework, and the management review is signed last by @simonorzel26 in #292
  • The walkthrough lives in the portal and becomes its front at launch: flag, access by plan, a new walk home with screenshot previews by @simonorzel26 in #291
  • Every account signs in to the walk; an unpaid one sees it locked with "Jetzt bestellen" by @simonorzel26 in #293
  • Everything in one document: the complete export page, a realistic demo walk, and German throughout by @simonorzel26 in #294
  • Unpaid accounts land on the locked walk, the company is set up in its first step, and free accounts see the registers as examples by @simonorzel26 in #295
  • Retire the billing and walkthrough switches by @simonorzel26 in #297
  • Landing page: the NIS 2 walkthrough shown screen by screen by @simonorzel26 in #296
  • Pricing: one English name (NIS 2 walkthrough) and the gap analysis anchor by @simonorzel26 in #298
  • Pricing: talk first, a page for the approver, buyer FAQ by @simonorzel26 in #300
  • Walkthrough: UI notes from 04.10 (blocked Continue, waiting sheet, course progress, in house or cloud) by @simonorzel26 in #301
  • Landing: first-step picture, step 6 screenshot, walk title above the fold by @simonorzel26 in #302
  • About page in the landing page's design; one Get started block on landing, about and wiki by @simonorzel26 in #304
  • Landing in all ten languages, home OG card per language by @simonorzel26 in #303
  • Locked walk: each step previews its own screen on hover by @simonorzel26 in #299
  • Share previews show the current landing page in every language by @simonorzel26 in #306
  • Landing page: 517 KB to 196 KB, og:url, theme-color, manifest, SVG icon, contrast by @simonorzel26 in #307
  • CEO course: every link into the product leads to the walk by @simonorzel26 in #308
  • Supplier questionnaire 4.0.0 (legal review, any supplier, ISO 27001), and the operator as every customer's first supplier by @simonorzel26 in #305
  • Walk: set up the company right after the registration by @simonorzel26 in #309
  • Hold back the AI prefill button on every form (the prefill itself stays) by @simonorzel26 in #310
  • Example activity log entries by Max Mustermann / John Smith, not the viewer by @simonorzel26 in #311
  • Supplier side: questionnaire landing in the home page's form, nav link, supplier portal in German, organization id to copy by @simonorzel26 in #312
  • Wiki: timeline shows the newest 5, wiki pages end on the landing headline by @simonorzel26 in #313
  • Wiki status pages: EU tracker, EU implementation and Germany brought to October 2026 by @simonorzel26 in #314
  • Wiki NIS2 roadmap rebuilt around the walkthrough; review fixes for #310 to #312; platform supplier listed as nisd2.eu by @simonorzel26 in #315
  • Platform supplier also lands in each customer's asset register as the cloud service nisd2.eu by @simonorzel26 in #317
  • Wiki status follow-ups: Denmark, Sweden, Italy, Lithuania, Dutch Germany page by @simonorzel26 in #316
  • Pricing page in seven more languages by @simonorzel26 in #321
  • Wiki facts: France, Netherlands, Spain, CIR, significant incident, IT security duty, logistics (10 languages) by @simonorzel26 in #318
  • Wiki facts, part 2: Ireland, Sweden, Finland, Belgium and four more countries; nine implementation pages (10 languages) by @simonorzel26 in #319
  • Landing: 'Lieber erst mit uns sprechen?' button under Jetzt starten; booking links keep campaign tags by @simonorzel26 in #322
  • Wiki: 50 pages end on the walkthrough's own steps (merge after #318 and #319) by @simonorzel26 in #320
  • Walk home: 'Lieber erst mit uns sprechen?' beside 'Jetzt bestellen' by @simonorzel26 in #323
  • Signup notice: Follow up opens a prepared offer mail in the signup's language by @simonorzel26 in #324
  • Wiki: each search points to the page that answers it by @simonorzel26 in #325
  • Pricing and help pages: current prices, register from the landing page by @simonorzel26 in #326
  • Signup keeps the utm tags of the page it started from by @simonorzel26 in #327
  • Hand the order to management from the walk's lock by @simonorzel26 in #328
  • Signup and order buttons open registration and keep the page's utm tags by @simonorzel26 in #329
  • /nis2-tool: correct pricing claims, retitle as NIS2 Software, add next steps by @simonorzel26 in #330
  • GetStarted on wiki, /about, /nis2-tool: show the app like the landing hero by @simonorzel26 in #331
  • Hero image requests a width that fits the screen by @simonorzel26 in #332
  • Wiki: four implementation pages answer their search in plain words by @simonorzel26 in #333
  • Booking calendar opens in a dialog on every talk-first link by @simonorzel26 in #335
  • Landing zoom: gentler hero zooms, questionnaire stops land on whole questions by @simonorzel26 in #334
  • Courses: pictures, links to the overview, honest free line, next step after the course by @simonorzel26 in #336
  • Wiki: popular pages answer their search in plain words by @simonorzel26 in #337
  • About page: founders' phone numbers by @coryhighsea in #338
  • Security review fixes: cal.com without script, invite cap, first signup campaign kept, Cal.com in privacy policy by @simonorzel26 in #339
  • Homepage: 'NIS2 Software' in the eyebrow and page title (DE, EN), so the software search finds its words on the page the ad lands on by @simonorzel26 in #340
  • Ad landing pages open like the homepage: app shot and programme logos by @simonorzel26 in #341
  • Approval page: the decision on the first screen by @simonorzel26 in #342
  • Walk: header and bar stay above the sliding screen by @simonorzel26 in #343
  • Landing: the walk's video replaces the hero shot once it has loaded by @simonorzel26 in #344
  • Sign-in: a terms notice instead of a checkbox, so Google sign-in is never blocked by @simonorzel26 in #345
  • Walk overview: the four promise cards are plain, without screenshot previews by @simonorzel26 in #346
  • Portals: language switcher in the top bar beside the help by @simonorzel26 in #347
  • Partner agreements: offer one from platform admin, the partner accepts on a link by @simonorzel26 in #348
  • Partner agreements come with a login: accepting gives the partner the Durchgang by @simonorzel26 in #349
  • Partner agreement page opens with a short product brief by @simonorzel26 in #350
  • Partner access comes with the offer, before signing by @simonorzel26 in #352
  • Landing: sell the outcome first by @simonorzel26 in #351
  • Landing: drop the 'What you get' block after the close by @simonorzel26 in #353
  • Course pages: titles, meta and headings match how people search for the training by @simonorzel26 in #354
  • OG images: full re-render after the course page headings changed by @simonorzel26 in #355
  • Platform admin: reissue an unpaid invoice with an agreed service period by @coryhighsea in #356
  • feat(partner): list the Claude for Startups membership on /partner by @simonorzel26 in #357
  • copy: talk-first label becomes 'Book a call' by @simonorzel26 in #358
  • Admin graph: new accounts per month, CEO course versus platform only by @simonorzel26 in #359
  • Second-login dialog: one sentence and a Book a call button by @simonorzel26 in #360
  • feat(partner-agreement): branded top block and trial access line by @simonorzel26 in #362
  • feat(onboarding): help dialog uses the founder card for Book a call by @simonorzel26 in #363
  • fix(auth): registering with an existing account's credentials signs in, code screen links to sign-in by @simonorzel26 in #364
  • feat(durchgang): each open point at the approval gets who and by when by @simonorzel26 in #365
  • fix(i18n): Czech as a full language, citing Czech law where German pages cite the BSIG by @simonorzel26 in #366
  • Graphs: where signups come from, and traffic above the funnel by @simonorzel26 in #367
  • Graphs: default to a month, tell real visits from automated ones by @simonorzel26 in #368
  • MCP: AI assistants read and fill the NIS 2 walkthrough by @simonorzel26 in #361
  • timeline: 16 October sweep, 4 events added, France and Germany portal entries refreshed by @simonorzel26 in #369
  • Settings: remove the AI Data Sharing card, link Settings from the profile menu by @simonorzel26 in #370
  • Wiki: 33 pages on AI assistants and MCP (NIS2, GDPR, ISO 27001, CRA), released 3 to 4 a day; MCP docs up to date by @simonorzel26 in #371
  • Search: real sitemap dates, DE/EN-only pages point other languages to English, one site name, a real logo by @simonorzel26 in #372
  • Wiki: 14 GDPR pages and a waitlist for the DSGVO Durchgang by @simonorzel26 in #374
  • Search Console: moved wiki pages leave the sitemap and 308 per language, mistyped URLs redirect by @simonorzel26 in #373
  • Sitemap: list only the language versions that have their own text; Czech dated 15.10 by @simonorzel26 in #375
  • www.nisd2.eu answers 308 for every path; sicherheitsfragebogen.de goes to the apex in one hop by @simonorzel26 in #376
  • Locked Durchgang: a click or tap on a step keeps its screenshot open with the way on under it by @simonorzel26 in #377
  • llms.txt: describe the product as it is now, link only pages that answer 200 by @simonorzel26 in #379
  • Language copies name the original as their canonical and leave every hreflang set by @simonorzel26 in #378
  • Public descriptions: drop "free", "management liability protection", "cut the bill in half" and two unsourced figures by @simonorzel26 in #380
  • README: add a section on the MCP endpoint by @simonorzel26 in #381
  • README: reference the MCP in the intro, folder tree and tech stack by @simonorzel26 in #382
  • Wiki: Richtlinien schreiben, first guide on the risk assessment methodology by @simonorzel26 in #383
  • Exit pages: the course, a call and the walkthrough as ways forward by @simonorzel26 in #393
  • Walkthrough: § 28(5) BSIG exemption in full, § 35(2) BSIG, Art. 21(4) as directive text by @simonorzel26 in #397
  • Signing: done only by a signature, no admin in a role's place by @simonorzel26 in #394
  • Evidence: deleting it sends a signed requirement back to needs review by @simonorzel26 in #395
  • Credit across frameworks only for the same record by @simonorzel26 in #396
  • One list of the package's frameworks, and an integrity test over all of them by @simonorzel26 in #392
  • Requirement copy in parts, one per framework, read as one namespace by @simonorzel26 in #386
  • Glossary generated from the dictionaries, with a fact-check of every entry by @simonorzel26 in #398
  • Pricing: self-hosting as one line under the cards, not a third card by @simonorzel26 in #400
  • Third-party standards: ISO titles and descriptions excluded from the licences, LICENSE-DATA.md by @simonorzel26 in #385
  • GDPR data checked against the Official Journal: copy, references, intervals by @simonorzel26 in #387
  • ISO 27001 clause copy in our own words, our own German titles, Amendment 1:2024 by @simonorzel26 in #388
  • Sign-off wording: the app's rule, not the law's by @simonorzel26 in #391
  • One source for the done status list; sign-off role narrowed, not cast by @simonorzel26 in #401
  • CRA data checked against the Official Journal by @simonorzel26 in #389
  • ISO 27001 Annex A descriptions in our own words by @simonorzel26 in #390
  • Pricing: cards use the page width, the offer fits the first screen by @simonorzel26 in #402
  • Info, wiki, funnel and course pages: article and point citations checked against the primary texts by @simonorzel26 in #399
  • Pricing: no 'recommended' badge on the only offer by @simonorzel26 in #404
  • Pricing: say each thing once by @simonorzel26 in #405
  • Cross-framework credit rule tested; README pair counts from REFERENCE.md by @simonorzel26 in #403
  • File size check: no hand-written file over 5,000 tokens, in a pre-commit hook and in CI by @simonorzel26 in #384
  • Pricing: two equal cards, built the same way, order and call side by side by @simonorzel26 in #407
  • Pricing: 400 € a month, invoiced yearly by @simonorzel26 in #408
  • NIS2 to ISO 27001 links from ENISA's mapping table v1.2 by @simonorzel26 in #406
  • Order page: the terms before the button as accordion rows by @simonorzel26 in #409
  • Google sign-in links to a password account on Gmail and Workspace addresses by @simonorzel26 in #410
  • Pricing: the offer on the left, NIS2 as one word, the site mark before it by @simonorzel26 in #412
  • CI: database drills in one job, plus a drill for cross-framework credit by @simonorzel26 in #411
  • Pricing: the paid offer lists the MCP server by @simonorzel26 in #413
  • Pricing: the free tier is Self Serve and includes self-hosting by @simonorzel26 in #415
  • Analytics: keep partner agreement links out of Umami by @simonorzel26 in #417
  • Pricing: order button says 30 days, money back by @simonorzel26 in #418
  • Sign-off history helpers take a transaction; drill covers assigned signers by @simonorzel26 in #416
  • Package licences: Kardashev Catalyst UG as copyright holder by @simonorzel26 in #414
  • Landing: the main button says 30 days, money back, like the pricing card by @simonorzel26 in #422
  • e2e: fix the flaky later-login tour test by @simonorzel26 in #421
  • NIS2 review intervals: none without a legal basis for every entity by @simonorzel26 in #419
  • MCP: the assistant sends suppliers on the list the security questionnaire by @simonorzel26 in #426
  • NIS2 citations: the BSIG row cites the BSIG, the CIR gets its own row by @simonorzel26 in #420
  • What was signed and what was approved, kept for good by @simonorzel26 in #423
  • Walkthrough copy in parts: one per walk item, three for the shared screens by @simonorzel26 in #424
  • Information security policy: the all-hazards approach covers the rooms the IT is in by @simonorzel26 in #425
  • Every button that starts the product makes the order button's promise by @simonorzel26 in #427
  • Emails: the nudge names the walkthrough, a shorter welcome, sender nisd2.eu by @simonorzel26 in #428
  • Emails: free course wording, questions about the reader's last time, signed nudge by @simonorzel26 in #429
  • Homepage hero: NIS2 Frist verpasst? Fangen Sie heute an. by @simonorzel26 in #432
  • Mail: every email in English until the per-language copy is reviewed by @simonorzel26 in #434
  • Remove the help dialog by @simonorzel26 in #431
  • Mail: only approved languages are sent; the walk's own text keeps the account's language by @simonorzel26 in #435

Full Changelog: v0.2.10...v0.2.11