Ingestion
A feed entry doesn't land in a side table — it becomes a content record with a readable body, an attributed image, and the same lifecycle every other piece of platform content follows.
Dedup & lifecycle
Every entry is keyed by its source and external GUID — so re-fetching a feed is idempotent, however often the schedule fires.
Normalization
Feed HTML is messy. Every item gets a clean, structured body — and the mess is kept on file, in case you ever want to re-process it.
content:encoded, Atom content, or JSON Feed's content_html — is converted to the platform's rich-text document model.original — for audit or re-processing.<!-- original — kept as `original` --> <div><b>Breaking:</b> markets rally…</div> // stored body — rich-text document { "type": "doc", "content": [ { "type": "paragraph", … } ] }
Featured images
Each item's most prominent image becomes its own content record — imported into platform storage, attributed, and linked to the item.
media:content with image semantics, media:thumbnail, an image enclosure, JSON Feed's image or banner_image — falling back to the first image in the body HTML.media:credit, or the publisher's host when none is declared.image.featured relationship, and relationships persist across re-fetches — a forced fetch backfills images for older items.media:content / media:thumbnailenclosureimage · banner_image<img> in the bodyimage.featuredKeep exploring