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

Since v3.13.0, Ktistec has supported custom feeds.

A custom feed is a collection of posts selected by a set of rules called a judge. Any post Ktistec has cached that is public, or was sent to you, is a candidate. The judge's job is to decide which posts are in the feed and which posts are out.

Ktistec comes with one built-in judge called the criteria judge. It also supports any number of fully custom external judges—judges implemented as external scripts the server can call on candidate posts.

I use the criteria judge for most of my custom feeds. This post explains how it works. Later posts will dive into external judges.

The Criteria Judge

The criteria judge allows you to define feeds by flexibly matching on keywords, hashtags, and mentions. You can filter candidates to those posts that contain any of one set of keywords, hashtags, or mentions, all of a second set, and none of a third.

A Judge dropdown set to "criteria" sits above Name and Notes fields. Below, a Criteria section has three stacked boxes for keywords, #hashtags, and @mentions: "Any of these" (green), then "AND", "All of these" (blue, optional), then "BUT", "None of these" (red, optional). Create Feed, Preview Feed, and Cancel buttons are at the bottom.
Ktistec's New Feed form.

Keywords match anywhere in a post's text, summary, or title, ignoring case—even inside words, so "art" also matches "party". Hashtags and mentions match exactly: #art matches only posts tagged #art. Use a hashtag when you want precision. Use a keyword when you want reach.

Once you've settled on terms, you can preview the feed. To keep it fast, the preview returns up to 20 matches from the 100 most recent candidates—just enough to give you a feel for what it will look like. "Create Feed" publishes the feed and starts a task that backfills the last 30 days of posts. (Feeds are private, though—only you can see them.)

After it is published, the feed is available in the deck—the column-oriented feed reader. The deck shows up to 12 feeds side by side, and you can reorder them.

A wide curved monitor showing Ktistec's deck in a browser: six side-by-side columns of posts titled Relentlessly Upbeat, The Fediverse, Retro Computing, Fandom, Fedicon, and DIY. Post text has been replaced with placeholder text and images are blurred.
The deck.

Matching is fast. I have feeds with 20+ keywords and hashtags, and there is no perceptible processing delay when a new post arrives.

#ktistec #activitypub #fediverse

Todd Sundsted
Release v3.15.0 of Ktistec

This release ("savor the moments when goodness prevails") of Ktistec lands two big new features: RFC 9421 HTTP Message Signatures and private labels.

RFC 9421 support is inbound only, for the moment. The code for signing activities is written, but I want to test parsing and verification in the real world first. Signing will ship in the next release.

Private labels allow you to annotate posts with your own hashtag-like labels. Once posts are labeled, you can view them together on an index page, just like hashtags. You can use them in custom themes, and in the next release, you will be able to include them as criteria in custom feeds. Because they are private, they are not federated.

Here's the full changelog:

Added

  • Verify inbound RFC 9421 HTTP Message Signatures (rsa-v1_5-sha256).
  • Private labels, visible only to you, for organizing and finding posts.
  • Cache the posts on inbound post quotes or replies.
  • Include totalItems in label, hashtag, and mention collections.

Fixed

  • Ignore inbound activities whose identifier is local.
  • Mark an actor up only when its origin took part in the request.
  • Store a community-relayed Delete only when its origin serves it.
  • Don't accept a community's signature as verification of a relayed vote by an actor on another origin.
  • Ignore federated hashtags, mentions, and emoji whose name is only their sigil.
  • Hide inline quote links and dim deleted or blocked posts on unthemed pages.
  • Fix action button spacing on mobile.

Changed

  • Move the timeline's share and reply filters into a control bar.
  • Hyphenate multi-word names in the theme data attributes.
  • Record how an inbound activity was verified.

I'll be publishing a series of posts on writing custom algorithmic feeds. Stay tuned!

#ktistec #crystallang #activitypub #fediverse

Todd Sundsted
A table with between 25 and 75 panels (depending on how you count them) stacked in columns, with lights, knobs, and too many patch cables to count. Small musical keyboards sit in front.

I was hoping to talk to the builder about their modular synth setup, but ran out of time...

EDC (Electric Daisy Carnival) is happening one field over from Maker Faire (there's literally just a fence between them), but I don't think this is what the crowd next door has in mind when they think "EDM".

#MakerFaire #Orlando #music #synth

Todd Sundsted
The southern R2 Builders table at Maker Faire Orlando, showing fully and partially assembled R2 units, a table with tools and parts, and three of their members at work.

I'm at Maker Faire Orlando today.

I never missed NYC Maker Faire until they stopped having them in 2018. It's been a drought since, but I happened to be in Orlando, so...

#MakerFaire #Orlando

Todd Sundsted

imagine the good you could do with $474 million dollars…!

Todd Sundsted

if you're using #ktistec and you're on an older version, i would be very happy to help you upgrade. there are a few instances running older versions, and there are enough improvements in usability, performance, and security that it is worth moving to the latest version.

Todd Sundsted

le sigh another bandcamp friday coming there goes a paycheck

Todd Sundsted

it was a long day but a very very very satisfying one…!

Todd Sundsted

the explosion of new fediverse servers is exciting, but it also means entertaining new bugs. i just noticed that epiktistes stored its first ever empty hashtag (just a #) on sept 16th, which means we operated for over six years until some new server federated that (naming no names, assigning no blame...)

Todd Sundsted

the only part of a research project that makes me unhappy is when i've only just started and early indicators are already telling me where it's going to end...