
German Technical Writing
- 18 installs
- 4 repo stars
- Updated August 3, 2026
- netresearch/german-technical-writing-skill
Helps with ai & agent building tasks.
About
german-technical-writing is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- german-technical-writing
- AI & Agent Building
- AI-coding skill
German Technical Writing by the numbers
- 18 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #10,736 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/netresearch/german-technical-writing-skill --skill german-technical-writingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 18 |
|---|---|
| repo stars | ★ 4 |
| Last updated | August 3, 2026 |
| Repository | netresearch/german-technical-writing-skill ↗ |
What it does
Helps with ai & agent building tasks.
Files
German Technical Writing
Natural German technical register for German-audience artifacts. Prevents English-first composition plus phrase-by-phrase translation, which produces grammatically correct German that reads as DeepL-output to native readers.
Process
1. Compose in German directly, not by translating. Restart if you catch yourself drafting English first. 2. Self-review each sentence against references/anti-patterns.md. 3. Apply the lexicon — canonical verbs and loanword gender: references/lexicon.md. 4. Match register — Präsens-Indikativ, impersonal voice, no first-person: references/register.md. 5. If unsure, ask — don't guess.
Top anti-patterns
| ❌ | ✅ |
|---|---|
| code bricht | schlägt fehl / wirft Exception |
| gefangen | erkannt / abgefangen |
| null returnen | null zurückgeben |
| Test failt | schlägt fehl / fällt durch |
| Fehler triggern | Fehler auslösen |
| auf Fehler hitten | auf Fehler stoßen |
Full ~60-entry catalogue plus pseudo-anglicisms and idiom calques in references/anti-patterns.md. Worked pair-examples in references/examples.md.
Two opposite traps — apply both disciplines
Two failure modes — over-applying one drives you into the other:
1. Anglicism (verb-level): keeping English when German is canonical. Test failt → schlägt fehl. Fehler triggern → Fehler auslösen. The table above and anti-patterns.md target this. 2. Calque / overcorrection (compound-noun-level): translating English when the loanword is canonical. Wurzelursache → Root Cause. Wettlaufbedingung → Race Condition. Speicherleck → Memory Leak. See anti-patterns.md ("Compound-noun calques") and lexicon.md ("Debugging / Postmortem / Analysis").
Decision rule for nouns: if a native German developer would say the term verbatim in a code review or stand-up, keep it English. The litmus test isn't "does a German equivalent exist?" — it's "do German engineers actually use it in everyday speech?" A German form that sounds like a textbook chapter title is a calque.
Absorbing "use German verbs" without "keep loanword nouns" produces DeepL-grade output. Apply both simultaneously.
Scope note
Commit messages, MR/PR descriptions, release notes and internal IT-project tickets (Netresearch: NRS, NRT, SRV\, IO\, LIC) are English — skip them. This skill governs how to write German, never whether German is the right choice.
{
"skill_name": "german-technical-writing",
"evals": [
{
"id": 1,
"prompt": "schreib bitte einen Jira-Kommentar auf OROSPD-692: der cart-merge-on-login Test failt weil die Fixture keine CPL hat, muss noch wait-for-AJAX rein. MR ist !1102, pipeline grün. danke",
"expected_output": "Compose a German Jira comment that uses canonical technical verbs (schlägt fehl, fehlt, wirft) and impersonal voice. No anglicisms like 'failt' in the output.",
"expectations": [
"Uses 'schlägt fehl' or 'fällt durch' for the test failure (not 'failt')",
"Uses Jira wiki markup (h3., {{monospace}}, table syntax)",
"Impersonal voice — no first-person 'ich' or 'wir'",
"Includes link to MR !1102"
],
"assertions": [
{"type": "content", "pattern": "(schlägt fehl|fällt durch)"},
{"type": "must_not", "pattern": "\\bfailt\\b"},
{"type": "must_not", "pattern": "\\bgefangen\\b"}
]
},
{
"id": 2,
"prompt": "HMKG-2202 ticket beschreibung muss neu geschrieben werden — problem/ziel format auf deutsch, ein satz problem, 2-3 akzeptanzkriterien, out of scope nur das kit-feature. bitte jira wiki markup",
"expected_output": "German Jira ticket description in Problem/Ziel/Akzeptanzkriterien/Out of Scope structure with wiki markup, impersonal voice.",
"expectations": [
"Uses h2. headings: Problem, Ziel, Akzeptanzkriterien, Out of Scope",
"Impersonal voice throughout",
"Bullet list for Akzeptanzkriterien"
],
"assertions": [
{"type": "content", "pattern": "h2\\. (Problem|Ziel|Akzeptanzkriterien)"},
{"type": "must_not", "pattern": "(?i)\\b(wir haben|ich habe)\\b"}
]
},
{
"id": 3,
"prompt": "status-update jira-kommentar auf deutsch für OROSPD-692: die Migration ist durch, Cache läuft wieder, keine weiteren Fehler in der Pipeline. kurz und sachlich bitte",
"expected_output": "Concise German Jira status-update comment, impersonal voice, canonical verbs, h3. heading optional.",
"expectations": [
"Uses canonical German verbs (läuft, ist durch, aufgetreten), not anglicisms",
"Impersonal voice — no first-person",
"Short and factual — under 5 sentences",
"Mentions migration, cache, pipeline status"
],
"assertions": [
{"type": "content", "pattern": "(?i)(migration|pipeline|cache)"},
{"type": "must_not", "pattern": "(?i)\\b(wir haben|ich habe|failt|gefangen|gefixt)\\b"}
]
},
{
"id": 4,
"prompt": "Bitte schreib eine kurze Slack-Ankündigung ans HMKG team auf deutsch: Pipeline CI-383 ist grün, QA kann starten, MR !1089 review willkommen",
"expected_output": "Short German Slack announcement using canonical idiom (Hinweis, not 'Heads up').",
"expectations": [
"Uses 'Hinweis' or similar German lead-in (not 'Heads up')",
"Mentions pipeline grün, QA, MR !1089"
],
"assertions": [
{"type": "must_not", "pattern": "(?i)\\bheads up\\b"},
{"type": "content", "pattern": "(?i)(QA|MR !1089|grün)"}
]
},
{
"id": 5,
"prompt": "translate this to german for a jira comment: 'The test fails because the fixture is empty. This happens when PricingStorageIsolator runs before the Combined* rebuild finishes. Fix: wait for idle before asserting.'",
"expected_output": "Natural German technical prose with 'schlägt fehl', 'leer', no anglicisms.",
"expectations": [
"Uses 'schlägt fehl' (not 'failt' or 'gefailt')",
"Uses 'leer' (not 'empty')",
"Impersonal voice"
],
"assertions": [
{"type": "content", "pattern": "(schlägt fehl|fällt durch)"},
{"type": "content", "pattern": "\\bleer\\b"},
{"type": "must_not", "pattern": "(?i)\\b(empty|gefailt|gefangen)\\b"}
]
},
{
"id": 6,
"prompt": "whats the status of HMKG-2202? is it ready for QA?",
"expected_output": "English status response. Should NOT invoke german-technical-writing skill (English query, no German artifact requested).",
"expectations": [
"Response is in English",
"No German prose composition output",
"Does not invoke german-technical-writing skill"
],
"assertions": [
{"type": "must_not", "pattern": "(?i)\\b(schlägt fehl|fällt durch|zurückgeben)\\b"},
{"type": "must_not", "pattern": "(?i)\\bwirft eine Exception\\b"}
]
},
{
"id": 7,
"prompt": "Danke",
"expected_output": "Brief acknowledgement reply. Should NOT invoke german-technical-writing skill (single-word German chat reply).",
"expectations": [
"Brief reply (under 100 characters)",
"Does not invoke german-technical-writing skill",
"No multi-paragraph German prose"
],
"assertions": [
{"type": "must_not", "pattern": "(?i)\\b(schlägt fehl|zurückgeben|abfangen|auslösen)\\b"},
{"type": "must_not", "pattern": "h[123]\\."}
]
},
{
"id": 8,
"prompt": "translate this jira comment from german to english so i can forward it to Oro corporate: 'Der Test schlägt fehl weil die Fixture leer ist, wir fixen das in MR !1102'",
"expected_output": "English translation. Should NOT invoke german-technical-writing skill (German→English direction, not German composition).",
"expectations": [
"Output is English (translation TO English)",
"Translates the German faithfully",
"Does not invoke german-technical-writing skill"
],
"assertions": [
{"type": "content", "pattern": "(?i)(test fails|fixture is empty|MR !1102)"},
{"type": "must_not", "pattern": "(?i)\\b(schlägt fehl|zurückgeben|abfangen)\\b"}
]
},
{
"id": 9,
"prompt": "explain to me what Konjunktiv II is in german grammar and when native speakers use it vs Indikativ",
"expected_output": "Grammar explanation in English. Should NOT invoke german-technical-writing skill (abstract grammar question, not artifact composition).",
"expectations": [
"Explanation focuses on grammar mechanics",
"Output is in English",
"Does not invoke german-technical-writing skill (no artifact being composed)"
],
"assertions": [
{"type": "content", "pattern": "(?i)(konjunktiv|subjunctive|hypothetic)"},
{"type": "must_not", "pattern": "h[123]\\. (Problem|Ziel|Akzeptanzkriterien)"}
]
},
{
"id": 10,
"prompt": "rename the variable `user` to `benutzer` in src/Meyer/ThemeBundle/Controller/AuthController.php and update the tests",
"expected_output": "Code edit. Should NOT invoke german-technical-writing skill (code task, German identifier name doesn't trigger).",
"expectations": [
"Performs code edit (no German prose composition)",
"Updates the variable name and references",
"Does not invoke german-technical-writing skill"
],
"assertions": [
{"type": "must_not", "pattern": "(?i)\\b(schlägt fehl|zurückgeben|abfangen|auslösen)\\b"},
{"type": "must_not", "pattern": "h[123]\\. (Problem|Ziel)"}
]
},
{
"id": 11,
"prompt": "wir brauchen eine Jira description auf deutsch für einen neuen Epic: Pflanzenbörse-Tax-Display überarbeiten weil die Kunden in der Gastansicht falsche Preise sehen, 2-3 akzeptanzkriterien, jira wiki markup",
"expected_output": "German Jira Epic description with Problem/Ziel/Akzeptanzkriterien sections, impersonal voice, wiki markup.",
"expectations": [
"Uses h2. headings (Problem, Ziel, Akzeptanzkriterien)",
"Impersonal voice — no first-person",
"2-3 Akzeptanzkriterien bullets",
"Mentions Pflanzenbörse, Tax-Display, Gastansicht"
],
"assertions": [
{"type": "content", "pattern": "h2\\. (Problem|Ziel|Akzeptanzkriterien)"},
{"type": "content", "pattern": "(?i)(Pflanzenbörse|Gastansicht|Tax)"},
{"type": "must_not", "pattern": "(?i)\\b(wir haben|ich habe)\\b"}
]
},
{
"id": 12,
"prompt": "paul hat mir einen code review in deutsch geschrieben und fragt warum wir keine unit tests für den provider haben. schreib bitte eine antwort auf deutsch die erklärt dass wir stattdessen einen regression test durch den decorator routen, und warum das sauberer ist",
"expected_output": "German reply explaining the decorator-routed regression test, using canonical verbs and impersonal voice.",
"expectations": [
"Reply is in German",
"Uses canonical verbs (schickt, abgefangen, erkannt) not anglicisms",
"Impersonal or third-person voice",
"Explains why decorator routing is cleaner"
],
"assertions": [
{"type": "content", "pattern": "(?i)(decorator|regression)"},
{"type": "must_not", "pattern": "\\b(gefangen|gefailt|returnen|triggern)\\b"}
]
},
{
"id": 13,
"prompt": "gib mir bitte einen drei-satz blurb auf deutsch für das internal-wiki über das MeyerBaselineBundle — was es macht, warum es existiert, wer es benutzt",
"expected_output": "Three-sentence German wiki blurb covering function, motivation, and audience. Impersonal voice.",
"expectations": [
"Exactly three sentences",
"Covers what / why / who",
"Impersonal voice — no first-person",
"Output is in German"
],
"assertions": [
{"type": "content", "pattern": "MeyerBaselineBundle"},
{"type": "must_not", "pattern": "(?i)\\b(wir haben|ich habe|unsere)\\b"}
]
},
{
"id": 14,
"prompt": "commit message auf deutsch bitte: wir haben den DataProviderDecorator regex bug gefixed, methode heisst jetzt getPimField statt get",
"expected_output": "Should refuse or redirect: at Netresearch, commit messages are English by team convention. Should NOT compose a German commit message.",
"expectations": [
"Refuses or redirects rather than composing a German commit message",
"Mentions that commits are English at Netresearch",
"Does NOT produce a German commit message body"
],
"assertions": [
{"type": "content", "pattern": "(?i)(English|englisch|convention|konvention)"},
{"type": "must_not", "pattern": "^HMKG-\\d+: [A-ZÄÖÜ][a-zäöüß]+ [a-zäöüß]"}
]
},
{
"id": 15,
"prompt": "können wir bitte den OROSPD-692 kommentar nochmal überarbeiten — die formulierung 'Code bricht mit Exception' soll natürlicher klingen",
"expected_output": "Rewrites the Anglicism 'Code bricht mit Exception' to canonical 'Code wirft eine Exception' or similar. Explains the false-friend.",
"expectations": [
"Replaces 'bricht' with canonical verb (wirft, schlägt fehl)",
"Explains why 'bricht' reads as anglicism",
"Provides the rewritten phrasing in German"
],
"assertions": [
{"type": "content", "pattern": "(?i)(wirft eine Exception|schlägt fehl)"},
{"type": "must_not", "pattern": "Code bricht mit Exception"}
]
}
]
}
Anti-Patterns — False Friends in German Technical Writing
Catalogue of literal English→German translations that read as anglicisms in professional German technical prose, paired with the natural technical phrasing.
How to use
Search by English concept or by the wrong-form you're tempted to write. Each row explains why the wrong form reads as anglicism — grammatical but foreign — and which form is established in German dev writing.
Verbs — Exceptions & Errors
| EN concept | ❌ Wrong | ✅ Right | Why |
|---|---|---|---|
| throw | schmeißen | werfen | "schmeißen" is colloquial/regional; technical German uses werfen for exceptions. |
| catch | fangen / catchen | abfangen | Bare fangen means "catch" in the animal/ball sense. Exceptions get abgefangen (the ab- prefix is not optional). |
| code breaks | brechen (alone) | fehlschlagen / abbrechen / eine Exception werfen | Code does not brechen; a process can abbrechen (abort) or scheitern, a call can fehlschlagen. |
| trigger error | triggern | auslösen | Triggern exists colloquially but sounds amateurish in written tech prose. Auslösen is the canonical verb. |
| hit an error | hitten / auf Fehler hitten | auf einen Fehler stoßen / einen Fehler treffen | Hitten is pure Denglisch. Auf X stoßen is idiomatic. |
| raise an exception | anheben | werfen / auslösen | German has no "raise" idiom for exceptions; collapse to werfen. |
| handle error | handeln | behandeln | Handeln means "to act/trade"; errors get behandelt. |
| recover from | erholen von | sich erholen von / zurückkehren aus | Technical contexts prefer nach einem Fehler zurückkehren or sich erholen (reflexive, not bare). |
Verbs — Tests & Builds
| EN | ❌ | ✅ | Why |
|---|---|---|---|
| test passes | passt | besteht / geht durch | Passen = to fit. Tests bestehen. |
| test fails | failt / failed | schlägt fehl / fällt durch | Failen is pure anglicism; fällt durch mirrors exam language. |
| test is green / red | grün / rot (OK) | grün / rot | This usage is accepted. |
| build fails | Build failt | Build schlägt fehl / bricht ab | Build schlägt fehl or bricht ab; never failt. |
| caught by tests | gefangen | erkannt / aufgedeckt / abgefangen | Gefangen = captured (in the prisoner sense). Tests erkennen or decken auf. |
| run tests | runnen | ausführen / laufen lassen | Ausführen is the canonical verb; laufen lassen is colloquial but acceptable. |
| skip test | skippen (OK colloquial) | überspringen / auslassen | Written form prefers überspringen. |
| cover code | covern | abdecken | Covern is music-industry German. Tests decken Code ab. |
| assert | asserten | zusichern / prüfen | Asserten is Denglisch; eine Assertion (noun) is fine, verb form prefers prüfen or zusichern. |
Verbs — Data Flow & Control
| EN | ❌ | ✅ | Why |
|---|---|---|---|
| return null | returnen | zurückgeben | Returnen is pure anglicism. |
| call method | callen | aufrufen | Callen is Denglisch. |
| pass argument | passen | übergeben | Passen is wrong (see tests); parameters get übergeben. |
| fall back to | zurück in … fallen | auf … zurückfallen / auf … ausweichen | Preposition+particle order: auf X zurückfallen, not zurück in X fallen. |
| end up in state | in Zustand … enden | in Zustand … landen / … erreichen | Enden is literal. Processes landen in a state. |
| fix bug | fixen (OK informal) | beheben / beseitigen / fixen | Fixen is acceptable in chat and commit messages; Jira descriptions prefer beheben. |
| parse input | parsen | parsen / auswerten | Parsen is accepted Denglisch. Auswerten is more formal. |
| check condition | checken (OK informal) | prüfen | Written form prefers prüfen. |
| resolve | resolven | auflösen / ermitteln | Resolven is Denglisch. |
Verbs — Git & VCS
| EN | ❌ | ✅ | Why |
|---|---|---|---|
| merge | mergen (OK) | mergen / zusammenführen | Both accepted. Pure German sounds stilted but is correct. |
| rebase | rebasen (OK) / umbasen | rebasen | Umbasen is not a word. Rebasen is accepted. |
| cherry-pick | cherry-picken (OK) | cherry-picken / übernehmen | Accepted loanword. |
| squash | squashen (OK) | squashen / zusammenfassen | Accepted loanword. |
| revert | reverten (OK) | reverten / zurücknehmen / rückgängig machen | Accepted loanword. |
| rename | renamen | umbenennen / renamen (colloquial) | Renamen acceptable in chat; written form prefers umbenennen. Ein Rename as noun is widely accepted. |
| checkout | auschecken / checkouten (OK) | auschecken / auf X wechseln | Accepted. |
| push | pushen (OK) | pushen | Accepted. |
| pull | pullen / ziehen (OK) | pullen / abholen | Accepted; abholen slightly dated. |
Nouns & Adjectives
| EN | ❌ | ✅ | Why |
|---|---|---|---|
| the test | die Test | der Test | Gender mistake — der Test (masc). |
| bare X | ein bare X | ein unqualifiziertes X / ein nacktes X | Bare is not a German adjective. |
| vanilla (default) | vanilla | unverändert / Standard- | Calque; in tech contexts unverändert works. |
| low-hanging fruit | niedrig hängende Frucht / low-hanging Fruit | leicht erreichbare Verbesserung / einfache Gewinne | Dead metaphor in German; prefer description. |
| end of the day | am Ende des Tages (as idiom) | letztlich / am Ende / unter dem Strich | Am Ende des Tages as idiom is calqued; only use literally. |
| on the same page | auf derselben Seite | einer Meinung / auf demselben Stand | Literal translation; cut it. |
| nice to have | nice-to-have (OK) | wünschenswert / angenehm, aber optional | Accepted loanword; pure form less stilted than calque. |
| happy path | happy path (OK) | Glücksfall / Normalfall / Standardablauf | Accepted loanword in design contexts. |
Sentence structure
| Pattern | Problem | Fix |
|---|---|---|
| "Wenn X, dann Y, was Z macht" | Calqued relative clause stacking | Split into two sentences. |
| "Der Code, der X macht, ist wichtig" | Over-nested subordinate | Flatten: "Der Code für X ist wichtig." |
| "Es ist wichtig, dass ..." | Weak opener | Start with the subject: "X muss ..." |
| "würde werfen" ohne Hypothese | Konjunktiv without counterfactual | Use Indikativ: "wirft". |
| Überlange Substantivketten (Produkt-Konfigurations-Attribut-Validierungs-Service) | Noun-stacking beyond 3 elements | Split with des/für/bei: "Validierungs-Service für Produkt-Konfigurations-Attribute" |
Compound-noun calques (the "Wurzelursache" trap)
These are the opposite of the verb-level anglicisms above. Writers who internalize "use German verbs" tend to over-correct and start translating English compound technical terms that should stay as loanwords. The result is grammatically perfect German that sounds like DeepL output to a native engineer because no German developer ever utters those translations.
| EN | ❌ Calque | ✅ Loanword | Why |
|---|---|---|---|
| root cause | Wurzelursache / Hauptursache | Root Cause | Wurzelursache is unused in German engineering speech. Postmortems, code reviews, Jira: Root Cause verbatim. Plural: Root Causes. |
| root-cause analysis | Wurzelursachen-Analyse | Root-Cause-Analyse | Same; hyphenated compound. |
| caller (stack-trace) | der Aufrufer | der Caller | Aufrufer technically correct, but stilted in dev jargon. Stack-Trace + Debugging: Caller. Aufrufstelle OK as alternative. |
| callsite | die Aufrufstelle (in dev jargon) | der Callsite | Same logic; Aufrufstelle OK in formal docs. |
| edge case | der Randfall | der Edge Case | Randfall works in math/stats register but is unused in software-engineering speech. Plural: Edge Cases. |
| corner case | der Eckfall | der Corner Case | Same logic. |
| race condition | die Wettlaufbedingung | die Race Condition | Wettlaufbedingung is academic-CS textbook; engineering register is Race Condition. |
| memory leak | das Speicherleck | das Memory Leak | Speicherleck exists but engineers say Memory Leak. |
| stack overflow | der Stapelüberlauf | der Stack Overflow | Engineering register keeps the loanword; Stapelüberlauf is OS-textbook. |
| garbage collection | die Müllabfuhr / die Speicherbereinigung | die Garbage Collection | Müllabfuhr is colloquial waste-disposal — never use in tech. Speicherbereinigung exists but is academic; engineers say GC or Garbage Collection. |
| deadlock | die Verklemmung | das Deadlock | Verklemmung is OS-textbook; engineering register is Deadlock. |
| heap | der Haldenspeicher | der Heap | Same trap. |
| thread | der Faden | der Thread | Faden is purely literal/textile. |
| code path | der Ausführungspfad | der Code-Pfad | Native form possible but uncommon; Code-Pfad dominant. |
| hot path | der heiße Pfad | der Hot Path | Performance-Kontext; loanword only. |
| happy path | der Glückspfad | der Happy Path | Already noted above. |
| reproducer | das Reproduktionsbeispiel | der Reproducer | Engineering shorthand. |
| trace | die Spur | der Trace | Spur is the Duden translation but engineers say Trace. |
| timeout | die Zeitüberschreitung (in dev jargon) | das Timeout / der Timeout | Zeitüberschreitung is Duden-perfect but reads bureaucratic. |
| stub | der Platzhalter | der Stub | Platzhalter exists but is for general placeholders, not test doubles. |
| mock | das Imitat | der Mock | Same logic. |
| pull request | die Zugverlangung | der Pull Request / der MR | Zugverlangung is a parodic backformation that should not exist in any document. |
| merge conflict | der Verschmelzungskonflikt | der Merge Conflict | Verschmelzung is metallurgy. |
| breaking change | die brechende Änderung | das Breaking Change / der Breaking Change | Brechende Änderung is calque from "breaking"; gender on the loanword unstable, both das and der attested. |
| dry-run | der Trockenlauf | der Dry-Run | Trockenlauf exists in mechanical engineering, not in software. |
Decision rule
If a native German developer would say the term verbatim in a code review or stand-up, keep it English. The litmus test isn't "does a German equivalent exist?" — Duden has German for nearly everything. The test is: "does any German engineer actually use the German equivalent in everyday speech?" If the German form sounds like a textbook chapter title, it's a calque.
Two opposite errors — keep them straight
This file catalogues two distinct failure modes, and over-applying one drives you into the other:
1. Anglicism (verbs): keeping English when German is canonical. Test failt → schlägt fehl. Fehler triggern → Fehler auslösen. The verb tables above target this. 2. Calque (compound nouns): translating English when the loanword is canonical. Wurzelursache → Root Cause. Wettlaufbedingung → Race Condition. The compound-calque table above targets this.
Both disciplines apply simultaneously. Writers who absorb only the first drift into the second.
Pseudo-anglicisms to avoid
These are German "English" words that don't exist in English or mean something else:
- Handy for mobile phone — acceptable in general German but never in tech writing (use Smartphone)
- Beamer for projector — avoid in tech writing (use Projektor)
- Shooting for photo session — marketing-speak, not tech
- Oldtimer for vintage car — irrelevant but beware the pattern
When to break the rules
Use anglicisms deliberately when:
- Quoting someone else's exact words
- Writing chat messages to a team that already uses the term
- In code-adjacent contexts where English identifier names need context ("the
callbackwird gecallt" sounds less weird than "dercallbackwird aufgerufen" if the discussion is heavily about the literal identifier)
But always flag it consciously — not as a default.
Examples — Bad vs. Good
Real paired cases from past Jira tickets and team-chat announcements. Each pair shows the anglicism-laden original, the rewrite, and why the rewrite works.
Case 1 — The opening incident
Bad (OROSPD-692 comment, 2026-04-24):
Ein bare get würde mit BadMethodCallException zur Laufzeit brechen. Ein Regressionstest führt den Provider durch den Decorator, damit ein Rename in die Falle zurück von Unit-Tests gefangen wird.
Problems:
1. "ein bare get" — bare is not a German word in this sense. Use "ein unqualifiziertes `get`" or "ein nacktes `get`". 2. "würde … brechen" — Konjunktiv II without counterfactual + brechen for "break code". Should be Indikativ "wirft" (the unqualified call does throw at runtime — not hypothetically). 3. "in die Falle zurück" — garbled calque of "back into the trap". German has no equivalent idiom here. 4. "gefangen" — literal "caught". Tests erkennen, decken auf, or fangen ab.
Good:
Ein unqualifiziertesgetwirft zur Laufzeit eineBadMethodCallException. Der Regressionstest schickt den Provider durch den Decorator, damit ein späterer Rename direkt in den Unit-Tests auffliegt — ohne Decorator würde ein Umbenennen erst im Behat-Lauf sichtbar.
Why it works:
- Indikativ for fact (wirft), Konjunktiv II only for the explicit counterfactual ("ohne Decorator würde ...")
- unqualifiziertes is the technical term for method calls without context
- auffliegt is idiomatic German for "a bug gets caught" in colloquial tech speech — alternative: erkannt wird
- The ohne Decorator würde ... clause provides the missing motivation that the original garbled away
Case 2 — Test failure description
Bad:
Der Test ist gefailt weil die Fixture empty war und das System in einen bad state endete.
Problems:
- gefailt — pure anglicism
- empty — untranslated English
- bad state — untranslated English
- endete — enden is literal for "end up"
Good:
Der Test ist fehlgeschlagen, weil die Fixture leer war und das System in einem inkonsistenten Zustand landete.
Why:
- fehlgeschlagen — canonical verb for test failure
- leer — German word exists, use it
- inkonsistenter Zustand — established technical phrasing for "bad state"
- landen — the idiomatic verb when a process arrives somewhere unintended
Case 3 — Jira comment: fix explanation
Bad:
Der Bug ist gefixt wo die Exception gecatched wurde aber nicht rethrown, sodass der Error silent war. Ich habe das gehandled indem ich den Handler refactored habe.
Problems:
- Stacked Denglisch with no reason: gefixt, gecatched, rethrown, silent, gehandled, refactored
- First person ("Ich habe") in a Jira comment that belongs in shared ticket history
- "wo" as relative pronoun for a thing is colloquial and wrong here
- silent applied to Error — English idiom that doesn't transfer
Good:
Die Exception wurde zwar abgefangen, aber nicht erneut geworfen — der Fehler blieb dadurch unsichtbar. Der Handler ist umgestellt, sodass die Exception nach dem Logging weitergereicht wird.
Why:
- abgefangen (proper verb), erneut geworfen (re-throw), unsichtbar (silent → invisible, the natural equivalent)
- Impersonal — no "ich"
- Describes the outcome ("der Handler ist umgestellt"), not the author's process
- weitergereicht is the established verb for passing an exception up the stack
Case 4 — Jira description problem statement
Bad:
Das Issue ist dass der Service immer null returned wenn die DB empty ist, was einen NullPointer trigger im Frontend bedeutet. Wir müssen das handeln.
Problems:
- returned, empty, trigger, bedeutet (calqued from "means")
- Issue is fine as loanword but das Problem would also work
- handeln = "to trade/act", not "to handle errors"
- First person ("Wir müssen") in a problem statement
Good:
Der Service gibt bei leerer Datenbanknullzurück. Im Frontend löst das eineNullPointerExceptionaus. Die Fehlerbehandlung muss ergänzt werden.
Why:
- gibt … zurück — canonical German for return
- löst … aus — canonical German for trigger
- Three short sentences instead of one rambling one
- Impersonal "muss ergänzt werden" instead of first-person "Wir müssen"
Case 5 — Status update comment
Bad:
Update: Ich habe heute das Issue debugged und gefunden dass der Root Cause die DataProviderDecorator Regex ist. Der bare get Name wird gerejected. Ich fixe das jetzt indem ich die Method zu getPimField renamen.
Problems:
- First person throughout
- debugged, gerejected, bare, renamen, Root Cause unsteady
- "Ich fixe das jetzt indem ich ... renamen" — verb placement + infinitive mix
- Stream-of-consciousness structure; not scannable
Good:
Status-Update: Die Ursache liegt in der Regex/^(get|has|is)(.+)$/idesDataProviderDecorator— der unqualifizierte Methodennamegetwird abgelehnt. Fix: Methode wird aufgetPimFieldumbenannt.
Why:
- Impersonal passive throughout
- Concrete detail (the actual regex pattern) replaces vague "Root Cause"
- Two sentences: diagnosis, then fix. Scannable.
- Italic "Status-Update:" as a lead-in works in Jira wiki markup
Case 6 — Deployment announcement
Bad:
Heads up: Der neue Release geht heute abend live. Wer noch MRs am draft hat sollte merged haben bis 18 Uhr sonst slippt das in die nächste Deploy Window.
Problems:
- Heads up, slippt, Window — English idioms breaking rhythm
- "gerne" missing — announcements like this tend to be clipped to the point of rudeness
- Mixed sentence structure
Good:
Hinweis: Das nächste Release geht heute Abend live. Offene MRs müssen bis 18:00 Uhr gemergt sein, sonst verschieben sie sich auf den nächsten Deploy.
Why:
- Hinweis is the German equivalent of "heads up" in an announcement register
- verschieben sich replaces slippt — proper German
- "nächsten Deploy" — Deploy is accepted loanword, use it without Window
Meta-observation
Across these cases, the repeating failure modes are:
1. First person slipping into artifacts — chat habits bleeding into persistent text 2. Verb-cognate translation — grabbing the first German verb that sounds like the English one, instead of the established technical one 3. Idiom calquing — translating an English idiom word-for-word when German has no equivalent (the idiom has to be dropped or reformulated) 4. Untranslated adjectives — empty, silent, bare, flaky, green — German has all of these, the writer just forgot to switch 5. Konjunktiv II for non-hypotheticals — adding würde to soften when the sentence should be blunt Indikativ
When reviewing your own German draft, scan for these five patterns specifically. One pass is usually enough.
Technical Lexicon — Preferred German Forms
Table of technical terms with gender, preferred form, and usage notes. Use this when you need to pick between two candidate phrasings for a concept.
How this list is organized
- EN term — the English concept
- DE form — preferred form with article (where noun)
- Register — accepted Denglisch loanword (use as-is), native German (preferred in formal writing), both (either works)
- Notes — gotchas, gender, pluralization
Exceptions & Error Handling
| EN | DE | Register | Notes |
|---|---|---|---|
| exception | die Exception | accepted loanword | plural: die Exceptions. Never der/das Exception. |
| throw | werfen | native | "eine Exception werfen" — canonical. schmeißen is colloquial. |
| catch | abfangen | native | "eine Exception abfangen". Never bare fangen. |
| re-throw | erneut werfen / rethrow | both | rethrow acceptable in code comments. |
| stack trace | der Stacktrace | accepted loanword | plural: die Stacktraces. |
| runtime error | der Laufzeitfehler | native | preferred over Runtime Error. |
| compile error | der Kompilierungsfehler | native | Compile-Fehler accepted colloquially. |
| type error | der Typfehler | native | preferred. |
| null pointer | der Nullpointer / NullPointerException | both | when quoting the Java exception, use the loanword. |
| fatal error | der fatale Fehler / der schwerwiegende Fehler | native | fataler Fehler is dominant. |
Tests
| EN | DE | Register | Notes |
|---|---|---|---|
| test | der Test | both | plural: die Tests. Never die Test (feminine is wrong). |
| unit test | der Unit-Test | accepted | plural: die Unit-Tests. Hyphen preferred. |
| integration test | der Integrationstest | native | no hyphen; der Integration-Test also seen. |
| functional test | der Funktionstest | native | |
| end-to-end test / e2e test | der End-to-End-Test / der E2E-Test | accepted | |
| fixture | die Fixture | accepted | plural: die Fixtures. |
| mock | der Mock | accepted | verb: mocken. |
| stub | der Stub | accepted | plural: die Stubs. |
| spy | der Spy | accepted | plural: die Spys / die Spies. |
| assertion | die Assertion | accepted | plural: die Assertions. |
| test passes | der Test besteht | native | never der Test passt. |
| test fails | der Test schlägt fehl / fällt durch | native | never der Test failt. |
| skip | überspringen / skippen | both | written: überspringen; chat: skippen. |
| test coverage | die Testabdeckung / die Test Coverage | both | |
| regression | die Regression | accepted | plural: die Regressionen. |
| flaky | flaky / instabil / flatterhaft | both | flaky dominant in team chat. |
Version Control & Git
| EN | DE | Register | Notes |
|---|---|---|---|
| commit (noun) | der Commit | accepted | plural: die Commits. |
| commit (verb) | committen | accepted | einchecken is dated. |
| branch | der Branch | accepted | plural: die Branches. |
| merge (noun) | der Merge | accepted | |
| merge (verb) | mergen / zusammenführen | both | |
| rebase (noun+verb) | der Rebase / rebasen | accepted | |
| cherry-pick | cherry-picken / übernehmen | both | |
| squash | squashen / zusammenfassen | both | |
| revert (verb) | reverten / zurücknehmen / rückgängig machen | both | |
| rename (noun) | der Rename / die Umbenennung | both | Rename widely accepted. |
| rename (verb) | umbenennen / renamen | both | written: umbenennen; chat: renamen. |
| pull request / MR | der Pull Request / der PR / der MR / die Merge Request | accepted | In git.netresearch.de always use MR / Merge Request (per team convention). |
| push | pushen | accepted | |
| pull | pullen / abholen | both | |
| fetch | fetchen / abholen | both | |
| checkout | auschecken / checkouten / auf X wechseln | both | auf X wechseln most native. |
| diff | der Diff | accepted | |
| conflict | der Konflikt | native | |
| reset | der Reset / zurücksetzen | both | |
| blame | blamen / blame (Tool-Name) | accepted | usually just git blame as tool-call. |
CI / CD / Build
| EN | DE | Register | Notes |
|---|---|---|---|
| pipeline | die Pipeline | accepted | plural: die Pipelines. |
| build (noun) | der Build | accepted | plural: die Builds. |
| deploy (noun) | das Deploy / das Deployment | accepted | |
| deploy (verb) | deployen / ausrollen | both | |
| rollout | der Rollout / die Ausrollung | accepted | Rollout dominant. |
| rollback | der Rollback | accepted | |
| staging | das Staging / die Staging-Umgebung | accepted | |
| production | die Produktion / die Produktivumgebung / Prod | native | |
| release (noun) | das Release / die Veröffentlichung | both | |
| release (verb) | releasen / veröffentlichen | both | |
| hotfix | der Hotfix | accepted | |
| patch | der Patch | accepted | |
| feature flag | das Feature Flag / der Feature-Schalter | accepted | |
| canary | das Canary / das Canary-Release | accepted | |
| smoke test | der Smoke-Test | accepted |
HTTP / APIs
| EN | DE | Register | Notes |
|---|---|---|---|
| request | der Request | accepted | plural: die Requests. |
| response | die Response | accepted | plural: die Responses. |
| endpoint | der Endpoint / der Endpunkt | both | |
| payload | das Payload | accepted | |
| header | der Header | accepted | |
| body | der Body | accepted | |
| query param | der Query-Parameter | accepted | |
| status code | der Statuscode | native | |
| timeout | das Timeout / der Timeout | accepted | gender unstable; das more common. |
| retry | der Retry / der erneute Versuch | both | |
| rate limit | das Rate Limit / die Drosselung | accepted |
Frontend / UI
| EN | DE | Register | Notes |
|---|---|---|---|
| component | die Komponente / das Component | both | native preferred. |
| render | rendern | accepted | |
| hook | der Hook | accepted | |
| state | der State / der Zustand | both | React-Kontext: State; allgemein: Zustand. |
| prop | die Prop | accepted | |
| event | das Event / das Ereignis | both | |
| listener | der Listener / der Zuhörer | accepted | Zuhörer too literal. |
| callback | der Callback / die Rückruffunktion | accepted | |
| selector | der Selector / der Selektor | both | |
| layout | das Layout | accepted | |
| template | das Template / die Vorlage | both |
Data / Persistence
| EN | DE | Register | Notes |
|---|---|---|---|
| database | die Datenbank | native | |
| query | die Query / die Abfrage | both | |
| migration | die Migration | accepted | |
| schema | das Schema | accepted | |
| index | der Index | accepted | |
| cache | der Cache | accepted | |
| cache invalidation | die Cache-Invalidierung | native | |
| transaction | die Transaktion | native | |
| rollback (DB) | der Rollback | accepted | |
| commit (DB) | der Commit | accepted | |
| session | die Session / die Sitzung | both | |
| token | der Token | accepted | |
| serialize | serialisieren | native | |
| deserialize | deserialisieren | native |
Architecture / Patterns
| EN | DE | Register | Notes |
|---|---|---|---|
| service | der Service | accepted | |
| controller | der Controller | accepted | |
| provider | der Provider | accepted | |
| decorator | der Decorator / der Dekorator | both | |
| wrapper | der Wrapper | accepted | |
| factory | die Factory | accepted | |
| repository | das Repository | accepted | |
| interface | das Interface / die Schnittstelle | both | |
| abstract | abstrakt | native | |
| inheritance | die Vererbung | native | |
| composition | die Komposition | native | |
| dependency | die Abhängigkeit / die Dependency | both | native usually preferred in formal docs. |
| injection | die Injektion / das Injecten | accepted | |
| refactoring | das Refactoring | accepted | Refaktorierung sounds bureaucratic. |
| bug | der Bug | accepted | |
| feature | das Feature | accepted | |
| ticket / issue | das Ticket / das Issue | accepted | |
| roadmap | die Roadmap | accepted |
Common verbs — technical register
| EN | DE | Notes |
|---|---|---|
| to execute | ausführen | "Code ausführen", "Befehl ausführen" |
| to run (tests/code) | ausführen / laufen lassen | |
| to invoke | aufrufen | |
| to validate | validieren / prüfen | |
| to parse | parsen | accepted loanword |
| to serialize | serialisieren | |
| to configure | konfigurieren | |
| to initialize | initialisieren | |
| to instantiate | instanziieren / erzeugen | |
| to override | überschreiben | |
| to implement | implementieren | |
| to extend | erweitern | |
| to refactor | refactoren / umgestalten | |
| to debug | debuggen | |
| to profile | profilen / das Profiling durchführen | |
| to optimize | optimieren | |
| to deprecate | als veraltet markieren / deprecaten | |
| to document | dokumentieren |
Articles for ambiguous loanwords
These get mistakes most often. Fix the article first:
- der Commit, der Rebase, der Merge, der Branch, der Build, der Bug, der Fix, der Patch, der Hook, der Mock, der Stub, der Wrapper, der Decorator, der Provider, der Service, der Controller, der Token, der Header, der Callback, der Listener, der State, der Request, der Endpoint, der Cache, der Index, der Timeout (or das), der Retry
- die Pipeline, die Exception, die Fixture, die Assertion, die Response, die Session, die Migration, die Query, die Prop, die Factory, die Komponente, die Schnittstelle
- das Interface, das Feature, das Event, das Ticket, das Issue, das Template, das Deployment, das Staging, das Logging, das Monitoring, das Framework, das Caching, das Routing, das Rendering, das Payload, das Refactoring, das Repository, das Schema
Debugging / Postmortem / Analysis
These are the terms most prone to the calque-overcorrection trap. Native German engineers say all of these as English loanwords; translating them produces DeepL-output that no developer would speak.
| EN | DE | Register | Notes |
|---|---|---|---|
| root cause | die Root Cause | accepted loanword | NEVER Wurzelursache (calque) or Hauptursache (works in formal text but uncommon in dev). Postmortems, code reviews, Jira: Root Cause verbatim. Plural: die Root Causes. |
| root-cause analysis | die Root-Cause-Analyse | accepted | Hyphenated compound. Wurzelursachen-Analyse is wrong. |
| caller | der Caller | accepted | Stack-trace + debugging context. Aufrufer technically correct but stilted in dev jargon. |
| callsite / call site | der Callsite / die Aufrufstelle | both | Loanword dominant; native form acceptable in formal docs. |
| call stack | der Call Stack / der Aufruf-Stack | both | |
| stack frame | das Stackframe / der Stack-Frame | accepted | |
| edge case | der Edge Case | accepted loanword | NEVER Randfall in software-engineering register. Randfall belongs to math/stats. Plural: die Edge Cases. |
| corner case | der Corner Case | accepted | Same logic as Edge Case. |
| code path | der Code-Pfad | accepted | Ausführungspfad possible but uncommon. |
| hot path | der Hot Path | accepted | Performance-Kontext; loanword only. |
| happy path | der Happy Path | accepted | Already in anti-patterns.md. |
| code path / execution path | der Code-Pfad | accepted | |
| race condition | die Race Condition | accepted loanword | NEVER Wettlaufbedingung (academic-CS textbook). |
| deadlock | das Deadlock | accepted | NEVER Verklemmung. |
| memory leak | das Memory Leak | accepted | NEVER Speicherleck. |
| stack overflow | der Stack Overflow | accepted | NEVER Stapelüberlauf. |
| garbage collection | die Garbage Collection / GC | accepted | NEVER Müllabfuhr. Speicherbereinigung is academic. |
| heap | der Heap | accepted | NEVER Haldenspeicher. |
| thread | der Thread | accepted | NEVER Faden. |
| trace | der Trace | accepted | |
| trace logging | das Trace-Logging | accepted | |
| stack trace | der Stacktrace / der Stack-Trace | accepted | Already in Exceptions section. |
| reproducer / repro | der Reproducer / das Repro | accepted | NEVER Reproduktionsbeispiel. |
| postmortem | das Postmortem | accepted | |
| breaking change | das Breaking Change / der Breaking Change | accepted | Gender unstable; both attested. NEVER brechende Änderung. |
| dry-run | der Dry-Run | accepted | NEVER Trockenlauf (mechanical-engineering term). |
| smoke test | der Smoke-Test | accepted | Already in CI/CD section. |
| diff | der Diff | accepted | Already in VCS section. |
| flag (boolean attribute) | das Flag | accepted | NEVER die Flagge. |
Calque check
Before writing a German compound noun in tech prose, ask: would I say this German word out loud in a code review with a German-speaking team? If the answer is "no, I'd say the English term," keep the loanword. The litmus test isn't dictionary existence — Duden has translations for nearly everything. The test is everyday-engineering-speech use.
When no entry exists
If a term isn't here:
1. Check whether it's in the Duden online (duden.de) — if yes, use that gender/spelling 2. Check how the Microsoft German Style Guide handles it 3. If still unclear, prefer the native German form in written text, the loanword in chat 4. If truly ambiguous, ask the user
Register — Tense, Voice, Person, and Artifact-Specific Conventions
Register is the biggest single driver of whether German technical prose reads as native or translated. Use this reference when composing longer artifacts: Jira descriptions and comments, internal German-language wiki pages, RFC/spec documents, and team-chat messages to German-speaking colleagues.
Not in scope: commit messages, MR/PR descriptions, and release notes — at Netresearch and most agencies delivering customer projects, those are written in English by team convention regardless of the team's native language.
Tense
Default: Präsens-Indikativ. Use it for describing what code does, what a system behaves like, what a ticket is about.
- ✅ "Der Service wirft bei fehlendem Feld eine Exception."
- ❌ "Der Service würde bei fehlendem Feld eine Exception werfen." (Konjunktiv II without counterfactual — calqued from English "would throw")
Konjunktiv II only for real hypotheticals. Counterfactuals, proposals, "if we did X", forward-looking plans:
- ✅ "Wenn wir die Cache-TTL auf 10 Minuten senken würden, würde der ES-Index seltener neu aufgebaut."
- ✅ "Ohne den Decorator-Layer würde ein Rename erst im Behat-Lauf sichtbar." (counterfactual — the Decorator layer exists, we're describing the absence case)
Perfekt for completed work done: Acceptance criteria, status updates, Jira-comment narrations.
- ✅ "Die Lock-Datei ist aktualisiert, die Pipeline läuft grün."
- ✅ "Der Import-Pfad ist umgestellt; die alte Klasse ist entfernt."
Präteritum almost never in tech writing. It's literary/narrative. Never use it in Jira text.
- ❌ "Der Test schlug fehl, weil die Fixture leer war." (sounds like a novel)
- ✅ "Der Test ist fehlgeschlagen, weil die Fixture leer war." (Perfekt — natural tech prose)
Voice
Active preferred when an actor is identifiable. Pick it when you're describing what a specific service/test/user does.
- ✅ "Der PricingStorageIsolator rebuildet die Combined-Price-Lists aus den raw-Rows."
- ✅ "Das Fixture-Loader liest die YAMLs aus
tests/Fixtures/."
Passive for system behavior where the actor is irrelevant or diffuse. Jira ticket descriptions often benefit from passive because they describe outcomes, not actors.
- ✅ "Die Exception wird zur Laufzeit geworfen."
- ✅ "Die PriceListToCustomer-Rows werden beim PricingStorageIsolator-Lauf neu aufgebaut."
Avoid mixing active and passive in a single flow. Pick one per paragraph for parallelism.
Never use "man" in technical writing for a concrete actor. It's acceptable in generic statements ("man kann X auch über Y erreichen") but clunky when a subject is identifiable.
- ❌ "Man muss das Behat-Baseline neu aufbauen."
- ✅ "Das Behat-Baseline muss neu aufgebaut werden."
Person
No first person in artifact text. Ever. "Ich", "wir", "uns" belong in informal chat replies and 1:1 communication — not in Jira descriptions or internal wiki/spec pages.
- ❌ "Wir haben den Bug gefixt."
- ✅ "Der Bug ist behoben." (Perfekt-Passiv)
- ✅ "Der Fix ist enthalten in Commit abc1234." (if you need to name it)
Second person only in user-facing documentation aimed at a reader. Use Sie-Form in product-facing documentation, Du-Form in internal wiki/team docs (HMKG team uses Du).
- ✅ (HMKG team wiki) "Achte darauf, dass der Branch auf
developbasiert, bevor du merged." - ✅ (external customer docs) "Melden Sie sich unter /admin an und navigieren Sie zu ..."
Artifact-Specific Conventions
Jira Issue Description
Structure:
h2. Problem
[What is broken/missing/needed. Impersonal, present tense, 2-4 sentences max.]
h2. Ziel
[What the solution should achieve. Impersonal, present or future, 1-2 sentences.]
h2. Akzeptanzkriterien
* [Bullet list, each item passive or imperative infinitive]
* [...]
h2. Out of Scope
* [What this ticket explicitly does NOT cover]
h2. Abhängigkeiten
* Benötigt: [ticket keys]
* Blockiert: [ticket keys]
* Parent Epic: [key]Style:
- Impersonal throughout — no "ich/wir"
- Present tense for the problem description (it is broken now)
- Bullets in parallel grammatical form (all noun phrases or all imperative verbs, not mixed)
Jira Comment
- Start with context in one line (MR link, CI status, commit SHA)
- Use
h3.headings, noth2.(comments are sub-content) - Tables for feature/test enumerations (
|| Column || Column ||header,| cell | cell |rows) - Code elements in
{{monospace}} - Closing: facts + next action, no hedging ("Hoffen wir mal", "Scheint zu funktionieren" — cut)
Commit messages, MR/PR descriptions, and release notes — not in scope
At Netresearch and most agencies delivering customer projects, commit messages, MR/PR descriptions, and release notes are all written in English by team convention regardless of the team's native language. Do not apply this skill's guidance to those artifacts — if a German version crosses your desk, flag it as off-convention rather than polish the German.
Internal German Wiki / Spec Pages
- Sie-Form for customer-facing docs; Du-Form for internal team wiki (HMKG convention)
- Impersonal voice in specification sections; direct voice acceptable in how-to sections
- Heading hierarchy:
#for page title,##for major sections,###for subsections - Technical terms in the established lexicon — same rules as Jira prose
Sentence Length
German allows longer sentences than English, but technical prose in Jira contexts should stay short. Rule of thumb:
- Ideal: 10–15 words per sentence
- Acceptable: up to 25 words
- Hard stop: 35+ words means split it
The reason: Jira readers skim. Long Verbalketten-Sätze are where anglicisms hide because the writer loses the thread halfway through.
Compound Nouns
German loves compound nouns. Technical writing leverages this, but beware overstacking:
- ✅ "Produkt-Konfigurations-Attribut" (3 elements, readable)
- ⚠️ "Produkt-Konfigurations-Attribut-Validierung" (4 elements, starting to strain)
- ❌ "Produkt-Konfigurations-Attribut-Validierungs-Service" (5 elements — split with prepositions)
- → "Service zur Validierung von Produkt-Konfigurations-Attributen"
- → "Validierungs-Service für Produkt-Konfigurations-Attribute"
Hyphenation rule: connect with - when at least one component is a loanword (Exception-Handler, PriceList-Rebuild, CI-Pipeline). Pure German compounds can omit hyphens (Konfigurationsattribut) but hyphens are always safe for readability.
Orthography Minimums
Never substitute these with ASCII:
- ß — "weiß", "Fuß", "groß", "Maß". Never write "weiss", "Fuss". (exception: Swiss German drops ß — not our context)
- ä ö ü — "Qualität", "Überprüfung", "Änderung". Never "ae/oe/ue" in normal text.
- „…" — German quotation marks. In Jira markup or code contexts, straight quotes
"..."are fine. In plain prose, use„…"for nested quotes.
Capitalization:
- All nouns capitalized (the default German rule — don't forget)
- Verbs used as nouns capitalized: "das Rebuilden der Combined-Price-Lists"
- Adjectives normally lowercase unless nominalized: "das Wichtigste ist X" (nominalized), "der wichtige Schritt" (attribute)
Checklist — self-review pass
Before posting any German artifact longer than one sentence, read through it once and ask:
1. ☐ Is every verb drawn from the German technical lexicon, not translated from English? 2. ☐ Is the tense Präsens-Indikativ (default) or justified Konjunktiv/Perfekt? 3. ☐ Is there any first-person ("ich", "wir") that should be impersonal? 4. ☐ Is every sentence under 25 words? 5. ☐ Are compound nouns split at ≤3 elements or with prepositions beyond that? 6. ☐ Are ß/ä/ö/ü intact? 7. ☐ Does any sentence contain a calqued English idiom ("am Ende des Tages", "low-hanging fruit", "auf derselben Seite")? 8. ☐ If bullet points: are they in parallel grammatical form?
If any check fails, fix it before posting.