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
Release v3.3.7 of Ktistec

Release v3.3.7 of Ktistec fixes several bugs and introduces two enhancements.

Security is a focus in this release. Every gap in input sanitization or escaping is a potential vulnerability, and I've been systematically closing them. I am also carefully, and maybe conservatively, restricting things like supported URL schemes and uploaded file types.

The two enhancements improve compatibility with Mastodon-compatible clients. Mastodon's OAuth tokens don't expire, and Mastodon clients don't know how to handle tokens that do. Sliding expiration ensures that tokens in active use stay alive, while unused tokens eventually expire.

Here's the full changelog:

Added

  • Sliding token expiration for OAuth2 access tokens.
  • Mastodon-compatible API: /api/v1/accounts/update_credentials endpoint.

Fixed

  • Prevent pinning of (and auto-unpin) private objects.
  • Don't save a quote if the quoted actor cannot be dereferenced.
  • Fix rendering of federated actor profile attachment values.
  • Remove href attributes with unsafe schemes from sanitized HTML.
  • Escape interpolated values in view helpers and the actor icon streaming refresh.
  • Restrict upload extensions and serve uploads with X-Content-Type-Options: nosniff.
  • Escape publicKey and scrub Tag.href.
  • Sanitizer no longer permits single-quote attribute injection.
  • Ensure bearer-token sessions cannot reach the web UI.
  • Require client authentication on the OAuth token endpoint.

I'm working on performance improvements for the next release. A rewrite of the Slang template library looks like it will cut both build time and executable size by around 10%!

馃摗 Stay tuned!

#ktistec #crystallang #activitypub #fediverse

Todd Sundsted

east village, manhattan, nyc
floodgates

view of the large floodgate door along the east river of manhattan
Todd Sundsted

i鈥檝e been writing lexers and parsers for most of my career. i still don鈥檛 feel i鈥檓 very good at it.

Todd Sundsted

east village, manhattan, nyc
still one of my favorite places
surprisingly quiet evening

1st avenue, looking east along 10th street at trees, cars, people, and stores at twilight
Todd SundstedCrystalLanguage

A new patch release Crystal 1.20.1 fixes some regressions and disables Kernel TLS (added in 1.20.0), due to instability.

Read more at crystal-lang.org/2026/04/29/1.

#crystallang

Todd Sundsted

i learned to program so that i could write text-based adventure games, so i'm particularly excited about this: 50 Years of Text Games

Todd SundstedCrystalLanguage

We released Crystal 1.19.2 to fix the request smuggling vulnerability (already fixed in 1.20.0) and a regression in Range#sample that could eventually lose randomness.

crystal-lang.org/2026/04/27/1.

Todd Sundsted

I鈥檓 working on handling OAuth token expiry as part of #ktistec Mastodon API support. Is my understanding that Mastodon issues OAuth tokens with no expiration correct?!?

Todd Sundsted

does anyone use GNU Cash? any free (software) alternatives anyone recommends?

Todd Sundsted
Release v3.3.6 of Ktistec

This release is a maintenance update: a few bug fixes, a security mitigation worth paying attention to, and some performance improvements for users on slow connections.

It's worth updating to pick up the SSRF (Server-Side Request Forgery) mitigation.

Fixed

  • Prevent SSRF when dereferencing externally supplied IRIs.
  • Timeline entry no longer becomes stale when an announce is undone.
  • Correctly represent boosted posts on the home timeline in API clients.

Changed

  • Defer downloading of script files.
  • Defer loading of image, video, and audio attachments.
  • Move poll vote notification for voters into the outbox processor.

#ktistec #crystallang #activitypub #fediverse