<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">
 <channel>
  <title>Will Lachance&#39;s Log: Posts tagged &#39;activitypub&#39;</title>
  <description></description>
  <link>https://wrla.ch/tags/activitypub.html</link>
  <lastBuildDate>Wed, 16 Sep 2026 11:11:58 GMT</lastBuildDate>
  <pubDate>Wed, 16 Sep 2026 11:11:58 GMT</pubDate>
  <ttl>1800</ttl>

  <item>
   <title>A couple quick notes on ActivityPub</title>
   <link>https://wrla.ch/log/2026/09/a-couple-quick-notes-on-activitypub/?utm_source=activitypub&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-wrla-ch:-log-2026-09-a-couple-quick-notes-on-activitypub</guid>
   <pubDate>Wed, 16 Sep 2026 11:11:58 GMT</pubDate>
   <author>Will Lachance</author>
   <description>
&lt;p&gt;A few weeks ago, I made this site publish to ActivityPub (really mostly thinking
about Mastodon, although as an open standard other software can consume it).
Just wanted to write down a few notes on the experience for posterity.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;tl;dr: At this time, a pure-static ActivityPub site isn&#39;t possible but the dynamic parts aren&#39;t particularly complicated and can be implemented with relatively minimal effort and compute.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Mechanism&lt;/h2&gt;
&lt;p&gt;There are really two parts to publishing, the static feed and the notification mechanism.&lt;/p&gt;
&lt;p&gt;The feed itself is a collection of files, published statically: just like this post.
Similarly, the &lt;a href=&#34;https://docs.joinmastodon.org/spec/webfinger/&#34;&gt;WebFinger&lt;/a&gt; portions of the site, which allows Mastodon to discover metadata about the publisher, can be static.
No reason it can&#39;t be the same every time this blog is published.&lt;/p&gt;
&lt;p&gt;The dynamic and complicated portions come from the &amp;quot;social&amp;quot; features of ActivityPub.
To track followers and syndicate &amp;quot;likes&amp;quot;, &amp;quot;quotes&amp;quot;, and &amp;quot;boosts&amp;quot;, you need both internal storage (to track the actions and who they should be distributed to)
and a mechanism to &amp;quot;push&amp;quot; them to whoever has subscribed.
To prevent impersonation, ActivityPub specifies that the messages pushed should be cryptographically signed (= generating and using RSA keys).&lt;/p&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;I was already using Cloudflare pages to deploy this blog, so building on top of their infrastructure was the obvious choice.&lt;/p&gt;
&lt;p&gt;The non-dynamic parts of the implementation just used this site&#39;s (very boring) Python code to write things out into the ActivityPub format Mastodon expected.&lt;/p&gt;
&lt;p&gt;The dynamic parts were written using a Cloudflare worker, running on python / &lt;a href=&#34;https://pyodide.org/en/stable/&#34;&gt;pyodide&lt;/a&gt;.
Backing store was &lt;a href=&#34;https://developers.cloudflare.com/d1/&#34;&gt;D1&lt;/a&gt;, an sqlite-like database.&lt;/p&gt;
&lt;p&gt;I got an LLM (GPT 5.6ish) to write most of it, based on &lt;a href=&#34;https://github.com/wlach/wrla.ch/blob/8a8683d351bf2d6a71f11d7e72d44279dd65ae7c/idrs/202608240235-add-activitypub-feed.md&#34;&gt;an idr&lt;/a&gt;.
I wasn&#39;t tracking precisely, but my guess is the implementation took four to six hours.
If I didn&#39;t care about making the output coherent and legible to myself, it probably could have been done in about half the time.&lt;/p&gt;
&lt;p&gt;As software goes, I&#39;m pretty happy with the result.
It&#39;s simple, cheap, and probably portable elsewhere without too much trouble if I ever get sick of Cloudflare.&lt;/p&gt;
&lt;h2&gt;Payoff&lt;/h2&gt;
&lt;p&gt;Honestly pretty marginal so far.
You can follow &lt;code&gt;@wrlach@wrla.ch&lt;/code&gt; from your favorite ActivityPub implementation and get post summaries as they are published.
If you wish, you can also boost/quote/like them.
As of 2026-09-16 I appear to be the only one who has done this.&lt;/p&gt;
&lt;p&gt;Viable alternatives to what I did:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RSS: much, much simpler-- just a XML feed of posts. Venerable. Interoperable. Downside is that it&#39;s one way publishing. You can use &lt;a href=&#34;https://fed.brid.gy/&#34;&gt;bridgy.fed&lt;/a&gt; to syndicate content from an RSS feed to both ActivityPub and ATProto (aka Bluesky).&lt;/li&gt;
&lt;li&gt;Manual linking by posting from my &lt;code&gt;@wlach@cosocial.ca&lt;/code&gt; account: for the amount of time I took to build this, I could have done this literally hundreds of times.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coda&lt;/h2&gt;
&lt;p&gt;This wasn&#39;t &lt;em&gt;too&lt;/em&gt; hard, but to make social publishing truly accessible, I feel like the direction to go is handling the social aspects via &lt;em&gt;the consuming application&lt;/em&gt; (Mastodon and friends) rather than forcing each publisher to reinvent the wheel.
bridgy.fed is cool, but it feels a bit bolted-on.&lt;/p&gt;
&lt;p&gt;If you enjoyed this post, you might find &lt;a href=&#34;https://socialwebfoundation.org/2026/09/04/static-activitypub-publishing/&#34;&gt;Static ActivityPub Publishing&lt;/a&gt; interesting.&lt;/p&gt;
</description></item>

  <item>
   <title>Is this thing on?</title>
   <link>https://wrla.ch/log/2026/08/is-this-thing-on/?utm_source=activitypub&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-wrla-ch:-log-2026-08-is-this-thing-on</guid>
   <pubDate>Tue, 25 Aug 2026 02:28:09 GMT</pubDate>
   <author>Will Lachance</author>
   <description>
&lt;p&gt;For no particular reason other than &amp;quot;I wanted to see if I could&amp;quot;, I added
an ActivityPub server to this domain (&lt;a href=&#34;https://wrla.ch&#34;&gt;wrla.ch&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/log/2026/08/is-this-thing-on/mastodon.png&#34; alt=&#34;Mastodon Screenshot with wrla.ch account&#34; /&gt;&lt;/p&gt;
&lt;p&gt;If it worked, you should be able to subscribe to future posts on from this blog
by adding &lt;code&gt;@wrlach@wrla.ch&lt;/code&gt; to your fediverse client (e.g. &lt;a href=&#34;https://joinmastodon.org&#34;&gt;Mastodon&lt;/a&gt;).&lt;/p&gt;
</description></item>
</channel></rss>