Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 75 additions & 15 deletions scripts/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,19 @@
"jobTitle": AUTHOR["role"],
"description": (
"Chief Technology Officer und Senior Engineering Leader mit über 25 "
"Jahren IT-Erfahrung. Schwerpunkte: Engineering-Governance, "
"Plattformarchitektur und Modernisierung komplexer Systemlandschaften."
"Jahren IT-Erfahrung. Verbindet technische Strategie und "
"Engineering-Governance mit operativer Plattformarbeit, "
"Modernisierung komplexer Systemlandschaften und der Einführung "
"AI-gestützter Engineering-Praktiken. Maintainer mehrerer "
"Open-Source-Projekte, Initiator des internen RFC-Prozesses und "
"des unternehmensweiten Trainingsprogramms für agentische "
"Entwicklung."
),
"url": f"{SITE_BASE}/",
"address": {
"@type": "PostalAddress",
"addressLocality": "Leipzig",
"postalCode": "04229",
"addressCountry": "DE",
},
"worksFor": {
Expand All @@ -65,6 +71,8 @@
"url": "https://www.netresearch.de/",
"address": {
"@type": "PostalAddress",
"streetAddress": "Nonnenstraße 11d",
"postalCode": "04229",
"addressLocality": "Leipzig",
"addressCountry": "DE",
},
Expand All @@ -85,19 +93,49 @@
{"@type": "Language", "name": "Englisch", "alternateName": "en"},
],
"knowsAbout": [
# Leadership & methodology
"Engineering Leadership",
"Engineering Governance",
"Technical Strategy",
"Architecture Decision Records",
"RFC Process",
"Curriculum Design",
"Mentoring and Coaching",
"Organizational Change Management",
"Stakeholder Communication",
"Presales and Technical Advisory",
# Architecture
"Platform Architecture",
"Technical Modernization",
"Architecture Decisions",
"RFC Process",
"API Design",
"Distributed Systems",
# AI-era engineering
"AI-assisted Engineering",
"Agentic Development",
"Prompt Engineering",
"Model Context Protocol",
"Skill Marketplace Engineering",
# Security & compliance
"Information Security",
"Compliance",
"ISO/IEC 27001-aligned ISMS Documentation",
"BSI IT-Grundschutz",
"Cloud Compliance (BSI C5)",
"Disaster Recovery",
"Business Continuity",
"Supply-Chain Security",
# Operations & platforms
"Continuous Integration",
"Continuous Delivery",
"DevOps",
"Open Source",
"Job Scheduling",
"Cron and DAG-based Workflow Engines",
"Identity and Access Management",
"LDAP and Active Directory",
"Reverse Proxy Architecture (Traefik)",
"Matrix / Synapse Operations",
"Composer Registry Operations",
"Open Source Maintainership",
# Stack
"TYPO3",
"Magento",
"OroCommerce",
Expand All @@ -116,18 +154,21 @@
"Concourse CI",
"Proxmox",
"AWS",
"AI-assisted Engineering",
"Agentic Development",
],
"hasOccupation": {
"@type": "Occupation",
"name": "Chief Technology Officer",
"occupationLocation": {"@type": "City", "name": "Leipzig"},
"experienceRequirements": "25+ years IT, 10+ years CTO",
"skills": (
"Engineering governance, platform architecture, technical "
"modernization, security and compliance documentation, "
"AI-assisted engineering practices"
"Technical strategy and engineering governance, "
"platform architecture and modernization of complex system "
"landscapes, information security and compliance "
"documentation (BSI IT-Grundschutz, BSI C5, ISMS), "
"AI-assisted and agentic engineering practices, "
"open-source maintainership, curriculum design and "
"mentoring, cross-functional stakeholder communication, "
"organizational change management."
),
},
"sameAs": [AUTHOR["linkedin"], AUTHOR["github"]],
Expand Down Expand Up @@ -228,13 +269,26 @@ def parse_source(path: Path) -> Variant:


def render_md(body: str) -> str:
# `abbr` extension wraps every occurrence of a defined token in
# <abbr title="…"> — WCAG 3.1.4 AAA Abbreviations.
md = markdown.Markdown(
extensions=["extra", "smarty", "sane_lists", "attr_list"],
extensions=["extra", "smarty", "sane_lists", "attr_list", "abbr"],
output_format="html5",
)
return md.convert(body)


def load_abbreviations() -> str:
"""Return the contents of `src/_abbreviations.md` (or '' if absent).

The block uses Markdown's `abbr` extension syntax: each line is
`*[KEY]: Expansion`. We append it to every CV body before rendering so
every occurrence of KEY in the body becomes <abbr title="Expansion">KEY</abbr>.
"""
path = SRC / "_abbreviations.md"
return path.read_text(encoding="utf-8") if path.exists() else ""


def load_inline_css() -> str:
"""Load assets/style.css and rewrite font URLs for inlining into HTML.

Expand Down Expand Up @@ -283,6 +337,7 @@ def render_html(
all_variants: list[Variant],
build_iso: str,
inline_css: str,
abbr_block: str = "",
) -> str:
tpl = env.get_template("cv.html.j2")
breadcrumb = variant_breadcrumb(variant)
Expand All @@ -294,6 +349,7 @@ def render_html(
updated_iso=build_iso,
breadcrumb=breadcrumb,
)
body_md_with_abbr = variant.body_md + "\n\n" + abbr_block
# Asset paths are relative to the HTML file. Both index.html and cv-*.de.html
# sit at the root of public/ alongside assets/, so plain "assets/..." works
# for every page; "../assets/..." would escape the project subpath on Pages.
Expand All @@ -306,7 +362,7 @@ def render_html(
og_locale=variant.front.get("og_locale", "de_DE"),
author=AUTHOR,
jsonld=json.dumps(jsonld, ensure_ascii=False),
body=render_md(variant.body_md),
body=render_md(body_md_with_abbr),
pdf_filename=variant.pdf_filename,
meta_links=build_meta_links(variant, all_variants),
updated_human=variant.front["updated"],
Expand Down Expand Up @@ -401,11 +457,15 @@ def main() -> int:
lstrip_blocks=True,
)

build_iso = datetime.now(timezone.utc).strftime("%Y-%m-%d")
# ISO 8601 datetime with explicit UTC offset — required for schema.org
# dateModified validation (date-only "YYYY-MM-DD" gets flagged).
now = datetime.now(timezone.utc).replace(microsecond=0)
build_iso = now.isoformat()
inline_css = load_inline_css()
abbr_block = load_abbreviations()

for v in variants:
html = render_html(env, v, variants, build_iso, inline_css)
html = render_html(env, v, variants, build_iso, inline_css, abbr_block)
out = PUBLIC / v.html_filename
out.write_text(html, encoding="utf-8")
print(f"wrote {out.relative_to(ROOT)}")
Expand Down
35 changes: 35 additions & 0 deletions src/_abbreviations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!-- Markdown abbr extension: WCAG 3.1.4 AAA Abbreviations.
Each line wraps every occurrence of the token in <abbr title="…">.
Keep alphabetical. -->

*[AAA]: Web Content Accessibility Guidelines, höchste Konformitätsstufe
*[AD]: Active Directory
*[AI]: Artificial Intelligence (Künstliche Intelligenz)
*[API]: Application Programming Interface
*[AWS]: Amazon Web Services
*[BCP]: Business Continuity Planning
*[BSI]: Bundesamt für Sicherheit in der Informationstechnik
*[C5]: Cloud Computing Compliance Criteria Catalogue (BSI)
*[CI/CD]: Continuous Integration / Continuous Delivery
*[CMS]: Content Management System
*[Concourse CI]: Concourse Continuous Integration
*[CRM]: Customer Relationship Management
*[CTO]: Chief Technology Officer
*[DAG]: Directed Acyclic Graph
*[DevOps]: Development and Operations
*[DR]: Disaster Recovery
*[DR/BCP]: Disaster Recovery / Business Continuity Planning
*[EVB-IT]: Ergänzende Vertragsbedingungen für die Beschaffung von IT-Leistungen
*[IAM]: Identity and Access Management
*[ISMS]: Informationssicherheits-Managementsystem
*[IT]: Informationstechnik
*[LDAP]: Lightweight Directory Access Protocol
*[MCP]: Model Context Protocol (Anthropic-Standard für Tool-Integration)
*[OSS]: Open Source Software
*[ÖPNV]: Öffentlicher Personennahverkehr
*[Proxmox]: Proxmox Virtual Environment, Linux-basierte Virtualisierungsplattform
*[RFC]: Request for Comments — strukturierter Architektur- oder Entscheidungsvorschlag
*[SDK]: Software Development Kit
*[SQL]: Structured Query Language
*[TER]: TYPO3 Extension Repository
*[TUGLE]: TYPO3 User Group Leipzig
13 changes: 11 additions & 2 deletions src/cv-executive.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ Erfahrung in Enterprise-, Public-Sector-, E-Commerce-, CMS- und Integrationsumfe
- Modernisierung komplexer Legacy-, CMS-, Commerce- und Integrationslandschaften
- Security-, Compliance-, Risiko-, Disaster-Recovery- und Business-Continuity-Dokumentation
- Einführung strukturierter AI-unterstützter Engineering-Praktiken
- Open-Source-Arbeit, technische Dokumentation und Entwickler-Enablement
- Open-Source-Maintainership, technische Dokumentation und Entwickler-Enablement
- Curriculum-Design, Mentoring und unternehmensinterne Trainingsprogramme
- Stakeholder-Kommunikation, Presales-Beratung, Change-Management

## Berufserfahrung

Expand Down Expand Up @@ -64,7 +66,14 @@ Ausbildung mit Schwerpunkt Web, Datenbanken, Hardware, Netzwerk und Support.

## Open Source

Langjähriger Open-Source-Hintergrund mit Beiträgen im phpMyAdmin- und TYPO3-Ökosystem. Schwerpunkt auf pragmatischer Softwareentwicklung, Wartbarkeit, Dokumentation und Zusammenarbeit in gewachsenen technischen Communities.
Langjähriger Open-Source-Hintergrund mit Beiträgen seit 2005. Schwerpunkt auf pragmatischer Softwareentwicklung, Wartbarkeit, Dokumentation und Zusammenarbeit in gewachsenen technischen Communities.

- **phpMyAdmin** (2005–2015) — Core-Beiträge zu MySQL-Administration, PHP-Backend und Dokumentation
- **TYPO3-Ökosystem** — Beiträge zu Documentation Tooling (`phpDocumentor/guides`, TYPO3-Documentation-Infrastruktur, `codesnippet`, `t3docs-ci-deploy`); öffentliche Claude-Code-Skills (`typo3-extension-analyzer-skill`, `typo3-update-issues`, `dxp-frontend`); aktiv in der TYPO3 User Group Leipzig (TUGLE)
- **Maintainer / Hauptbeiträger** — `netresearch/ldap-manager` (Go, LDAP-Operations-Tooling), `netresearch/ofelia` (Docker-basierter Job-Scheduler), `netresearch/go-cron` (DAG-Engine, Cron-Erweiterungen), `netresearch/claude-code-marketplace` (öffentlicher Skill-Marketplace)
- **Sonstige OSS** — Beiträge u.a. zu `hybridauth/hybridauth`, `repowise-dev/repowise`, `gofiber/cli`, `Seagate/cloudfuse`, `matrix-docker-ansible-deploy`, `traefik`, `weaviate`, `ddev`
- **Eigene Repos** — `kidsync` (Privacy-First Co-Parenting App, Kotlin, E2EE), `wow-quickroute` (Lua), `typo3-extension-analyzer-skill`
- GitHub: **github.com/CybotTM** (40+ public repos, aktiv seit 2010)

## Technologiefelder

Expand Down
15 changes: 13 additions & 2 deletions src/cv-technical.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@ Ausgewählte Beiträge:

- Governance und technische Weiterentwicklung einer zentralen Engineering-Plattform
- Modernisierung von Delivery-, Build-, Release- und Backup-Prozessen
- Einführung strukturierter Architekturentscheidungen und technischer RFC-Prozesse
- Einführung strukturierter Architekturentscheidungen und technischer RFC-Prozesse (Initiator des unternehmensweiten T3-RFC-Verfahrens)
- Curriculum-Design und persönliche Durchführung eines mehrwöchigen Trainingsprogramms „Best Practices für agentische Entwicklung" für das Engineering-Team
- Aufbau einer internen AI-Tooling-Plattform (Skill-Marketplace, eigene Composer-Distribution)
- Betriebs- und Incident-Unterstützung in kritischem Kundenumfeld
- Technische Beratung in Presales, Roadmaps und Modernisierungsprogrammen
- Aufbau und Pflege einer internen technischen Wissensbasis (50+ Artikel zu Engineering-, Sicherheits- und AI-Themen seit 2020)

### phpMyAdmin (2005–2015)

Expand All @@ -61,7 +64,15 @@ Ausbildung Fachinformatik Systemintegration mit Schwerpunkt Web, Datenbanken, Ha

## Open Source

Langjährige Beiträge im phpMyAdmin- und TYPO3-Ökosystem mit Fokus auf technische Dokumentation, Tooling und wartbare Entwicklungsprozesse.
Langjährige Beiträge in mehreren Ökosystemen mit Fokus auf wartbare Entwicklungsprozesse, technische Dokumentation und nachhaltige Maintainership.

- **phpMyAdmin** (2005–2015) — Core-Beiträge zu MySQL/SQL-Funktionalität, PHP-Backend, Dokumentation
- **TYPO3-Ökosystem** — Beiträge zu Documentation Tooling (`phpDocumentor/guides`, `codesnippet`, `t3docs-ci-deploy`, `t3docs-search-indexer`), Extension-Tooling und Skills (`typo3-extension-analyzer-skill`, `typo3-update-issues`, `dxp-frontend`); aktiv in der TYPO3 User Group Leipzig (TUGLE)
- **Maintainership** — `netresearch/ldap-manager` (Go, LDAP-Operations), `netresearch/ofelia` (Docker-Job-Scheduler), `netresearch/go-cron` (DAG-Engine, `@triggered`-Erweiterungen), `netresearch/claude-code-marketplace`
- **Matrix-Ökosystem** — Beiträge zu `matrix-docker-ansible-deploy`
- **Sonstige OSS** — Beiträge u.a. zu `hybridauth/hybridauth`, `repowise-dev/repowise`, `gofiber/cli`, `Seagate/cloudfuse`, `traefik`, `weaviate`, `ddev`, `raybeam`, `ocf-scheduler`
- **Eigene Repos** — `kidsync` (Privacy-First Co-Parenting App, Kotlin, E2EE), `wow-quickroute` (Lua), `typo3-extension-analyzer-skill`
- GitHub: **github.com/CybotTM** (40+ public repos, aktiv seit 2010)

## Sprachen

Expand Down
Loading