Recent changes to this wiki:

seems like spam
This reverts commit 1f4ef7fd1b2b761d40af32ba0f9f60a61717668a
diff --git a/doc/users/datahabibi.mdwn b/doc/users/datahabibi.mdwn
deleted file mode 100644
index 87cd3ac1a..000000000
--- a/doc/users/datahabibi.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-Haron Merzaie is co-founder and CEO of [dataHabibi](https://datahabibi.ae/), an AI-powered platform for Dubai housing data, with co-founder Ibrahim Qorraj.
-
-dataHabibi shows building-level prices, rental yields and forecasts, based on Dubai Land Department transactions. The team works from Meydan Free Zone in Dubai, UAE.

remove branch and tag/patch: nothing un-merged (yet)
diff --git a/doc/todo/finish_html5_migration.mdwn b/doc/todo/finish_html5_migration.mdwn
index b05d573af..4271a49e4 100644
--- a/doc/todo/finish_html5_migration.mdwn
+++ b/doc/todo/finish_html5_migration.mdwn
@@ -1,5 +1,3 @@
-[[!template id=gitbranch branch=jon/finish-html5-migration author="[[Jon]]"]]
-
 We should get rid of the html5 config option, remove all the branching around
 it in the templates and unconditionally use the semantic container elements.
 The advantages are twofold: users will get the semantic containers by default

planning to remove the html5 branching in page templates
diff --git a/doc/todo/finish_html5_migration.mdwn b/doc/todo/finish_html5_migration.mdwn
index ca54653ac..b05d573af 100644
--- a/doc/todo/finish_html5_migration.mdwn
+++ b/doc/todo/finish_html5_migration.mdwn
@@ -54,3 +54,8 @@ Steps 3 and 4 should happen in the same release.
 (2) and only pushed it just now. Rats! It would have been good to get that into
 a stable Debian release. We will have to have at least one IkiWiki release
 before we consider (3) and (4). *— [[Jon]], 2025-05-14*
+
+----
+
+I'd like to look at (3) in the near future. Shout *now* if this will be a problem!
+Do we have _any_ (X)HTML or non-HTML(5) users? *— [[Jon]], 2026-10-12*

wl bugs/todo/patch
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index 66bd4ca8c..323533d59 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -8,14 +8,14 @@ since 2008, as well as a number of private instances.
 
  * [[!pagecount pages="bugs/* and !bugs/done and !bugs/discussion and 
 !link(patch) and !link(bugs/done) and !bugs/*/*"
-feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] open bugs
+feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] open [[bugs]]
  * [[!pagecount pages="todo/* and !todo/done and !todo/discussion and !link(todo/done)"
-feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] TODO items
+feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] [[TODO]] items
  * [[!pagecount pages="""
 (todo/* or bugs/*) and link(patch) and !link(bugs/done) and
 !link(todo/done) and !link(reviewed) and !*/Discussion
 """
-]] unreviewed patches
+]] unreviewed [[patch]]es
 
 ## contributions
 

remove toc
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index bbb6db2da..66bd4ca8c 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="Jonathan Dowland"]][[!toc levels=2]]
+[[!meta title="Jonathan Dowland"]]
 
 I've been using IkiWiki for [my personal site](https://jmtd.net/)
 since 2008, as well as a number of private instances.

short 'dashboard' of bugs/patches/TODOs
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index 030b2398d..bbb6db2da 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -4,6 +4,19 @@ I've been using IkiWiki for [my personal site](https://jmtd.net/)
 since 2008, as well as a number of private instances.
 [[I joined the IkiWiki maintainers in 2024|contact]].
 
+## dashboard
+
+ * [[!pagecount pages="bugs/* and !bugs/done and !bugs/discussion and 
+!link(patch) and !link(bugs/done) and !bugs/*/*"
+feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] open bugs
+ * [[!pagecount pages="todo/* and !todo/done and !todo/discussion and !link(todo/done)"
+feedpages="created_after(bugs/no_commit_mails_for_new_pages)"]] TODO items
+ * [[!pagecount pages="""
+(todo/* or bugs/*) and link(patch) and !link(bugs/done) and
+!link(todo/done) and !link(reviewed) and !*/Discussion
+"""
+]] unreviewed patches
+
 ## contributions
 
 I've worked on a few different issues and bugs over the years (they

last edited dates wrong on ikiwiki.info
diff --git a/doc/bugs/ikiwiki.info_last_edited_dates_wrong.mdwn b/doc/bugs/ikiwiki.info_last_edited_dates_wrong.mdwn
new file mode 100644
index 000000000..cabe948e3
--- /dev/null
+++ b/doc/bugs/ikiwiki.info_last_edited_dates_wrong.mdwn
@@ -0,0 +1,3 @@
+Visible at e.g. [[bugs/no_commit_mails_for_new_pages]]. I suspect this is a
+consequence of the underlying git repository being re-created and the mtimes
+being reset. *— [[Jon]], 2026-10-12*

new user page
diff --git a/doc/users/datahabibi.mdwn b/doc/users/datahabibi.mdwn
new file mode 100644
index 000000000..87cd3ac1a
--- /dev/null
+++ b/doc/users/datahabibi.mdwn
@@ -0,0 +1,3 @@
+Haron Merzaie is co-founder and CEO of [dataHabibi](https://datahabibi.ae/), an AI-powered platform for Dubai housing data, with co-founder Ibrahim Qorraj.
+
+dataHabibi shows building-level prices, rental yields and forecasts, based on Dubai Land Department transactions. The team works from Meydan Free Zone in Dubai, UAE.

inline: map meta description to atom summary
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index f40956821..5729945b9 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -689,6 +689,10 @@ sub genfeed ($$$$$@) {
 		);
 
 		if (exists $pagestate{$p}) {
+			if (exists $pagestate{$p}{meta}{description}) {
+				eval q{use HTML::Entities};
+				$itemtemplate->param(summary => HTML::Entities::encode_entities($pagestate{$p}{meta}{description}, '<>&'));
+			}
 			if (exists $pagestate{$p}{meta}{guid}) {
 				eval q{use HTML::Entities};
 				$itemtemplate->param(guid => HTML::Entities::encode_numeric($pagestate{$p}{meta}{guid}));
diff --git a/doc/todo/support_atom_feed_summary_tag.mdwn b/doc/todo/support_atom_feed_summary_tag.mdwn
index 82668f878..75b1e5527 100644
--- a/doc/todo/support_atom_feed_summary_tag.mdwn
+++ b/doc/todo/support_atom_feed_summary_tag.mdwn
@@ -35,3 +35,6 @@ index 9b056e0f4..176f91dfe 100644
  </TMPL_IF>
 ```
 [[!tag patch]] — [[Jon]], 2026-01-19
+
+> I've been using this for most of the year and it's worked well for me,
+> so I'm applying it. [[done]].  — [[Jon]], 2026-10-10

mention podman
diff --git a/doc/containers.mdwn b/doc/containers.mdwn
index 0f8f14b5f..7b81651bd 100644
--- a/doc/containers.mdwn
+++ b/doc/containers.mdwn
@@ -15,4 +15,5 @@ There are at least three unofficial container distributions of IkiWiki:
    based on Debian 13, and Apache httpd,
    by [[users/Jon]]
 
-These can be used with a container runtime such as [Docker](https://www.docker.com/).
+These can be used with a container runtime such as [Docker](https://www.docker.com/)
+or [Podman](https://podman.io/).

update info on opinionated-ikiwiki software + versions
diff --git a/doc/containers.mdwn b/doc/containers.mdwn
index 4ed39feae..0f8f14b5f 100644
--- a/doc/containers.mdwn
+++ b/doc/containers.mdwn
@@ -12,7 +12,7 @@ There are at least three unofficial container distributions of IkiWiki:
 
  * [opinionated-ikiwiki](https://quay.io/repository/jdowland/opinionated-ikiwiki)
    ([source on GitHub](https://github.com/jmtd/opinionated-ikiwiki/)),
-   based on Debian 10, and lighttpd,
+   based on Debian 13, and Apache httpd,
    by [[users/Jon]]
 
 These can be used with a container runtime such as [Docker](https://www.docker.com/).

my user page: Re-order and adjust priorities
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index cecf6ab2c..030b2398d 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -17,16 +17,17 @@ My current focus is working upstream.
 This is an unorganised and (mostly) unordered stream-of-thought list of the things
 I'm interested in addressing at the moment.
 
+Maintain the project’s stability and backwards compatibility for existing users;
 Review all unreviewed [[patches|patch]];
-triage all the Debian bugs and make sure upstream issues are forwarded to issues
-recorded here;
+[[todo/javascript management]];
 [[todo/reconsider jquery]];
 an approach for [[todo/mastodon comments]];
-maintain the project’s stability and backwards compatibility for existing users;
 make ikiwiki more attractive to people looking for SSGs;
 more prominent / support bits and pieces from IndieWeb;
 shrink the delta between ikiwiki and the opinionated-ikiwiki container:
-make setuid  wrappers optional.
+[[todo/make suid wrapper optional]];
+triage all the Debian bugs and make sure upstream issues are forwarded to issues
+recorded here.
 
 ## historic
 

TLDR and TODO list for reconsider jquery
diff --git a/doc/todo/reconsider_jquery.mdwn b/doc/todo/reconsider_jquery.mdwn
index e4553bf29..dbe715091 100644
--- a/doc/todo/reconsider_jquery.mdwn
+++ b/doc/todo/reconsider_jquery.mdwn
@@ -1,3 +1,18 @@
+TL;DR: An attempt to remove the bundled jquery (and jquery UI) or failing that,
+sequester its use as much as possible, and update the bundled versions if
+possible.
+
+## TODO
+
+ - [X] stop using jquery in login selector
+ - [ ] sequester bundled jquery into attachment underlay
+  - [ ] could this break external plugins?
+ - [ ] what impact has this on the openid plugin
+ - [ ] stop using jquery-ui in [[plugins/attachment]]
+ - [ ] stop using jquery in [[plugins/attachment]]
+
+## Detail
+
 We bundle jquery, currently version jquery 1.6.2 and jquery-ui
 1.8.14 (both from mid-2011).
 

these are done
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index 4db8537e5..cecf6ab2c 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -17,16 +17,10 @@ My current focus is working upstream.
 This is an unorganised and (mostly) unordered stream-of-thought list of the things
 I'm interested in addressing at the moment.
 
-1. Move the basic `style.css` out of `./doc`, such that <https://ikiwiki.info>
-can be rebuilt without overwriting the `lightdark` theme (fixing optional dark
-mode on the main site). Branch `mv-antitheme-from-doc`.
-
 Review all unreviewed [[patches|patch]];
 triage all the Debian bugs and make sure upstream issues are forwarded to issues
 recorded here;
 [[todo/reconsider jquery]];
-[[todo/move_doc__47__style.css]] in order to enable dark mode on
-<https://ikiwiki.info>;
 an approach for [[todo/mastodon comments]];
 maintain the project’s stability and backwards compatibility for existing users;
 make ikiwiki more attractive to people looking for SSGs;

example configuration for proposed extension
diff --git a/doc/todo/reorganise_theme_plugin.mdwn b/doc/todo/reorganise_theme_plugin.mdwn
index bf115cb81..585b0a884 100644
--- a/doc/todo/reorganise_theme_plugin.mdwn
+++ b/doc/todo/reorganise_theme_plugin.mdwn
@@ -35,7 +35,12 @@ stylesheet, in between `style` and `local`.
 Extend [[plugins/theme]] to support configuring a list of alternate themes. The named
 themes will be included into site builds and into page sources as "alternate
 stylesheets". Users can then select an alternate theme for such sites (Firefox
-has built in UI for this, I don't know about other browsers).
+has built in UI for this, I don't know about other browsers). E.g.
+
+    theme: actiontabs
+    alternate_themes:
+    - goldtype
+    - monochrome
 
 Reconfigure <https://ikiwiki.info> to name all shipped themes as alternate styles.
 This preserves the choice to have the default style the "anti-theme", but also

fix 2 more wikilinks
diff --git a/doc/todo/reorganise_theme_plugin.mdwn b/doc/todo/reorganise_theme_plugin.mdwn
index 139c638fe..bf115cb81 100644
--- a/doc/todo/reorganise_theme_plugin.mdwn
+++ b/doc/todo/reorganise_theme_plugin.mdwn
@@ -29,10 +29,10 @@ Do not concatenate the base style and theme styles in IkiWiki build. The theme
 stylesheets should be shipped in their source form. This is a minor simplification
 to the build.
 
-Adjust [[theme]] so that the selected theme is added to `page.tmpl` as a third
+Adjust [[plugins/theme]] so that the selected theme is added to `page.tmpl` as a third
 stylesheet, in between `style` and `local`.
 
-Extend [[theme]] to support configuring a list of alternate themes. The named
+Extend [[plugins/theme]] to support configuring a list of alternate themes. The named
 themes will be included into site builds and into page sources as "alternate
 stylesheets". Users can then select an alternate theme for such sites (Firefox
 has built in UI for this, I don't know about other browsers).

fix markup
diff --git a/doc/todo/reorganise_theme_plugin.mdwn b/doc/todo/reorganise_theme_plugin.mdwn
index c2a248084..139c638fe 100644
--- a/doc/todo/reorganise_theme_plugin.mdwn
+++ b/doc/todo/reorganise_theme_plugin.mdwn
@@ -56,4 +56,4 @@ done by using "alternate stylesheets" (I do this on <https://jmtd.net>),  but
 using that mechanism for both theme choices and dark/light mode per-theme would
 result in a long list.
 
-­— [[Jon]], 2026-09-05*
+*— [[Jon]], 2026-09-05*

fix link
diff --git a/doc/todo/reorganise_theme_plugin.mdwn b/doc/todo/reorganise_theme_plugin.mdwn
index 336f69760..c2a248084 100644
--- a/doc/todo/reorganise_theme_plugin.mdwn
+++ b/doc/todo/reorganise_theme_plugin.mdwn
@@ -20,7 +20,7 @@ get a great idea of what a theme looks like.
 
 ## proposal
 
-Either remove the additional stylesheet functionality from [[meta]] completely,
+Either remove the additional stylesheet functionality from [[plugins/meta]] completely,
 or re-work it as proposed to not use "alternate". I'm leaning towards the former
 because I can't see a need for adding a stylesheet via meta that isn't addressed
 by support for `local.css`.

theme plugin re-org proposal
diff --git a/doc/todo/reorganise_theme_plugin.mdwn b/doc/todo/reorganise_theme_plugin.mdwn
new file mode 100644
index 000000000..336f69760
--- /dev/null
+++ b/doc/todo/reorganise_theme_plugin.mdwn
@@ -0,0 +1,59 @@
+This is a proposal for re-organising the way that [[plugins/theme]] works.
+
+## current situation
+
+IkiWiki sites reference two stylesheets: `style.css`, which is either the
+base "anti-theme" CSS or, if a theme is configured, that theme's CSS
+concatenated to the anti-theme; `local.css` which defaults to empty, is
+controlled by the user/site source and can override the former.
+
+IkiWiki's build process constructs the concatenated theme CSS files at
+IKiWiki-build time, and IkiWiki distributions ship the concatenated files.
+
+[[plugins/meta]] has some support for adding further stylesheets to a site,
+but it's broken (see [[bugs/meta plugin should not add alternate stylesheets and title by default]]).
+
+The exemplar demonstration IkiWiki site, <https://ikiwiki.info>, deliberately
+does not configure a theme. The documentation has some thumbnails of the theme
+choices which are very small, by modern standards, at [[themes]]. Users do not
+get a great idea of what a theme looks like.
+
+## proposal
+
+Either remove the additional stylesheet functionality from [[meta]] completely,
+or re-work it as proposed to not use "alternate". I'm leaning towards the former
+because I can't see a need for adding a stylesheet via meta that isn't addressed
+by support for `local.css`.
+
+Do not concatenate the base style and theme styles in IkiWiki build. The theme
+stylesheets should be shipped in their source form. This is a minor simplification
+to the build.
+
+Adjust [[theme]] so that the selected theme is added to `page.tmpl` as a third
+stylesheet, in between `style` and `local`.
+
+Extend [[theme]] to support configuring a list of alternate themes. The named
+themes will be included into site builds and into page sources as "alternate
+stylesheets". Users can then select an alternate theme for such sites (Firefox
+has built in UI for this, I don't know about other browsers).
+
+Reconfigure <https://ikiwiki.info> to name all shipped themes as alternate styles.
+This preserves the choice to have the default style the "anti-theme", but also
+gives us a way of demoing all the themes for users.
+
+### drawbacks
+
+Having three separate CSS files referenced in page HTML is three separate HTTP
+requests to build the page. However, the current situation is already two. For
+those who are concerned with optimising sites, we probably need to implement a
+more sophisticated optimiser plugin, which could flatten multiple stylesheets
+down to one, and potentially perform other changes (minification if there's any
+point, remove overridden or unused styles, etc.)
+
+We may want to provide a way for users to specify a site-local preference for
+dark or light mode, independent of their browser or OS setting. This could be
+done by using "alternate stylesheets" (I do this on <https://jmtd.net>),  but
+using that mechanism for both theme choices and dark/light mode per-theme would
+result in a long list.
+
+­— [[Jon]], 2026-09-05*

some pointers on how i'm doing this.
diff --git a/doc/plugins/contrib/opengraph/discussion.mdwn b/doc/plugins/contrib/opengraph/discussion.mdwn
index 8b6d0c79c..fbd61be16 100644
--- a/doc/plugins/contrib/opengraph/discussion.mdwn
+++ b/doc/plugins/contrib/opengraph/discussion.mdwn
@@ -1,3 +1,60 @@
 Regarding the disclaimer "WARNING: Open Graph is modern spyware. You should use this if and only if you don't mind making the readers of your wiki/blog being tracked by evil corporations without their consent. By using this plugin you are being mean to the people who are reading your content. You have been warned."
 
 I have looked up how open graph is described to work, and don't see how this can be considered spyware. All it seems to do is enable to control how shared links are displayed on social networks that implement the protocol, and possibly on those platforms determine how many times a link to my site would be shared a little more easily, but there doesn't seem to be a way readers of my site would be tracked thanks to the metadata on the wiki. Even if they are users of social networks and logged in there, their browsing of my site won't be tracked after open graph metadata is included. Is that incorrect?
+
+----
+
+I've been implementing this by hand in my `page.tmpl` template here:
+
+```html
+    <meta property="og:title" content="<TMPL_VAR TITLE>" />
+    <meta property="og:description" content="<TMPL_IF DESCRIPTION><TMPL_VAR DESCRIPTION><TMPL_ELSE><TMPL_VAR WIKINAME></TMPL_IF>" />
+    <meta property="og:type" content="website" />
+    <meta property="og:site_name" content="<TMPL_VAR WIKINAME>" />
+    <!-- until https://ikiwiki.info/forum/how_to_put_a_permalink_on_each_post/#comment-adac5fa63a3724c4719188c9858f239d
+    AKA https://gitlab.com/anarcat/ikiwiki/-/commit/c2e63cbd195db95115fe4e1e1ef591bfdf290135
+    gets merged, my domain is harcoded here -->
+    <meta property="og:url" content="https://anarc.at/<TMPL_VAR PAGE>" />
+    <!-- this can be overriden per page in the META section above, first seem to take precedence -->
+    <meta property="og:image" content="https://anarc.at/apple-touch-icon.png" />
+```
+
+The trick, from there, is to use the following [[directives/meta]] entries in the page to tweak things:
+
+```
+\[[!meta title="This blog post title"]]
+\[[!meta description="This is an example description of an eventual blog post you'd want a description of"]]
+\[[!meta name="image" property="og:image" content="/cool-image.jpg"]]
+```
+
+The image bit only works if:
+
+ 1. you have the [[plugins/htmlscrubber]] plugin disabled (which is... not great)
+ 2. the `<TMPL_IF NAME="META"><TMPL_VAR META></TMPL_IF>` block is *above* the `og:image` property shown above
+ 3. if OpenGraph parsers all consistently serve the *first* `og:image` it finds (I just tested this on <https://www.opengraph.xyz/>
+
+Here it renders as this:
+
+```
+    <meta name="description" content="This is a test page" />
+<meta name="image" property="og:image" content="/night_city/bg_header.jpg" />
+
+    <title>Sandbox - anarcat</title>
+
+    <meta property="og:title" content="Sandbox" />
+    <meta property="og:description" content="This is a test page" />
+    <meta property="og:type" content="website" />
+    <meta property="og:site_name" content="anarcat" />
+    <!-- until https://ikiwiki.info/forum/how_to_put_a_permalink_on_each_post/#comment-adac5fa63a3724c4719188c9858f239d
+    AKA https://gitlab.com/anarcat/ikiwiki/-/commit/c2e63cbd195db95115fe4e1e1ef591bfdf290135
+    gets merged, my domain is harcoded here -->
+    <meta property="og:url" content="https://anarc.at/sandbox" />
+    <!-- this can be overriden per page in the META section above, first seem to take precedence -->
+    <meta property="og:image" content="https://anarc.at/apple-touch-icon.png" />
+```
+
+So there's two `property="og:image"` there which isn't great, but I couldn't figure out how to parse out the `META` variable from HTML::Template  (it's likely impossible at that level) to avoid duplication.
+
+It would be better if we could have a more generic `image` meta here that would Just Do The Right thing. We could even add the `og:` stuff to the basic template to simplify things, and it would remove the need to disable the htmlscrubber plugin.
+
+-- [[anarcat]]

done
diff --git a/doc/todo/move_doc__47__style.css.mdwn b/doc/todo/move_doc__47__style.css.mdwn
index 43eea4d28..d4b0ba990 100644
--- a/doc/todo/move_doc__47__style.css.mdwn
+++ b/doc/todo/move_doc__47__style.css.mdwn
@@ -5,3 +5,6 @@ When building the doc-wiki from `./doc`, the style.css overrides the copy in the
 To resolve this I want to move `style.css` out of `./doc` and rejig the necessary machinery so things continue to work as they should.
 
 *­— [[Jon]], 2025-06-02*
+
+[[done]] in `a7f24e6d7eb2f43473e9971e4b113c556ab3efaa`. 
+*­— [[Jon]], 2026-08-14*

diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index aba5d406a..ead5275bb 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -50,7 +50,7 @@ Projects & Organizations
   * [Homebase](http://support.homebase.dk/)
   * [Bitbase](http://support.bitbase.dk/) ([source](http://source.bitbase.dk/))
   * [Børneuniversitetet](http://support.borneuni.dk/) ([source](http://source.borneuni.dk/))
-* [CampusGrün Hamburg](http://www.campusgruen.org/)
+* [CampusGrün Hamburg](http://archiv.campusgruen.org/) (archived site)
 * The [awesome window manager homepage](http://awesome.naquadah.org/)
 * [notqmail](https://notqmail.org)
 * [vcs-home](http://vcs-home.madduck.net)

diff --git a/doc/todo/mastodon_comments.mdwn b/doc/todo/mastodon_comments.mdwn
index 3c02aaf31..4ebb1147e 100644
--- a/doc/todo/mastodon_comments.mdwn
+++ b/doc/todo/mastodon_comments.mdwn
@@ -147,6 +147,14 @@ If we figure that out though, I'd certainly kick my CGI back into gear, that sou
 > 
 > *—[[Jon]], 2026-03-23*
 
+> > Regarding state, I am not sure about introducing a new database for this, but perhaps 
+> > you're right that using git or the existing DB could fail to scale correctly... I still 
+> > really like the idea of storing the comments in .comments file though...
+> >
+> > Re JSON-LD + Perl, I wouldn't worry about it too much. The data is *technically* JSON-LD, but really, it's just JSON and the dereferencing can be done outside of a JSON-LD implementation, from what I understand. That said, I *did* look quickly and there's a `libjsonld-perl` package in Debian which is [this CPAN package](https://metacpan.org/pod/JSONLD), so that should be fine.
+> >
+> > -- [[anarcat]]
+
 ## A "lighter", "external server" implementation
 
 A "light" design could be essentially reimplementing my hack, but natively, with some improvements:
@@ -168,3 +176,5 @@ Either way, I'm not super excited about implementing this, to be quite honest. M
 I did want to look into this problem for other reasons and figured this was as good place as any to do this! I hope that helps... -- [[users/anarcat]]
 
 > I really appreciate you sharing your notes on this, thanks! *— [[Jon]], 2026-03-21*
+
+> > You're welcome! Happy it helps! :)

some notes on MVP server impl
diff --git a/doc/todo/mastodon_comments.mdwn b/doc/todo/mastodon_comments.mdwn
index 2a9380f07..3c02aaf31 100644
--- a/doc/todo/mastodon_comments.mdwn
+++ b/doc/todo/mastodon_comments.mdwn
@@ -127,6 +127,26 @@ That's the "heavy client" design, where we essentially implement a AP service in
 
 If we figure that out though, I'd certainly kick my CGI back into gear, that sounds pretty awesome.
 
+> for an MVP, if we statically generate `.well-known/...` then I think we restrict this
+> to single user, and to deployments at the root of a domain. Which I think is fine.
+>
+> For POST handling via CGI (and caveat I haven't looked at this much yet at all!) I think
+> something we would have to do is release all the normal ikiwiki locks as early as possible,
+> assuming we can avoid needing to write (or possibly read) any existing ikiwiki data to
+> respond to the POST request. If we need to maintain state for Mastodon, I would probably
+> look to store it in a completely independent place, perhaps an sqlite db under `.ikiwiki`,
+> and not use the existing global ikiwiki locks to manage it. (Sadly choosing sqlite still
+> makes it our responsibility to manage spin locking for writes, I think.) This way all the
+> Fediverse server communication handling will not block on other ikiwiki activity and vice
+> versa. I don't think Ikiwiki's global lock approach would scale to Fediverse levels of
+> parallelism.
+> 
+> RE Perl, I'm not as burnt out on it as you ;) but I'd happily consider using
+> [[plugins/write/external]], especially if there is a lack of JSON-LD libraries in Perl already
+> (haven't looked).
+> 
+> *—[[Jon]], 2026-03-23*
+
 ## A "lighter", "external server" implementation
 
 A "light" design could be essentially reimplementing my hack, but natively, with some improvements:

+toc
diff --git a/doc/todo/mastodon_comments.mdwn b/doc/todo/mastodon_comments.mdwn
index 5525dd29b..2a9380f07 100644
--- a/doc/todo/mastodon_comments.mdwn
+++ b/doc/todo/mastodon_comments.mdwn
@@ -1,3 +1,5 @@
+[[!toc levels=3]]
+
 I'm getting truly fed up with spam in my wiki. At this point, all comments are manually approved and I still get trouble: now it's scammers spamming the registration form with dummy accounts, which bounce back to me when I make new posts, or just generate backscatter for the confirmation email. It's really bad. I have hundreds of users registered on my blog, and I don't know which are spammy, which aren't.
 
 So. I'm considering ditching ikiwiki comments altogether and I'm turning towards Mastodon as a commenting platforms. Others (JAK) have implemented this [as a server](https://github.com/julian-klode/mastodon-comments) but a more interesting approach for me is to simply load them dynamically from the server, which is what [this person has done](https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/). They are using Hugo, however, so they can easily embed page metadata in the template to load the right server with the right comment ID.

thanks!
diff --git a/doc/todo/mastodon_comments.mdwn b/doc/todo/mastodon_comments.mdwn
index 1c487d71d..5525dd29b 100644
--- a/doc/todo/mastodon_comments.mdwn
+++ b/doc/todo/mastodon_comments.mdwn
@@ -144,3 +144,5 @@ This seems *much* simpler, but the devil is in the details.
 Either way, I'm not super excited about implementing this, to be quite honest. My days of wanting to read (let alone write) Perl code are far behind me, so I'm not sure I'll have much energy to do this.
 
 I did want to look into this problem for other reasons and figured this was as good place as any to do this! I hope that helps... -- [[users/anarcat]]
+
+> I really appreciate you sharing your notes on this, thanks! *— [[Jon]], 2026-03-21*

more mastodon design work
diff --git a/doc/todo/mastodon_comments.mdwn b/doc/todo/mastodon_comments.mdwn
index 66d5635e8..1c487d71d 100644
--- a/doc/todo/mastodon_comments.mdwn
+++ b/doc/todo/mastodon_comments.mdwn
@@ -51,3 +51,96 @@ Thoughts? -- [[anarcat]] 2025-03-03
 > I've been wondering about a different approach to Fediverse-enabling an IkiWiki site. Instead of the chicken-and-egg problem of toot-about-post, then update post with toot-id; what if the post itself was a first-class Fediverse object from the start? You could "follow" your blog directly, and re-toot (or toot about) a blog post once that post existed in the Fediverse, which would ideally be as soon as it existed anywhere else. I'm exploring what might be required for this approach, starting with stuff like [Mastodon instance with 6 files](https://justingarrison.com/blog/2022-12-06-mastodon-files-instance/). *— [[Jon]], 2025-05-20*
 
 > > Yeah, that's what I initially thought of doing, but that seemed even harder to implement. That post, for example, mentions "posts don't work", which is the critical part that we actually need here. We'd also need to handle `POST` requests for the /inbox endpoint, which would require CGI (which I'm trying to get rid of in my deployments...). But yeah, this would be pretty awesome! -- [[anarcat]]
+
+# Native ActivityPub implementation notes
+
+So I think it's worth starting a new thread entirely here.
+
+## Current implementation
+
+Above, I copied or [wrote a bunch of Python code](https://gitlab.com/anarcat/feed2exec/-/blob/main/feed2exec/plugins/ikiwikitoot.py) that does this:
+
+ 1. reimplements parts of ikiwiki's parser do figure out stuff like "is this a blog" or "is this a draft"
+ 2. once it decides it's good, post a link to the page to a Mastodon instance through the `toot` binary
+ 3. inject a `[[!mastodon]]` directive in the markdown pointing to that post, which does some javascript magic to fetch comments
+
+I think that kind of sucks, for many reasons:
+
+ 1. it reimplements ikiwiki's logic, poorly, and buggily (although most bugs should be gone now?) legacy, untested code
+ 2. it doesn't actually implement mastodon posting mechanism, requires third-party `toot` code *and* an external mastodon server
+ 3. doesn't actually have a local copy of comments, no control over moderation
+
+So we should look at other options. 
+
+## What would an implementation mean?
+
+Implementing full ActivityPub (AP) for Ikiwiki is a huge challenge, because it's made up of many, many parts, but perhaps we can start small and scope this.
+
+My minimum viable product (MVP) is this:
+
+ 1. on a certain pagespec, post an article to the fediverse, idempotently. this can be done with an external AP server or *behave* as a server, i don't care, whichever is easier
+ 2. on those pagespecs, show replies to the article, ideally as static comments
+
+This looks simple, but the devil is in the details:
+
+ 1. for posting, if we want to do it natively, we need to implement things like "subscriptions" or an "outbox"
+ 2. for local comments, we essentially need to be able to *receive* notices that there are new comments to posts
+
+I have only a rough idea of how this works, but I suspect it can't be done without POST handling, which kicks the CGI in. In my case, this is a problem: I turned this entire thing off because of the abuse and load it was generating, and I am *really* happy about that.
+
+So I think we're sitting at a cross-road here: we either implement full support, in CGI, or delegate it to a separate server. Right now I'm going that latter approach, but maybe there could be a modular way of making this work?
+
+## Other documentation
+
+Here are some interesting links I found while researching this for another project:
+
+- [Mastodon instance with 6 files](https://justingarrison.com/blog/2022-12-06-mastodon-files-instance/): mentioned above, says "posts don't work", so i'm not sure it's sufficient, the files are `.well-known/webfinger`, `followers`, `following`, `user` information, a `banner.jpg` and a `image.jpg`1
+- [A guide to implement ActivityPub in a static site (or any website)](https://maho.dev/2024/02/a-guide-to-implement-activitypub-in-a-static-site-or-any-website/), 9 steps, good guide that covers "notes" and "outbox" (posting), "subscribing" (allows for followers), "inbox" (replies), and "quotes", pretty complete, uses a [rss2outbox](https://github.com/mahomedalid/almost-static-activitypub/tree/main/src/Rss2Outbox) tool to convert RSS into AP posts, uses Javascript for the "subscribe" form, a DotNet (!) implementation for follow/unfollow/reply (this is the bit that requires handling POST)
+- [ActivityPub on a (mostly) static website](https://elvery.net/drzax/activitypub-on-a-mostly-static-website/), good introduction on the basics of the protocol, with direct links to the spec
+- [the W3C spec](https://www.w3.org/TR/activitypub/) and [official website](https://activitypub.rocks/), <https://activitypub.rocks/>
+- [staticpub](https://github.com/lvm/staticpub), a script that bolts on AP suport into an existing site, faces the same problem as we do that it can't handle POST
+- <https://activitypub.academy/>, provides test endpoints for AP
+
+## A Mastodon/ActivityPub MVP server implementation
+
+I think that the TL;DR: of those endpoints is this:
+
+- most endpoints are JSON-LD
+- `.well-known/webfinger`: user information, can be static, therefore easy to implement, without any custom code, technically a pointer to an [Actor](https://www.w3.org/TR/activitypub/#actors) in the spec, another JSON object
+- [`outbox`](https://www.w3.org/TR/activitypub/#outbox): where *our* posts are published
+- [`inbox`](https://www.w3.org/TR/activitypub/#inbox): where we receive replies, and follower's requests through POST requests, we check cryptographic signatures here, here lies dragons
+- [`followers`](https://www.w3.org/TR/activitypub/#followers): a collection of actors that follow us, technically not necessary, but we need to keep track of those anyways to keep them updated with our posts, might as well publish (or keep private!)
+- [`delivery`](https://www.w3.org/TR/activitypub/#delivery): technically not an endpoint, this is the part where *we* post new posts from our `outbox` to the Followers
+
+We need to keep track of those states:
+
+- our identity: this already exists as well
+- our published posts: technically, this already exists in the form of whatever pagespec we have, a bit like how RSS feeds are built from a pagespec. perhaps this would be an addition to the already gargantuan `inline` directive? or another directive? but we need to keep track of which posts we've already posted to the fediverse to avoid duplicating outgoing traffic
+- our followers: a set of URLs (and possibly cached/TOFU public keys?) of where we need to deliver news
+- maybe something about reply users signatures, again TOFU
+- replies: when someone replies, we could create a `comment` object/directive/file to store it, which would allow us a crude mechanism for moderation (just delete the file)
+- blocked users / servers: a set of URLs or servers that we *do not* want to receive comments from (that is *huge*: moderation is a huge challenge in any federation, and the second we start implementing this correctly, we suddenly need to block gab and truth social and so on)
+
+That's the "heavy client" design, where we essentially implement a AP service in Mastodon.
+
+If we figure that out though, I'd certainly kick my CGI back into gear, that sounds pretty awesome.
+
+## A "lighter", "external server" implementation
+
+A "light" design could be essentially reimplementing my hack, but natively, with some improvements:
+
+- when a new post is posted (how do we tell?!), relay the post to an external AP server, essentially implementing the [Mastodon POST API](https://docs.joinmastodon.org/methods/statuses/#create), which it seems we can get away with relying on as a standard, e.g. [plemora implements it with some differences](https://docs-develop.pleroma.social/backend/development/API/differences_in_mastoapi_responses/#statuses), but it is implementation specific... e.g. [misskey has a different API](https://legacy.misskey-hub.net/docs/api/endpoints/notes/create.html)
+- regularly (cron job? javascript sync?) pull comments from posts and add them as `[[!comment]]` files
+- progressive enhancement for javascript-enabled users that would pull the latest comments from the server, possibly triggering the above sync
+
+we need to keep state:
+
+- URL of a status related to the post (currently the `[[!mastodon]]` directive, not sure if that's the best)
+- replies as comments, including *deleted* comments (not sure how to track that)
+- API token
+
+This seems *much* simpler, but the devil is in the details.
+
+Either way, I'm not super excited about implementing this, to be quite honest. My days of wanting to read (let alone write) Perl code are far behind me, so I'm not sure I'll have much energy to do this.
+
+I did want to look into this problem for other reasons and figured this was as good place as any to do this! I hope that helps... -- [[users/anarcat]]

that's enough of that
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
deleted file mode 100644
index b9aa3f1a7..000000000
--- a/doc/forum/theme_poll.mdwn
+++ /dev/null
@@ -1,9 +0,0 @@
-Existing IkiWiki users: which [[themes]] do you use on your site?
-
-[[!poll 10 "antitheme (i.e., none)"
-8 "actiontabs"
-16 "blueview"
-2 "goldtype"
-0 monochrome
-5 "other, including heavily modified versions of the above"
-]]

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index fbb67a6a7..b9aa3f1a7 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-9 "actiontabs"
-15 "blueview"
+8 "actiontabs"
+16 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 3461fcb80..fbb67a6a7 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-10 "actiontabs"
-14 "blueview"
+9 "actiontabs"
+15 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index a841fc9f0..3461fcb80 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-11 "actiontabs"
-13 "blueview"
+10 "actiontabs"
+14 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index a9fdd3eea..a841fc9f0 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-12 "actiontabs"
-12 "blueview"
+11 "actiontabs"
+13 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 641ee89a1..a9fdd3eea 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-11 "blueview"
+12 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 00f724b7d..641ee89a1 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-10 "blueview"
+11 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 70ea5648d..00f724b7d 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-9 "blueview"
+10 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index f761da947..70ea5648d 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-8 "blueview"
+9 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index c0f6c247e..f761da947 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-7 "blueview"
+8 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 396615c0c..c0f6c247e 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-6 "blueview"
+7 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 8a7579d88..396615c0c 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -2,7 +2,7 @@ Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
 12 "actiontabs"
-5 "blueview"
+6 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 5962d4b8b..8a7579d88 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-13 "actiontabs"
-4 "blueview"
+12 "actiontabs"
+5 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index b5495640f..5962d4b8b 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-14 "actiontabs"
-3 "blueview"
+13 "actiontabs"
+4 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index c50ea7dda..b5495640f 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-15 "actiontabs"
-2 "blueview"
+14 "actiontabs"
+3 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 68ed47f24..c50ea7dda 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-16 "actiontabs"
-1 "blueview"
+15 "actiontabs"
+2 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (blueview)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index a8d829909..68ed47f24 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,8 +1,8 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 10 "antitheme (i.e., none)"
-17 "actiontabs"
-0 "blueview"
+16 "actiontabs"
+1 "blueview"
 2 "goldtype"
 0 monochrome
 5 "other, including heavily modified versions of the above"

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index b900c2cce..a8d829909 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 11 "antitheme (i.e., none)"
-16 "actiontabs"
+[[!poll 10 "antitheme (i.e., none)"
+17 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index a301009c9..b900c2cce 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 12 "antitheme (i.e., none)"
-15 "actiontabs"
+[[!poll 11 "antitheme (i.e., none)"
+16 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index d3fd5043f..a301009c9 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 13 "antitheme (i.e., none)"
-14 "actiontabs"
+[[!poll 12 "antitheme (i.e., none)"
+15 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index af4520b1c..d3fd5043f 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 14 "antitheme (i.e., none)"
-13 "actiontabs"
+[[!poll 13 "antitheme (i.e., none)"
+14 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 3e2562762..af4520b1c 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 14 "antitheme (i.e., none)"
-12 "actiontabs"
+13 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 3bf3b2996..3e2562762 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 14 "antitheme (i.e., none)"
-11 "actiontabs"
+12 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index b212c0539..3bf3b2996 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 14 "antitheme (i.e., none)"
-10 "actiontabs"
+11 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 98cda37a5..b212c0539 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 14 "antitheme (i.e., none)"
-9 "actiontabs"
+10 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 3949fba98..98cda37a5 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
 [[!poll 14 "antitheme (i.e., none)"
-8 "actiontabs"
+9 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 2d64990e9..3949fba98 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 15 "antitheme (i.e., none)"
-7 "actiontabs"
+[[!poll 14 "antitheme (i.e., none)"
+8 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 16db4de2d..2d64990e9 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 16 "antitheme (i.e., none)"
-6 "actiontabs"
+[[!poll 15 "antitheme (i.e., none)"
+7 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 54802ffe3..16db4de2d 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 17 "antitheme (i.e., none)"
-5 "actiontabs"
+[[!poll 16 "antitheme (i.e., none)"
+6 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index e2c254de3..54802ffe3 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 18 "antitheme (i.e., none)"
-4 "actiontabs"
+[[!poll 17 "antitheme (i.e., none)"
+5 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 156c832b1..e2c254de3 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 19 "antitheme (i.e., none)"
-3 "actiontabs"
+[[!poll 18 "antitheme (i.e., none)"
+4 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 8a98ab88b..156c832b1 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 18 "antitheme (i.e., none)"
+[[!poll 19 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 8349e0ce7..8a98ab88b 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 17 "antitheme (i.e., none)"
+[[!poll 18 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 515370b1c..8349e0ce7 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 16 "antitheme (i.e., none)"
+[[!poll 17 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 8945a848c..515370b1c 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 15 "antitheme (i.e., none)"
+[[!poll 16 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 611eee3a4..8945a848c 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 14 "antitheme (i.e., none)"
+[[!poll 15 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index da79ba9e0..611eee3a4 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 13 "antitheme (i.e., none)"
+[[!poll 14 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index ead8097e3..da79ba9e0 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 12 "antitheme (i.e., none)"
+[[!poll 13 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 322c7d0b1..ead8097e3 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 11 "antitheme (i.e., none)"
+[[!poll 12 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index dc77ec5a0..322c7d0b1 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 10 "antitheme (i.e., none)"
+[[!poll 11 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 1a4f618d2..dc77ec5a0 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 9 "antitheme (i.e., none)"
+[[!poll 10 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index b73647316..1a4f618d2 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 8 "antitheme (i.e., none)"
+[[!poll 9 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 7f5981a35..b73647316 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 7 "antitheme (i.e., none)"
+[[!poll 8 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index c53cfe492..7f5981a35 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 6 "antitheme (i.e., none)"
+[[!poll 7 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 97c09cf1d..c53cfe492 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 5 "antitheme (i.e., none)"
+[[!poll 6 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 21e6f7477..97c09cf1d 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 4 "antitheme (i.e., none)"
+[[!poll 5 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 39d2820a5..21e6f7477 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 3 "antitheme (i.e., none)"
+[[!poll 4 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none)'")
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 21e6f7477..39d2820a5 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 4 "antitheme (i.e., none)"
+[[!poll 3 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 39d2820a5..21e6f7477 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 3 "antitheme (i.e., none)"
+[[!poll 4 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (-1 OR 2+787-787-1=0+0+0+1 -- )
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 21e6f7477..39d2820a5 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 4 "antitheme (i.e., none)"
+[[!poll 3 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index c457cf7e2..21e6f7477 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 3 "antitheme (i.e., none)"
-4 "actiontabs"
+[[!poll 4 "antitheme (i.e., none)"
+3 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (actiontabs)
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 21e6f7477..c457cf7e2 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,7 +1,7 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 4 "antitheme (i.e., none)"
-3 "actiontabs"
+[[!poll 3 "antitheme (i.e., none)"
+4 "actiontabs"
 0 "blueview"
 2 "goldtype"
 0 monochrome

poll vote (antitheme (i.e., none))
diff --git a/doc/forum/theme_poll.mdwn b/doc/forum/theme_poll.mdwn
index 39d2820a5..21e6f7477 100644
--- a/doc/forum/theme_poll.mdwn
+++ b/doc/forum/theme_poll.mdwn
@@ -1,6 +1,6 @@
 Existing IkiWiki users: which [[themes]] do you use on your site?
 
-[[!poll 3 "antitheme (i.e., none)"
+[[!poll 4 "antitheme (i.e., none)"
 3 "actiontabs"
 0 "blueview"
 2 "goldtype"

dark mode now available on this site
diff --git a/doc/forum/dark_mode_is_now_available_for_ikiwiki.info.mdwn b/doc/forum/dark_mode_is_now_available_for_ikiwiki.info.mdwn
new file mode 100644
index 000000000..c88418cac
--- /dev/null
+++ b/doc/forum/dark_mode_is_now_available_for_ikiwiki.info.mdwn
@@ -0,0 +1 @@
+Joey enabled the "lightdark" theme for this site a while ago, but it was prevented from working due to a technicality unique to this site, which has now been addresed. So: dark mode is now available! The site should follow your browser's preferences. *— [[Jon]], 2026-03-16*

de-link style.css
The wikilink is broken since the file is not in the doc source path
anymore.
diff --git a/doc/basewiki.mdwn b/doc/basewiki.mdwn
index b4aa60c78..6b079703f 100644
--- a/doc/basewiki.mdwn
+++ b/doc/basewiki.mdwn
@@ -17,7 +17,7 @@ It currently includes these pages:
 * [[ikiwiki/wikilink]]
 
 As well as a few other files, like [[favicon.ico]], [[local.css]],
-[[style.css]], and some icons.
+style.css, and some icons.
 
 Note that an important property of the basewiki is that it should be
 self-contained. That means that the pages listed above cannot link

Move style.css canonically to underlays directory
Shifting it out of doc/ means, if we enable a theme for
<https://ikiwiki.info>, the theme-generated style.css will
not be overwritten by doc/style.css.
diff --git a/Makefile.PL b/Makefile.PL
index b63ee7397..cfad64d90 100755
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -126,7 +126,7 @@ underlay_install:
 		install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme; \
 		for file in $$theme/*; do \
 			if echo "$$file" | grep -q style.css; then \
-				(cat doc/style.css; cat $$theme/base.css 2>/dev/null || :; cat $$file) > $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
+				(cat underlays/basewiki/style.css; cat $$theme/base.css 2>/dev/null || :; cat $$file) > $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
 			elif echo "$$file" | grep -q base.css; then \
 				:; \
 			elif [ -f "$$file" ]; then \
diff --git a/doc/style.css b/doc/style.css
deleted file mode 100644
index e3f75b1d9..000000000
--- a/doc/style.css
+++ /dev/null
@@ -1,618 +0,0 @@
-/* ikiwiki style sheet */
-
-/* Note that instead of modifying this style sheet, you can instead edit
- * local.css and use it to override or change settings in this one.
- */
-
-/* html5 compat */
-article,aside,details,figcaption,figure,
-footer,header,hgroup,menu,nav,section {
-	display: block;
-}
-
-div.header, header.header {
-	margin: 0;
-	font-size: 140%;
-	font-weight: bold;
-	line-height: 1em;
-	display: block;
-}
-
-.inlineheader .author {
-	margin: 0;
-	font-size: 112%;
-	font-weight: bold;
-	display: block;
-}
-
-.actions ul {
-	margin: 0;
-	padding: 6px .4em;
-	height: 1em;
-	list-style-type: none;
-}
-.actions li {
-	display: inline;
-	padding: .2em;
-}
-.pageheader .actions ul {
-	border-bottom: 1px solid #000;
-}
-
-.inlinepage .actions ul {
-	border-bottom: 0;
-}
-
-#otherlanguages ul {
-	margin: 0;
-	padding: 6px;
-	list-style-type: none;
-}
-#otherlanguages li {
-	display: inline;
-	padding: .2em .4em;
-}
-.pageheader #otherlanguages {
-	border-bottom: 1px solid #000;
-}
-
-.inlinecontent,
-.inlineenclosure {
-	margin-top: .4em;
-}
-
-.pagefooter,
-.inlinefooter,
-.comments {
-	clear: both;
-}
-
-#pageinfo {
-	margin: 1em 0;
-	border-top: 1px solid #000;
-}
-
-.tags {
-	margin-top: 1em;
-}
-
-.inlinepage .tags {
-        display: inline;
-}
-
-.mapparent {
-	text-decoration: none;
-}
-
-.img caption {
-	font-size: 80%;
-	caption-side: bottom;
-	text-align: center;
-}
-
-img.img {
-	margin: 0.5ex;
-}
-
-.align-left {
-	float:left;
-}
-
-.align-right {
-	float:right;
-}
-
-#backlinks {
-	margin-top: 1em;
-}
-
-#searchform {
-	display: inline;
-	float: right;
-}
-
-#editcontent {
-	width: 98%;
-}
-
-.editcontentdiv {
-	width: auto;
-	overflow: auto;
-}
-
-img {
-	border-style: none;
-}
-
-pre {
-	overflow: auto;
-}
-
-div.recentchanges {
-	border-style: solid;
-	border-width: 1px;
-	overflow: auto;
-	width: auto;
-	clear: none;
-	background: #eee;
-	color: black !important;
-}
-.recentchanges .metadata {
-	padding: 0px 0.5em;
-}
-.recentchanges .changelog {
-	font-style: italic;
-	clear: both;
-	display: block;
-	padding: 1px 2px;
-	background: white !important;
-	color: black !important;
-}
-.recentchanges .desc {
-	display: none;
-}
-.recentchanges .diff {
-	display: none;
-}
-.recentchanges .committer {
-	float: left;
-	margin: 0;
-	width: 40%;
-}
-.recentchanges .committype {
-	float: left;
-	margin: 0;
-	width: 5%;
-	font-size: small;
-}
-.recentchanges .changedate {
-	float: left;
-	margin: 0;
-	width: 35%;
-	font-size: small;
-}
-.recentchanges .pagelinks,
-.recentchanges .revert {
-	float: right;
-	margin: 0;
-	width: 60%;
-}
-
-.blogform, #blogform {

(Diff truncated)
plan for dark mode on main site
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index a9c5d0924..4db8537e5 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -14,9 +14,13 @@ My current focus is working upstream.
 
 ## priorities
 
-This is an unorganised and unordered stream-of-thought list of the things
+This is an unorganised and (mostly) unordered stream-of-thought list of the things
 I'm interested in addressing at the moment.
 
+1. Move the basic `style.css` out of `./doc`, such that <https://ikiwiki.info>
+can be rebuilt without overwriting the `lightdark` theme (fixing optional dark
+mode on the main site). Branch `mv-antitheme-from-doc`.
+
 Review all unreviewed [[patches|patch]];
 triage all the Debian bugs and make sure upstream issues are forwarded to issues
 recorded here;

revert obvious spam
This reverts commit 0227b26aabe8dfe6cf35d5f427c04ba4f8f8fa34
diff --git a/doc/tips.mdwn b/doc/tips.mdwn
index a452140f0..53f966001 100644
--- a/doc/tips.mdwn
+++ b/doc/tips.mdwn
@@ -1,64 +1,5 @@
-Discover Pips NYT: Strategy Tips For Daily Puzzle Fun
-Introduction to Pips NYT
+This page is a place to document tips and techniques for using ikiwiki.
 
-Pips NYT is an engaging word puzzle game that challenges players to test their vocabulary and logic skills. Unlike traditional crossword puzzles, this game focuses on short, interactive challenges that can be completed in minutes, making it perfect for casual players and puzzle enthusiasts alike. The game is designed to offer daily puzzles that gradually increase in difficulty, keeping players entertained and mentally stimulated.
-
-In <a href="https://pipsly.io/">Pips NYT</a>, players encounter grids of letters where the objective is to create meaningful words or identify hidden patterns. The game combines strategic thinking with quick decision-making, providing a unique experience that differs from other word games. Many players enjoy the sense of accomplishment from completing puzzles quickly while also discovering new words along the way.
-
-How to Play Pips NYT
-
-Playing Pips NYT involves several key steps that are easy to learn but challenging to master. The first step is to observe the grid carefully. Players need to scan the letters and look for potential combinations that form valid words. Attention to detail is crucial, as overlooking even one letter can make a difference in puzzle completion.
-
-After identifying possible words, players select letters in sequence to form the word. Correctly formed words are highlighted, and points are awarded based on the complexity and length of the word. The game encourages players to find longer or less common words to maximize their scores.
-
-Time management is also an important aspect of the game. While some puzzles allow unlimited time, daily challenges often impose a limit, pushing players to think quickly and efficiently. Players who consistently practice Pips NYT develop sharper pattern recognition and faster word recall.
-
-Benefits of Playing Pips NYT
-
-Pips NYT is more than just a casual game. It offers several cognitive benefits that make it a valuable activity for mental exercise. One major benefit is vocabulary enhancement. By interacting with diverse letter combinations, players discover new words and reinforce their existing knowledge.
-
-Another benefit is improved problem-solving skills. Each puzzle requires players to plan ahead, consider multiple options, and anticipate the consequences of their choices. This strategic thinking translates into real-world decision-making abilities.
-
-The game also provides stress relief and entertainment. Engaging with a short, focused puzzle can serve as a break from work or daily routines, offering a sense of accomplishment and relaxation. Many players use Pips NYT as part of a morning routine or evening wind-down, finding it both stimulating and soothing.
-
-Strategies for Beginners
-
-Beginners in Pips NYT should start by familiarizing themselves with the basic rules and layout of the game. Observing the most common letter combinations is a helpful first step. Simple words often appear in initial puzzles, allowing new players to gain confidence before attempting more challenging grids.
-
-Focusing on vowels can also be an effective strategy. Many words rely on vowel placement, so identifying clusters of vowels early can provide a roadmap for constructing words. Players should experiment with different letter sequences to see which combinations yield points.
-
-Additionally, it is important for beginners to review previous puzzles. Revisiting solved challenges helps players recognize patterns and common word formations. This practice builds a mental library of solutions that can be applied in future games.
-
-Advanced Techniques for Skilled Players
-
-For experienced players, mastering Pips NYT involves advanced techniques that go beyond basic word formation. One such technique is scanning the grid for prefixes and suffixes. Recognizing these components quickly allows players to form multiple words from a single sequence of letters.
-
-Another technique is pattern recognition. Skilled players often identify repeating letter arrangements or common letter pairings. This allows for faster puzzle completion and higher scores, as players can anticipate potential words before attempting to select letters.
-
-Time optimization is also a key factor. Advanced players learn to balance speed with accuracy, minimizing mistakes while maximizing points. Regular practice strengthens both recall and reflexes, enabling players to handle complex daily challenges efficiently.
-
-Common Challenges and Solutions
-
-While Pips NYT is designed to be enjoyable, players often face certain challenges. One common challenge is letter overload. Large grids can be overwhelming, making it difficult to identify potential words. To overcome this, players should break the grid into smaller sections and tackle one area at a time.
-
-Another challenge is mental fatigue. Completing multiple puzzles in one session can lead to reduced focus. Players are encouraged to take short breaks and return to the game with a fresh perspective. This approach prevents frustration and maintains the enjoyment of the game.
-
-Finally, encountering unfamiliar words can be challenging but also rewarding. Using a dictionary or word reference after finishing a puzzle helps players learn new terms and expand their vocabulary for future puzzles.
-
-Community and Competitive Play
-
-Pips NYT has cultivated a dedicated community of players who share tips, strategies, and achievements. Online forums and social media groups provide platforms for discussion and collaboration. Players often post high scores, discuss difficult puzzles, and exchange advice on effective strategies.
-
-Competitive play is another exciting aspect. Many players challenge friends or join online leagues to test their skills. Competitions often feature daily or weekly leaderboards, creating a sense of excitement and motivation. Friendly rivalry encourages players to improve and explore new strategies, keeping engagement high.
-
-Tips for Daily Improvement
-
-Consistent practice is key to improvement in Pips NYT. Playing daily challenges helps players develop quicker word recognition and more efficient strategies. Setting small goals, such as finding three new words each day, can also motivate players and track progress over time.
-
-Experimenting with different approaches is beneficial. For example, starting puzzles from the corners or focusing on less obvious letter combinations can reveal hidden words. Players who vary their tactics often discover more efficient paths to high scores.
-
-Finally, reflection after each puzzle is important. Reviewing mistakes and successful moves provides insight into patterns and effective techniques. Over time, these reflections contribute to greater skill and confidence in the game.
-
-Conclusion
-
-Pips NYT offers a unique blend of entertainment, mental exercise, and strategic challenge. Its daily puzzles provide players with opportunities to enhance vocabulary, improve problem-solving skills, and engage in a stimulating activity that fits into any schedule. Whether playing casually or competitively, Pips NYT delivers an enjoyable experience for word enthusiasts of all levels.
+[[!inline pages="tips/* and !tips/*/*" 
+feedpages="created_after(tips/howto_avoid_flooding_aggregators)" archive="yes"
+rootpage="tips" postformtext="Add a new tip about:" show=0]]

diff --git a/doc/tips.mdwn b/doc/tips.mdwn
index 53f966001..a452140f0 100644
--- a/doc/tips.mdwn
+++ b/doc/tips.mdwn
@@ -1,5 +1,64 @@
-This page is a place to document tips and techniques for using ikiwiki.
+Discover Pips NYT: Strategy Tips For Daily Puzzle Fun
+Introduction to Pips NYT
 
-[[!inline pages="tips/* and !tips/*/*" 
-feedpages="created_after(tips/howto_avoid_flooding_aggregators)" archive="yes"
-rootpage="tips" postformtext="Add a new tip about:" show=0]]
+Pips NYT is an engaging word puzzle game that challenges players to test their vocabulary and logic skills. Unlike traditional crossword puzzles, this game focuses on short, interactive challenges that can be completed in minutes, making it perfect for casual players and puzzle enthusiasts alike. The game is designed to offer daily puzzles that gradually increase in difficulty, keeping players entertained and mentally stimulated.
+
+In <a href="https://pipsly.io/">Pips NYT</a>, players encounter grids of letters where the objective is to create meaningful words or identify hidden patterns. The game combines strategic thinking with quick decision-making, providing a unique experience that differs from other word games. Many players enjoy the sense of accomplishment from completing puzzles quickly while also discovering new words along the way.
+
+How to Play Pips NYT
+
+Playing Pips NYT involves several key steps that are easy to learn but challenging to master. The first step is to observe the grid carefully. Players need to scan the letters and look for potential combinations that form valid words. Attention to detail is crucial, as overlooking even one letter can make a difference in puzzle completion.
+
+After identifying possible words, players select letters in sequence to form the word. Correctly formed words are highlighted, and points are awarded based on the complexity and length of the word. The game encourages players to find longer or less common words to maximize their scores.
+
+Time management is also an important aspect of the game. While some puzzles allow unlimited time, daily challenges often impose a limit, pushing players to think quickly and efficiently. Players who consistently practice Pips NYT develop sharper pattern recognition and faster word recall.
+
+Benefits of Playing Pips NYT
+
+Pips NYT is more than just a casual game. It offers several cognitive benefits that make it a valuable activity for mental exercise. One major benefit is vocabulary enhancement. By interacting with diverse letter combinations, players discover new words and reinforce their existing knowledge.
+
+Another benefit is improved problem-solving skills. Each puzzle requires players to plan ahead, consider multiple options, and anticipate the consequences of their choices. This strategic thinking translates into real-world decision-making abilities.
+
+The game also provides stress relief and entertainment. Engaging with a short, focused puzzle can serve as a break from work or daily routines, offering a sense of accomplishment and relaxation. Many players use Pips NYT as part of a morning routine or evening wind-down, finding it both stimulating and soothing.
+
+Strategies for Beginners
+
+Beginners in Pips NYT should start by familiarizing themselves with the basic rules and layout of the game. Observing the most common letter combinations is a helpful first step. Simple words often appear in initial puzzles, allowing new players to gain confidence before attempting more challenging grids.
+
+Focusing on vowels can also be an effective strategy. Many words rely on vowel placement, so identifying clusters of vowels early can provide a roadmap for constructing words. Players should experiment with different letter sequences to see which combinations yield points.
+
+Additionally, it is important for beginners to review previous puzzles. Revisiting solved challenges helps players recognize patterns and common word formations. This practice builds a mental library of solutions that can be applied in future games.
+
+Advanced Techniques for Skilled Players
+
+For experienced players, mastering Pips NYT involves advanced techniques that go beyond basic word formation. One such technique is scanning the grid for prefixes and suffixes. Recognizing these components quickly allows players to form multiple words from a single sequence of letters.
+
+Another technique is pattern recognition. Skilled players often identify repeating letter arrangements or common letter pairings. This allows for faster puzzle completion and higher scores, as players can anticipate potential words before attempting to select letters.
+
+Time optimization is also a key factor. Advanced players learn to balance speed with accuracy, minimizing mistakes while maximizing points. Regular practice strengthens both recall and reflexes, enabling players to handle complex daily challenges efficiently.
+
+Common Challenges and Solutions
+
+While Pips NYT is designed to be enjoyable, players often face certain challenges. One common challenge is letter overload. Large grids can be overwhelming, making it difficult to identify potential words. To overcome this, players should break the grid into smaller sections and tackle one area at a time.
+
+Another challenge is mental fatigue. Completing multiple puzzles in one session can lead to reduced focus. Players are encouraged to take short breaks and return to the game with a fresh perspective. This approach prevents frustration and maintains the enjoyment of the game.
+
+Finally, encountering unfamiliar words can be challenging but also rewarding. Using a dictionary or word reference after finishing a puzzle helps players learn new terms and expand their vocabulary for future puzzles.
+
+Community and Competitive Play
+
+Pips NYT has cultivated a dedicated community of players who share tips, strategies, and achievements. Online forums and social media groups provide platforms for discussion and collaboration. Players often post high scores, discuss difficult puzzles, and exchange advice on effective strategies.
+
+Competitive play is another exciting aspect. Many players challenge friends or join online leagues to test their skills. Competitions often feature daily or weekly leaderboards, creating a sense of excitement and motivation. Friendly rivalry encourages players to improve and explore new strategies, keeping engagement high.
+
+Tips for Daily Improvement
+
+Consistent practice is key to improvement in Pips NYT. Playing daily challenges helps players develop quicker word recognition and more efficient strategies. Setting small goals, such as finding three new words each day, can also motivate players and track progress over time.
+
+Experimenting with different approaches is beneficial. For example, starting puzzles from the corners or focusing on less obvious letter combinations can reveal hidden words. Players who vary their tactics often discover more efficient paths to high scores.
+
+Finally, reflection after each puzzle is important. Reviewing mistakes and successful moves provides insight into patterns and effective techniques. Over time, these reflections contribute to greater skill and confidence in the game.
+
+Conclusion
+
+Pips NYT offers a unique blend of entertainment, mental exercise, and strategic challenge. Its daily puzzles provide players with opportunities to enhance vocabulary, improve problem-solving skills, and engage in a stimulating activity that fits into any schedule. Whether playing casually or competitively, Pips NYT delivers an enjoyable experience for word enthusiasts of all levels.

markdown
diff --git a/doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin b/doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin.mdwn
similarity index 100%
rename from doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin
rename to doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin.mdwn

bug
diff --git a/doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin b/doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin
new file mode 100644
index 000000000..5e259526f
--- /dev/null
+++ b/doc/bugs/crash_Wide_character_in_subroutine_entry_in_search_plugin
@@ -0,0 +1,14 @@
+Building my personal website
+
+	Wide character in subroutine entry at /usr/share/perl5/IkiWiki/Plugin/search.pm line 222.
+
+Causes a build failure. perl 5.40.1, utf-8 locale.
+
+	return "U".lc(Digest::SHA::sha1_hex($page));
+
+I suppose that it's $page that contains the wide character, and it
+seems perhaps relevant that commit 4af7b2c14d548beaf09f100e7fc6efc39e9c73a2
+already did some adjacent utf8 encoding of $page.
+
+This will only affect wikis with long page lengths, 240+ characters.
+--[[Joey]]

some possible ways forward
diff --git a/doc/forum/default_commit_message.mdwn b/doc/forum/default_commit_message.mdwn
index 37f3dde63..6e1cb84fc 100644
--- a/doc/forum/default_commit_message.mdwn
+++ b/doc/forum/default_commit_message.mdwn
@@ -69,3 +69,23 @@ sub editcontent {
 
 1;
 ```
+
+> Interesting problem! Presuming you are using git, the section of the git plugin
+> you would want to influence is in [sub rcs_commit_helper](http://source.ikiwiki.branchable.com/?p=source.git;a=blob;f=IkiWiki/Plugin/git.pm;h=af7695de43071149f6cb258eb42d3df1f21524b4;hb=HEAD#l689). 
+> 
+> It _might_ be possible to do this by writing a separate plugin and using the
+> [[RCS plugin hooks|https://ikiwiki.info/plugins/write/#index76h3]]. I'm not sure
+> exactly how that would interact with the Git plugin also registering those hooks.
+> You might have to wrap some, or all, of the hooks, passing through to the Git
+> plugin. You'd check and set the 'message' field of `@params` before calling the
+> Git plugin implementation of the relevant hooks.
+> 
+> Another approach would be to modify the Git plugin and carry the modified version
+> in your [[libdir|https://ikiwiki.info/plugins/install/]]. However you would then
+> have to track updates to the upstream Git plugin if/when you updated IkiWiki.
+>
+> I'd certainly consider a patch for this functionality in IkiWiki itself.
+> In theory, a solution which worked for any VCS backend would be ideal (perhaps
+> we need another hook), but that
+> might be a much harder change. I'd be surprised if we had many non-git users.
+> — [[Jon]], 2026-01-22

diff --git a/doc/forum/default_commit_message.mdwn b/doc/forum/default_commit_message.mdwn
new file mode 100644
index 000000000..37f3dde63
--- /dev/null
+++ b/doc/forum/default_commit_message.mdwn
@@ -0,0 +1,71 @@
+Hi there,
+
+I'm trying to write a small IkiWiki plugin that would set a default commit message when the user submits an edit with an empty "comment about this change" field.
+
+At the moment I managed to make this work at the form level using formbuilder hook, so the UI side is handled.
+
+However, what I really want is to enforce this at the request/commit level, even if the field is cleared manually and submitted empty.
+
+In other words, I'm looking for the proper hook or stage in IkiWiki where the final commit message is assembled and can be modified/validated reliably, rather than only manipulating the HTML form.
+
+Thanks.
+
+```perl
+#!/usr/bin/perl
+package IkiWiki::Plugin::defaultcommit;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+use Data::Dumper;
+
+sub import {
+	hook(type => "formbuilder_setup", id => "defaultcommit", call => \&formbuilder_setup);
+	hook(type => "editcontent",       id => "defaultcommit", call => \&editcontent);
+	hook(type => "getsetup",          id => "defaultcommit", call => \&getsetup);
+}
+
+sub getsetup {
+	return {
+		plugin => {
+			safe    => 1,
+			rebuild => 0,
+			section => "web",
+		},
+
+        defaultcommit_message => {
+            type        => "string",
+            example     => "web edit",
+            description => "Default commit message used when the edit comment is empty.",
+            safe        => 1,
+            rebuild     => 0,
+        },
+	};
+}
+
+sub formbuilder_setup {
+	my %params = @_;
+	my $form = $params{form};
+
+	$form->field(
+		name  => "editmessage",
+		value => "web edit",
+	) unless defined $form->field("editmessage");
+}
+
+sub editcontent {
+	my %params = @_;
+	my $cgi = $params{cgi};
+
+	my $name = "message";
+	my $c = $cgi->param($name);
+
+	if (!defined($c) || $c =~ /^\s*$/) {
+		$cgi->param($name, "web edit");
+	}
+
+	return $params{content};
+}
+
+1;
+```

Update CHANGELOG for release 3.20260201
diff --git a/CHANGELOG b/CHANGELOG
index 1a2de5e62..fc5fa5114 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,27 @@
-ikiwiki (3.20250912) UNRELEASED; urgency=medium
+ikiwiki (3.20260201) upstream; urgency=medium
 
+  [ Joe Rayhawk ]
+  * Git.pm: Headless git branches
+
+  [ Jonathan Dowland ]
   * Add CommonMark support to mdwn.pm
   * New plugin: pagespec_aliases
+  * Warn if deprecated html5 option is set
+  * Fix ups for headless git branches
+    * new test (build) dependency: Test::Fatal
+  * Fix reproducible images with ImageMagick 7.1.2.1+
+  * loginselector: remove jquery dependency
+    * Upgrade notice: The highlighted login field is now marked
+      with the CSS class name "login_highlight", instead of having
+      its ID changed to "login_highlight".
+
+  [ Philip Searle ]
+  * Fix AutoSetup with modern readline
+
+  [ intrigeri ]
+  * po: fix incompatibility with po4a 0.73+ and HTML input files
 
- -- Jonathan Dowland <jmtd@debian.org>  Thu, 25 Sep 2025 21:07:47 +0100
+ -- Jonathan Dowland <jmtd@debian.org>  Sun, 01 Feb 2026 09:21:35 +0000
 
 ikiwiki (3.20250501) upstream; urgency=medium
 
diff --git a/doc/news/version_3.20260201.mdwn b/doc/news/version_3.20260201.mdwn
new file mode 100644
index 000000000..8e283d4a7
--- /dev/null
+++ b/doc/news/version_3.20260201.mdwn
@@ -0,0 +1,23 @@
+ikiwiki 3.20260201 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+* [ Joe Rayhawk ]
+  * Git.pm: Headless git branches
+
+* [ Jonathan Dowland ]
+  * Add CommonMark support to mdwn.pm
+  * New plugin: pagespec_aliases
+  * Warn if deprecated html5 option is set
+  * Fix ups for headless git branches
+    * new test (build) dependency: Test::Fatal
+  * Fix reproducible images with ImageMagick 7.1.2.1+
+  * loginselector: remove jquery dependency
+    * Upgrade notice: The highlighted login field is now marked
+      with the CSS class name "login_highlight", instead of having
+      its ID changed to "login_highlight".
+
+* [ Philip Searle ]
+  * Fix AutoSetup with modern readline
+
+* [ intrigeri ]
+  * po: fix incompatibility with po4a 0.73+ and HTML input files
+"""]]
diff --git a/ikiwiki.spec b/ikiwiki.spec
index dc1918a76..e30869999 100644
--- a/ikiwiki.spec
+++ b/ikiwiki.spec
@@ -1,5 +1,5 @@
 Name:           ikiwiki
-Version: 3.20250501
+Version: 3.20260201
 Release:        1%{?dist}
 Summary:        A wiki compiler
 

(correct date)
diff --git a/doc/todo/support_atom_feed_summary_tag.mdwn b/doc/todo/support_atom_feed_summary_tag.mdwn
index 03780d327..82668f878 100644
--- a/doc/todo/support_atom_feed_summary_tag.mdwn
+++ b/doc/todo/support_atom_feed_summary_tag.mdwn
@@ -34,4 +34,4 @@ index 9b056e0f4..176f91dfe 100644
         <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
  </TMPL_IF>
 ```
-[[!tag patch]] — [[Jon]], 2026-01-16
+[[!tag patch]] — [[Jon]], 2026-01-19

simple patch
diff --git a/doc/todo/support_atom_feed_summary_tag.mdwn b/doc/todo/support_atom_feed_summary_tag.mdwn
index dd99b63c8..03780d327 100644
--- a/doc/todo/support_atom_feed_summary_tag.mdwn
+++ b/doc/todo/support_atom_feed_summary_tag.mdwn
@@ -1,2 +1,37 @@
 I would like to populate a `summary` property in the items of Atom feeds I generate via [[plugins/inline]],
 with the content I specify via [[plugins/meta]] `description`. — [[Jon]], 2026-01-16
+
+Pretty simple patch, trying this out myself for a little while:
+
+```
+diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
+index f40956821..5729945b9 100644
+--- a/IkiWiki/Plugin/inline.pm
++++ b/IkiWiki/Plugin/inline.pm
+@@ -689,6 +689,10 @@ sub genfeed ($$$$$@) {
+                );
+
+                if (exists $pagestate{$p}) {
++                       if (exists $pagestate{$p}{meta}{description}) {
++                               eval q{use HTML::Entities};
++                               $itemtemplate->param(summary => HTML::Entities::encode_entities($pagestate{$p}{meta}{description}, '<>&'));
++                       }
+                        if (exists $pagestate{$p}{meta}{guid}) {
+                                eval q{use HTML::Entities};
+                                $itemtemplate->param(guid => HTML::Entities::encode_numeric($pagestate{$p}{meta}{guid}));
+diff --git a/templates/atomitem.tmpl b/templates/atomitem.tmpl
+index 9b056e0f4..176f91dfe 100644
+--- a/templates/atomitem.tmpl
++++ b/templates/atomitem.tmpl
+@@ -32,6 +32,9 @@
+ </TMPL_IF>
+        <updated><TMPL_VAR MDATE_3339></updated>
+        <published><TMPL_VAR CDATE_3339></published>
++<TMPL_IF SUMMARY>
++       <summary><TMPL_VAR SUMMARY></summary>
++</TMPL_IF>
+ <TMPL_IF ENCLOSURE>
+        <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
+ </TMPL_IF>
+```
+[[!tag patch]] — [[Jon]], 2026-01-16

populate atom feed item summary property with data from meta description
diff --git a/doc/todo/support_atom_feed_summary_tag.mdwn b/doc/todo/support_atom_feed_summary_tag.mdwn
new file mode 100644
index 000000000..dd99b63c8
--- /dev/null
+++ b/doc/todo/support_atom_feed_summary_tag.mdwn
@@ -0,0 +1,2 @@
+I would like to populate a `summary` property in the items of Atom feeds I generate via [[plugins/inline]],
+with the content I specify via [[plugins/meta]] `description`. — [[Jon]], 2026-01-16

backed out this in opinionated: caused deadlocks
diff --git a/doc/todo/make_suid_wrapper_optional.mdwn b/doc/todo/make_suid_wrapper_optional.mdwn
index 57d591bec..eb1e092d2 100644
--- a/doc/todo/make_suid_wrapper_optional.mdwn
+++ b/doc/todo/make_suid_wrapper_optional.mdwn
@@ -90,3 +90,6 @@ are we still saving some heavy lifting with the lock?
 > git wrapper, and extended my wrapper-wrapper to call `ikiwiki --setup… --refresh`
 > instead of the wrapper. I'm happy to sacrifice support for `wrapper_background_command`
 > in this configuration. *— [[Jon]], 2025-10-02*
+
+>> Alas I've had to back this out as I had created some deadlock situations.
+>> *— [[Jon]], 2026-01-07*

remove patch tag. The merged bit is in, the unmerged bit is not ready.
diff --git a/doc/todo/reconsider_jquery.mdwn b/doc/todo/reconsider_jquery.mdwn
index 6a7f66625..e4553bf29 100644
--- a/doc/todo/reconsider_jquery.mdwn
+++ b/doc/todo/reconsider_jquery.mdwn
@@ -49,7 +49,7 @@ sequester the stuff in one place. Or maybe a waste of time. I don't know!
 
 >> Thanks for the encouragement! I've de-jquery'd the login selector.
 >> Patches in the branch detailed in the template. If anyone is prepared
->> to give this some basic testing that would be appreciated. [[!tag patch]]
+>> to give this some basic testing that would be appreciated.
 *— [[Jon]], 2025-09-16*
 
 ----

done
diff --git a/doc/bugs/po_plugin_broken_with_po4a_0.70.mdwn b/doc/bugs/po_plugin_broken_with_po4a_0.70.mdwn
index 111e55f6f..8adf3195e 100644
--- a/doc/bugs/po_plugin_broken_with_po4a_0.70.mdwn
+++ b/doc/bugs/po_plugin_broken_with_po4a_0.70.mdwn
@@ -14,3 +14,5 @@ I think this patch is sufficient: <https://salsa.debian.org/jmtd/ikiwiki/-/commi
 >
 > I'm unavailable for a couple of weeks so I'll let it "soak" in Debian before committing it here.
 > *— [[Jon]], 2024-06-12*
+
+[[done]].

+tag patch
diff --git a/doc/todo/object_support.mdwn b/doc/todo/object_support.mdwn
index 527f45ad1..b005ba0c1 100644
--- a/doc/todo/object_support.mdwn
+++ b/doc/todo/object_support.mdwn
@@ -1,3 +1,4 @@
 [[!template id=gitbranch branch=GiuseppeBilotta/obj author="[[GiuseppeBilotta]]"]]
 
 I have created a rather straightforward adaptation of the `img` directive to implement `object` support. The intended use case is to allow inclusion of SVG images that use interaction and/or load external resources, which are not supported in modern browsers via the `img` tag because security. The new directive is called `obj`, and it's implemented as part of the `img` plugin. The patch implementing it is available in my `obj` branch
+[[!tag patch]]

done
diff --git a/doc/todo/headless_git_branches.mdwn b/doc/todo/headless_git_branches.mdwn
index b292f50c7..968d7e457 100644
--- a/doc/todo/headless_git_branches.mdwn
+++ b/doc/todo/headless_git_branches.mdwn
@@ -253,3 +253,4 @@ index cf7fbe9..e5bafcf 100644
 >>>> I've pushed a branch with this fix, and a corresponding test. The test
 >>>> relies upon `Test::Fatal` so before I merge I want to check that this
 >>>> isn't an egregious extra dependency for IkiWiki.  *— [[Jon]], 2025-12-04*
+>>>>> merged. [[done]]. *— [[Jon]], 2025-12-04*