<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[#ActivityPub developers: which of these HTTP caching headers does your software publish or consume?]]></title><description><![CDATA[<p><a href="https://cosocial.ca/tags/ActivityPub" rel="tag">#<span>ActivityPub</span></a> developers: which of these HTTP caching headers does your software publish or consume? </p><p><a href="https://cosocial.ca/tags/EvanPoll" rel="tag">#<span>EvanPoll</span></a> <a href="https://cosocial.ca/tags/poll" rel="tag">#<span>poll</span></a></p>]]></description><link>https://citiverse.it/topic/5c631be5-22f1-45b1-ab85-cb39cd7f5d82/activitypub-developers-which-of-these-http-caching-headers-does-your-software-publish-or-consume</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 14:58:24 GMT</lastBuildDate><atom:link href="https://citiverse.it/topic/5c631be5-22f1-45b1-ab85-cb39cd7f5d82.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Apr 2026 12:34:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 22:24:57 GMT]]></title><description><![CDATA[<p><span><a href="/user/julian%40activitypub.space">@<span>julian</span></a></span> ah, right! I meant, many Fediverse servers don't do a good job with caching headers, but you can use some of the data to guess if there have been changes. Caching headers are better though!</p>]]></description><link>https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116348780360092235</link><guid isPermaLink="true">https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116348780360092235</guid><dc:creator><![CDATA[evan@cosocial.ca]]></dc:creator><pubDate>Sat, 04 Apr 2026 22:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 18:07:19 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/evan%40cosocial.ca" target="_blank" rel="noopener noreferrer nofollow ugc">@evan@cosocial.ca</a> yes, you can but that's not the point I think?</p>
<p dir="auto">The point is that generating the collection is more expensive than returning the ETag, if it's cached (and it is, with NodeBB).</p>
<p dir="auto">So if I wanted to check the context for updates, I could issue a lightweight HEAD instead of a GET, and the target server could simply bounce back the ETag.</p>
<p dir="auto">Likewise, I think it sends the appropriate http response (<code>304 Not Modified</code>) when If-None-Match matches the ETag, or something. So I think with collections of object ids, the savings are minimal but it could add up to much more for endpoints that return entire objects... Like an outbox!</p>
<p dir="auto">It's been awhile since I worked on that code.</p>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1730</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1730</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Sat, 04 Apr 2026 18:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 14:27:43 GMT]]></title><description><![CDATA[<p>It would probably be good if we had a separate identity header, so servers can say, "this stuff is different by user, this is the same for every user" with Vary: Signature-Key-Id or something.</p>]]></description><link>https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346903850815405</link><guid isPermaLink="true">https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346903850815405</guid><dc:creator><![CDATA[evan@cosocial.ca]]></dc:creator><pubDate>Sat, 04 Apr 2026 14:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 14:25:46 GMT]]></title><description><![CDATA[<p>The problem with Signature: and Signature-Input:</p><p>If the server wants to say, "this content is different for different users", you use the Vary header. For OAuth, you'd use Vary: Authorization, say. And the cache knows to separate data for different users. Same OAuth token, you can reuse the cached data.</p><p>We include our ID in the Signature (or Signature-Input) header. But we also include a timestamp there, so every single request has a different signature (by design).</p>]]></description><link>https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346896160203413</link><guid isPermaLink="true">https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346896160203413</guid><dc:creator><![CDATA[evan@cosocial.ca]]></dc:creator><pubDate>Sat, 04 Apr 2026 14:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 14:09:59 GMT]]></title><description><![CDATA[<p>Thanks to everyone who replied! Unfortunately HTTP caching is not our strong suit in the ActivityPub world; HTTP Signature header(s) are a real public cache buster. But you can do at least some good caching per user. tags.pub provides ETag, and sends If-None-Match and If-Modified-Since, but doesn't do Last-Modified well yet.</p>]]></description><link>https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346834056478847</link><guid isPermaLink="true">https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346834056478847</guid><dc:creator><![CDATA[evan@cosocial.ca]]></dc:creator><pubDate>Sat, 04 Apr 2026 14:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 14:06:23 GMT]]></title><description><![CDATA[<p><span><a href="/user/julian%40activitypub.space">@<span>julian</span></a></span> hmmm. With a reverse chron collection you can do pretty well with `totalItems` and the first item on the first page. </p><p>If there were net items added or deleted, `totalItems` will be different. </p><p>If the same number of items were added and deleted, the most recent item will be different. </p><p>So you can check synch with a couple of hits.</p>]]></description><link>https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346819897602642</link><guid isPermaLink="true">https://citiverse.it/post/https://cosocial.ca/users/evan/statuses/116346819897602642</guid><dc:creator><![CDATA[evan@cosocial.ca]]></dc:creator><pubDate>Sat, 04 Apr 2026 14:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Sat, 04 Apr 2026 11:17:33 GMT]]></title><description><![CDATA[<p><span><a href="/user/evan%40cosocial.ca">@<span>evan@cosocial.ca</span></a></span></p><p>None of them... yet... <img src="https://citiverse.it/assets/plugins/nodebb-plugin-emoji/emoji/android/1f609.png?v=8a6f891d299" class="not-responsive emoji emoji-android emoji--wink" style="height:23px;width:auto;vertical-align:middle" title="😉" alt="😉" /></p>]]></description><link>https://citiverse.it/post/https://hhmx.de/users/nick/notes/2270716</link><guid isPermaLink="true">https://citiverse.it/post/https://hhmx.de/users/nick/notes/2270716</guid><dc:creator><![CDATA[nick@hhmx.de]]></dc:creator><pubDate>Sat, 04 Apr 2026 11:17:33 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Fri, 03 Apr 2026 16:20:41 GMT]]></title><description><![CDATA[<p dir="auto">Cache-Control and Vary</p>
]]></description><link>https://citiverse.it/post/https://piefed.social/comment/10810465</link><guid isPermaLink="true">https://citiverse.it/post/https://piefed.social/comment/10810465</guid><dc:creator><![CDATA[rimu@piefed.social]]></dc:creator><pubDate>Fri, 03 Apr 2026 16:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Fri, 03 Apr 2026 13:01:43 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/evan%40cosocial.ca" target="_blank" rel="noopener noreferrer nofollow ugc">@evan@cosocial.ca</a> all four, but only for contexts. It's how NodeBB's topic synchronization logic works, although there isn't an FEP for it yet <img src="https://citiverse.it/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=8a6f891d299" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title="🙂" alt="🙂" /></p>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1722</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1722</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Fri, 03 Apr 2026 13:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to #ActivityPub developers: which of these HTTP caching headers does your software publish or consume? on Fri, 03 Apr 2026 12:39:34 GMT]]></title><description><![CDATA[<p><span><a href="/user/evan%40cosocial.ca">@<span>evan</span></a></span> My systems export both Etag and Last-Modified. I have no idea how the computers looking at my stuff know which to prioritise, and typically on my browser I still need to refresh the page manually to see any changes. Caching really is quite hard.</p>]]></description><link>https://citiverse.it/post/https://bne.social/users/james/statuses/116340816235086473</link><guid isPermaLink="true">https://citiverse.it/post/https://bne.social/users/james/statuses/116340816235086473</guid><dc:creator><![CDATA[james@bne.social]]></dc:creator><pubDate>Fri, 03 Apr 2026 12:39:34 GMT</pubDate></item></channel></rss>