feat: wire community feed posts to cf-core.activitypub (Fediverse publishing) #113

Closed
opened 2026-04-20 08:18:53 -07:00 by pyr0ball · 0 comments
Owner

Summary

Wire Kiwi community feed posts into the Fediverse — Mastodon, Lemmy, and Kiwi-to-Kiwi WAN federation.

Design spec

circuitforge-plans/kiwi/superpowers/specs/2026-04-21-activitypub-federation-design.md

Key decisions (see spec for full rationale)

  • Actor model: Single instance actor (kiwi@host), not per-user — pseudonyms must not be resolvable AP identities
  • AP object type: Note with structured HTML — universally supported by Mastodon and Lemmy
  • Mastodon: User OAuth (write:statuses only) to their own account, not a Kiwi bot
  • Lemmy: Federate to existing communities via AP — no self-hosted Lemmy instance
  • Kiwi-to-Kiwi: Extend mDNS approach to WAN via AP Follow

Open questions (blocking design sign-off)

  1. Sub-path vs subdomain for WebFinger (menagerie.circuitforge.tech/kiwi complicates /.well-known/)
  2. Lemmy: spin up lemmy.circuitforge.tech or federate to existing communities?
  3. Mastodon token storage: Heimdall user_preferences or encrypted per-user kiwi.db?
  4. Image attachment in MVP or deferred?
  5. Moderation/block-list strategy?

Build sequence (10 steps)

  1. Migration 029 — ap_followers, ap_deliveries, ap_received tables
  2. RSA keypair management (app/core/ap_keys.py)
  3. WebFinger + Actor read endpoints
  4. Outbox — serve existing posts as AP Notes
  5. Inbox — HTTP Signature verify + activity dispatch
  6. AP delivery service (BackgroundTask)
  7. Wire publish_post() to trigger delivery
  8. Mastodon OAuth endpoints
  9. Publish modal UI — Mastodon/Lemmy toggles
  10. cf-core.activitypub extraction (Circuit-Forge/circuitforge-core#46)

Tier gates

  • Publish to Mastodon/Lemmy: Paid / BYOK-unlockable
  • Read federated content + receive inbox: Free (self-hosted with AP_ENABLED)
  • Mastodon account connection: Free
## Summary Wire Kiwi community feed posts into the Fediverse — Mastodon, Lemmy, and Kiwi-to-Kiwi WAN federation. ## Design spec `circuitforge-plans/kiwi/superpowers/specs/2026-04-21-activitypub-federation-design.md` ## Key decisions (see spec for full rationale) - **Actor model:** Single instance actor (`kiwi@host`), not per-user — pseudonyms must not be resolvable AP identities - **AP object type:** `Note` with structured HTML — universally supported by Mastodon and Lemmy - **Mastodon:** User OAuth (`write:statuses` only) to their own account, not a Kiwi bot - **Lemmy:** Federate to existing communities via AP — no self-hosted Lemmy instance - **Kiwi-to-Kiwi:** Extend mDNS approach to WAN via AP `Follow` ## Open questions (blocking design sign-off) 1. Sub-path vs subdomain for WebFinger (menagerie.circuitforge.tech/kiwi complicates `/.well-known/`) 2. Lemmy: spin up `lemmy.circuitforge.tech` or federate to existing communities? 3. Mastodon token storage: Heimdall `user_preferences` or encrypted per-user kiwi.db? 4. Image attachment in MVP or deferred? 5. Moderation/block-list strategy? ## Build sequence (10 steps) 1. Migration 029 — ap_followers, ap_deliveries, ap_received tables 2. RSA keypair management (app/core/ap_keys.py) 3. WebFinger + Actor read endpoints 4. Outbox — serve existing posts as AP Notes 5. Inbox — HTTP Signature verify + activity dispatch 6. AP delivery service (BackgroundTask) 7. Wire publish_post() to trigger delivery 8. Mastodon OAuth endpoints 9. Publish modal UI — Mastodon/Lemmy toggles 10. cf-core.activitypub extraction (Circuit-Forge/circuitforge-core#46) ## Tier gates - Publish to Mastodon/Lemmy: Paid / BYOK-unlockable - Read federated content + receive inbox: Free (self-hosted with AP_ENABLED) - Mastodon account connection: Free
pyr0ball added this to the Post-Launch milestone 2026-04-20 11:43:30 -07:00
pyr0ball modified the milestone from Post-Launch to Public Launch 2026-04-24 16:09:32 -07:00
pyr0ball added the
enhancement
needs-design
labels 2026-04-24 16:12:30 -07:00
Sign in to join this conversation.
No milestone
No project
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: Circuit-Forge/kiwi#113
No description provided.