Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo

agnos.is Forums

julian@community.nodebb.orgJ

[email protected]

@[email protected]
About
Posts
427
Topics
27
Shares
0
Groups
0
Followers
0
Following
0

View Original

Posts

Recent Best Controversial

  • Fun with Federation: Lemmy edition
    julian@community.nodebb.orgJ [email protected]

    It all started with a report about federation breaking between Lemmy and NodeBB. I was subconsciously aware that something was going on, but had chalked it up to network issues.

    Observed behaviour showed that some remote categories would be receiving content in spurts, with long gaps in between.

    I spent the next 3-4 days looking into it, but came up empty. Whatever was happening wasn't throwing any obvious errors, and along the way, I found what I thought was related (it was), but I wasn't sure why: against some Lemmy servers, the "follow"/"unfollow" mechanic would simply stop working, and this would often coincide with gaps in content. In some egregious cases, the flow of content stopped completely!

    Unable to make headway, I had to reach out to the folks at Lemmy to figure out what the issue was. NodeBB occasionally sends non-200 level responses depending on the activity. Specifically, the following scenarios:

    • A remote user upvoting more than 20 posts in a single day (a spam prevention tactic) causing NodeBB to throw an error, which was caught and returned an HTTP 500 Internal Server Error.
    • A Dislike activity, which is not currently handled by NodeBB. In these cases, NodeBB would send an HTTP 501 Not Implemented

    When encountering either of these responses, Lemmy would return the activity back to the queue for later delivery and mark a delivery failure. If enough of these (~40) happened within 24 hours, Lemmy would give the instance a time-out and pause delivery completely.

    That was it — a quick pair of code updates later, and we started working through Lemmy's backlog of 4.1M activities.

    As of 4am this morning, community.nodebb.org is no longer behind lemmy.world.

    d2b3dc1c-01f3-4203-b281-2406e949667d-image.png

    Fun week. Let's not do that again LOL.

    v4.4.2 of NodeBB contains the updated logic for smoother Lemmy federation.

    Fediverse nodebb lemmy activitypub

  • Backfilling Conversations: Two Major Approaches
    julian@community.nodebb.orgJ [email protected]

    In February 2025, I presented a topic at FOSDEM in Brussels entitled The Fediverse is Quiet — Let's Fix That! In it, I outlined several "hard problems" endemic to the fediverse, focusing on one particular complaint that is often voiced by newcomers and oldtimers alike; that the fediverse is quiet because you don't ever see the full conversation due to some design considerations made at the protocol level.

    Since then there have been a number of approaches toward solving this problem, and it is worth spending the time to review the two main approaches and their pros and cons.

    N.B. I have a conflict of interest in this subject as I am a proponent of one of the approaches (FEP 7888/f228) outlined below. This article should be considered an opinion piece.


    Crawling of the reply tree

    First discussed 15 April 2024 and merged into Mastodon core on 12 Mar 2025, [email protected] pioneered this approach to "fetch all replies" by crawling the entirety of the reply tree. When presented with an object, the Mastodon service would make a call to the context endpoint, and if supported(?) would start to crawl the reply tree via the replies collection, generating a list of statuses to ingest.

    This approach is advantageous for a number of reasons, most notably that inReplyTo and replies are properties that are ubiquitous among nearly all implementations and their usage tends not to differ markedly from one another.

    N.B. I am not certain whether the service would crawl up the inReplyTo chain first, before expanding downwards, or whether context is set in intermediate and leaf nodes that point to the root-level object.

    One disadvantage is this approach's susceptibility to network fragility. If a single node in the reply tree is temporarily or permanently inaccessible, then every branch of the reply tree emanating from that node is inaccessible as well.

    Another disadvantage is the reliance on intermediate nodes for indexing the reply tree. The amount of work (CPU time, network requests, etc.) scales linearly with the size of the reply tree, and more importantly discoverability of new branches of the reply tree necessitate a re-crawl of the entire reply tree. For fast-growing trees, this may not net you a complete tree depending on when you begin crawling.

    Lastly, in the ideal case, a full tree crawl would net you a complete tree with all branches and leaves. Great!

    Mastodon is the sole implementor of this approach, although it is not proprietary or special to Mastodon by any means.

    FEP 7888/f228, or FEP 171b/f228

    Summarized by [email protected] in FEP f228 (as an extension of FEPs 7888 by [email protected] and 171b by [email protected]), this conversational backfill approach defines the concept of a "context owner" as referenced by compatible nodes in the tree. This context owner returns an OrderedCollection containing all members of the context.

    A major advantage of this approach centers around the pseudo-centralization provided by the context owner. This "single source of truth" maintains the index of objects (or activities) and supplies their IDs (or signed full activities) on request. Individual implementations then retrieve the objects (or activities). It is important to note that should the context owner become inaccessible, then backfill is no longer possible to achieve. On the other hand, a dead or unresponsive intermediate node will not affect the ability of the downstream nodes to be processed.

    The context owner is only able to respond with a list of objects/activities that it knows about. This does mean that downstream branches that do not propagate upwards back to the root will not be known to the context owner.

    Additionally, consumers are also able to query the context owner for an index without needing to crawl the entire reply tree. The ability to de-duplicate objects at this level reduces the overall number of network requests (and CPU time from parsing retrieved objects) required, making this approach relatively more efficient.

    Additional synchronization methods (via id hashsums) could be leveraged to reduce the number of network calls further.

    A number of implementors follow this approach to backfill, including NodeBB, Discourse, WordPress, Frequency, Mitra, and Streams. Additional implementors like Lemmy and Piefed have expressed interest.

    One technical hurdle with this approach is technical buy-in from implementors themselves. Unlike crawling a reply tree, this approach only works when the context owner supports it, and thus should be combined with various other backfill strategies as part of an overall conversational backfill solution.

    Conclusion

    2025 is shaping up to be an exciting year for resolving some of the harder technical and social problems endemic to the open social web/fediverse. It is this author's opinion that we may be able to make good headway towards resolving the "quiet fedi" problem with these two approaches.

    It is important to note that neither approach conflicts with the other. Implementations are free to utilise multiple approaches to backfill a conversation. Both methods presented here have pros and cons, and a combination of both (or more) could be key.

    Feel free to use this as a starting point for discussions regarding either approach. Does one speak to you more than the other? Are the cons of either approach significant enough for you to disregard it? What other approaches or changes could you recommend?

    Fediverse activitypub fep 7888 f228 171b

  • What would cross-posting between instances look like in ActivityPub?
    julian@community.nodebb.orgJ [email protected]

    Following up on this question I asked back in late March, I wanted to continue thinking about how one would handle cross-posting between categories/communities, given that there isn't current consensus on it, and especially given that NodeBB—as of v4.3.0—can now see and browse remote categories.

    From that original topic, we can distil the following:

    1. Both PieFed and Mbin do not natively handle cross-posts, a new entity is made with the crucial bits (link, text, possibly title) copied over and changed if needed, sometimes a "cross-posted from..." helper text is prepended.
    2. There are legitimate concerns that a cross-post might not succeed depending on privilege settings on the receiving end, so a pre-flight check (or explicit rejection) of some kind might be required.
    3. Cross-posting can be done by the original author, or another user.

    So were an FEP to be written, we'd center it around the following assumptions:

    • "A user (which may or may not be the object author) is sharing an object to additional audiences"
    • We would use the existing Announce(Object) model
    • We would not use Announce(Activity) because it is not the original object creation that is being announced, but the object itself, to a new audience.
    • Some form of Reject handling would be required for cases where the cross-post is not allowed
    • How the receiver handles the activity is out-of-scope of the FEP. It could be that the original object is contained within multiple categories/communities, or a duplicate object could be created — implementor's choice.

    This is very similar to an existing announce/boost/reshare, except that instead of addressing the activity to followers list you are addressing it to a group actor's inbox.

    Some additional questions:

    1. Is there desire from PieFed/Lemmy/Mbin for supporting incoming (and possibly outgoing) federation of cross-posting?
    2. What exactly happens currently if a Group actor receives an Announce(Object)? My guess is nothing, currently, but let me know otherwise 😄
    3. Would this allow you to accept cross-posts from other AP applications without needing to refactor any existing code?
    4. Duplicating the object would mean the discussion is split between objects. The ideal implementation would be the same object present in multiple categories/communities. Is there desire for this in the threadiverse?

    @[email protected] @[email protected] @[email protected] @[email protected] @[email protected] @[email protected]

    Fediverse threadiverse crosspost activitypub

  • Fun with Federation: Lemmy edition
    julian@community.nodebb.orgJ [email protected]

    [email protected] I'm still at the point where seeing two-way federation working for real between instances is so exciting that it overrides the pain of federation 😅

    Fediverse nodebb lemmy activitypub

  • Automatic category/community assignment on received object
    julian@community.nodebb.orgJ [email protected]

    I'm wondering how content on threadiverse is automatically assigned its community when received by the software (e.g. PieFed, Lemmy, Mbin).

    The answer I am expecting is "if the community is addressed (to, cc, audience), then it is slotted into that community".

    However that causes issues for compatibility with microblogs... for example, [email protected] recently authored a post that mentioned [[email protected]](https://community.nodebb.org/category/[email protected]) and it got slotted into that community on NodeBB, which isn't correct since that group is private.

    Better practice would be to only trust the addressed community if it is Announce'd by the community directly, but would fall short if my instance does not receive the Announce (say, if nobody follows the community), in which case we'd fall back to "uncategorized", which is where all microblog posts currently go. Then it's neither correct nor incorrect, I suppose.

    I think this might be an issue where NodeBB tries to be too many things at once (microblog and threadiverse compatible).

    Fediverse activitypub threadiverse

  • Pleroma Webfinger compatibility
    julian@community.nodebb.orgJ [email protected]

    Does anybody know what exactly Pleroma needs for a valid Webfinger check? I'm attempting to figure out why @[email protected] won't resolve in NodeBB, and it's because the webfinger call returns 400 Bad Request.

    NodeBB is calling https://pleroma.debian.social/.well-known/webfinger?resource=acct%3Ajmtd%40pleroma.debian.social with User-Agent and Content-Type headers (curiously, it's not sending Accept, but it also fails if that header is set, so that's irrelevant.)

    Navigating to that webfinger url in the browser returns XML, which is 😬 but I'm not even getting that when NodeBB makes the call.

    Fediverse activitypub pleroma webfinger

  • Native Push Notifications Support for NodeBB
    julian@community.nodebb.orgJ [email protected]

    @phenomlab said in Native Push Notifications Support for NodeBB:
    > NordVPN

    Thanks for closing the loop! Kind of annoying that NordVPN blocks them...

    Fediverse pushnotificatio nodebb notifications pushapi

  • Went and Broke Federation. Kinda.
    julian@community.nodebb.orgJ [email protected]

    Kichae re:

    > so giving registered-users privilege back to -1 worked?

    can you let me know if the registered-users bug is still occurring? I am wondering if I patched it in the course of regular development.

    Tech

  • Automatic category/community assignment on received object
    julian@community.nodebb.orgJ [email protected]

    [email protected] it'll work better once cross-posting is built into NodeBB I think 😄

    Fediverse activitypub threadiverse

  • Native Push Notifications Support for NodeBB
    julian@community.nodebb.orgJ [email protected]

    Our relationship with push notifications has been rather circuitous...

    1. First Andrew (@psychobunny) tried plain desktop notifications via the Notification API (that's the desktop notifications plugin), but notification delivery stopped when you closed your browser.
    2. Then I wrote the PushBullet plugin, but they went from free to paid and that went out the window
    3. Around that time I wrote the Firebase plugin, which was a dead end because there was no iOS support.
    4. I then wrote the ntfy plugin, which works really well, but does rely on a freemium third-party service and app (written by @[email protected])

    Thanks to some recent discussion from @crazycells and @bh4-tech, I learned that the Push API had reached general availability across most modern browsers. In fact, this actually happened over a year ago, so compatibility should be even better.

    So I set about working on yet another push notifications plugin, hopefully for the last time, and this time using the native Push API on the client-side.

    To enable them, simply navigate over to the "Push Notifications" menu item in your user profile, and flip the switch.

    6da06989-f902-492b-866f-14c39b34a9ca-image.png

    So, let's dogfood! I de-activated the ntfy plugin on this site and activated the web-push plugin so you can try it out right now.

    The plugin is in the proof-of-concept phase, so there might (read: most definitely will be) issues. Please let me know any you find here.

    Fediverse pushnotificatio nodebb notifications pushapi

  • Native Push Notifications Support for NodeBB
    julian@community.nodebb.orgJ [email protected]

    bh4-tech that's good to know, thank you!

    Fediverse pushnotificatio nodebb notifications pushapi

  • Updates to the world page
    julian@community.nodebb.orgJ [email protected]

    tl;dr — you can now find remote categories and see your tracked/watched categories in /world.

    A new alpha version of NodeBB was tagged today: v4.3.0-alpha.3. The biggest change is to the /world route, which up until now showed a list of topics from outside of the local NodeBB instance.

    New to this alpha release:

    1. A quick search widget was added, allowing you to directly search for remote categories. There is no need to navigate to to the search page to discover new categories.
    2. Your list of tracked and watched categories will show at the top of the page.
      • "Tracking" and "Watching" categories—both local and remote—is how content discovery happens in NodeBB. Tracked categories will have new content show up in the "unread" page, while watched categories take that a step further and notify you when new content is posted.
      • Tracking and watching a category will tell NodeBB to subscribe to that remote community for updates

    At this time we're continuing to look for stability issues with the remote category integration. We'll be working on QoL fixes as we move into the beta phase this/next week.

    60bd030a-7626-4629-9ac4-8ddd2bd34f3f-image.png

    0a11627f-65cc-477b-8c33-49f1ea6de53f-image.png

    Fediverse nodebbactivityp nodebb

  • Native Push Notifications Support for NodeBB
    julian@community.nodebb.orgJ [email protected]

    I'm particularly excited about this new development because it opens the door for richer integration between NodeBB and the push notifications themselves.

    With (probably) every iteration prior, when you clicked on the notification, it likely opened a new window. With direct access to the Push API and service worker, we can now accurately detect whether the site is already open (in another tab), and open it there.

    In the future, we'll also be able to add in things like icons, pictures, and custom actions, right from the notification itself.

    One particular nice-to-have is the ability to update notifications. Being able to merge notifications (like they already do in NodeBB) or potentially rescind notifications would be a nice step forward in usability as well.

    Fediverse pushnotificatio nodebb notifications pushapi

  • Unicode in handles
    julian@community.nodebb.orgJ [email protected]

    I'm assuming Unicode in handles is not allowed? At least by Mastodon.

    This user is not able to have their content federated because the username is all Hebrew (I think?) characters!

    Fediverse unicode activitypub
  • Login

  • Login or register to search.
  • First post
    Last post
0
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups