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 my ideal “salted caramel ice cream” is just caramel…

Todd Sundsted@reiver ⊼ (Charles) :batman:

I think hobbyist programmers should (in a practical sense) be able to create Fediverse applications & other Fediverse software — and not just career software-engineers.

#Fediverse

Todd Sundsted

I managed to get 2/3rds of quote posts (FEP-044f) working in #ktistec. The only part remaining is quote posting from the server and this depends on functionality to delay delivery until the quote request is accepted (or not). I need that for scheduled posts, so it's a delay but time well spent!

#activitypub #fediverse

Todd Sundsted

got my bookmarks down to just one page

Todd Sundsted
Release v3.2.9 of Ktistec

I just released v3.2.9 of Ktistec!

You can now customize the secondary menu on your home page. This is the menu that links to your posts, drafts, notifications, etc. Posts, drafts, and notifications are fixed, but you can change the final three—they default to bookmarks, followers, and following. Edit the links on your Settings page in the section titled Pinned Collections. I typically replace the defaults with hashtags I'm following and threads I'm actively participating in.

I am slowly adding functionality to support Mastodon API compatible clients. In line with that effort, OAuth access tokens are now associated with sessions, which makes it possible for clients that authenticate via OAuth (instead of username/password) to access all of the existing API.

I use this extensively when building scripts to automate my Ktistec instance. A script can authenticate and cache the access token in a secure keystore. Since access tokens have a limited lifespan and can be individually invalidated, a compromised access token does not force me to change my password!

Here's the full list of changes:

Added

  • Support for customizing the secondary menu with pinned collections.

Fixed

  • Thread rendering no longer fails when drafts are present.

Changed

  • Content warnings are now preserved when replying to posts. (fixes #136)
  • OAuth access tokens are now associated with sessions.
  • Attachments are deleted when draft objects are destroyed.
  • Actor icons and images are deleted when replaced or unset.

A recent poll prioritized emoji reactions and quote posts. I see dozens of quote posts every day, so that's where I plan to focus next.

#ktistec #crystallang #activitypub #fediverse

Todd Sundsted

we fixate on the demise of entry level corporate jobs as if that's a bad thing.

Todd SundstedAndrew Plotkin

Website procedural note: I now have a landing page for the Visible Zorker collection.

eblong.com/infocom/visi/

Still just has Zork 1 and Zork 2, but now there's a list to grow.

Todd SundstedWill Richardson

Building Dependency Injection with Crystal Macros

Appreciate my absolutely cursed macros that call other macros that trigger generic specialisation to introspect on method names all just to create objects

willhbr.net/2026/01/31/crystal

Todd Sundsted

today i learned that you can run commands in a docker container from the command line. i guess this is pretty obvious, but somehow i missed it.

docker run --rm alpine:edge sh -c "apk update && apk search crystal"

#TIL

Todd Sundsted