<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
 <title type="text">Will Lachance&#39;s Log: Posts tagged &#39;activitypub&#39;</title>
 <link rel="self" href="https://wrla.ch/feeds/activitypub.atom.xml" />
 <link href="https://wrla.ch/tags/activitypub.html" />
 <id>urn:https-wrla-ch:-tags-activitypub-html</id>
 <updated>2026-09-16T11:11:58Z</updated>

 <entry>
  <title type="text">A couple quick notes on ActivityPub</title>
  <link rel="alternate" href="https://wrla.ch/log/2026/09/a-couple-quick-notes-on-activitypub/?utm_source=activitypub&amp;utm_medium=Atom" />
  <id>urn:https-wrla-ch:-log-2026-09-a-couple-quick-notes-on-activitypub</id>
  <published>2026-09-16T11:11:58Z</published>
  <updated>2026-09-16T11:11:58Z</updated>
  <author>
   <name>Will Lachance</name></author>
  <content type="html">
&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;
</content></entry>

 <entry>
  <title type="text">Is this thing on?</title>
  <link rel="alternate" href="https://wrla.ch/log/2026/08/is-this-thing-on/?utm_source=activitypub&amp;utm_medium=Atom" />
  <id>urn:https-wrla-ch:-log-2026-08-is-this-thing-on</id>
  <published>2026-08-25T02:28:09Z</published>
  <updated>2026-08-25T02:28:09Z</updated>
  <author>
   <name>Will Lachance</name></author>
  <content type="html">
&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;
</content></entry>
</feed>