commits 2ce62db...86822f5 implement support for typical social signals, like share/boost and like.

i got one like

performing and visualizing simple interactions are table stakes for socializing in the fediverse, so it's an important milestone. i got one like. i want more! 😉

if you're a fan of the crystal programming language check out ktistec. if you're brave enough to try it, i'd love feedback!



  1. asterite is correct. named tuples in crystal are seemingly attractive (compile-time type checking of keys and values) but quickly become a trainwreck as the compiler specializes every method receiving them (passing/receiving **options is definitely a code smell). every possible permutation of keys and values is a new type and results in a  specialized copy of a method, increasing build time and executable size.
  2. crystal + sqlite continue to perform well. i recently released code that computes and displays social signals like boosts/shares and likes as part of the content in the timeline. even though counts are aggregated on the fly, rendering is still brisk—about 780msec to fetch and render 1000 posts from the main timeline.


The last large piece of missing functionality leading up to a Ktistec release candidate is complete.

Ktistec now runs scheduled tasks in a separate fiber. In particular, ActivityPub message delivery now happens in the background, which makes posting snappier.

Other new features:

  • Remote follows
  • Warning prompts before dangerous activities (deleting posts)
  • Many bug fixes


Running Ktistec the First Time

One of Ktistec's design goals is to make installation and configuration as easy as possible. Rather than multiple supporting data store services, Ktistec uses Sqlite. The database, along with uploaded images, are stored on disk, for easy setup (and, more importantly, backup).

When you run Ktistec the first time, you'll set up the instance, and then you'll set up the primary account.

specify the host name and site name

Ktistec needs to know the name of its permanent home on the internet. The host name is part of the identity of every account on the instance. My identity is ""—other federated hosts, and users, send messages and other content to me at "". (This means you'll need a domain of your own, too.) Give the instance a site name and submit.

create an account

Once you name the instance, you create the primary account. Ktistec current supports only one account. This is intentional—another one of Ktistec's design goals is to promote a more fully distributed fediverse. A fediverse with a handful of large, multiuser services isn't a whole lot better than the world we had before, imo. (But don't worry—secondary accounts are on the roadmap.)

At a minimum, you need to specify the username and the password of the account. You can use a single character for the username, but you'll need six characters that include both letters, numbers and symbols for the password. Display name and summary are optional.


Once those two steps are done, you're online!


a fistful of improvements to ktistec

  • 6d1925b track a recent mastodon change that requires a signed digest on http posts
    annoying—epiktistes wasn't successfully federating with mastodon servers for days—but breaking compatibility in the interest of better security is an acceptable excuse (but don't get me started).
  • bd6fb4d log encountered uncached external contexts
    ktistec parses and caches the contexts it cares about and ignores everything else. this change drops a message in the log when the server encounters contexts it doesn't know about.
  • 1661226 wire in post reply and delete buttons
    posting is de rigueur for membership in the fediverse. deleting is just a good idea.


i put the finishing touches on content editing and presentation.

a post about saki

because i want to support long form content, one of my goals was inline images that present as attachments on other implementations like mastodon. my choice of editor, trix, handles image uploads, which is nice, but the generated markup is verbose and suboptimal (trix uses br instead of p tags to break up text into paragraphs, for example).


with open source software, things break but you can get in under the hood to investigate and fix. a recent, breaking change to signatures in mastodon recently broke ktistec federation. a few hours and a few commits later, things were working again. of course, i would have been happier if it hadn't been a breaking change... 😐


i posted about the problems caused by the lack of a clear license a week ago. commits ca662ca through 49d3e2a remove the kemal-session and kemal-csrf shards and replace them with lightweight improvements to a session store i'd written previously and forgotten about and cut-and-paste reuse of kemal-csrf (which has a clear license and clean history). ktistec will be released under AGPLv3.


these commits show the actor's public posts when an anonymous user navigates to the site, and show the authenticated actor the content timeline for both their inbox and their outbox. these are really two big queries with a pagination scheme i found on the internet. i haven't yet benchmarked it against the common "OFFSET LIMIT" method.