Content-Downloads und gerenderte OG-Bilder können einen kurzlebigen CI-Runner
überdauern. Sie haben unterschiedliche Invalidierungsregeln und deshalb je ein
eigenes duxt-Kommando.

## Öffentliche Remote-Quellen

```yaml [.github/workflows/deploy.yml]
- id: sources
  run: duxt-cache-key --root . --github >> "$GITHUB_OUTPUT"
- if: steps.sources.outputs.cacheable == 'true'
  uses: actions/cache@v6
  with:
    path: ${{ steps.sources.outputs.paths }}
    key: ${{ steps.sources.outputs.key }}
```

`--root` nennt die konsumierende Nuxt-App. Das Kommando läuft nach der
Installation und vor dem Build. Sein Key enthält die aufgelösten Repositories
und Refs; `contents.sqlite*` bleibt ausgeschlossen, weil es ein Parsergebnis und
kein Download ist. Schon eine private, SSH- oder authentifizierte Quelle setzt
`cacheable=false` für die gesamte Liste. Ohne `--github` zeigt das Kommando die
redigierten Eingaben und den Grund.

## Gerenderte OG-Bilder

```yaml [.github/workflows/deploy.yml]
- id: og
  run: duxt-og-cache --root . --run "$GITHUB_SHA" --github >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
  with:
    path: ${{ steps.og.outputs.path }}
    key: ${{ steps.og.outputs.key }}
    restore-keys: ${{ steps.og.outputs['restore-keys'] }}
```

Die konsumierende Nuxt-Konfiguration bindet zusätzlich
`@kirchdev/duxt/og-image-cache` ein und fingerprintet Theme-Optionen, Fonts und
Renderer-Versionen. Geänderte Eingaben leeren einen wiederhergestellten Cache,
bevor ein altes Bild ausgeliefert werden kann. Nach dem Build berichtet
`duxt-og-cache --root . --report --since "$STARTED_MS" --log build.log` die
tatsächliche Wiederverwendung.

## Checkliste

- [ ] `--root` zeigt auf die konsumierende App.
- [ ] Der Source-Cache läuft nur bei `cacheable == 'true'`.
- [ ] `contents.sqlite*` und private Quellen gelangen nicht in den Cache.
- [ ] Der OG-Cache verwendet die ausgegebenen Rolling Restore Keys.
- [ ] Die Nuxt-Konfiguration fingerprintet site-eigene Rendering-Eingaben.