{
  "version": "1.0",
  "site": "https://redaction-technique.org",
  "description": "Technical writing blog on Docs-as-Code, DITA XML, Markdown, YAML, and content automation by Olivier Carrère.",
  "endpoints": {
    "index": "https://redaction-technique.org/index.json",
    "sitemap": "https://redaction-technique.org/sitemap.md",
    "llms": "https://redaction-technique.org/llms.txt",
    "llmsFull": "https://redaction-technique.org/llms-full.txt"
  },
  "count": 24,
  "posts": [
    {
      "title": "You Probably Don’t Need a CMS: Building a Lightweight Admin with Git and Astro",
      "description": "Most of a small organization’s website barely changes. This is an argument for building the smallest editing interface it actually needs, using Astro, Git, YAML, and a small admin layer instead of a full CMS.",
      "url": "https://redaction-technique.org/blog/lightweight-cms-git-astro",
      "markdown": "https://redaction-technique.org/blog/lightweight-cms-git-astro.md",
      "locale": "en",
      "publishDate": "2026-09-08",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 3229,
      "headings": [
        {
          "level": 2,
          "text": "The idea, in one diagram",
          "slug": "the-idea-in-one-diagram"
        },
        {
          "level": 2,
          "text": "The content that actually changes",
          "slug": "the-content-that-actually-changes"
        },
        {
          "level": 2,
          "text": "GitHub is the backend, not the editorial interface",
          "slug": "github-is-the-backend-not-the-editorial-interface"
        },
        {
          "level": 2,
          "text": "The architecture",
          "slug": "the-architecture"
        },
        {
          "level": 2,
          "text": "What editors can actually manage",
          "slug": "what-editors-can-actually-manage"
        },
        {
          "level": 2,
          "text": "From YAML to a live website",
          "slug": "from-yaml-to-a-live-website"
        },
        {
          "level": 2,
          "text": "Why the API matters",
          "slug": "why-the-api-matters"
        },
        {
          "level": 2,
          "text": "Automation: one dataset, multiple outputs",
          "slug": "automation-one-dataset-multiple-outputs"
        },
        {
          "level": 2,
          "text": "Security and personal data",
          "slug": "security-and-personal-data"
        },
        {
          "level": 2,
          "text": "Where this approach stops working",
          "slug": "where-this-approach-stops-working"
        },
        {
          "level": 2,
          "text": "When to choose WordPress or a headless CMS",
          "slug": "when-to-choose-wordpress-or-a-headless-cms"
        },
        {
          "level": 2,
          "text": "The smallest system that works",
          "slug": "the-smallest-system-that-works"
        }
      ],
      "tags": [
        "astro",
        "wordpress",
        "cms",
        "git",
        "headless-cms",
        "vercel"
      ]
    },
    {
      "title": "AI will soon replace GUIs: rebuilding an InDesign leaflet through conversation, not clicks",
      "description": "A GUI hides complex code behind menus and drag handles you operate by hand. AI hides the same complexity behind a conversation. Recreating a hand-built InDesign leaflet as a YAML-to-LaTeX pipeline: abandoned in 2025 as beyond the time I could afford: is what made the difference concrete.",
      "url": "https://redaction-technique.org/blog/ai-will-soon-replace-guis",
      "markdown": "https://redaction-technique.org/blog/ai-will-soon-replace-guis.md",
      "locale": "en",
      "publishDate": "2026-09-01",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 424,
      "headings": [
        {
          "level": 2,
          "text": "InDesign layout limitations",
          "slug": "indesign-layout-limitations"
        },
        {
          "level": 2,
          "text": "Conversational layout iteration",
          "slug": "conversational-layout-iteration"
        },
        {
          "level": 2,
          "text": "Spreadsheet data mapping",
          "slug": "spreadsheet-data-mapping"
        },
        {
          "level": 2,
          "text": "Interface model comparison",
          "slug": "interface-model-comparison"
        },
        {
          "level": 2,
          "text": "Spatial judgment boundaries",
          "slug": "spatial-judgment-boundaries"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "ai",
        "docs-as-code",
        "latex",
        "yaml",
        "claude",
        "human-in-the-loop"
      ]
    },
    {
      "title": "Structured authoring’s hidden bill: when DITA XML pays off, and when it doesn’t",
      "description": "DITA XML can shrink the volume a technical writer creates, translates, and maintains: and a firewall vendor once got its documentation praised by the press because of it. But the productivity comes with a complexity bill. Here’s where structured authoring earns its keep, and where it’s overkill.",
      "url": "https://redaction-technique.org/blog/structured-authoring-hidden-bill-dita",
      "markdown": "https://redaction-technique.org/blog/structured-authoring-hidden-bill-dita.md",
      "locale": "en",
      "publishDate": "2026-08-25",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 444,
      "headings": [
        {
          "level": 2,
          "text": "Single-sourcing productivity mechanisms",
          "slug": "single-sourcing-productivity-mechanisms"
        },
        {
          "level": 2,
          "text": "Architectural overhead",
          "slug": "architectural-overhead"
        },
        {
          "level": 2,
          "text": "Phrase-level reuse pitfalls",
          "slug": "phrase-level-reuse-pitfalls"
        },
        {
          "level": 2,
          "text": "Scope and applicability boundaries",
          "slug": "scope-and-applicability-boundaries"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "dita-xml",
        "structured-authoring",
        "single-source-of-truth",
        "technical-writing",
        "i18n",
        "structured-content",
        "content-reuse"
      ]
    },
    {
      "title": "Three levels of technical documentation: wasteland, English garden, French garden",
      "description": "Technical documentation is like a garden, and it grows in three stages. The wasteland has no process and no owner. The English garden is cultivated but informal. The French garden is structured and deliberate. Knowing which one you’re standing in tells you what to fix next: and what not to.",
      "url": "https://redaction-technique.org/blog/three-levels-of-technical-documentation",
      "markdown": "https://redaction-technique.org/blog/three-levels-of-technical-documentation.md",
      "locale": "en",
      "publishDate": "2026-08-18",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 384,
      "headings": [
        {
          "level": 2,
          "text": "Wasteland architecture",
          "slug": "wasteland-architecture"
        },
        {
          "level": 2,
          "text": "Topic-based English gardens",
          "slug": "topic-based-english-gardens"
        },
        {
          "level": 2,
          "text": "Structured French gardens",
          "slug": "structured-french-gardens"
        },
        {
          "level": 2,
          "text": "Component interdependence",
          "slug": "component-interdependence"
        },
        {
          "level": 2,
          "text": "Maturity diagnostics",
          "slug": "maturity-diagnostics"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "technical-writing",
        "structured-authoring",
        "docs-as-code",
        "content-strategy"
      ]
    },
    {
      "title": "RGB to CMYK in Python: Pillow, LittleCMS, and the principle of checking without faking",
      "description": "The prepare_images.py walkthrough: converting every source image to CMYK using the FOGRA39 ICC profile via Pillow and LittleCMS, with black-point compensation. Resolution is checked at placed size: never faked, never upscaled.",
      "url": "https://redaction-technique.org/blog/rgb-to-cmyk-python",
      "markdown": "https://redaction-technique.org/blog/rgb-to-cmyk-python.md",
      "locale": "en",
      "publishDate": "2026-08-11",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 934,
      "headings": [
        {
          "level": 2,
          "text": "Convert upstream, not at the RIP",
          "slug": "convert-upstream-not-at-the-rip"
        },
        {
          "level": 2,
          "text": "Implementation",
          "slug": "implementation"
        },
        {
          "level": 2,
          "text": "Format, resolution, and color transforms",
          "slug": "format-resolution-and-color-transforms"
        },
        {
          "level": 2,
          "text": "Defect reporting",
          "slug": "defect-reporting"
        },
        {
          "level": 2,
          "text": "Post-processing pipeline integration",
          "slug": "post-processing-pipeline-integration"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "docs-as-code",
        "latex",
        "automation"
      ]
    },
    {
      "title": "The soft hyphen (U+00AD): the invisible character that breaks PDF text extraction",
      "description": "It’s invisible on screen. It prints correctly. But when text is extracted from the PDF — by an accessibility checker, a search engine, or a copy-paste — U+00AD surfaces as a garbage character between syllables. Here’s what it is, where it comes from, and how to find it.",
      "url": "https://redaction-technique.org/blog/soft-hyphen-u00ad",
      "markdown": "https://redaction-technique.org/blog/soft-hyphen-u00ad.md",
      "locale": "en",
      "publishDate": "2026-08-04",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1283,
      "headings": [
        {
          "level": 2,
          "text": "The character that hides in plain sight",
          "slug": "the-character-that-hides-in-plain-sight"
        },
        {
          "level": 2,
          "text": "What a soft hyphen is",
          "slug": "what-a-soft-hyphen-is"
        },
        {
          "level": 2,
          "text": "Where it comes from",
          "slug": "where-it-comes-from"
        },
        {
          "level": 2,
          "text": "How to find it",
          "slug": "how-to-find-it"
        },
        {
          "level": 2,
          "text": "How to fix it",
          "slug": "how-to-fix-it"
        },
        {
          "level": 2,
          "text": "The broader lesson",
          "slug": "the-broader-lesson"
        },
        {
          "level": 2,
          "text": "Summing up",
          "slug": "summing-up"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "typography",
        "latex",
        "docs-as-code",
        "accessibility",
        "pdf-ua"
      ]
    },
    {
      "title": "One source, three languages: the strict facts-vs-display-strings split",
      "description": "events.yaml holds no labels. traduction.yaml holds no facts. The generator resolves them at build time with --lang fr, --lang en, or --lang es. What enforcing this constraint looks like in practice, and why the discipline is worth the friction it creates.",
      "url": "https://redaction-technique.org/blog/one-source-three-languages",
      "markdown": "https://redaction-technique.org/blog/one-source-three-languages.md",
      "locale": "en",
      "publishDate": "2026-07-28",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1298,
      "headings": [
        {
          "level": 2,
          "text": "The distinction that makes multilingual output tractable",
          "slug": "the-distinction-that-makes-multilingual-output-tractable"
        },
        {
          "level": 2,
          "text": "The data layer: facts only",
          "slug": "the-data-layer-facts-only"
        },
        {
          "level": 2,
          "text": "The language layer: display strings only",
          "slug": "the-language-layer-display-strings-only"
        },
        {
          "level": 2,
          "text": "How the generator resolves them",
          "slug": "how-the-generator-resolves-them"
        },
        {
          "level": 2,
          "text": "What this means for adding a language",
          "slug": "what-this-means-for-adding-a-language"
        },
        {
          "level": 2,
          "text": "The constraint in practice",
          "slug": "the-constraint-in-practice"
        },
        {
          "level": 2,
          "text": "The broader principle",
          "slug": "the-broader-principle"
        },
        {
          "level": 2,
          "text": "Summing up",
          "slug": "summing-up"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "docs-as-code",
        "yaml",
        "single-source-of-truth",
        "automation",
        "structured-content"
      ]
    },
    {
      "title": "Reliability vs. latency: running Claude through the CLI so it can fix its own mistakes",
      "description": "Claude’s LaTeX output frequently didn’t compile. The fix wasn’t to prompt better — it was to close the feedback loop. What looked like a reliability problem turned out to be a latency problem.",
      "url": "https://redaction-technique.org/blog/reliability-vs-latency-claude-cli",
      "markdown": "https://redaction-technique.org/blog/reliability-vs-latency-claude-cli.md",
      "locale": "en",
      "publishDate": "2026-07-21",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1212,
      "headings": [
        {
          "level": 2,
          "text": "The problem with one-shot AI workflows",
          "slug": "the-problem-with-one-shot-ai-workflows"
        },
        {
          "level": 2,
          "text": "What the Claude Code CLI enables",
          "slug": "what-the-claude-code-cli-enables"
        },
        {
          "level": 2,
          "text": "The diagnostic insight: reliability vs. latency",
          "slug": "the-diagnostic-insight-reliability-vs-latency"
        },
        {
          "level": 2,
          "text": "What this requires in practice",
          "slug": "what-this-requires-in-practice"
        },
        {
          "level": 2,
          "text": "The failure mode the loop introduces",
          "slug": "the-failure-mode-the-loop-introduces"
        },
        {
          "level": 2,
          "text": "The broader lesson",
          "slug": "the-broader-lesson"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "ai",
        "latex",
        "automation",
        "claude",
        "human-in-the-loop"
      ]
    },
    {
      "title": "Persona prompting: you’re an experienced typographer, check this before printing",
      "description": "The same PDF, two different prompts. 'Is this well laid out?' returned vague positivity. 'You’re an experienced typographer, check this before printing’ returned a structured technical review. The before/after register change is a clean, demonstrable lesson.",
      "url": "https://redaction-technique.org/blog/persona-prompting-typographer",
      "markdown": "https://redaction-technique.org/blog/persona-prompting-typographer.md",
      "locale": "en",
      "publishDate": "2026-07-14",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1249,
      "headings": [
        {
          "level": 2,
          "text": "Two prompts, one PDF",
          "slug": "two-prompts-one-pdf"
        },
        {
          "level": 2,
          "text": "What the vague prompt returns",
          "slug": "what-the-vague-prompt-returns"
        },
        {
          "level": 2,
          "text": "What the persona prompt returns",
          "slug": "what-the-persona-prompt-returns"
        },
        {
          "level": 2,
          "text": "Macro inspection and line-numbered proofing",
          "slug": "macro-inspection-and-line-numbered-proofing"
        },
        {
          "level": 2,
          "text": "The mechanism",
          "slug": "the-mechanism"
        },
        {
          "level": 2,
          "text": "What this generalises to",
          "slug": "what-this-generalises-to"
        },
        {
          "level": 2,
          "text": "Summing up",
          "slug": "summing-up"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "ai",
        "prompting",
        "typography",
        "human-in-the-loop"
      ]
    },
    {
      "title": "PDF/X-4 from LuaLaTeX without Ghostscript: TrimBox, BleedBox, FOGRA39, and the pdfx package",
      "description": "Producing a PDF/X-4 press-ready file from LuaLaTeX without touching Ghostscript: the pdfx package, TrimBox/BleedBox geometry in points, FOGRA39 OutputIntent, CMYK-only color discipline, and XMP metadata — everything a print shop will verify.",
      "url": "https://redaction-technique.org/blog/pdfx4-lualatex-without-ghostscript",
      "markdown": "https://redaction-technique.org/blog/pdfx4-lualatex-without-ghostscript.md",
      "locale": "en",
      "publishDate": "2026-07-07",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1360,
      "headings": [
        {
          "level": 2,
          "text": "Why Ghostscript is the wrong tool for this job",
          "slug": "why-ghostscript-is-the-wrong-tool-for-this-job"
        },
        {
          "level": 2,
          "text": "The pdfx package",
          "slug": "the-pdfx-package"
        },
        {
          "level": 2,
          "text": "Box geometry",
          "slug": "box-geometry"
        },
        {
          "level": 2,
          "text": "CMYK-only color discipline",
          "slug": "cmyk-only-color-discipline"
        },
        {
          "level": 2,
          "text": "What the preflight verifies",
          "slug": "what-the-preflight-verifies"
        },
        {
          "level": 2,
          "text": "Post-processing without Ghostscript",
          "slug": "post-processing-without-ghostscript"
        },
        {
          "level": 2,
          "text": "Summing up",
          "slug": "summing-up"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "latex",
        "docs-as-code",
        "typography",
        "accessibility"
      ]
    },
    {
      "title": "Non-blocking preflight, or: a build that always produces a PDF",
      "description": "One hard stop, five soft failures, a renamed file, and a report alongside it. The design philosophy behind a preflight that never aborts — plus the pikepdf/PyMuPDF six-check implementation and the --strict flag for CI.",
      "url": "https://redaction-technique.org/blog/non-blocking-preflight-build-always-produces-pdf",
      "markdown": "https://redaction-technique.org/blog/non-blocking-preflight-build-always-produces-pdf.md",
      "locale": "en",
      "publishDate": "2026-06-30",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1677,
      "headings": [
        {
          "level": 2,
          "text": "The design philosophy",
          "slug": "the-design-philosophy"
        },
        {
          "level": 2,
          "text": "The six checks",
          "slug": "the-six-checks"
        },
        {
          "level": 2,
          "text": "Two checks that need care",
          "slug": "two-checks-that-need-care"
        },
        {
          "level": 2,
          "text": "The orchestrator",
          "slug": "the-orchestrator"
        },
        {
          "level": 2,
          "text": "Why this matters in practice",
          "slug": "why-this-matters-in-practice"
        },
        {
          "level": 2,
          "text": "The extension point",
          "slug": "the-extension-point"
        },
        {
          "level": 2,
          "text": "Summing up",
          "slug": "summing-up"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "docs-as-code",
        "latex",
        "automation"
      ]
    },
    {
      "title": "Why hand-maintained InDesign files rot — and what docs-as-code does instead",
      "description": "A 370-cell calendar that shifts every year. A lead’s name in three places. An IBAN in an invisible text box. These are not unusual InDesign problems — they are what InDesign files become when they accumulate facts with no single home. Two projects show what the alternative looks like — and where InDesign’s own global tools stop short.",
      "url": "https://redaction-technique.org/blog/indesign-vs-docs-as-code",
      "markdown": "https://redaction-technique.org/blog/indesign-vs-docs-as-code.md",
      "locale": "en",
      "publishDate": "2026-06-23",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 2749,
      "headings": [
        {
          "level": 2,
          "text": "The same problem, two artifacts",
          "slug": "the-same-problem-two-artifacts"
        },
        {
          "level": 2,
          "text": "What \"no single home\" means in practice",
          "slug": "what-no-single-home-means-in-practice"
        },
        {
          "level": 2,
          "text": "But doesn’t InDesign already solve this?",
          "slug": "but-doesnt-indesign-already-solve-this"
        },
        {
          "level": 2,
          "text": "What docs-as-code does instead",
          "slug": "what-docs-as-code-does-instead"
        },
        {
          "level": 2,
          "text": "Late changes that stayed cheap",
          "slug": "late-changes-that-stayed-cheap"
        },
        {
          "level": 2,
          "text": "Build traceability and platform info",
          "slug": "build-traceability-and-platform-info"
        },
        {
          "level": 2,
          "text": "The structural reason",
          "slug": "the-structural-reason"
        },
        {
          "level": 2,
          "text": "What this costs",
          "slug": "what-this-costs"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "docs-as-code",
        "latex",
        "git",
        "automation",
        "single-source-of-truth"
      ]
    },
    {
      "title": "Transforming a corpus of 7,000 pages into living knowledge",
      "description": "From a massive archive of 7,000 pages to daily insights, quote retrieval, and AI-powered thematic digests: this project turns static content into a living flow of clarity, focus, and well-being.",
      "url": "https://redaction-technique.org/blog/transforming-corpus-ai-living-knowledge",
      "markdown": "https://redaction-technique.org/blog/transforming-corpus-ai-living-knowledge.md",
      "locale": "en",
      "publishDate": "2025-11-01",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1041,
      "headings": [
        {
          "level": 2,
          "text": "From 7,000 pages to daily insights",
          "slug": "from-7000-pages-to-daily-insights"
        },
        {
          "level": 2,
          "text": "Closing the audience gap with AI-curated content",
          "slug": "closing-the-audience-gap-with-ai-curated-content"
        },
        {
          "level": 2,
          "text": "Exploring audience concerns through Q/A sessions",
          "slug": "exploring-audience-concerns-through-qa-sessions"
        },
        {
          "level": 2,
          "text": "Curating content and quotes from identified topics",
          "slug": "curating-content-and-quotes-from-identified-topics"
        },
        {
          "level": 2,
          "text": "From files to flow",
          "slug": "from-files-to-flow"
        },
        {
          "level": 2,
          "text": "Scoring, metadata, and thematic discovery",
          "slug": "scoring-metadata-and-thematic-discovery"
        },
        {
          "level": 2,
          "text": "From AI-scored digests to thematic discovery dimensions",
          "slug": "from-ai-scored-digests-to-thematic-discovery-dimensions"
        },
        {
          "level": 2,
          "text": "From quotes to conversations",
          "slug": "from-quotes-to-conversations"
        },
        {
          "level": 2,
          "text": "Toward a living, AI-powered knowledge archive",
          "slug": "toward-a-living-ai-powered-knowledge-archive"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "AI",
        "Knowledge",
        "Curation",
        "Discovery"
      ]
    },
    {
      "title": "1.8 million words, freed from Word 97 and made searchable",
      "description": "1,800 lecture transcripts — 1.8 million words once trapped in Word 97 files — converted to Markdown, scored and tagged by AI, and turned into a searchable discovery platform that also generates print-ready LaTeX anthologies.",
      "url": "https://redaction-technique.org/blog/transforming-meditation-classes-ai-discovery",
      "markdown": "https://redaction-technique.org/blog/transforming-meditation-classes-ai-discovery.md",
      "locale": "en",
      "publishDate": "2025-10-28",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1511,
      "headings": [
        {
          "level": 2,
          "text": "From Word 97 lecture transcripts to structured Markdown",
          "slug": "from-word-97-lecture-transcripts-to-structured-markdown"
        },
        {
          "level": 2,
          "text": "Objective: building an AI-enabled knowledge platform from 1,800 articles",
          "slug": "objective-building-an-ai-enabled-knowledge-platform-from-1800-articles"
        },
        {
          "level": 2,
          "text": "Analysis and cleaning",
          "slug": "analysis-and-cleaning"
        },
        {
          "level": 2,
          "text": "Metadata and tagging",
          "slug": "metadata-and-tagging"
        },
        {
          "level": 2,
          "text": "Indexing and search",
          "slug": "indexing-and-search"
        },
        {
          "level": 2,
          "text": "Interactive AI layer",
          "slug": "interactive-ai-layer"
        },
        {
          "level": 2,
          "text": "Deploying the AI discovery platform for web and API access",
          "slug": "deploying-the-ai-discovery-platform-for-web-and-api-access"
        },
        {
          "level": 2,
          "text": "Automated thematic scoring of Markdown files with GPT",
          "slug": "automated-thematic-scoring-of-markdown-files-with-gpt"
        },
        {
          "level": 2,
          "text": "From Markdown to LaTeX: automating the creation of various anthologies",
          "slug": "from-markdown-to-latex-automating-the-creation-of-various-anthologies"
        },
        {
          "level": 2,
          "text": "Outcome: a scalable AI-powered publishing platform for deep reading",
          "slug": "outcome-a-scalable-ai-powered-publishing-platform-for-deep-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "AI",
        "LaTeX",
        "Discovery",
        "Content"
      ]
    },
    {
      "title": "Less is more: from psychology to technical writing",
      "description": "How Kahneman’s idea of 'less is more’ connects with minimalist documentation — and how layering keeps clarity from becoming oversimplification.",
      "url": "https://redaction-technique.org/blog/less-is-more-layering",
      "markdown": "https://redaction-technique.org/blog/less-is-more-layering.md",
      "locale": "en",
      "publishDate": "2025-10-21",
      "author": "Olivier Carrère",
      "category": "Technical Writing",
      "wordCount": 984,
      "headings": [
        {
          "level": 2,
          "text": "Less is more: what Kahneman teaches us about technical writing",
          "slug": "less-is-more-what-kahneman-teaches-us-about-technical-writing"
        },
        {
          "level": 2,
          "text": "System 1 and System 2: the two readers in every mind",
          "slug": "system-1-and-system-2-the-two-readers-in-every-mind"
        },
        {
          "level": 2,
          "text": "How System 1 shapes the reader’s first impression",
          "slug": "how-system-1-shapes-the-readers-first-impression"
        },
        {
          "level": 2,
          "text": "How System 2 demands depth and precision",
          "slug": "how-system-2-demands-depth-and-precision"
        },
        {
          "level": 2,
          "text": "Why “less” works: cognitive economy",
          "slug": "why-less-works-cognitive-economy"
        },
        {
          "level": 2,
          "text": "When “less” becomes “not enough”",
          "slug": "when-less-becomes-not-enough"
        },
        {
          "level": 2,
          "text": "Designing documentation for two minds",
          "slug": "designing-documentation-for-two-minds"
        },
        {
          "level": 2,
          "text": "The deeper lesson: tell the right story",
          "slug": "the-deeper-lesson-tell-the-right-story"
        },
        {
          "level": 2,
          "text": "TL;DR for technical writers",
          "slug": "tldr-for-technical-writers"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "Minimalism",
        "Documentation",
        "UX Writing",
        "Kahneman",
        "Layering"
      ]
    },
    {
      "title": "Slow food for fast thinking: designing with cognitive ease in mind",
      "description": "What can Kahneman’s Systems 1 and 2 teach us about technical writing? This post explores how minimalism and DITA structure align with cognitive systems to make documentation more intuitive and human-centered.",
      "url": "https://redaction-technique.org/blog/systems-1-2-affordance-minimalism-technical-writing",
      "markdown": "https://redaction-technique.org/blog/systems-1-2-affordance-minimalism-technical-writing.md",
      "locale": "en",
      "publishDate": "2025-10-04",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1463,
      "headings": [
        {
          "level": 2,
          "text": "Food for thought: Systems 1 and 2, and minimalism",
          "slug": "food-for-thought-systems-1-and-2-and-minimalism"
        },
        {
          "level": 2,
          "text": "System 1: misunderstood, yet remarkably efficient",
          "slug": "system-1-misunderstood-yet-remarkably-efficient"
        },
        {
          "level": 2,
          "text": "Writing for System 1",
          "slug": "writing-for-system-1"
        },
        {
          "level": 2,
          "text": "Foster cognitive ease in technical documentation",
          "slug": "foster-cognitive-ease-in-technical-documentation"
        },
        {
          "level": 2,
          "text": "Minimalism and the reduction of cognitive load",
          "slug": "minimalism-and-the-reduction-of-cognitive-load"
        },
        {
          "level": 2,
          "text": "DITA and systems thinking",
          "slug": "dita-and-systems-thinking"
        },
        {
          "level": 2,
          "text": "A concrete use case: writing for cognitive ease",
          "slug": "a-concrete-use-case-writing-for-cognitive-ease"
        },
        {
          "level": 2,
          "text": "Technical diagrams: where writers’ System 2 meets readers’ System 1",
          "slug": "technical-diagrams-where-writers-system-2-meets-readers-system-1"
        },
        {
          "level": 2,
          "text": "AI as a cognitive partner: offloading System 2 to strengthen System 1",
          "slug": "ai-as-a-cognitive-partner-offloading-system-2-to-strengthen-system-1"
        },
        {
          "level": 2,
          "text": "Minimalism, affordance, and Systems 1 and 2 working together",
          "slug": "minimalism-affordance-and-systems-1-and-2-working-together"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "Cognitive Psychology",
        "Technical Writing",
        "DITA",
        "Minimalism"
      ]
    },
    {
      "title": "What YAML gives technical docs that XML and Markdown can’t",
      "description": "A growing engine-oil catalog — brands, viscosities, prices — becomes a maintenance nightmare as a Markdown table and a verbose tangle as DITA XML. One YAML file holds each fact once and generates every table, doc page, and app view from it.",
      "url": "https://redaction-technique.org/blog/scalable-maintainable-technical-docs-with-yaml",
      "markdown": "https://redaction-technique.org/blog/scalable-maintainable-technical-docs-with-yaml.md",
      "locale": "en",
      "publishDate": "2025-09-27",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1793,
      "headings": [
        {
          "level": 2,
          "text": "Imaginary scenario: choosing the right engine oil",
          "slug": "imaginary-scenario-choosing-the-right-engine-oil"
        },
        {
          "level": 3,
          "text": "The XML temptation",
          "slug": "the-xml-temptation"
        },
        {
          "level": 3,
          "text": "Markdown tables: simple but limiting",
          "slug": "markdown-tables-simple-but-limiting"
        },
        {
          "level": 3,
          "text": "Databases: powerful, but a poor fit for source content",
          "slug": "databases-powerful-but-a-poor-fit-for-source-content"
        },
        {
          "level": 3,
          "text": "YAML: readable, structured, and scalable",
          "slug": "yaml-readable-structured-and-scalable"
        },
        {
          "level": 3,
          "text": "Benefits of YAML",
          "slug": "benefits-of-yaml"
        },
        {
          "level": 2,
          "text": "YAML versatility: one source, multiple output formats",
          "slug": "yaml-versatility-one-source-multiple-output-formats"
        },
        {
          "level": 2,
          "text": "Easier diffs and cleaner version control",
          "slug": "easier-diffs-and-cleaner-version-control"
        },
        {
          "level": 3,
          "text": "Growing with your YAML",
          "slug": "growing-with-your-yaml"
        },
        {
          "level": 2,
          "text": "Why a structured source is better than embedded tables",
          "slug": "why-a-structured-source-is-better-than-embedded-tables"
        },
        {
          "level": 2,
          "text": "Where YAML wins, and where it doesn’t",
          "slug": "where-yaml-wins-and-where-it-doesnt"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "YAML",
        "OpenAPI",
        "Schema",
        "Structured Data",
        "Technical Writing",
        "Content Reuse",
        "Validation"
      ]
    },
    {
      "title": "One YAML file, three outputs: API docs, web, and mobile",
      "description": "Learn how one YAML file can serve as a single source of truth for APIs, powering docs, HTML documentation, and even mobile apps.",
      "url": "https://redaction-technique.org/blog/experimental-astro-api-docs",
      "markdown": "https://redaction-technique.org/blog/experimental-astro-api-docs.md",
      "locale": "en",
      "publishDate": "2025-09-24",
      "author": "Olivier Carrère",
      "category": "Development",
      "wordCount": 410,
      "headings": [
        {
          "level": 2,
          "text": "One YAML file, many outputs",
          "slug": "one-yaml-file-many-outputs"
        },
        {
          "level": 2,
          "text": "Query the API in practice",
          "slug": "query-the-api-in-practice"
        },
        {
          "level": 3,
          "text": "Use fetch (JavaScript)",
          "slug": "use-fetch-javascript"
        },
        {
          "level": 3,
          "text": "Use cURL (terminal)",
          "slug": "use-curl-terminal"
        },
        {
          "level": 2,
          "text": "Example JSON output",
          "slug": "example-json-output"
        },
        {
          "level": 3,
          "text": "GET /api/oil-types",
          "slug": "get-apioil-types"
        },
        {
          "level": 2,
          "text": "Why YAML as the source of truth?",
          "slug": "why-yaml-as-the-source-of-truth"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "Astro",
        "API",
        "OpenAPI",
        "YAML",
        "Documentation"
      ]
    },
    {
      "title": "Translating legacy French docs to English with DeepL and GPT-4o",
      "description": "Professionally translating hundreds of legacy French Markdown files would have cost a fortune. Instead, a DeepL-then-GPT-4o pipeline with Git diffs as a safety net: keep the good translations file by file, discard the rest, rebuild.",
      "url": "https://redaction-technique.org/blog/ai-translation-legacy-technical-docs",
      "markdown": "https://redaction-technique.org/blog/ai-translation-legacy-technical-docs.md",
      "locale": "en",
      "publishDate": "2025-09-22",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 732,
      "headings": [
        {
          "level": 2,
          "text": "Automatic translation with DeepL",
          "slug": "automatic-translation-with-deepl"
        },
        {
          "level": 2,
          "text": "Manual cleanup of broken Markdown after DeepL translation",
          "slug": "manual-cleanup-of-broken-markdown-after-deepl-translation"
        },
        {
          "level": 2,
          "text": "AI proofreading with GPT-4o",
          "slug": "ai-proofreading-with-gpt-4o"
        },
        {
          "level": 2,
          "text": "Selective review with Git",
          "slug": "selective-review-with-git"
        },
        {
          "level": 2,
          "text": "Build the Astro site and fix translated media",
          "slug": "build-the-astro-site-and-fix-translated-media"
        },
        {
          "level": 2,
          "text": "Iterating through the full documentation set",
          "slug": "iterating-through-the-full-documentation-set"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "AI",
        "Translation",
        "Technical Writing",
        "Markdown",
        "DeepL",
        "GPT-4o"
      ]
    },
    {
      "title": "Manage content in files, not databases",
      "description": "Databases are not always the best place for your content. By storing it in plain files, you gain speed, security, Git-based workflows, and a simpler, more reliable publishing stack.",
      "url": "https://redaction-technique.org/blog/manage-content-in-files-not-databases",
      "markdown": "https://redaction-technique.org/blog/manage-content-in-files-not-databases.md",
      "locale": "en",
      "publishDate": "2025-09-18",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 1100,
      "headings": [
        {
          "level": 2,
          "text": "The Linux principle: everything is a file",
          "slug": "the-linux-principle-everything-is-a-file"
        },
        {
          "level": 2,
          "text": "Productivity & tooling: use the tools you already know",
          "slug": "productivity-tooling-use-the-tools-you-already-know"
        },
        {
          "level": 2,
          "text": "Version control with Git: track, revert, branch",
          "slug": "version-control-with-git-track-revert-branch"
        },
        {
          "level": 2,
          "text": "Feature branch workflow for documentation",
          "slug": "feature-branch-workflow-for-documentation"
        },
        {
          "level": 2,
          "text": "Security: fewer attack surfaces",
          "slug": "security-fewer-attack-surfaces"
        },
        {
          "level": 2,
          "text": "Cost: free for small projects on modern CDNs",
          "slug": "cost-free-for-small-projects-on-modern-cdns"
        },
        {
          "level": 2,
          "text": "Speed & SEO: ultra-fast delivery",
          "slug": "speed-seo-ultra-fast-delivery"
        },
        {
          "level": 2,
          "text": "Reliability: simpler platform than LAMP stacks",
          "slug": "reliability-simpler-platform-than-lamp-stacks"
        },
        {
          "level": 2,
          "text": "More control over content changes",
          "slug": "more-control-over-content-changes"
        },
        {
          "level": 2,
          "text": "Caveats: when a database might still be right",
          "slug": "caveats-when-a-database-might-still-be-right"
        },
        {
          "level": 2,
          "text": "Quick practical checklist to get started",
          "slug": "quick-practical-checklist-to-get-started"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "Static Sites",
        "Linux Philosophy",
        "Docs-as-Code",
        "Content Management",
        "Git"
      ]
    },
    {
      "title": "Strong information typing without the XML overhead",
      "description": "You don’t need the complexity of DITA XML to benefit from its discipline. With Markdown and modern docs-as-code workflows, technical writers can apply strong information typing-tasks, concepts, and references-using lightweight, open tools.",
      "url": "https://redaction-technique.org/blog/strong-information-typing-without-xml-overhead",
      "markdown": "https://redaction-technique.org/blog/strong-information-typing-without-xml-overhead.md",
      "locale": "en",
      "publishDate": "2025-09-17",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 705,
      "headings": [
        {
          "level": 2,
          "text": "The DITA mindset",
          "slug": "the-dita-mindset"
        },
        {
          "level": 2,
          "text": "DITA-like task pages",
          "slug": "dita-like-task-pages"
        },
        {
          "level": 2,
          "text": "DITA-like concept pages",
          "slug": "dita-like-concept-pages"
        },
        {
          "level": 2,
          "text": "Why DITA information typing still matters in Markdown docs",
          "slug": "why-dita-information-typing-still-matters-in-markdown-docs"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "DITA",
        "Markdown",
        "Information Typing",
        "Content Model",
        "Docs-as-Code"
      ]
    },
    {
      "title": "A decade of Word 97 conference files, rebuilt for the web for $30",
      "description": "How we transformed unstructured Word 97/2000 files into a decade-long web publication of conferences-using Markdown, Python, and GPT-powered automation for just $30.",
      "url": "https://redaction-technique.org/blog/turn-word-files-seo-optimized-web-pages-ai",
      "markdown": "https://redaction-technique.org/blog/turn-word-files-seo-optimized-web-pages-ai.md",
      "locale": "en",
      "publishDate": "2025-09-01",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 883,
      "headings": [
        {
          "level": 2,
          "text": "Preserving a legacy of conferences",
          "slug": "preserving-a-legacy-of-conferences"
        },
        {
          "level": 2,
          "text": "Structuring legacy content",
          "slug": "structuring-legacy-content"
        },
        {
          "level": 2,
          "text": "Splitting content into sections",
          "slug": "splitting-content-into-sections"
        },
        {
          "level": 2,
          "text": "Enriching metadata with GPT-4o",
          "slug": "enriching-metadata-with-gpt-4o"
        },
        {
          "level": 2,
          "text": "Iterative workflow",
          "slug": "iterative-workflow"
        },
        {
          "level": 2,
          "text": "The scale of the project",
          "slug": "the-scale-of-the-project"
        },
        {
          "level": 2,
          "text": "A living digital archive",
          "slug": "a-living-digital-archive"
        },
        {
          "level": 2,
          "text": "Lessons learned converting Word archives to web pages with AI",
          "slug": "lessons-learned-converting-word-archives-to-web-pages-with-ai"
        },
        {
          "level": 2,
          "text": "Next steps for the digital archive and AI content pipeline",
          "slug": "next-steps-for-the-digital-archive-and-ai-content-pipeline"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "DITA",
        "Markdown",
        "Information Typing",
        "AI",
        "Python",
        "Digital Archives",
        "Automation",
        "SEO"
      ]
    },
    {
      "title": "From DITA XML to Markdown: lightweight information typing",
      "description": "DITA brought structure through XML, but its complexity often felt heavy. Markdown offers a lightweight alternative where technical writers can still apply DITA’s information typing principles — using open, freely available tools and without the XML overhead.",
      "url": "https://redaction-technique.org/blog/dita-xml-to-markdown-lightweight-information-typing",
      "markdown": "https://redaction-technique.org/blog/dita-xml-to-markdown-lightweight-information-typing.md",
      "locale": "en",
      "publishDate": "2025-08-01",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 362,
      "headings": [
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "DITA",
        "Markdown",
        "Information Typing"
      ]
    },
    {
      "title": "A web journey: from HTML to Git-based Markdown workflows",
      "description": "Tracing over two decades of web publishing, from raw HTML and Dreamweaver to CMSes, structured content, static site generators, and modern Git-based Markdown workflows. Lessons for solo and team content developers on maintainability, collaboration, and performance.",
      "url": "https://redaction-technique.org/blog/web-journey-html-to-git-markdown",
      "markdown": "https://redaction-technique.org/blog/web-journey-html-to-git-markdown.md",
      "locale": "en",
      "publishDate": "2025-07-10",
      "author": "Olivier Carrère",
      "category": "Blog",
      "wordCount": 757,
      "headings": [
        {
          "level": 2,
          "text": "Early days: HTML in Notepad and generators",
          "slug": "early-days-html-in-notepad-and-generators"
        },
        {
          "level": 2,
          "text": "Enter CMS: SPIP and WordPress",
          "slug": "enter-cms-spip-and-wordpress"
        },
        {
          "level": 2,
          "text": "Structured content: DocBook and DITA",
          "slug": "structured-content-docbook-and-dita"
        },
        {
          "level": 2,
          "text": "Static site generators and lightweight markup languages",
          "slug": "static-site-generators-and-lightweight-markup-languages"
        },
        {
          "level": 2,
          "text": "Modern web workflows: beyond CMS",
          "slug": "modern-web-workflows-beyond-cms"
        },
        {
          "level": 2,
          "text": "Lessons learned from two decades of web publishing evolution",
          "slug": "lessons-learned-from-two-decades-of-web-publishing-evolution"
        },
        {
          "level": 2,
          "text": "Takeaways for solo content developers and small teams",
          "slug": "takeaways-for-solo-content-developers-and-small-teams"
        },
        {
          "level": 2,
          "text": "Related reading",
          "slug": "related-reading"
        },
        {
          "level": 2,
          "text": "External sources",
          "slug": "external-sources"
        }
      ],
      "tags": [
        "HTML",
        "WordPress",
        "DITA",
        "Markdown",
        "Sphinx",
        "Static Sites",
        "Docs-as-Code",
        "Git",
        "Content Management"
      ]
    }
  ]
}