Todd Sundsted

🔒 Manual approval
View original page

@toddsundsted@epiktistes.com · Joined ⁨Aug⁩ ⁨2026⁩

Better dead than bored.
Pronouns
he/him
🌎
Sector 001

Release v3.13.0 of Ktistec

Release v3.13.0 of Ktistec ("love who you choose to love") links the feed deck into the navigation. Feeds are now fully supported.

Feeds are custom collections of posts selected by hashtag, mention, and keyword, each grouped as terms you want any of, all of, or none of, so a feed can be as broad or as narrow as you like. The feed deck is my primary reading interface now.

The rest of the changes mostly address a variety of small federation issues:

Added

  • Link the feed deck from the secondary nav bar.
  • Offer a retry and a link when a quoted post can't be loaded.

Fixed

  • Keep the verify button when a quote authorization can't be fetched.
  • Verify HTTP signatures over the full set of headers the headers signature parameter names.
  • Sign an inbox delivery's fetches with the implicated account.
  • Render directly published media objects as attachments.
  • Handle more attachment media types when rendering.

Changed

  • Finish the feeds API.
  • Widen the metrics charts display.

With feeds shipped, I'm turning my attention back to federation. There are still a ton of small issues (e.g. Likes relayed through Groups are always rejected, RFC 9421 support, blurhash support) that I'd like to squash.

#ktistec #crystallang #activitypub #fediverse

Release v3.12.0 of Ktistec

This release encompasses two broad sets of changes: widening the pool of candidates for feeds and more carefully checking the origin of inbound activities (broadly FEP-fe34, Origin-based security model).

Candidates for feeds were originally limited to posts in the actor's mailboxes. This decision made authorization easy but omitted clearly acceptable posts (for example, posts addressed to the public collection) that arrived via other means (for example, filling in a thread).

Prior to this release, inbox processing did not consistently define an object's origin nor did it apply consistent rules to what it admitted based on the origin.

FEP-fe34 is still not fully enforced, and truth be told, I'm still reviewing some of its mandates, so I'm not yet listing it in Ktistec's federation documentation.

Here's the full list of changes:

Added

  • Notify a deck pane when it has new posts.

Fixed

  • Retry an unresolved quote authorization.
  • Label a draft with the status of its quote request.
  • Compare origins when deciding whether to trust an IRI, key document, or owner.
  • Ignore a trailing slash when matching a dereferenced document's IRI.
  • Allow only Create and Update to update objects.
  • Ignore an inbound vote that fails the FEP-9967 checks.
  • Expand commonly omitted ActivityStreams context terms.
  • Break a long link rather than let it overflow.

Changed

  • Widen the feed scan to every object the server holds.
  • Address a published feed by slug rather than by id.

Removed

  • The proxyUrl property from the actor document.

I am still working hard on the feed deck. Both notifications and feed ordering now work. It's now my preferred reading interface, and should be ready by the next release!

#ktistec #crystallang #activitypub #fediverse

Image of an ultrawide monitor showing the Ktistec feed deck across six feeds.EpiktistesPost by toddsundsted@epiktistes.comThe culmination of my recent work on algorithmic feeds is a #fediverse feed reading machine for all of the topics I care about. #ktistec

Release v3.9.0 of Ktistec

I shipped back-end support for algorithmic feeds in the last release. In this release I shipped front-end support. The feature needs testing and polish, so it's still not possible to navigate to the feeds editor, but if you know where to look, you can try it 😉.

"Algorithmic feeds" currently means support for custom hashtag, mention, and keyword feeds (e.g everything that mentions "#fediverse" and "#activitypub" but not "x" or "facebook").

Here's the full changelog:

Added

  • Front-end support for user-defined algorithmic feeds.
  • Allow editing optional properties on published posts.
  • Support undoing a dislike.

Fixed

  • Handle concurrent duplicate inbox delivery.
  • Don't apply custom themes on the drafts and posts pages.
  • Adapt duration units in thread analysis.
  • Restore the spinning loader.

Changed

  • Restrict theme overrides to color and reduce reliance on !important.
  • Render the homepage description in a basic segment.

Removed

  • The deliver_to state and the recipients fallback.

In the next release, algorithmic feeds get wired into the navigation!

#ktistec #crystallang #activitypub #fediverse

EpiktistesEpiktistesRelease v3.8.0 of KtistecThere are two significant new additions in release v3.8.0 of ktistec. First, the actor cards on the followed/following pages show relevant actor status. O…

Release v3.8.0 of Ktistec

There are two significant new additions in release v3.8.0 of ktistec.

First, the actor cards on the followed/following pages show relevant actor status. On the followed page, it tells you how long it has been since that actor published an activity (create, announce, like, etc.) that was sent to your server. It's a proxy for how active they are (or are not). On the following page, it tells you how long it has been since you have been able to send to that server. It's a proxy for whether that server is reachable or that actor is still alive.

Second, the backend for user-defined algorithmic feeds is in place, along with a keyword/hashtag/mention feeds implementation. You can't set up a feed via the user-interface, but the feeds work if you set one up directly in the database—which is how I've been previewing them. I plan to release the frontend next week.

Here's the full changelog:

Added

  • Display activity status on actor cards.
  • Back-end support for user-defined algorithmic feeds.
  • Apply community-relayed moderator deletes received as a Group's wrapped Announce.
  • Follow a web page's rel="alternate" link when searching.

Fixed

  • Avoid loading entire has_many collections when constructing child records.
  • Evaluate the same-origin fetch gate against an embedded node's own identifier.
  • Accept a delete of an uncached object or actor without verification.
  • Catch MIME::Multipart::Error in local file-upload handling.
  • Map malformed request-body parse failures to Bad Request.

#ktistec #crystallang #activitypub #fediverse

ActivityPub (https://www.w3.org/TR/activitypub/) server for individual users and small groups. - Comparing aec6139a...c3605dc6 · toddsundsted/ktistecGitHubComparing aec6139a...c3605dc6 · toddsundsted/ktistecActivityPub (https://www.w3.org/TR/activitypub/) server for individual users and small groups. - Comparing aec6139a...c3605dc6 · toddsundsted/ktistec

Release v3.7.0 of Ktistec

I started to work on algorithmic feeds but was side-tracked by interoperability work. No complaints. It turned out to be a productive detour.

Here's the full changelog for release v3.7.0 of Ktistec:

Added

  • Support FEP-2c59: Discovery of a Webfinger address from an ActivityPub actor.
  • Support ActivityPub Update activities for actor profile changes.

Fixed

  • Disambiguate reblog IDs from status IDs. (fixes #151)
  • Correct the quote_policy mapping to public/nobody values.
  • Ignore malformed pagination parameters instead of raising.
  • Treat "cannot be reconnected" errors as connection failures.
  • Infer a media attachment's type when mediaType is missing.
  • Faster, case-insensitive, actor username lookups.
  • Faster statuses_count using an approximate count.

Changed

  • Resolve JSON-LD contexts by matching their digest against a bundled copy.

The first version of algorithmic feeds won't be very algorithmic—it will let you create a feed that filters by keywords, hashtags, and mentions. That covers a lot of ground for me personally, and lays the groundwork for future enhancements.

#ktistec #crystallang #activitypub #fediverse