Release v3.2.0 of Ktistec
<p>The major feature in <a href="https://github.com/toddsundsted/ktistec/compare/65e9e57f...9a25965a" rel="nofollow">v3.2.0 of Ktistec</a> is thread analysis. The previous release, <a href="https://epiktistes.com/objects/EB2bbZyS-xA" rel="nofollow">v3.1.2</a>, added support for viewing threads from <a href="https://github.com/LemmyNet/lemmy" rel="nofollow">Lemmy</a> communities. I follow the <a href="https://lemmy.world/c/
[email protected]" rel="nofollow">Open Source</a> community, which leads to many large threads. The thread on <a href="https://lemmy.world/post/38671782" rel="nofollow">FFMpeg and Google</a> has 112 posts and is still growing.</p><p>Thread analysis helps me navigate these extensive conversations. It includes: top contributors, a timeline histogram, and notable branches.</p><p>The analysis applies several heuristics to identify interesting branches of the main thread. “Interesting” is subjective, but the algorithm currently looks for sudden bursts of activity and highlights those areas. Ktistec uses this to create a table of contents that links directly to those branches. Clicking on one of these links takes you to a branch-only view that focuses on the selected part of the thread.</p><p>It's fast—I anticipated needing to cache analyses, but analyzing a thread with over 400 posts takes only about 50 milliseconds on my production server.</p>Figure 1: Screenshot of the final design. Notable branches link to subsets of the thread.<p>This release also addresses an object visibility regression that was introduced in a previous version.</p><p>Full Changelog</p><p>Added</p><p>Thread analysis that displays key participants, a timeline histogram, and notable branches<br>New MCP tools: analyze_thread and get_thread<br>Focal point rendering support for image attachments</p><p>Fixed</p><p>Regression in object visibility affecting replies to threads</p><p>Changed</p><p>Enhanced MCP tool details for likes, dislikes, and announces<br>Improved cookie security.</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
<p>no <a href="/tags/ktistec/" rel="tag">#ktistec</a> release this week. i have been working on bookmarked posts, pinned/featured posts, as well as some minor performance improvements, but i need to spend time fixing <a href="https://github.com/toddsundsted/libxml_ext/issues/1" rel="nofollow">an issue with my libxml extensions</a> that is preventing me from moving to the latest release of <a href="/tags/crystallang/" rel="tag">#crystallang</a>. i've been putting it off but it's gotta get done, so...</p>
Release v3.2.2 of Ktistec
<p>The big feature in <a href="https://github.com/toddsundsted/ktistec/compare/ab57a3c7...74f7666e" rel="nofollow">release v3.2.2</a> of Ktistec is pinned posts with support for the Mastodon Featured Posts collection. Federation works both ways—pin a post on Ktistec and it will show up as a pinned post on Mastodon and vice versa. When you refresh an actor profile, Ktistec also fetches and updates the actor's pinned posts. This is another small step in the direction of supporting all features that Mastodon-compatible client applications expect to access via the API. It's also useful in its own right.</p><p> The other major feature, which I posted a short video demonstrating <a href="https://epiktistes.com/objects/HEfQyY2fOTQ" rel="nofollow">here</a>, is X-Ray Mode. X-Ray Mode is a developer and power-user tool for inspecting ActivityPub JSON-LD representations of actors, objects, and other content. Pressing Ctrl+Shift+X on any page displays the data behind the page—like an x-ray. You can:</p><p>Cached Version: View the local JSON-LD representation stored in the Ktistec database<br>Remote Version: Fetch and view the original JSON-LD representation from the source server<br>Navigation: Click on any ActivityPub IRI to navigate to that object<br>History: Use Alt+Left and Alt+Right to navigate through your viewing history</p><p>This feature is useful for debugging federation issues, understanding ActivityPub structures, and verifying how content is stored and represented.</p><p>Here's the full changelog for the release:</p><p>Added</p><p>Support for pinned posts and the Mastodon "featured posts" collection.<br>X-Ray Mode for viewing and navigating JSON-LD resource (actor, object, etc.) representations.<br>Back links on thread pages for easier navigation. (fixes <a href="/tags/1/" rel="tag">#1</a>)<br>License page for LibreJS compliance. (fixes <a href="/tags/127/" rel="tag">#127</a>)<br>Highlighting of recently fetched hashtagged posts.</p><p>Changed</p><p>Improved presentation of audio and video media.<br>Refactored theming/styling implementation.</p><p>The next release will focus on smaller features and bug fixes.</p><p>Enjoy!</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
Release v3.2.3 of Ktistec
<p><a href="https://github.com/toddsundsted/ktistec/compare/2ab2a727...023fd225" rel="nofollow">Release v3.2.3</a> of Ktistec includes two big features:</p><p><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/1b12/fep-1b12.md" rel="nofollow">FEP-1b12</a> Group federation<br>Improved federation with Lemmy and other forum-type servers. Ktistec supports community and thread follow/unfollow, as well as up-vote/like (down-vote/dislike is supported but there is no visual affordance for that yet).<br><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/9098/fep-9098.md" rel="nofollow">FEP-9098</a> Custom emojis<br>Support for viewing custom emoji in posts and on actor profiles. Ktistec does not yet support custom emoji creation and management.</p><p>The full changelog:</p><p>Added</p><p>Support for viewing custom emoji in posts and on actor profiles.<br>Actor type (Person, Group, etc.) overlay badges on actor panels.<br>Colored fallback avatars for actors without icons.<br>Support for robots.txt.</p><p>Fixed</p><p>Federation with Lemmy and other servers that support <a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/1b12/fep-1b12.md" rel="nofollow">FEP-1b12</a>.<p>Shared inbox support for local actors.<br>Serialization of Undo includes the undone activity.<br>Serialization of Like and Dislike does not.</p><br>Notify only once for an object's first received activity.</p><p>Changed</p><p>Accumulate metrics by hour for finer granularity.<br>Clean up presentation of public followers/following pages.</p><p>The next release will include support for Mastodon polls (<a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/9967/fep-9967.md" rel="nofollow">FEP-9967</a>).</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
Release v2.4.11 of Ktistec
<p>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 <a href="https://epiktistes.com/" rel="nofollow">epiktistes.com</a>. The site description is managed on the settings page using the same rich text editor used to edit posts. See the <a href="https://github.com/toddsundsted/ktistec?tab=readme-ov-file#site-description" rel="nofollow">README</a> for more information.</p><p>Other changes in this release:</p><p>Added</p><p>Support a "site description" on the unauthenticated home page.<br>Support autofocus on onboarding and authentication forms.<br>Add trix_editor view helper.</p><p>Changed</p><p>Remove accounts from unauthenticated home page.<br>Persist timeline filters in session.</p><p>Fixed</p><p>Exclude abstract classes from all_types output. (fixes <a href="/tags/104/" rel="tag">#104</a>)<br>Work around bug in at_beginning_of_week. (see <a href="https://github.com/crystal-lang/crystal/issues/16112" rel="nofollow">crystal-lang/crystal#16112</a>)</p><p>Other</p><p>Disable streaming updates on pages other than the first. (fixes <a href="/tags/118/" rel="tag">#118</a>)<br>Pin Crystal version at 1.16.3 in Docker build. (see <a href="https://github.com/toddsundsted/libxml_ext/issues/1" rel="nofollow">libxml_ext#1</a>)</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
<p>With the addition of the <a href="https://epiktistes.com/@ktistec" rel="nofollow">@ktistec</a> account, <a href="https://github.com/toddsundsted/ktistec" rel="nofollow">Ktistec</a> (the server) now supports multiple users.</p><p>I still have a few rough edges to fix, but there's a good chance official multi-user support will be included in the next release.</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
Release v2.4.15 of Ktistec
<p>Experimental support for multiple users landed with Ktistec <a href="https://github.com/toddsundsted/ktistec/releases/tag/v2.4.15" rel="nofollow">release v2.4.15</a>. "Experimental" means that it works for me, but hasn't seen enough testing for me to call it "ready for production". With that said, it's unlikely you'll lose your data.</p><p>There are lots of intentional design decisions that fit my vision for Ktistec but may surprise you. Here they are:</p><p>Every user is an administrator. That doesn't mean users have access to each other's posts and data, but it does mean all users have access to the shared parts of the site—they can change the site description, for example—and they can add new users. So only add people you trust.</p><p>If you want to add another user, create an account for them and give them their username and password. There is no self-registration. There are no invitations.</p><p>Beyond adding a user, there is no support for user management. You can't even boot a user from your site. Users can delete themselves, however.</p><p>There is no support for content moderation. Only add people you trust.</p><p>TL;DR Multi-user support in Ktistec is suitable for small teams, families (biological or chosen), and your personal avatars. There are better tools for online communities.</p><p>Here's the full set of changes:</p><p>Added</p><p>Add support for multiple user accounts.</p><p>Fixed</p><p>Hide attachments behind the summary. (fixes <a href="/tags/125/" rel="tag">#125</a>)<br>Mark actors as up after refreshing their profile.</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
Release v2.4.16 of Ktistec
<p><a href="https://github.com/toddsundsted/ktistec/releases/tag/v2.4.16" rel="nofollow">Release v2.4.16</a> of Ktistec... because I forgot to include some critical code in v2.4.15... namely, the menu.</p><p>Changed</p><p>Reorganize the admin menu.</p><p>If you're not planning on adding additional users, you don't need to update!</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
Release v3.2.7 of Ktistec
<p>The two big features in <a href="https://github.com/toddsundsted/ktistec/compare/480c0c6f...c37790ba" rel="nofollow">release v3.2.7 of Ktistec</a> are back end support for creating polls (the front end is coming in the next release) and advanced theming support—specifically, a rich vocabulary of CSS class values and data attributes on which to build a theme. The full set is <a href="https://github.com/toddsundsted/ktistec?tab=readme-ov-file#css-classes-and-data-attributes" rel="nofollow">documented in the README</a>. I'll post more on how I'm using these later this week.</p><p>Here is the full set of notable changes:</p><p>Added</p><p>Back-end support for creating polls.<br>Advanced theming support with new classes, data attributes, and view helpers.<br>Task status display on admin page showing running and imminently scheduled task counts.</p><p>Fixed</p><p>Poll vote form now correctly submits Question ID.</p><p>Changed</p><p>Move location of Ktistec version notice. (fixes <a href="/tags/133/" rel="tag">#133</a>)<br>Updated admin page for better accessibility and less clutter.</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
Release v3.1.3 of Ktistec
<p>There are two big features in <a href="https://github.com/toddsundsted/ktistec/compare/c460d486...c06caebe" rel="nofollow">release v3.1.3</a> of Ktistec: auto-approve followers and a new image viewer.</p><p>Auto-approve followers is conceptually simple ("the server automatically sends an Accept activity when it receives a Follow activity") but it required extensive changes to some of the oldest code in the codebase: the inboxes and outboxes controllers. I refactored inbox and outbox side-effect processing into independent services, which made it possible to support side-effects like auto-approve follow (and also auto-follow back), without having to go through the controllers.</p><p>A more significant change for me personally was replacing the lightGallery image gallery (an external dependency) with my own implementation. It's not as slick, and not as full of features—I wrote it in two days—but it is fully free software, and that's important to me.</p><p>Added</p><p>Add admin page for managing OAuth access tokens.<br>Add support for auto-approve followers. (fixes <a href="/tags/26/" rel="tag">#26</a>)<br>Add support for auto-follow back.</p><p>Fixed</p><p>Prevent triggering actor refresh when user is anonymous.</p><p>Changed</p><p>Replace "lightgallery" dependency with custom image viewer.<br>Set OAuth access token expiry to 30 days (previously expired after 24 hours).<br>Refactor inbox and outbox processing into dedicated processor services.</p><p>The OAuth changes set the groundwork for better support of the Mastodon API and the Fediverse clients that depend on it. Stay tuned!</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a></p>
Release v3.3.3 of Ktistec
<p>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 <a href="https://joinmastodon.org/apps" rel="nofollow">official Mastodon app</a>, <a href="https://tusky.app/" rel="nofollow">Tusky</a>, and <a href="https://phanpy.social/" rel="nofollow">Phanpy</a>.</p><p>Here's the full changelog:</p><p>Fixed</p><p>Editor focus now stays in the editor after the first draft is saved. (fixes <a href="/tags/139/" rel="tag">#139</a>)<br>Filter settings instructions. (fixes <a href="/tags/135/" rel="tag">#135</a>)</p><p>Changed</p><p>Improved consistency of mini button colors.</p><p>As always, check out the <a href="https://github.com/toddsundsted/ktistec/compare/39a167b9...c95cd6f3" rel="nofollow">full diff</a> for the complete details.</p><p><a href="/tags/ktistec/" rel="tag">#ktistec</a> <a href="/tags/crystallang/" rel="tag">#crystallang</a> <a href="/tags/activitypub/" rel="tag">#activitypub</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>