#ktistec 160 hashtags

Todd Sundsted
Release v2.4.13 of Ktistec

I was planning on adding support for custom themes in release v2.4.13 of Ktistec. That turned out to be difficult, so I implemented post visibility instead—which then also turned out to be difficult. C'est la vie.

The editor now includes radio buttons for controlling post distribution and visibility. In particular, you can now send messages directly to mentioned users without sending them to all of your followers.

You can also mark posts as sensitive using the content warning checkbox in the editor. Sensitive posts are hidden behind a summary that readers can click to reveal the content.

figure: screenshot of the editor showing the visibility settings and the content warning checkbox

This release of Ktistec includes RSS feeds and RSS feed discovery. RSS feeds are currently available for the site home page and account pages.

Here's the full changelog:

Added

  • Support RSS feeds on the home page and account pages. (fixes #14)
  • Hide sensitive content, spoilers, etc. with content warnings.
  • Support direct messages with proper visibility controls.

Changed

  • Switch from calendar-based periods to duration-based periods in charts.

Fixed

  • Track and federate object updates.
  • Fix object visibility bugs in object replies and threads.

#ktistec #fediverse #activitypub #crystallang

Todd Sundsted
Todd Sundsted
figure: the form inputs for setting range and granularity on the metrics page

I'm going to make a backwards-incompatible change to the dropdown values for the range input on the metrics page, switching from calendar-based periods to duration-based periods. I thought beginning of week, beginning of month, and beginning of year would be sensible ranges, but I almost always adjust the range in the query string by hand to be last seven days, last thirty days, or last 365 days, so it makes sense to make those the options.

#ktistec

Todd Sundsted
Release v2.4.12 of Ktistec

The biggest changes in release v2.4.12 of Ktistec are the UI/UX enhancements. The mobile profile, in particular, felt like an afterthought—which it was. The changes make the mobile experience much more pleasant and ergonomic. All of the credit for this work goes to @jayvii.

This release also now refuses to deserialize and use embedded ActivityPub objects from hosts other than the host of the embedding object. While I haven't encountered any problems with the previous implementation in practice, this fix closes a gap that could be exploited by a bad actor to spoof or change content.

Added

  • Add follow request status to the actor panel.
  • Compute and cache monthly active accounts.

Changed

  • (Internal) Only consider properties with changed values as "changed".
  • (Internal) Only deserialize embedded ActivityPub objects if hosts match.

Fixed

  • Remove line breaks in Turbo Stream output.

#ktistec #fediverse #activitypub #crystallang

Todd Sundsted
Now on Epiktistes: two accounts!

The smoke test worked. Account-level access control works. I'm pretty sure the remaining issues are all in the inbox/outbox pipeline—which is some of the oldest code in Ktistec.

Also, the issue with MAU is fixed in 740d3c28.

#epiktistes #ktistec

Todd Sundsted
Release v2.4.11 of Ktistec

Ktistec is taking steps toward supporting multiple users. The first (small) step removes the actor panel from the unauthenticated home page and replaces it with a site description. You can see this in action at epiktistes.com. The site description is managed on the settings page using the same rich text editor used to edit posts. See the README for more information.

Other changes in this release:

Added

  • Support a "site description" on the unauthenticated home page.
  • Support autofocus on onboarding and authentication forms.
  • Add trix_editor view helper.

Changed

  • Remove accounts from unauthenticated home page.
  • Persist timeline filters in session.

Fixed

Other

  • Disable streaming updates on pages other than the first. (fixes #118)
  • Pin Crystal version at 1.16.3 in Docker build. (see libxml_ext#1)

#ktistec #fediverse #activitypub #crystallang

Todd Sundsted
Release v2.4.10 of Ktistec

I'm trying to get through the backlog of bugs and features in my to-do list. Release v2.4.10 of Ktistec packages up several important improvements. The most impactful change is graceful server shutdown—I've never had a problem with shutdown leaving the database in a broken state, but prevention is the best cure.

Added

  • Support manually refreshing actor information. (fixes #112)
  • Add link to log level settings to the navigation bar.

Fixed

  • Enable dragging source links to the address bar. (fixes #109)
  • Fix missing reply/mention notifications for non-create activities.
  • Ensure the network is up before attempting to refresh a page.

Changed

  • Block actor handle and display name when actor or post is blocked.
  • Gracefully shut down the server.

I'm considering adding lightweight multi-user support (invitation-only, not open registration). I'm interested in your thoughts on whether this would be useful.

#ktistec #fediverse #activitypub #crystallang

Todd Sundsted

the 113,520 lines of code across 332 files in the ktistec codebase is teaching me the importance of distinctive class/method/function/variable names

#ktistec #crystallang

Todd Sundsted
Release v3.0.0 of Ktistec

I've been running v3.0.0 of Ktistec in production for the last few weeks, and it seems stable and I’m using it every day, so it’s time to release it!

This release adds:

  • Model Context Protocol (MCP) support. Ktistec can act as an MCP Server.
  • OAuth2 authentication support. Ktistec can act as both an OAuth2 authentication server and a resource server.

Model Context Protocol (MCP) is a simple, general API that exposes Ktistec ActivityPub collections (timeline, notifications, likes, announces, etc.) to MCP clients. To be fully transparent about what this means, MCP clients are shells for Large Language Models (LLMs).

When building this, I focused on a few use cases that are important to me: content summarization, content prioritization (or filtering) based on my interests or the content's structure (well-constructed arguments vs. low-signal opinions) or its tone, especially when it comes to shared posts. Ktistec is a single user ActivityPub server and Epiktistes (my instance) gets a lot of traffic. I want to build the “algorithms” that surface the content I want to see.

Of note, there’s currently no support for content generation.

While I work on this, I’m not abandoning the 2.x line. I’ll continue to add compatible features and fix bugs as long as I'm able. I realize the use of LLMs, and MCP by extension, and therefore the 3.x branch, is controversial—I don’t intend to push v3 on anyone.

If you're still with me, Ktistec now exposes:

  • MCP Resources
    • ActivityPub actors (ktistec://actors/{id*})
    • ActivityPub objects (ktistec://objects/{id*})
    • registered users (ktistec://users/{id})
    • server information (ktistec://information)
  • Tools
    • count_collection_since(name, since)
    • paginate_collection(name, page, size)
    • read_resources(uris)
  • Prompts
    • whats_new

Supported collections include:

  • timeline, notifications, posts, drafts, likes, announces, followers, following
  • collections of hashtags of the form hashtag#<name> (e.g., "hashtag#technology")
  • collections of mentions of the form mention@<name> (e.g., "mention@euripides")

There is more detail in the README.

TL;DR Add a remote MCP connector in your MCP client of choice: supply the URL of your instance including the /mcp path (e.g. "https://epiktistes.com/mcp").

Screenshot of the MCP Inspector connected to Epiktistes


#ktistec #fediverse #activitypub #crystallang #mcp #llm

Todd Sundsted
Release v2.4.9 of Ktistec

Release v2.4.9 of Ktistec fixes two significant bugs. From the changelog:

  • Don't reset next_attempt_at in tasks when server restarts.
  • Fix incorrect syntax for inline tags in Slang templates.

The first bug resulted in server maintenance tasks running immediately, every time the server restarted, and then beginning their cadence of scheduled runs from there. The second bug surfaced after I released a new version of Slang that itself included a bug fix.

#ktistec #fediverse #activitypub #crystallang