---
title: Eigene Quellen
description: >-
  Binde mit custom() ein beliebiges Backend in Blume ein – übergib ein Objekt, das das ContentSource-Interface implementiert, oder eine eingebaute Engine mit eigenen Serializern.
---

Jedes Objekt, das das `ContentSource`-Interface implementiert, kannst du an `custom()` übergeben. Auf diesem Weg bindest du einen Adapter mit eigenen Serializern oder jedes andere nicht eingebaute Backend ein, ohne dass dessen SDK in der Kerninstallation landet:

```ts blume.config.ts
import { defineConfig } from "blume";
import { custom, filesystem } from "blume/sources";
import { sanitySource } from "blume/sources/sanity.ts";

export default defineConfig({
  content: {
    sources: [
      filesystem({ root: "docs" }),
      custom(
        sanitySource({
          name: "guides",
          prefix: "guides",
          projectId: "abc123",
          dataset: "production",
          query: `*[_type == "guide"]`,
          // Map custom Portable Text blocks to Blume components
          serializers: {
            callout: (block) => `<Callout>${block.text}</Callout>`,
          },
        })
      ),
    ],
  },
});
```

Eine Quelle, die du mit einer von Blumes Engine-Factories erstellst, wie `sanitySource` oben, wird auf dem Kontext des laufenden Befehls neu aufgebaut. Dadurch liest sie unter `--preview` Entwürfe und legt ihren Snapshot in `.blume/cache` ab, genau wie der eingebaute Adapter. Eine selbst geschriebene Quelle kann dasselbe leisten: Implementiere dafür `withContext(ctx)` und gib die Quelle neu aufgebaut auf diesem Kontext zurück.

`custom()` nimmt eine `ContentSource`-Instanz statt eines Options-Objekts entgegen. Daher gibt es keine Stelle, an der du die [gemeinsamen Optionen](/de/docs/content/sources#adapters) `prefix` oder `pollInterval` übergeben könntest. Die Quelle setzt ihre `prefix`-Eigenschaft selbst, und wie sie Daten erneut abruft, bestimmt ihre `watch`-Methode. Weil sie eine Live-Instanz statt reiner Daten enthält, deklariert sie keine eigene Laufzeitabhängigkeit und kein eigenes Secret. Darum kümmert sich die Instanz selbst.

Wenn deine eigene Quelle lokale Dateien liest, sollte sie `sourcePath` für jeden Eintrag und `contentRoot` für die Quelle selbst setzen. `sourcePath` nennt die Datei in Diagnosemeldungen und sorgt dafür, dass relative Bilder relativ zu dieser Datei aufgelöst werden. `contentRoot` begrenzt das git-`log`, aus dem die Datumsangaben der Seiten stammen. Ohne `contentRoot` bekommen die Seiten der Quelle kein aus git abgeleitetes [„Zuletzt aktualisiert“-Datum](/de/docs/configuration#last-modified).
