project activity

My Covid-19 quarantine plan for the last 12 months was to write code every day. With a few exceptions, I pulled that off. The big pre-Covid plan was to write every day, but in traditional hacker fashion I first built some tools (Ktistec and kin).

The big project was Ktistec, of course, but early on I spent a lot of time on, mostly on native MXNet bindings, but also on a Gluon compatible library. I also put a lot of time into Ishi, a project that sprang from my desire to visualize MXNet output inside of my iTerm console.

Now, to do some writing...

#ktistec #mxnet #ishi

ktistec now supports both @-mentions and #-hashtags.

commits 4118ec6 through 1bdcf12 consist of an embarrassing amount of yak-shaving, and that's not the whole of it. commits 3346865 through dfc00d2 were necessary to make those changes work. and most of the work to surmount the first problems i ran into were actually fixed with commit 258e2d3, but i didn't realize that and make the change until quite late in the game. so it goes.

#ktistec #yakshaving


i'm happy with how typeahead now works in ktistec. it took a surprising amount of effort to get it to feel right.


commits 52d849d through 8cd8f3b implement draft posts, a feature that makes it easier to use ktistec to compose longer posts. one big change in the set of changes is support for incremental edits and saves of posts, as they are being written. this change also gets us very close to federated updates to published posts—a feature that mastodon, unfortunately, only supports for polls.


i've released more enhancements to ktistec. i'm still working toward an mvp—functionality any socially-oriented activitypub server should implement. recent commits added replies counts to the social signals exposed to the user, and updated the home page to display local activity to anonymous users.

next up: draft posts


"Many Small Queries Are Efficient In SQLite"

in fact, many small queries can be slightly faster than a single, more complex query, based on testing i'm doing on ktistec. the difference is small—10-15 msec for a complex page on average.


i ask the engineers i work with to spent 25-50% of their time refactoring before adding new features. these commits are exactly that—six days of cleaning up and small fixes.

i'm working toward a smarter timeline—one that uses social signals and some heuristics to prioritize content since i typically follow too many people/topics/things.


commits 2ce62db...86822f5 implement support for typical social signals, like share/boost and like.

i got one like

performing and visualizing simple interactions are table stakes for socializing in the fediverse, so it's an important milestone. i got one like. i want more! 😉

if you're a fan of the crystal programming language check out ktistec. if you're brave enough to try it, i'd love feedback!



  1. asterite is correct. named tuples in crystal are seemingly attractive (compile-time type checking of keys and values) but quickly become a trainwreck as the compiler specializes every method receiving them (passing/receiving **options is definitely a code smell). every possible permutation of keys and values is a new type and results in a  specialized copy of a method, increasing build time and executable size.
  2. crystal + sqlite continue to perform well. i recently released code that computes and displays social signals like boosts/shares and likes as part of the content in the timeline. even though counts are aggregated on the fly, rendering is still brisk—about 780msec to fetch and render 1000 posts from the main timeline.


The last large piece of missing functionality leading up to a Ktistec release candidate is complete.

Ktistec now runs scheduled tasks in a separate fiber. In particular, ActivityPub message delivery now happens in the background, which makes posting snappier.

Other new features:

  • Remote follows
  • Warning prompts before dangerous activities (deleting posts)
  • Many bug fixes