Personas have walls their followers write on

Owner decision of 2026-10-06 (G-0009, FEP-400e). A persona's actor names its wall (…/graffiti, sm:wall) and, in
Smithereen's privacySettings, that its followers may write on it. A public post that is not a reply, sent with the wall
as its target by an account following the persona, is hosted: the persona is notified, it reaches the persona's and its
followers' homes, and the followers' servers and the author's are told with Add{Note}. The persona deletes it with
DELETE /api/v1/statuses/:id, which sends Remove{Note}; Smithereen deletes the post then. The wall lists the persona's
public posts that start a thread and what was written on it.

Elsewhere: an account's Add{Note} on its own wall shows the post to its followers here as on that wall (privapub.wall on
the status), and its Remove takes it away. An Add or Remove naming a collection of the account's own server PrivaPub
does not know has its document read again first, at most hourly: accounts kept before walls were read had none.

Checked live: Smithereen 40 checks (G-0009 closed); GoToSocial and Mastodon unchanged (121).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-06 08:17:10 +02:00
1 parent e0682fa868
commit c47b6e5533
26 files changed
+582 -36

No files matched your search

@@ -72,7 +72,14 @@ namespace PrivaPub.Federation.Rendering
["value"] = "schema:value",
["webfinger"] = "https://purl.archive.org/socialweb/webfinger#webfinger",
["lemmy"] = "https://join-lemmy.org/ns#",
["postingRestrictedToMods"] = "lemmy:postingRestrictedToMods"
["postingRestrictedToMods"] = "lemmy:postingRestrictedToMods",
// Smithereen's, which it compacts what it reads by: an allowedTo stays a plain string, as it reads them
["sm"] = "http://smithereen.software/ns#",
["wall"] = new JsonObject { ["@id"] = "sm:wall", ["@type"] = "@id" },
["privacySettings"] = "sm:privacySettings",
["wallPosting"] = "sm:wallPosting",
["wallPostVisibility"] = "sm:wallPostVisibility",
["allowedTo"] = "sm:allowedTo"
});
public static string Html(string markdown) =>
@@ -128,6 +135,16 @@ namespace PrivaPub.Federation.Rendering
["value"] = FieldValue(field.Value)
}).ToArray())
};
// a persona's wall (FEP-400e, owner decision 2026-10-06): its followers write on it, everyone reads it
if (actor.HasWall)
{
document["wall"] = actor.Wall;
document["privacySettings"] = new JsonObject
{
["wallPosting"] = new JsonObject { ["allowedTo"] = new JsonArray(actor.Followers) },
["wallPostVisibility"] = new JsonObject { ["allowedTo"] = new JsonArray(Public) }
};
}
if (actor is { Kind: LocalActorKind.Group, IsCircle: false })
{
document["attributedTo"] = actor.Wardens;