<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ActivityPub user and category outboxes coming soon]]></title><description><![CDATA[<p dir="auto">Up until today, when you queried a NodeBB user or category's <code>outbox</code>, you would receive an empty <code>OrderedCollection</code>. This was done because the property's inclusion in the actor object was <strong>required</strong>, but it was not immediately apparent in 2024 how many people utilised this property. Thus it was easier to just send the empty outbox and pursue more urgent functionality.</p>
<p dir="auto">While sending that empty outbox has not broken any implementations, but it has come to my attention that a few (read: more than 1) other implementors already do, or plans to, read from an actor outbox for backfill purposes.</p>
<p dir="auto">The upcoming NodeBB v4.10.0 will contain an outbox populated by the contributions by that user or category.</p>
<p dir="auto">Here's how that works...</p>
<p dir="auto">For both users and categories, a standard <code>OrderedCollection</code> is returned, with <code>first</code>, <code>last</code>, <code>prev</code>, and <code>next</code> properties for navigation.</p>
<p dir="auto">For users:</p>
<ul>
<li>A combined set of the user's activity is returned in the form of activities (<code>Create</code>, <code>Like</code>, etc.) — these activities include the user's <strong>posts</strong>, <strong>votes</strong> (both up and down), and <strong>shares</strong>.</li>
<li>Unlike other collections, this one uses a cursor. You can pass <code>?before=</code> or <code>?after=</code> values in the query string to retrieve items 20 at a time.</li>
</ul>
<p dir="auto">For categories:</p>
<ul>
<li>A set of posts curated by this category is shown. It can contain both posts local to the instance, and remote posts from outside of the instance.</li>
<li>All posts are wrapped in the <code>Announce</code> activity. If the post is local, it is an <code>Announce(Create(Note/Article))</code>, if it is a remote post, then it is just an <code>Announce(Object)</code> <em>by reference</em>.</li>
<li>This collection is paged like other collections served by NodeBB.</li>
</ul>
<p dir="auto">It is possible that this implementation serves data in an unexpected manner. If this is the case, please reply here to contact me directly so it can be fixed.</p>
<p dir="auto">I used my best judgement for what to include in the outboxes, as well as using Piefed as a reference implementation. <a href="https://community.nodebb.org/user/rimu%40piefed.social" rel="nofollow ugc">@rimu@piefed.social</a>, I notice that Piefed's community outboxes serve up <code>Announce(Create(Page))</code> even if the Page is not local to the instance. I was under the assumption that remote content couldn't (shouldn't?) be expanded in this manner because you cannot guarantee the integrity of the data, and so announcing the object by reference is preferred. Just wondering your thoughts on that.</p>
]]></description><link>https://postcall.pub/topic/a06c3cea-3ace-41b0-b6a8-fb6b3e0226bc/activitypub-user-and-category-outboxes-coming-soon</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 15:09:52 GMT</lastBuildDate><atom:link href="https://postcall.pub/topic/a06c3cea-3ace-41b0-b6a8-fb6b3e0226bc.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Mar 2026 19:11:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ActivityPub user and category outboxes coming soon on Wed, 11 Mar 2026 20:46:06 GMT]]></title><description><![CDATA[<p dir="auto">Yeah that's the tricky part, since I've thrown away the original create long ago, so if I'm including it in the outbox after the fact all I can really do is Announce(Object) by reference, even if originally when it happened I might've properly announced the whole activity... I know Mastodon understands Announce(Object), but is that a proper use case?</p>
]]></description><link>https://postcall.pub/post/https://community.nodebb.org/post/106849</link><guid isPermaLink="true">https://postcall.pub/post/https://community.nodebb.org/post/106849</guid><dc:creator><![CDATA[julian@community.nodebb.org]]></dc:creator><pubDate>Wed, 11 Mar 2026 20:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to ActivityPub user and category outboxes coming soon on Wed, 11 Mar 2026 20:36:38 GMT]]></title><description><![CDATA[<p>FEP-fe34 currently lists <a href="https://codeberg.org/fediverse/fep/src/commit/badad3b92058f438ab31867a0ced259767c5fb97/fep/fe34/fep-fe34.md#embedding" rel="noopener">3 scenarios</a> where you can trust an embedded object:</p><blockquote><p>- An embedded object has the same origin and the same owner as the wrapping object.<br />- An embedded object is identified as a fragment of the wrapping object.<br />- An embedded object is anonymous (doesn't have an ID).</p></blockquote><p>This may look too strict, but that's because I was taking C2S into account, where actors can create arbitrary objects and embed all kind of things in them.</p>]]></description><link>https://postcall.pub/post/https://mitra.social/objects/019cde9d-a1d9-8a43-832a-f34cfedb7b26</link><guid isPermaLink="true">https://postcall.pub/post/https://mitra.social/objects/019cde9d-a1d9-8a43-832a-f34cfedb7b26</guid><dc:creator><![CDATA[silverpill@mitra.social]]></dc:creator><pubDate>Wed, 11 Mar 2026 20:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to ActivityPub user and category outboxes coming soon on Wed, 11 Mar 2026 20:28:50 GMT]]></title><description><![CDATA[<p><span><a href="/user/julian%40community.nodebb.org" rel="noopener">@julian</a></span> <code>Create</code> is a bit more complicated because creating something that is not yours doesn't make much sense. However, if we focus solely on authentication, it's fine too. If <code>Create.object</code> has different origin than <code>Create</code>, just fetch it from there.</p>]]></description><link>https://postcall.pub/post/https://mitra.social/objects/019cde96-7ef1-4d6a-4553-5478f5c7ca05</link><guid isPermaLink="true">https://postcall.pub/post/https://mitra.social/objects/019cde96-7ef1-4d6a-4553-5478f5c7ca05</guid><dc:creator><![CDATA[silverpill@mitra.social]]></dc:creator><pubDate>Wed, 11 Mar 2026 20:28:50 GMT</pubDate></item><item><title><![CDATA[Reply to ActivityPub user and category outboxes coming soon on Wed, 11 Mar 2026 20:13:17 GMT]]></title><description><![CDATA[<p dir="auto">Really? I can wrap a remote object in a Create of my own?</p>
<p dir="auto">I suppose nothing is stopping me but I figured it was disingenuous.</p>
]]></description><link>https://postcall.pub/post/https://community.nodebb.org/post/106844</link><guid isPermaLink="true">https://postcall.pub/post/https://community.nodebb.org/post/106844</guid><dc:creator><![CDATA[julian@community.nodebb.org]]></dc:creator><pubDate>Wed, 11 Mar 2026 20:13:17 GMT</pubDate></item><item><title><![CDATA[Reply to ActivityPub user and category outboxes coming soon on Wed, 11 Mar 2026 20:06:00 GMT]]></title><description><![CDATA[<p><span><a href="/user/julian%40community.nodebb.org" rel="noopener">@julian</a></span> <span><a href="/user/rimu%40piefed.social" rel="noopener">@rimu</a></span> I think it's fine to include <code>Announce</code>s of remote <code>Create(Page)</code>s as long as <code>Announce.actor</code> is local. However, consumers must not trust the embedded activity, and fetch it by its ID (or verify FEP-8b32 integrity proof, if present).</p><p>(apparently PieFed outboxes are served with a wrong content type, <code>application/json</code> ?)</p>]]></description><link>https://postcall.pub/post/https://mitra.social/objects/019cde81-96ee-1a63-7476-61aa6e89a5e3</link><guid isPermaLink="true">https://postcall.pub/post/https://mitra.social/objects/019cde81-96ee-1a63-7476-61aa6e89a5e3</guid><dc:creator><![CDATA[silverpill@mitra.social]]></dc:creator><pubDate>Wed, 11 Mar 2026 20:06:00 GMT</pubDate></item></channel></rss>