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

a glance is worth a thousand words

a black and white husky malamute fluffer mix glancing upward with blue and brown mismatched eyes

#DogsOfMastodon #Saki

Todd Sundsted
Release v3.3.4 of Ktistec

Release v3.3.4 of Ktistec is available.

This release adds Mastodon-compatible client support for publishing posts. Just like the previous release, however, all Mastodon API support is behind a build flag (-Dwith_mastodon_api). It's still experimental, so opt in only if you're happy to work with rough edges.

Beyond that, I focused on cleanup and refactoring throughout the codebase. Here's the full changelog:

Added

  • Cursor-based pagination on actor timeline and everything pages.
  • Mastodon-compatible API: /api/v1/statuses endpoint for status posting.
  • Mastodon-compatible API: /api/v1/timelines/public endpoint.

Fixed

  • Autosave focus handling. Fixes problems introduced in v3.3.3.
  • Prevent blur from creating a draft post when publishing a post.

Changed

  • Integrate X-Ray Mode colors into the theming system.
  • Improve CI: add npm audit, test, and caching.
  • Use npm ci in Dockerfile for reproducible builds.
  • Remove very old compiler bug work-around.

🏋️ Mastodon API support is coming along—more in the next release!

#ktistec #crystallang #activitypub #fediverse

Todd Sundsted

test post from tusker via Mastodon-compatible API… #ktistec

Todd Sundsted

@reiver i installed vibefed. to shrink context usage at the top level, i put everything into one of three groups of skills: fediverse-detection, fediverse-protocols, or fediverse-platforms. the top level skill, in each case, is an index that links to the individual documents. starting with JSON-LD, i'm scrutinizing ktistec's implementation of core technology against your best practices.

Todd Sundsted

after a long detour away from functional programming, i've swerved back and i'm studying lean.

Todd Sundsted

is it the expectation that atomic should be used for all class level variables now?

#crystallang

Todd Sundsted

I have a workflow where I “move” (cherry pick) commits from an R&D branch to the main branch and then rebase the original branch on top of main. Today I learned that this works even if the moved commits are still present on the original branch. Git detects their presence in the history and doesn’t try to add them a second time, which is what I was afraid would happen!

#til

Todd Sundsted
Release v3.3.3 of Ktistec

I have started work on a Mastodon-compatible API layer intended to support the many Mastodon front-ends available. It is incomplete and requires an explicit build flag to enable, but what's there (the main timeline) already works with the official Mastodon app, Tusky, and Phanpy.

Here's the full changelog:

Fixed

  • Editor focus now stays in the editor after the first draft is saved. (fixes #139)
  • Filter settings instructions. (fixes #135)

Changed

  • Improved consistency of mini button colors.

As always, check out the full diff for the complete details.

#ktistec #crystallang #activitypub #fediverse

Todd Sundsted
Release v3.3.2 of Ktistec

This small release focused on two big deliverables: support for the latest version of Crystal and fixes for a few delivery issues.

Previous releases supported a wide range of Crystal Language versions, but ran into problems with version 1.17.x and beyond due to breaking changes in the standard library. This release works on 1.19.1 but also requires at least 1.19.1.

This release also fixes a bug, present since mid-2020 when HTTP signatures were first added, that resulted in signatures some fediverse servers wouldn't accept. Mastodon did, but with the proliferation of new ActivityPub servers, I increasingly encountered servers that did not.

Here's the full changelog:

Fixed

  • HTTP signature keyId now includes #main-key fragment.
  • IRI matching during dereferencing.
  • Broken down-detection for actors.

Changed

  • Fall back to Activity Streams context if supplied context is empty.
  • Deliver to personal inbox if delivery to shared inbox fails.

It's always good to stay up-to-date on releases. But if your platform doesn't yet support 1.19.1, I've also released a parallel branch that still runs on 1.16.3 and earlier. I'll maintain that branch for the next few releases to give everyone time to upgrade.

#ktistec #crystallang #activitypub #fediverse

Todd SundstedJayVii

My never ending quest to redefine my news reading habits have fallen back to old school newspaper reading, but with a twist!

Using a pretty cool RSS aggregator that writes into templates of arbitrary formats in combination with some RegEx foo and a full-page scraper, I am now able to read "newspaper" every morning either on the phone, PC or ebook reader and be done with it for the rest of the day.

I realised that I fall into the habit of checking news constantly, even when using classic RSS readers for it. During my test-flights in the past week, this hacky project appears to work-for-me(TM)

Git-Repository of "Zeitung", a news aggregator in newspaper style as HTML/PDF/EPUB