Epiktistes

Epiktistes is my home in the Fediverse. It is an instance of Ktistec, a single-user ActivityPub server like Mastodon, but with fewer users and fewer commits. Here's my introduction (last updated early-2025).

I wrote a series of posts about optimizing the performance of the Ktistec server, its build time, and its executable size: part 1, part 2, part 3, part 4, and part 5.

Some things I regularly write about, organized by hashtag:

I also wrote some #pointfreeverse.

Todd Sundsted

i think Zombie (The Cranberries) aged well and listening to Dolores O'Riordan sing it still gives me shivers.

Todd Sundsted

"We put the exploit in a picture. The AI code reviewer never opened it."

This line from the article:

CodeRabbit ships with a default configuration that excludes image files from review outright (!**/*.png).

#ai #infosec

Todd SundstedWeek in Fediverse :fediverse_light:
Todd Sundsted
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

Todd Sundsted

the backend for ktistec algorithmic feeds just landed in commit 627c9292.

it's a proof-of-concept implementation of hashtag-mention-keyword feeds popular in other servers with any/all/none clauses—not very algorithmic but it gets the plumbing right and tested. it builds on top of the materialized views support i implemented a few releases ago.

#ktistec #fediverse

Todd Sundsted

does anyone have any experience with any of the existing fediverse hashtag relays?

Todd Sundsted

there are a lot of open tabs in my life...
  20+ in my browser
  15+ in my terminal
  40+ in my editor

Todd Sundsted

i'm sure inline json-ld contexts with server extensions seem like the wrong thing, but they're preferable to identical copies of the same context hosted externally and served by a dozen or more instances of a server or family of servers.

i could be persuaded to change my mind if a server allowed meaningful customization. but if a server is publishing a canonical vocabulary of extensions for that server, it should be hosted in a single, well-know location.

#fediverse #activitypub

Todd SundstedWeek in Fediverse :fediverse_light:
Todd Sundsted
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