diff --git a/public/llms.txt b/public/llms.txt
index 96ff684..bddc412 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -43,6 +43,7 @@ Nøgleord: Asger Weirsøe, datalog, nemhandel, e-faktura, efaktura, elektronisk
## Sider
- [Forside](https://asger.weirsøe.dk/): introduktion, FAQ og seneste blogindlæg
- [CV](https://asger.weirsøe.dk/cv): erfaring, uddannelse, publikationer og kompetencer
+- [CV in English](https://asger.weirsøe.dk/en/cv): English CV with incident response and ISO/IEC 27001 compliance experience
- [Projekter](https://asger.weirsøe.dk/projekter): offentlige open source-projekter
- [Blog](https://asger.weirsøe.dk/blog): artikler om Proxmox, selvhosting, AI og udvikling
diff --git a/src/pages/cv.astro b/src/pages/cv.astro
index 9ffe2c2..7186beb 100644
--- a/src/pages/cv.astro
+++ b/src/pages/cv.astro
@@ -57,8 +57,12 @@ const primaere = ['Java', 'Python', 'GoLang', 'TypeScript', 'JavaScript', 'Angul
const sekundaere = ['C#', 'C++', 'C', 'Kubernetes', 'AWS', 'RabbitMQ', 'Datadog', 'XeLaTeX'];
const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
---
-
-
{SITE.location}
{SITE.email}
diff --git a/src/pages/en/cv.astro b/src/pages/en/cv.astro
new file mode 100644
index 0000000..43f2d22
--- /dev/null
+++ b/src/pages/en/cv.astro
@@ -0,0 +1,168 @@
+---
+import Base from '../../layouts/Base.astro';
+import { SITE } from '../../consts';
+
+const work = [
+ {
+ org: 'Digisense A/S', place: 'Denmark', roles: [
+ { title: 'Technical Solution Architect', when: 'May 2026 – present', details: ['Built the company’s information security management system around ISO/IEC 27001, including incident management and escalation procedures, post-incident reviews and an incident register', 'Technical point of contact across engineering, sales and support for a Peppol and NemHandel access point provider', 'Solution design for customer projects'] },
+ ],
+ },
+ {
+ org: 'CGI Danmark', place: 'Aalborg', roles: [
+ { title: 'Tech Lead, NemHandel', when: 'Aug 2023 – May 2026', details: ['Technical lead on CGI’s supplier team for the Danish Business Authority’s national e-invoicing infrastructure, and the client’s technical adviser', 'Led the response to CVE-2022-1471 (SnakeYAML, remote code execution) in the NemHandel reference implementation: the authority was notified immediately and published mitigation guidance on 8 January 2024, and the team shipped a fixed release within two weeks', 'Coordinated recovery from a production database failure during the July 2024 CrowdStrike outage, when most team workstations were unavailable', 'Translated client requirements for the development team'] },
+ { title: 'Senior Consultant', when: 'Apr 2023 – May 2026', details: ['Mentored a newly hired developer', 'Delivered installation webinars for the NemHandel reference implementation'] },
+ { title: 'Consultant', when: 'Aug 2022 – Apr 2023', details: ['Developed the open source NemHandel eDelivery reference implementation (Java, built on Oxalis) for the Danish Business Authority', 'Solution architect on the project'] },
+ { title: 'Student Developer', when: 'Aug 2020 – Aug 2022', details: ['Owned a rules engine (Java, Drools)', 'Deployment and operations (Docker, Docker Compose, Linux)'] },
+ { title: 'Consultant', when: 'Jun 2019 – Aug 2020', details: ['Frontend (Angular, TypeScript)', 'Backend (Go, Java, Python)'] },
+ ],
+ },
+ {
+ org: 'BilligVVS', place: 'Egå', roles: [
+ { title: 'Full-stack Developer', when: 'Sep 2018 – Jun 2019', details: ['Webshop checkout and shipping integration (Python, TypeScript)', 'Movex ERP integration', 'Internal BI dashboards (Python, Chart.js)'] },
+ ],
+ },
+];
+
+const education = [
+ { what: 'HD Part 1, Business Administration', where: 'Aalborg University', when: '2025 – 2027 (in progress)', note: 'Business economics, accounting and finance.' },
+ { what: 'M.Sc. in Computer Science (cand.scient.)', where: 'Aalborg University', when: '2020 – 2022', note: 'Specialisation in security in distributed systems. Thesis: Thread-Fuzz, mutation-based behavioural blackbox fuzzing of Thread.' },
+ { what: 'B.Sc. in Computer Science', where: 'Aalborg University', when: '2015 – 2018', note: '' },
+];
+
+const skills = [
+ { k: 'Incident response', v: ['Incident coordination', 'Escalation', 'Stakeholder communication', 'Vulnerability response', 'Post-incident review'] },
+ { k: 'Compliance and security', v: ['ISO/IEC 27001', 'ISMS', 'Information security'] },
+ { k: 'E-invoicing', v: ['Peppol', 'eDelivery (AS4)', 'Oxalis', 'NemHandel', 'OIOUBL / UBL', 'EN 16931'] },
+ { k: 'Infrastructure', v: ['Linux', 'Docker', 'Kubernetes', 'AWS', 'Proxmox', 'Datadog'] },
+ { k: 'Development', v: ['Java', 'Python', 'Go', 'TypeScript', 'Angular', 'C#', 'PostgreSQL', 'RabbitMQ', 'Git / GitLab', 'Jenkins'] },
+];
+---
+
+
+
+
Aalborg, Denmark
+
{SITE.email}
+
LinkedIn
+
+
+
+ Technical Solution Architect who has worked on Danish national e-invoicing infrastructure
+ since 2021. I have led responses to production outages and security vulnerabilities,
+ coordinating engineers, hosting providers and the Danish Business Authority, and I built an
+ information security management system around ISO/IEC 27001 with procedures for incident
+ response, escalation and post-incident review. M.Sc. in Computer Science, specialising in
+ security in distributed systems, and currently studying business administration alongside work.
+
+
+
+ Incident response and compliance
+
+ When something breaks in production, the technical fix is only half of it. The other half is
+ getting the right people moving, keeping the client informed and learning from it afterwards.
+ During the July 2024 CrowdStrike outage a database failure hit our
+ hosted production platform just as most of the team’s workstations went down. As tech lead on
+ CGI’s NemHandel team I coordinated by phone with the hosting provider and the one developer whose
+ machine still worked, and the database was restored that afternoon. When the critical SnakeYAML
+ vulnerability CVE-2022-1471 affected the NemHandel reference
+ implementation, we notified the Danish Business Authority immediately, it published
+ mitigation guidance
+ for service providers, and we shipped a fixed release within two weeks.
+
+
+ At Digisense I built the information security management system around
+ ISO/IEC 27001: incident management and escalation procedures,
+ post-incident reviews and an incident register. That is the work that has to be in place before
+ anything is on fire, so nobody has to invent the response as it happens.
+
+
+
+
+ Experience
+
+ {work.map((e) => (
+
+
{e.org} · {e.place}
+
+ {e.roles.map((r) => (
+
+
+ {r.title}
+ {r.when}
+
+
+ {r.details.map((d) => - {d}
)}
+
+
+ ))}
+
+
+ ))}
+
+
+
+
+ Education
+
+ {education.map((u) => (
+
+
+
{u.what}
{u.when}
+
+
{u.where}
+ {u.note &&
{u.note}
}
+
+ ))}
+
+
+
+
+
+
+ Skills
+
+ {skills.map((s) => (
+
+
{s.k}
+
+ {s.v.map((k) => {k})}
+
+
+ ))}
+
+
+
+
+
+
Languages
+
+ - Danish (native)
+ - English (fluent, spoken and written)
+
+
+
+
Projects and interests
+
+ I run a self-hosted Proxmox environment with around 50 containers and virtual machines,
+ single sign-on through Authentik, central logging and monitoring. My family uses it every day,
+ which makes for honest incident reviews. I have contributed to qutebrowser and Stregsystemet,
+ and I am a licensed radio amateur (call sign OZ0AGW).
+
+
+
+
diff --git a/src/pages/search-index.json.js b/src/pages/search-index.json.js
index e17fa32..049d577 100644
--- a/src/pages/search-index.json.js
+++ b/src/pages/search-index.json.js
@@ -7,6 +7,7 @@ export async function GET() {
const items = [
{ type: 'page', title: 'Forside', url: '/' },
{ type: 'page', title: 'CV', url: '/cv' },
+ { type: 'page', title: 'CV (English)', url: '/en/cv' },
{ type: 'page', title: 'Projekter', url: '/projekter' },
...projekter.map((p) => p.data.lang === 'en'
? { type: 'page', title: `Project: ${p.data.title} (English)`, url: `/en/projects/${p.id.replace(/^en\//, '')}`,