notefeed 0.34.0
Released 2026-10-29 · on GitHub
The operator can take down one post instead of the whole feed (#159, ADR 0052). With "scope": "note", POST /api/operator/takedown takes a note's read URL, an image URL or <read id>/<note id> (what a report carries). It removes the post: the note, the text it was posted with, and every picture posted with that text. Their images go on the blocklist, as with a feed takedown. In the post's place, the feed shows a mark: "Removed by the operator: this broke the content rules of this instance.", linked to the terms page when there is one. Whoever can post to the feed can delete the mark, but the post does not come back. The removed notes answer 410 (removed) in the API, MCP and their file links, also once the mark is deleted. Readers only learn of removals they could have seen: a removed draft, or a removed post dated later, is a missing note to them. Without scope, the takedown removes the whole feed, as before.
In the APIs and clients the mark is a note with removed: true and the type application/x-notefeed-removed. It has the removed note's id and date and no content. Getting or editing it answers 410 (removed), and deleting it works like for any note.
Every note now counts against a feed's limits: texts, pictures and marks alike. On a free feed, the newest notes kept include pictures kept from a license that ran out, and the oldest note to go may be a picture or a mark. NOTEFEED_MAX_NOTES_PER_FEED counts every note too; NOTEFEED_MAX_IMAGES_PER_FEED still limits pictures on their own. Takedowns of posts are counted in notefeed_notes_deleted_total with reason="takedown".
Breaking: NOTEFEED_MAX_NOTES_PER_FEED counted only text notes and now counts pictures as well. On an instance that sets it, a feed with many pictures reaches the limit sooner and further posts answer 507 (note_limit). Raise the value if that matters to you. A free feed's cap counts pictures too: a feed that kept pictures after its license ran out drops its oldest notes sooner.
Upgrading: on SQLite and PostgreSQL the first start adds a table (migration 008_note_tombstones); take a backup first. No setting changes.
MCP: list_notes and get_note mark the operator's marks with removed: true; get_note and edit_note refuse a removed note, and delete_note deletes a mark. Assistants see this after reconnecting (Claude: a new chat, or remove and add the connector; Claude Code: restart).