Introduce a source-neutral ingestion model for external feeds #25

Closed
opened 2026-09-28 16:54:12 +00:00 by Michael Westergaard · 1 comment
Owner

Problem

Links and AutoBoost currently model ActivityPub actors and Announce of remote object IDs. RSS, Atom, and direct Bluesky need a common path for user-added sources and imported items without putting protocol logic in link, UI, or federation transport code.

Scope

  • Define application/domain contracts for a linked source, normalized item, stable source/item identity, provenance, timestamps, URL, text, and media metadata. Preserve the source URL and author attribution.
  • Add provider adapters behind those contracts; keep source-specific fetch/parse logic in Services and persistence behind Application repository interfaces. The Web layer only configures sources and shows status.
  • Persist per-source polling/checkpoint state and item identity. Handle initial import limits, edits, duplicates, removals, disabled/deleted sources, transient failures, and bounded retries without duplicate publication.
  • Apply outbound-fetch protections (HTTP(S) only, redirects/DNS/private-network restrictions, response-size and timeout limits) to user-supplied feed URLs. Treat external content as untrusted.
  • Specify ownership/verification semantics: adding a public feed is not proof that the user owns it; verified-source claims require a separate mechanism.

Acceptance

Functional and contract tests pin normalization, idempotent polling, source lifecycle, error isolation, and fetch safety. Keep unit tests in regular CI; use manually run integration tests only for real HTTP/database boundaries. Document the boundary and migration of current ActivityPub-link behavior without regressions.

Dependency for RSS, Atom, and Bluesky source tickets. Publication to followers is tracked separately.

## Problem Links and AutoBoost currently model ActivityPub actors and Announce of remote object IDs. RSS, Atom, and direct Bluesky need a common path for user-added sources and imported items without putting protocol logic in link, UI, or federation transport code. ## Scope - Define application/domain contracts for a linked source, normalized item, stable source/item identity, provenance, timestamps, URL, text, and media metadata. Preserve the source URL and author attribution. - Add provider adapters behind those contracts; keep source-specific fetch/parse logic in Services and persistence behind Application repository interfaces. The Web layer only configures sources and shows status. - Persist per-source polling/checkpoint state and item identity. Handle initial import limits, edits, duplicates, removals, disabled/deleted sources, transient failures, and bounded retries without duplicate publication. - Apply outbound-fetch protections (HTTP(S) only, redirects/DNS/private-network restrictions, response-size and timeout limits) to user-supplied feed URLs. Treat external content as untrusted. - Specify ownership/verification semantics: adding a public feed is not proof that the user owns it; verified-source claims require a separate mechanism. ## Acceptance Functional and contract tests pin normalization, idempotent polling, source lifecycle, error isolation, and fetch safety. Keep unit tests in regular CI; use manually run integration tests only for real HTTP/database boundaries. Document the boundary and migration of current ActivityPub-link behavior without regressions. Dependency for RSS, Atom, and Bluesky source tickets. Publication to followers is tracked separately.
Author
Owner

Implemented in commits 883e7f5 and 6430cea on michael. The external-source model, durable polling and checkpointing, item deduplication, and lifecycle handling are covered by unit and repository contract tests. Final Forgejo CI run 1101 and integration run 1102 passed. Publication as local ActivityPub posts is tracked in issue 26.

Implemented in commits 883e7f5 and 6430cea on michael. The external-source model, durable polling and checkpointing, item deduplication, and lifecycle handling are covered by unit and repository contract tests. Final Forgejo CI run 1101 and integration run 1102 passed. Publication as local ActivityPub posts is tracked in issue 26.
Sign in to join this conversation.
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
klafbang/fediprofile#25
No description provided.