Recent changes to this wiki:

diff --git a/doc/sandbox/Do_issue___96__titles__96_____42__support__42_____95__Markdown__95___or_are___91__they__93____40__https:__47____47__fsf.org__41___plain___60__i__62__text__60____47__i__62__.mdwn b/doc/sandbox/Do_issue___96__titles__96_____42__support__42_____95__Markdown__95___or_are___91__they__93____40__https:__47____47__fsf.org__41___plain___60__i__62__text__60____47__i__62__.mdwn
new file mode 100644
index 000000000..c67b52b9b
--- /dev/null
+++ b/doc/sandbox/Do_issue___96__titles__96_____42__support__42_____95__Markdown__95___or_are___91__they__93____40__https:__47____47__fsf.org__41___plain___60__i__62__text__60____47__i__62__.mdwn
@@ -0,0 +1 @@
+Do issue `titles` *support* _Markdown_ or are [they](https://fsf.org) plain <i>text</i>

diff --git a/doc/plugins/sparkline/discussion.mdwn b/doc/plugins/sparkline/discussion.mdwn
index 076e6b707..08e130355 100644
--- a/doc/plugins/sparkline/discussion.mdwn
+++ b/doc/plugins/sparkline/discussion.mdwn
@@ -5,3 +5,5 @@ php5 is no longer available in Debian stable (or oldstable).
 the libphp-sparkline package is broken with php7 CLI (it redefines "Object" which is now reserved).
 
 Perhaps reverting to the Perl sparkline would make sense now? — [[Jon]]
+
+> oh, now I see [[bugs/remove orphaned sparkline-php from Suggests]].

php sparkline is dead
diff --git a/doc/plugins/sparkline/discussion.mdwn b/doc/plugins/sparkline/discussion.mdwn
new file mode 100644
index 000000000..076e6b707
--- /dev/null
+++ b/doc/plugins/sparkline/discussion.mdwn
@@ -0,0 +1,7 @@
+sparkline.org no longer hosts the php sparkline software. it redirects to a personal website which points people at github for their projects, and that list does not include sparkline.
+
+php5 is no longer available in Debian stable (or oldstable).
+
+the libphp-sparkline package is broken with php7 CLI (it redefines "Object" which is now reserved).
+
+Perhaps reverting to the Perl sparkline would make sense now? — [[Jon]]

Added a comment: I also need this. Please help!
diff --git a/doc/forum/how_to_put_a_permalink_on_each_post/comment_1_c9bb9dec3c3eab234aa3b0cc22991cfa._comment b/doc/forum/how_to_put_a_permalink_on_each_post/comment_1_c9bb9dec3c3eab234aa3b0cc22991cfa._comment
new file mode 100644
index 000000000..325cdd7db
--- /dev/null
+++ b/doc/forum/how_to_put_a_permalink_on_each_post/comment_1_c9bb9dec3c3eab234aa3b0cc22991cfa._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="DataComputist"
+ avatar="http://cdn.libravatar.org/avatar/a17d83194742f0bd57df1e9fc6858c8f"
+ subject="I also need this. Please help!"
+ date="2019-11-08T21:35:21Z"
+ content="""
+Thanks for bring this up. Many users including myself probably need this feature or instruction on how to enable it.
+"""]]

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index c3d1156c1..27e2acc9e 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -3,7 +3,8 @@
 Why doesn't the following work?..
 [[!color  foreground=white background=#ff0000 text="White text on red background"]]
 
-Sure it is. 
+Sure it is.
+===========
 
 I hope baby.
 

revert link spam/vandalism
diff --git a/doc/usage/discussion.mdwn b/doc/usage/discussion.mdwn
new file mode 100644
index 000000000..189d74eb0
--- /dev/null
+++ b/doc/usage/discussion.mdwn
@@ -0,0 +1 @@
+Man page does not document "account\_creation\_password". I started to add it, then noticed other configurations are not documented in the manual page either. --[[JeremyReed]]

removed
diff --git a/doc/usage/discussion.mdwn b/doc/usage/discussion.mdwn
deleted file mode 100644
index dc002c0a8..000000000
--- a/doc/usage/discussion.mdwn
+++ /dev/null
@@ -1 +0,0 @@
-Golden Egg - https://www.thegoldenegg.in/services/address-change/

diff --git a/doc/usage/discussion.mdwn b/doc/usage/discussion.mdwn
index 189d74eb0..dc002c0a8 100644
--- a/doc/usage/discussion.mdwn
+++ b/doc/usage/discussion.mdwn
@@ -1 +1 @@
-Man page does not document "account\_creation\_password". I started to add it, then noticed other configurations are not documented in the manual page either. --[[JeremyReed]]
+Golden Egg - https://www.thegoldenegg.in/services/address-change/

link spam
This reverts commit 88928ee349fd0b6c09779f84e029901afde66b09
diff --git a/doc/users/Erkan_Yilmaz2.html b/doc/users/Erkan_Yilmaz2.html
deleted file mode 100644
index 8f1c59a09..000000000
--- a/doc/users/Erkan_Yilmaz2.html
+++ /dev/null
@@ -1 +0,0 @@
-Yalancı ekrem imamoğlu Mağduriyet edebiyatı yapan şovmen ekrem https://yalanci.neocities.org

link spam
This reverts commit de95e30465eea72b0182f19a8312d9d7fb1faba6
diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index efbb13a91..3d5304365 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -10,7 +10,7 @@ sysadmins.
   [[tips/untrusted_git_push]]); 'jmtd.net', 'jmtd.livejournal.com', 
   'jmtd' if I've forgotten to set my local git config properly,
   or once upon a time 'alcopop.org/me/openid/' or 'jondowland'.
-* My [homepage](https://yalanci.neocities.org/) is powered by ikiwiki
+* My [homepage](http://jmtd.net/) is powered by ikiwiki
 
 I gave a talk at the [UK UNIX User's Group](http://www.ukuug.org/) annual
 [Linux conference](http://www.ukuug.org/events/linux2008/) in 2008 about

link spam
This reverts commit 3d50a3e46880717b4d64ed7e5ff9b4f225d4b785
diff --git a/doc/users/smcv.mdwn b/doc/users/smcv.mdwn
index 2726931d1..9835049c3 100644
--- a/doc/users/smcv.mdwn
+++ b/doc/users/smcv.mdwn
@@ -1,6 +1,6 @@
 Website: [pseudorandom.co.uk](http://www.pseudorandom.co.uk/)
 
-Blog: [smcv.pseudorandom.co.uk](https://yalanci.neocities.org/)
+Blog: [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/)
 
 My repository containing ikiwiki branches:
 

diff --git a/doc/users/smcv.mdwn b/doc/users/smcv.mdwn
index 9835049c3..2726931d1 100644
--- a/doc/users/smcv.mdwn
+++ b/doc/users/smcv.mdwn
@@ -1,6 +1,6 @@
 Website: [pseudorandom.co.uk](http://www.pseudorandom.co.uk/)
 
-Blog: [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/)
+Blog: [smcv.pseudorandom.co.uk](https://yalanci.neocities.org/)
 
 My repository containing ikiwiki branches:
 

diff --git a/doc/users/jon.mdwn b/doc/users/jon.mdwn
index 3d5304365..efbb13a91 100644
--- a/doc/users/jon.mdwn
+++ b/doc/users/jon.mdwn
@@ -10,7 +10,7 @@ sysadmins.
   [[tips/untrusted_git_push]]); 'jmtd.net', 'jmtd.livejournal.com', 
   'jmtd' if I've forgotten to set my local git config properly,
   or once upon a time 'alcopop.org/me/openid/' or 'jondowland'.
-* My [homepage](http://jmtd.net/) is powered by ikiwiki
+* My [homepage](https://yalanci.neocities.org/) is powered by ikiwiki
 
 I gave a talk at the [UK UNIX User's Group](http://www.ukuug.org/) annual
 [Linux conference](http://www.ukuug.org/events/linux2008/) in 2008 about

diff --git a/doc/users/Erkan_Yilmaz2.html b/doc/users/Erkan_Yilmaz2.html
new file mode 100644
index 000000000..8f1c59a09
--- /dev/null
+++ b/doc/users/Erkan_Yilmaz2.html
@@ -0,0 +1 @@
+Yalancı ekrem imamoğlu Mağduriyet edebiyatı yapan şovmen ekrem https://yalanci.neocities.org

link to the actual ikiwiki repo
diff --git a/doc/users/GiuseppeBilotta.mdwn b/doc/users/GiuseppeBilotta.mdwn
index 7b15da959..49f028205 100644
--- a/doc/users/GiuseppeBilotta.mdwn
+++ b/doc/users/GiuseppeBilotta.mdwn
@@ -1,5 +1,5 @@
 Custom patches to IkiWiki can be found in select branches of
-<http://git.oblomov.eu>.
+<http://git.oblomov.eu/ikiwiki>.
 
 Patches proposed/discussed:
 [[!map pages="link(users/GiuseppeBilotta) and (todo/* or bugs/*) and

Whitespace
diff --git a/doc/todo/object_support.mdwn b/doc/todo/object_support.mdwn
index e7a9dd811..527f45ad1 100644
--- a/doc/todo/object_support.mdwn
+++ b/doc/todo/object_support.mdwn
@@ -1,3 +1,3 @@
-[[!template id=gitbranch branch=GiuseppeBilotta/obj author="[[Giuseppe Bilotta]]"]]
+[[!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

Proposed support for object tag
diff --git a/doc/todo/object_support.mdwn b/doc/todo/object_support.mdwn
new file mode 100644
index 000000000..e7a9dd811
--- /dev/null
+++ b/doc/todo/object_support.mdwn
@@ -0,0 +1,3 @@
+[[!template id=gitbranch branch=GiuseppeBilotta/obj author="[[Giuseppe Bilotta]]"]]
+
+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

I had the same problem somebody on the discussion page had so I changed the instructions so nobody else will.
diff --git a/doc/install.mdwn b/doc/install.mdwn
index 82fd299e3..7b768a61e 100644
--- a/doc/install.mdwn
+++ b/doc/install.mdwn
@@ -25,7 +25,7 @@ documentation for details.
 
 If you want to install by hand from the tarball, you should make sure that
 all the perl modules are installed. This is one way to install them, using
-CPAN:
+CPAN to install modules from your local machine after you extract the ikiwiki tarball:
 
 	PERL5LIB=`pwd` PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'CPAN::Shell->install("Bundle::IkiWiki")'
 	PERL5LIB=`pwd` PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'CPAN::Shell->install("Bundle::IkiWiki::Extras")'

libtext-csv-xs-perl not relevant
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index cafc7e419..f115fbebb 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -134,4 +134,6 @@ I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon
 >> Post Buster-upgrade, and it's *still* broken on my webhost, which shows
 >> `[\[!table Error: Wide character at /usr/lib/x86_64-linux-gnu/perl/5.28/Encode.pm line 296.]]`
 >> with libperl5.28:amd64	5.28.1-6, libtext-csv-perl	1.99-1 and 
->> libtext-csv-xs-perl	1.38-1. Further fiddling will commence. — [[Jon]]
+>> libtext-csv-xs-perl	1.38-1. Further fiddling will commence.
+>> (removing libtext-csv-xs-perl does not help.)
+— [[Jon]]

sigh, still broken, different error message.
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 653ec00d3..cafc7e419 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -130,3 +130,8 @@ I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon
 >> EDIT: yes indeed merely upgrading to libperl5.28=5.28.1-6 in stretch fixes the
 >> issue.
 >> — [[Jon]]
+>>
+>> Post Buster-upgrade, and it's *still* broken on my webhost, which shows
+>> `[\[!table Error: Wide character at /usr/lib/x86_64-linux-gnu/perl/5.28/Encode.pm line 296.]]`
+>> with libperl5.28:amd64	5.28.1-6, libtext-csv-perl	1.99-1 and 
+>> libtext-csv-xs-perl	1.38-1. Further fiddling will commence. — [[Jon]]

libpel5
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index dd5b3982c..653ec00d3 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -120,8 +120,13 @@ I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon
 >> libtext-csv-perl         1.33-2 and libtext-csv-xs-perl is not installed.
 >> I'll do some futher diagnosis and poking around.
 >> ­— [[Jon]]
+>> 
 >> OK: issue exists with oldstable/Stretch, and is seemingly fixed in stable/Buster.
 >> `libcsv-text-xs-perl` doesn't seem to matter (presence or absence doesn't change
 >> the bug). Upgrading just `libtext-csv-perl` on a Stretch host with Buster's
 >> 1.99-1 is not sufficent to fix it. As per the error, I think libperl5 might be
->> relevant, i.e. bug present in 5.24.1-3+deb9u5 and fixed by 5.28.1-6. — [[Jon]]
+>> relevant, i.e. bug present in 5.24.1-3+deb9u5 and fixed by 5.28.1-6.
+>>
+>> EDIT: yes indeed merely upgrading to libperl5.28=5.28.1-6 in stretch fixes the
+>> issue.
+>> — [[Jon]]

more info: libperl5, buster versus stretch
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 3b6780f85..dd5b3982c 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -120,3 +120,8 @@ I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon
 >> libtext-csv-perl         1.33-2 and libtext-csv-xs-perl is not installed.
 >> I'll do some futher diagnosis and poking around.
 >> ­— [[Jon]]
+>> OK: issue exists with oldstable/Stretch, and is seemingly fixed in stable/Buster.
+>> `libcsv-text-xs-perl` doesn't seem to matter (presence or absence doesn't change
+>> the bug). Upgrading just `libtext-csv-perl` on a Stretch host with Buster's
+>> 1.99-1 is not sufficent to fix it. As per the error, I think libperl5 might be
+>> relevant, i.e. bug present in 5.24.1-3+deb9u5 and fixed by 5.28.1-6. — [[Jon]]

follow-up: sorry, I appreciate that wasn't as useful as it could have been
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 92be2b636..3b6780f85 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -111,3 +111,12 @@ I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon
 > test-case, and push it to your github fork or something, so I can apply
 > it without having to guess precisely what the whitespace should be.
 > --[[smcv]]
+
+>> Sorry, I appreciate as bug reports go my last post was not that useful.
+>> It's serving as a sort-of personal placeholder to investigate further.
+>> The issue can be seen live [here](https://jmtd.net/fiction/sf_masterworks/),
+>> the source is [here](https://jmtd.net/tmp/sf_masterworks.mdwn). The web
+>> servers versions are ikiwiki                  3.20190228-1,
+>> libtext-csv-perl         1.33-2 and libtext-csv-xs-perl is not installed.
+>> I'll do some futher diagnosis and poking around.
+>> ­— [[Jon]]

split done and not done patch list, remove patches from the other lists
diff --git a/doc/users/anarcat.mdwn b/doc/users/anarcat.mdwn
index 5adbf9a17..d9391eafc 100644
--- a/doc/users/anarcat.mdwn
+++ b/doc/users/anarcat.mdwn
@@ -5,7 +5,11 @@ See <https://anarc.at/>. I have home pages like this on tons of other wikis incl
 Submitted patches
 =================
 
-[[!inline pages="tagged(patch) and link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]]
+[[!inline pages="tagged(patch) and link(users/anarcat) and !link(todo/done)" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+## Done
+
+[[!inline pages="tagged(patch) and link(users/anarcat) and link(todo/done)" sort=mtime feeds=no actions=yes archive=yes show=0]]
 
 
 My todos
@@ -14,13 +18,13 @@ My todos
 ... or the ones I commented it, to be more precise.
 
 [[!inline pages="todo/* and !todo/done and !link(todo/done) and
-link(users/anarcat) and !todo/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat) and !todo/*/* and !tagged(patch)" sort=mtime feeds=no actions=yes archive=yes show=0]]
 
 Done
 ----
 
 [[!inline pages="todo/* and !todo/done and link(todo/done) and
-link(users/anarcat) and !todo/*/*" feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat) and !todo/*/* and !tagged(patch)" feeds=no actions=yes archive=yes show=0]]
 
 My bugs
 =======
@@ -28,10 +32,10 @@ My bugs
 ... same.
 
 [[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
-link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat) and !bugs/*/* and !tagged(patch)" sort=mtime feeds=no actions=yes archive=yes show=0]]
 
 Fixed
 -----
 
 [[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
-link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat) and !bugs/*/* and !tagged(patch)" feeds=no actions=yes archive=yes show=0]]

explicitely tag this as a patch
diff --git a/doc/todo/git-annex_support.mdwn b/doc/todo/git-annex_support.mdwn
index c49cab4d2..f1a4e787c 100644
--- a/doc/todo/git-annex_support.mdwn
+++ b/doc/todo/git-annex_support.mdwn
@@ -230,7 +230,7 @@ add_plugins:
 
 > <del>...aaaand this doesn't work anymore. :( i could have sworn this was working minutes ago, but for some reason the annexed files get skipped again now. :(</del> Sorry for the noise, the annex repo wasn't in direct mode - the above works! --[[anarcat]]
 
-This [[patch]] still applies - anything else I should be doing here to try to get this fixed? A summary maybe? --[[anarcat]]
+This [[!taglink patch]] still applies - anything else I should be doing here to try to get this fixed? A summary maybe? --[[anarcat]]
 
 > Sorry, I don't have the mental bandwidth at the moment to work through the
 > implications of this change. I know you want this feature, I know it's an

Gentle ping on proposed branch
diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index 07eb23d04..fbdccc5b2 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -30,4 +30,8 @@ See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15
 >> Happy to squash all this into a single commit if you prefer.
 >> --[[intrigeri]]
 
+>>> Please let me know if the added test coverage is sufficient to unblock
+>>> the merge of this branch. Thanks in advance!
+>>> --[[intrigeri]]
+
 [[!tag patch]]

cannot reproduce new bug
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 5c2b0b2ae..92be2b636 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -97,3 +97,17 @@ I've hit this bug with an inline-table and 3.20190228-1 (so: patch applied), wit
     I (HB1), 70 (PB1), 5 (PB50)     Dune    O       ✓"""]]
 
 I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon]]
+
+> What version of Text::CSV (Debian: `libtext-csv-perl`) are you using?
+> What version of Text::CSV::XS (Debian: `libtext-csv-xs-perl`) are you
+> using, if any?
+>
+> I could't reproduce this with `libtext-csv-perl_2.00-1` and
+> `libtext-csv-xs-perl_1.39-1`, assuming that the whitespace in
+> `delimiter="..."` was meant to be a literal tab character, and that
+> the data row has literal tabs before Dune, before O and before ✓.
+>
+> It would be great if you could modify `t/table.t` to include a failing
+> test-case, and push it to your github fork or something, so I can apply
+> it without having to guess precisely what the whitespace should be.
+> --[[smcv]]
diff --git a/t/table.t b/t/table.t
index d7e9e6ff0..a7bbc06bf 100755
--- a/t/table.t
+++ b/t/table.t
@@ -48,6 +48,12 @@ Key       | Value
 ASCII     | hello
 Not ASCII | ¬
 """]]');
+write_old_file("jon.mdwn",
+'(See doc/bugs/table_can_not_deal_with_Chinese.mdwn)
+
+[[!table class=fullwidth_table delimiter="	" data="""
+Number	Title	Own?	Read?
+I (HB1), 70 (PB1), 5 (PB50)	Dune	O	✓"""]]');
 
 ok(! system(@command));
 ok(! system(@command, "--refresh"));
@@ -60,6 +66,10 @@ like($blob, qr{<td>\s*Not ASCII\s*</td>.*<td>\s*¬\s*</td>}s);
 SKIP: {
 	skip "Text::CSV unavailable", 0 unless eval q{use Text::CSV; 1};
 
+	$blob = readfile("t/tmp/out/jon.html");
+	like($blob, qr{<th>\s*Number\s*</th>\s*<th>\s*Title\s*</th>\s*<th>\s*Own\?\s*</th>\s*<th>\s*Read\?\s*</th>}s);
+	like($blob, qr{<td>\s*I \(HB1\), 70 \(PB1\), 5 \(PB50\)\s*</td>\s*<td>\s*Dune\s*</td>\s*<td>\s*O\s*</td>\s*<td>\s*✓\s*</td>}s);
+
 	$blob = readfile("t/tmp/out/csv.html");
 	like($blob, qr{<th>\s*Key\s*</th>.*<th>\s*Value\s*</th>}s);
 	like($blob, qr{<td>\s*ASCII\s*</td>.*<td>\s*hello\s*</td>}s);

diff --git a/doc/forum/how_to_put_a_permalink_on_each_post.mdwn b/doc/forum/how_to_put_a_permalink_on_each_post.mdwn
new file mode 100644
index 000000000..cfeca4592
--- /dev/null
+++ b/doc/forum/how_to_put_a_permalink_on_each_post.mdwn
@@ -0,0 +1,3 @@
+I hope my title sorta says it all. Searching ikiwiki for 'permalink' was not fruitful, not, at least, for this user, at this juncture.
+
+Thank you.

bug remains for inline table case
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 8e7aa6fc3..5c2b0b2ae 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -86,3 +86,14 @@ The below patch seem to deal with this problem:
 ----
 
 I can confirm that the above patch fixes the issue for me. Thanks! I'm not an ikiwiki committer, but I would encourage them to consider the above. Whilst I'm at it, I would be *really* grateful for some input on [[todo/support_multi-row_table_headers]] which relates to the same plugin. [[Jon]]
+
+----
+
+I've hit this bug with an inline-table and 3.20190228-1 (so: patch applied), with the following definition
+
+    [[\!table class=fullwidth_table delimiter="      " data="""    
+     
+    Number  Title   Own?    Read?    
+    I (HB1), 70 (PB1), 5 (PB50)     Dune    O       ✓"""]]
+
+I'm going to attempt to work around it by moving to an external CSV. ­— [[Jon]]

bug report
diff --git a/doc/bugs/http_login_after_https_login_leads_to_extremely_confusing_error.mdwn b/doc/bugs/http_login_after_https_login_leads_to_extremely_confusing_error.mdwn
new file mode 100644
index 000000000..eae465f1d
--- /dev/null
+++ b/doc/bugs/http_login_after_https_login_leads_to_extremely_confusing_error.mdwn
@@ -0,0 +1,10 @@
+As reported by many confused users at 
+<http://git-annex.branchable.com/bugs/impossible_to_login_to_the_website_at_times/>
+a successful login can end up at the error message "Error: Login succeeded,
+but I don't remember why you were logging in [...]"
+
+This happens when the user has earlier logged into a site on its https
+url, but then later navigates to the http url, and is prompted to log in
+there.
+
+Workaround: Set `redirect_to_https`.

not sure this is necessary
diff --git a/doc/todo/section-numbering.mdwn b/doc/todo/section-numbering.mdwn
index 41803e3a2..86a86de5b 100644
--- a/doc/todo/section-numbering.mdwn
+++ b/doc/todo/section-numbering.mdwn
@@ -7,3 +7,5 @@ I guess it is implementable with complex CSS... but one has first to compose thi
 And another aspect why this is related to ikiwiki, not just authoring a CSS, is that the style of the numbers (genereated by CSS probably) should match the style of the numbers in ikiwiki's [[plugins/toc]]. --Ivan Z.
 
 <https://codepen.io/X-Raym/pen/dBprG> - a known CSS technique.  works well.  adapted here due to that numbering starting from h2, where ikiwiki (incorrectly) starts headings from h1 <http://libre-riscv.org/local.css> --lkcl
+
+> Related: [[todo/toc-with-human-readable-anchors]]. That said, I'm not sure this is something that ikiwiki should handle at all. As you said, this can be generated by CSS... Maybe an option for the `toc` plugin would be necessary to *change* the style of the numbering, but I doubt it's worth the effort... In other words, there is already some numbering in the table of contents, the CSS should just match it... unless I'm missing something? -- [[anarcat]]

add link to auto-numbering on CSS
diff --git a/doc/todo/section-numbering.mdwn b/doc/todo/section-numbering.mdwn
index 3a2d232a8..41803e3a2 100644
--- a/doc/todo/section-numbering.mdwn
+++ b/doc/todo/section-numbering.mdwn
@@ -5,3 +5,5 @@ Optional automatic section numbering would help reading: otherwise, a reader (li
 I guess it is implementable with complex CSS... but one has first to compose this CSS in any case. So, this wish still has a todo status. --Ivan Z.
 
 And another aspect why this is related to ikiwiki, not just authoring a CSS, is that the style of the numbers (genereated by CSS probably) should match the style of the numbers in ikiwiki's [[plugins/toc]]. --Ivan Z.
+
+<https://codepen.io/X-Raym/pen/dBprG> - a known CSS technique.  works well.  adapted here due to that numbering starting from h2, where ikiwiki (incorrectly) starts headings from h1 <http://libre-riscv.org/local.css> --lkcl

MultiMarkdown footnote un-inversion: done
diff --git a/doc/bugs/MultiMarkdown_footnote_support_seems_to_be_broken.mdwn b/doc/bugs/MultiMarkdown_footnote_support_seems_to_be_broken.mdwn
index 2baba7137..b6c771780 100644
--- a/doc/bugs/MultiMarkdown_footnote_support_seems_to_be_broken.mdwn
+++ b/doc/bugs/MultiMarkdown_footnote_support_seems_to_be_broken.mdwn
@@ -36,3 +36,8 @@ I've been running with this patch to fix it:
     2.21.0.595.g6364b05174
 
 [[!tag patch]]
+[[done]]
+
+> Applied (along with some accompanying tests) in e642784. Thanks for
+> finding and fixing the bug.
+> --[[schmonz]]

Please test sudo-mass-rebuild branch on Debian
diff --git a/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn b/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
index 867b99566..18866c98c 100644
--- a/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
+++ b/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
@@ -144,3 +144,8 @@ The `-m` may be overzealous. I have some sites running as users with `/sbin/nolo
 >>>>     my $ret=system("sudo", "-n", "-s", "-u", $user, "/bin/sh", "-c", "--", "$0", "--nonglobal", @ARGV);
 >>>> 
 >>>> --[[schmonz]]
+
+>>>>> [[!template id=gitbranch branch=schmonz/sudo-mass-rebuild author="[[schmonz]]"]]
+>>>>> Works well for me on macOS and NetBSD. Does it look right? Can
+>>>>> someone vouch that there is indeed no functional change on Debian?
+>>>>> --[[schmonz]]

diff --git a/doc/git.mdwn b/doc/git.mdwn
index 1b21a93ac..df26b2ad3 100644
--- a/doc/git.mdwn
+++ b/doc/git.mdwn
@@ -63,6 +63,8 @@ think about merging them. This is recommended. :-)
 * [[thcipriani]] `https://github.com/thcipriani/ikiwiki.git` ([[browse|https://github.com/thcipriani/ikiwiki]])
 * [[tincho]] `git@github.com:TheTincho/ikiwiki.git` ([[browse|https://github.com/TheTincho/ikiwiki]])
 * [[hefee]] `https://salsa.debian.org/hefee/ikiwiki.git/` ([[browse|https://salsa.debian.org/hefee/ikiwiki]])
+* bsv `https://bico.media/1EZF5WfG6t35iwFpyVVptxT1MB4DKt6G2U`
+  bsv blockchain repo using ([[git-remote-bsv|https://github.com/xloem/git-remote-bsv]])
 ## branches
 
 Current branches of ikiwiki are listed on [[branches]].

Response: am trying sudo
diff --git a/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn b/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
index 3bae33ada..867b99566 100644
--- a/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
+++ b/doc/bugs/ikiwiki-mass-rebuild_has_probably_never_worked_portably.mdwn
@@ -138,3 +138,9 @@ The `-m` may be overzealous. I have some sites running as users with `/sbin/nolo
 >>> and thorough option might be to make the run-as-user command
 >>> configurable, with some strong suggestions and warnings. Thoughts?
 >>> --[[schmonz]]
+
+>>>> Here's what I'm experimenting with now:
+>>>>
+>>>>     my $ret=system("sudo", "-n", "-s", "-u", $user, "/bin/sh", "-c", "--", "$0", "--nonglobal", @ARGV);
+>>>> 
+>>>> --[[schmonz]]

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

Directive fix
diff --git a/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn b/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn
index f59482278..2baba7137 100644
--- a/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn
+++ b/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn
@@ -35,4 +35,4 @@ I've been running with this patch to fix it:
     -- 
     2.21.0.595.g6364b05174
 
-[[!tags patch]]
+[[!tag patch]]

diff --git a/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn b/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn
new file mode 100644
index 000000000..f59482278
--- /dev/null
+++ b/doc/bugs/MultiMarkdown_footnot_support_seems_to_be_broken.mdwn
@@ -0,0 +1,38 @@
+Hello,
+
+I have just updated an ikiwiki installation of mine from the `master` branch in 2014
+to the current `master` (430f69034f7c9f64325ef48da3b3eaf0d685dcc5), and found out that the
+the footnote support with MultiMarkdown is broken. After some investigation, I believe that
+the breakage was introduced in 4db4e589e4c73f076b666a77b86743695454a3ce, with Discount support
+for footnotes. The conditional for the footnote support in MultiMarkdown is inverted.
+
+I've been running with this patch to fix it:
+
+    From 8c624b3cc67bf41b3987a27b15a8dee5fe1087f7 Mon Sep 17 00:00:00 2001
+    From: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+    Date: Thu, 29 Aug 2019 16:51:45 +0200
+    Subject: [PATCH] Fix inverted conditional for multimarkdown footnote support
+    
+    ---
+     IkiWiki/Plugin/mdwn.pm | 4 +---
+     1 file changed, 1 insertion(+), 3 deletions(-)
+    
+    diff --git a/IkiWiki/Plugin/mdwn.pm b/IkiWiki/Plugin/mdwn.pm
+    index eefa29a97..cff4204ef 100644
+    --- a/IkiWiki/Plugin/mdwn.pm
+    +++ b/IkiWiki/Plugin/mdwn.pm
+    @@ -77,9 +77,7 @@ sub htmlize (@) {
+     				$markdown_sub=sub {
+     					my %flags=( use_metadata => 0 );
+     
+    -					if ($config{mdwn_footnotes}) {
+    -						$flags{disable_footnotes}=1;
+    -					}
+    +					$flags{disable_footnotes}= not $config{mdwn_footnotes};
+     
+     					Text::MultiMarkdown::markdown(shift, \%flags);
+     				}
+    -- 
+    2.21.0.595.g6364b05174
+
+[[!tags patch]]

I've not looked at Shake yet, thanks, I'll give it a look! — [[Jon]]
diff --git a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
index 9d2a7c746..851fdbe1f 100644
--- a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
+++ b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
@@ -84,3 +84,5 @@ I've got an idea of how to handle `template`, but haven't tried coding it up yet
 Cool, Jon. Have you thought about Shake + pandoc as an interesting alternative to Hakyll,
 perhaps a little more lightweight and flexible ? Here’s a [bit of Shake code](https://github.com/simonmichael/hledger/blob/master/Shake.hs#L421)
 I use for rendering wiki-like pages. —[[Simon Michael]]
+
+> I've not looked at Shake yet, thanks, I'll give it a look! — [[Jon]]

diff --git a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
index 79a6a758c..9d2a7c746 100644
--- a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
+++ b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
@@ -79,7 +79,7 @@ Directives, I've written basic implementations of `meta` and `tag`. In both case
 `Metadata`, which is really a hash map. I've yet to figure out plumbing that back into Hakyll, though.
 I've got an idea of how to handle `template`, but haven't tried coding it up yet. — [[Jon]]
 
-——-
+-----
 
 Cool, Jon. Have you thought about Shake + pandoc as an interesting alternative to Hakyll,
 perhaps a little more lightweight and flexible ? Here’s a [bit of Shake code](https://github.com/simonmichael/hledger/blob/master/Shake.hs#L421)

Suggest shake
diff --git a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
index ccad64351..79a6a758c 100644
--- a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
+++ b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
@@ -78,3 +78,9 @@ the page-linking rules are not yet implemented (the wiki link target is passed t
 Directives, I've written basic implementations of `meta` and `tag`. In both cases, I build up Hakyll
 `Metadata`, which is really a hash map. I've yet to figure out plumbing that back into Hakyll, though.
 I've got an idea of how to handle `template`, but haven't tried coding it up yet. — [[Jon]]
+
+——-
+
+Cool, Jon. Have you thought about Shake + pandoc as an interesting alternative to Hakyll,
+perhaps a little more lightweight and flexible ? Here’s a [bit of Shake code](https://github.com/simonmichael/hledger/blob/master/Shake.hs#L421)
+I use for rendering wiki-like pages. —[[Simon Michael]]

some beginning code to migrate an ikiwiki to hakyll
diff --git a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
index ff20f7c8a..ccad64351 100644
--- a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
+++ b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn
@@ -63,3 +63,18 @@ Rather than coding plugins for the Perl ikiwiki in Haskell, I wonder how easily
 -----
 
 I'm very keen on this, and would be interested in helping. I've been wanting to use ikiwiki for years, but the idea of investing time in the perl ecosystem and perl-based implementation stops me. -- [[Simon Michael]]
+
+-----
+
+I've recently been wondering whether I could migrate my personal blog (powered by IkiWiki) to Hakyll.
+I'm really fond of Ikiwiki's wiki link syntax, as well as the linking rules, and many of the features
+offered by plugins. Therefore I set out to see how easily (and whether it's even feasible) to implement
+them on top of Hakyll. I'm totally new to Hakyll so I don't fully understand some of the concepts but
+I've made some promising initial progress. I decided to share my work in progress experiments here:
+<https://github.com/jmtd/hakyll-ikiwiki>
+
+I can recognise and parse out wiki links and directives. Wikilinks are translated into HTML links, but
+the page-linking rules are not yet implemented (the wiki link target is passed through as-is). For
+Directives, I've written basic implementations of `meta` and `tag`. In both cases, I build up Hakyll
+`Metadata`, which is really a hash map. I've yet to figure out plumbing that back into Hakyll, though.
+I've got an idea of how to handle `template`, but haven't tried coding it up yet. — [[Jon]]

lol
diff --git a/doc/forum/A_new_ikiwiki_logo.mdwn b/doc/forum/A_new_ikiwiki_logo.mdwn
index 93b4d86eb..8533f97f9 100644
--- a/doc/forum/A_new_ikiwiki_logo.mdwn
+++ b/doc/forum/A_new_ikiwiki_logo.mdwn
@@ -3,3 +3,5 @@
 ![cartoon depiction of a stick figure dragging a camel](http://halestrom.net/darksleep/software/minisleep/wikibash_justiki.png)
 
 Thankyou for ikiwiki.  I've stolen some of its ideas over the years, and it's shown me there are better and different ways of doing things.
+
+> This really made me laugh, thank you ☺ — [[Jon]]

saw typesetter-css and was reminded of my appeal against the anti-theme as default
diff --git a/doc/todo/Modern_standard_layout.mdwn b/doc/todo/Modern_standard_layout.mdwn
index bb6356a6d..6fd41b7dd 100644
--- a/doc/todo/Modern_standard_layout.mdwn
+++ b/doc/todo/Modern_standard_layout.mdwn
@@ -71,3 +71,15 @@ Thanks, [[users/Jon]]. (2017-12-28)
 9 month ping, does [[Joey]] or [[smcv]] have any kind of opinion on this matter,
 subsequent to my last comment? I ask because both of your takes on the issue are from
 way back in 2011. — [[Jon]] (2018-09-24)
+
+----
+
+saw this "typesetter CSS" and was reminded of the anti-theme (and my 18 month old appeal to revisit that decision):
+[typesetter-css](https://screwtapello.gitlab.io/typesetter-css/example/demo.html):
+
+> HTML is a semantic markup language, but web-browsers' default presentation of semantic HTML is more based on compatibility with decades-old browsers than with readability. There are browser-addons that will take a page, strip out the presentational markup and try to present the result in a readable format, but that shouldn't be necessary if you've got sensible semantic markup to begin with.
+> 
+> Typesetter.css is a custom stylesheet designed to present generic, semantic HTML in the most readable way possible.
+
+The readability problems with unstyled HTML that this project talks about are exactly why I think the anti-theme
+as default for the main site should be revisited. — [[Jon]] (2019-08-16)

diff --git a/doc/todo/pdf_output.mdwn b/doc/todo/pdf_output.mdwn
index e273f60fc..c176f1939 100644
--- a/doc/todo/pdf_output.mdwn
+++ b/doc/todo/pdf_output.mdwn
@@ -5,6 +5,8 @@ Note that for example dokuwiki has a [[nice plugin|http://danjer.doudouke.org/te
 > I've actually written one, it's just not publicly released.  You can check it out from the "experimental" branch of my <a href="https://github.com/rubykat/ikiplugins">ikiplugins githup repo</a>.  It's called "html2pdf" and it depends on the static version of <a href="http://wkhtmltopdf.org">wkhtmltopdf</a> rather than requiring a whole LaTeX setup. It's only been used on Ubuntu, so I can't say what problems there might be on other setups, but it works for me.  It's not properly documented; I'd appreciate some help with that.
 > -- [[KathrynAndersen]]
 
+>> kathryn: wkhtmltopdf is based on webkit (qtwebkit).  it effectively does a sort-of "i am a browser, i am going to print this page for you, oh look, you don't actually have a screen, i'll just output the file conveniently for you" thing.  as such, the dependencies are MASSIVE.  i just tried installing wkhtmltopdf on a debian server: it required pulling in x11 libraries, font configs, QT5, libxml2, 30+ other dependencies, pulling in over ONE HUNDRED sub and sub-dependencies - the works.  absolutely NO chance - whatsoever - that i am going to put a public-facing server at risk or waste resources with such a nightmare waiting to happen, particularly one that is activated by a web service.  latex on the other hand, despite being likely much larger, i can tolerate.  it has "class" and history, being developed in the 70s by donald knuth - i.e. it was *not* developed by apple (ripping off the KDE KHTMLPart team's work, years ago) and does *not* depend on a whole bunch of crap such as qt.  qt is a *GUI* toolkit, what am i gonna do installing that on a *server* for god's sake?? :)  tex.  donald knuth.  that's pedigree.
+
 >> Thanks, I downloaded the git-repro and did `sudo cp html2pdf.pm /usr/share/perl5/IkiWiki/Plugin/` then I added html2pdf to the addplugins line in my setup-file (`mywiki.setup`) as well a new line `html2pdf_pages=>"/*",`. Then I did `sudo ikiwiki --setup mywiki.setup`. However there is no button or something like that which let's me create the pdf's
 >> -- [[micheal]]
 

Adding my work-in-progress blog to the list
diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index 44503217d..2d5507c0c 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -222,3 +222,4 @@ Personal sites and blogs
 * [Svetlana Tkachenko's personal website](http://svetlana.nfshost.com/index.en.html) - personal site, no blog
 * [re:fi.64's personal wiki](https://wiki.refi64.com/)
 * [canvon's blog](https://blog.canvon.de/)
+* [Coyote Works](http://coyote.works/) - Work In Progress site of Stephen Michael Kellat

No longer hosting these on Branchable.
diff --git a/doc/users/schmonz.mdwn b/doc/users/schmonz.mdwn
index e4eb28c4e..f8beb59cb 100644
--- a/doc/users/schmonz.mdwn
+++ b/doc/users/schmonz.mdwn
@@ -15,15 +15,13 @@ pages="!*/Discussion and ((link(users/schmonz) and plugins/* and !plugins/openid
 * [An undergraduate group's university-provided-static-hosted
   site](http://www.columbia.edu/cu/philo/) (with [[plugins/rsync]] and a [WIND
   authentication](http://www.columbia.edu/acis/rad/authmethods/wind/) plugin)
-* [A small personal site](http://www.anglofish.net/) (happily hosted at
-  [Branchable](http://www.branchable.com/))
+* [A small personal site](http://www.anglofish.net/)
 * [A wiki about Agile in distributed teams](http://shapemywork.com/)
 
 ## Non-public
 
 * On my laptop, personal to-do and scratch space
-* [A small personal site](http://podcast.schmonz.com/) (happily hosted at
-  [Branchable](http://www.branchable.com/))
+* [A small personal site](http://podcast.schmonz.com/)
 * At a previous job, team documentation and project planning: product and sprint
   backlogs, burndown charts, release plans/procedures/announcements,
   aggregating feeds of shared interest, etc.

Fix link in previous.
diff --git a/doc/podcast/discussion.mdwn b/doc/podcast/discussion.mdwn
index ac3da985c..7209b22e7 100644
--- a/doc/podcast/discussion.mdwn
+++ b/doc/podcast/discussion.mdwn
@@ -1,7 +1,7 @@
 I'm trying to figure out if there is a way to perhaps host podcast content on the Internet Archive and make reference to the files there as enclosures.  So far I've not had the greatest successes trying to upload content to incorporate as enclosures on my own site. I'm still trying to straighten things out to get the site running https as it is now... -- [skellat](http://coyote.works) / [alpacaherder](https://mastodon.sdf.org/@alpacaherder)
 
 > Podcast content must be in `srcdir`, at present,
-> so that `bestlink()` can find it (applying [[SubPage/LinkingRules]]).
+> so that `bestlink()` can find it (applying [[ikiwiki/SubPage/LinkingRules]]).
 > Some future enhancement might turn external media into enclosures; see
 > [[forum/ikiwiki_and_big_files]],
 > [[todo/git-annex_support]],

Reply to fancypodcast question.
diff --git a/doc/podcast/discussion.mdwn b/doc/podcast/discussion.mdwn
index 1a2e22275..ac3da985c 100644
--- a/doc/podcast/discussion.mdwn
+++ b/doc/podcast/discussion.mdwn
@@ -1 +1,12 @@
 I'm trying to figure out if there is a way to perhaps host podcast content on the Internet Archive and make reference to the files there as enclosures.  So far I've not had the greatest successes trying to upload content to incorporate as enclosures on my own site. I'm still trying to straighten things out to get the site running https as it is now... -- [skellat](http://coyote.works) / [alpacaherder](https://mastodon.sdf.org/@alpacaherder)
+
+> Podcast content must be in `srcdir`, at present,
+> so that `bestlink()` can find it (applying [[SubPage/LinkingRules]]).
+> Some future enhancement might turn external media into enclosures; see
+> [[forum/ikiwiki_and_big_files]],
+> [[todo/git-annex_support]],
+> and
+> [[todo/fancypodcast]]).
+> In the meantime, enclosures from your site can definitely work.
+> What have you tried, and in what way did it fail?
+> -- [[schmonz]]

Open up the discussion
diff --git a/doc/podcast/discussion.mdwn b/doc/podcast/discussion.mdwn
new file mode 100644
index 000000000..1a2e22275
--- /dev/null
+++ b/doc/podcast/discussion.mdwn
@@ -0,0 +1 @@
+I'm trying to figure out if there is a way to perhaps host podcast content on the Internet Archive and make reference to the files there as enclosures.  So far I've not had the greatest successes trying to upload content to incorporate as enclosures on my own site. I'm still trying to straighten things out to get the site running https as it is now... -- [skellat](http://coyote.works) / [alpacaherder](https://mastodon.sdf.org/@alpacaherder)

Add my ikiwiki/blog
diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index d14e4898c..44503217d 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -221,3 +221,4 @@ Personal sites and blogs
 * [Rob Sayers' personal website](http://www.robsayers.com)
 * [Svetlana Tkachenko's personal website](http://svetlana.nfshost.com/index.en.html) - personal site, no blog
 * [re:fi.64's personal wiki](https://wiki.refi64.com/)
+* [canvon's blog](https://blog.canvon.de/)

diff --git a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
index 53f85d881..864a5473b 100644
--- a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
+++ b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
@@ -36,3 +36,6 @@ We're running ikiwiki version 3.20180228-1.
 >> 
 >> I've upgraded our installations of both Xapian components and will let you know if that fixes it.
 >> -- jsewell
+>>
+>>> Updating appeared to fix it. Sorry for not trying that sooner. Thanks for the help.
+>>> -- jsewell

diff --git a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
index afbda3d5b..53f85d881 100644
--- a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
+++ b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
@@ -27,3 +27,12 @@ We're running ikiwiki version 3.20180228-1.
 > Maybe worth blowing away `.ikiwiki/xapian/`, as described in [[tips/inside_dot_ikiwiki]]?
 > 
 > --[[schmonz]]
+> 
+>> We've removed the `.ikiwiki/xapian` directory before performing a rebuild, including actually rebooting the host OS. The search appears to work for a while, but once the wiki has been live for a while (and subject to edits on the web interface), the issue reappears.
+>> 
+>> * OS: Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-47-generic x86_64)
+>> * xapian-tools/bionic-updates,bionic-security,now 1.4.5-1ubuntu0.1 amd64
+>> * xapian-omega/bionic,now 1.4.5-1 amd64
+>> 
+>> I've upgraded our installations of both Xapian components and will let you know if that fixes it.
+>> -- jsewell

Response to jsewell's bug report.
diff --git a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
index 3cb5d53f6..afbda3d5b 100644
--- a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
+++ b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
@@ -17,3 +17,13 @@ Error: Exception: Db block overwritten - are there multiple writers?
 The issue goes away when we disable the 'search' plugin.
 
 We're running ikiwiki version 3.20180228-1.
+
+> Every time?
+> I used to see an error (this one, I think) intermittently on OS X, on incremental rebuilds only.
+> Haven't seen it in a while, though.
+> Maybe something got fixed upstream.
+> What OS, and what version of Xapian and Omega?
+> (1.4.11 for me.)
+> Maybe worth blowing away `.ikiwiki/xapian/`, as described in [[tips/inside_dot_ikiwiki]]?
+> 
+> --[[schmonz]]

diff --git a/doc/forum/A_new_ikiwiki_logo.mdwn b/doc/forum/A_new_ikiwiki_logo.mdwn
new file mode 100644
index 000000000..93b4d86eb
--- /dev/null
+++ b/doc/forum/A_new_ikiwiki_logo.mdwn
@@ -0,0 +1,5 @@
+(Meant as light-hearted jest)
+
+![cartoon depiction of a stick figure dragging a camel](http://halestrom.net/darksleep/software/minisleep/wikibash_justiki.png)
+
+Thankyou for ikiwiki.  I've stolen some of its ideas over the years, and it's shown me there are better and different ways of doing things.

diff --git a/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
new file mode 100644
index 000000000..3cb5d53f6
--- /dev/null
+++ b/doc/bugs/__39__search__39___plugin_causes_Error:_Exception:_Db_block_overwritten_-_are_there_multiple_writers__63__.mdwn
@@ -0,0 +1,19 @@
+When the `search` plugin is enabled, with the options:
+
+```
+# search plugin
+# path to the omega cgi program
+omega_cgi: /usr/lib/cgi-bin/omega/omega
+# use google site search rather than internal xapian index?
+google_search: 0
+```
+
+Then we see the following error when editing a page from the web browser UI or running `ikiwiki --rebuild`:
+
+```
+Error: Exception: Db block overwritten - are there multiple writers?
+```
+
+The issue goes away when we disable the 'search' plugin.
+
+We're running ikiwiki version 3.20180228-1.

add gitbranch template, prompted by Integeri. Thanks
diff --git a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
index cf79123ef..688b3cb85 100644
--- a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
+++ b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
@@ -1,3 +1,5 @@
+[[!template  id=gitbranch branch=duckduckgo author="[[Jon]]"]]
+
 The search box on ikiwiki uses Google to look for documentation. Unfortunately to use the result page one have to accept Google terms of use, which may be annoying (since it is full of tracker and a real privacy nightmare).
 
 Would it be possible to change the default behavior to use another search engine more privacy friendly such as https://duckduckgo.com or https://qwant.com.
@@ -8,3 +10,4 @@ With both engines adding the "site:ikiwiki.info" string to the search terms limi
 > GitHub](https://github.com/jmtd/ikiwiki/tree/duckduckgo), specifically [branch
 > duckduckgo](https://github.com/jmtd/ikiwiki/tree/duckduckgo).
 > It's also live on <https://jmtd.net/>. — [[Jon]] [[!tag patch]]
+

Fix syntax.
diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index 92140b32a..07eb23d04 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -30,4 +30,4 @@ See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15
 >> Happy to squash all this into a single commit if you prefer.
 >> --[[intrigeri]]
 
-[[!tags patch]]
+[[!tag patch]]

Submit branch for review.
diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index 690f89d5d..92140b32a 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -1,4 +1,4 @@
-[[!template  id=gitbranch branch=feature/15355-po-plugin-disable-languages author="[[hefee]]"]]
+[[!template  id=gitbranch branch=feature/15355-po-plugin-disable-languages author="[[intrigeri]]"]]
 
 `po_disabled_languages` is used to disable languages on the website. It
 can be used to prepare new translations, while it will hide those from
@@ -20,3 +20,14 @@ See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15
 > to monkey-patch ikiwiki internals. If this plugin is important to you,
 > more test coverage would be very much appreciated.
 > --[[smcv]]
+
+>> I've put this branch into a shape that I now dare submitting:
+>> https://salsa.debian.org/tails-team/ikiwiki/tree/feature/15355-po-plugin-disable-languages.
+>> It adds a little bit test coverage in the form of integration tests
+>> for the proposed feature, that incidentally exercise the rest of the
+>> basic functionality of the PO plugin.
+>> Credits go to hefee for the initial work; I merely did a lot of polishing.
+>> Happy to squash all this into a single commit if you prefer.
+>> --[[intrigeri]]
+
+[[!tags patch]]

update my comment to reflect new commits on that branch
diff --git a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
index 47ec555c8..cf79123ef 100644
--- a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
+++ b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
@@ -5,7 +5,6 @@ Would it be possible to change the default behavior to use another search engine
 With both engines adding the "site:ikiwiki.info" string to the search terms limit results to these present on ikiwiki.info.
 
 > I've had a first stab at implementing this. It's in [my fork on
-> GitHub](https://github.com/jmtd/ikiwiki/tree/duckduckgo), specifically branch
-> "duckduckgo" commit
-> [8aeca188f96594f3fb314b75b7ef316f808b4271](https://github.com/jmtd/ikiwiki/commit/8aeca188f96594f3fb314b75b7ef316f808b4271).
+> GitHub](https://github.com/jmtd/ikiwiki/tree/duckduckgo), specifically [branch
+> duckduckgo](https://github.com/jmtd/ikiwiki/tree/duckduckgo).
 > It's also live on <https://jmtd.net/>. — [[Jon]] [[!tag patch]]

initial implementation (I was unable to use untrusted git push to add this comment)
diff --git a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
index 6adc051dc..47ec555c8 100644
--- a/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
+++ b/doc/todo/Change_the_ikiwiki.info_search_box_to_not_using_Google.mdwn
@@ -3,3 +3,9 @@ The search box on ikiwiki uses Google to look for documentation. Unfortunately t
 Would it be possible to change the default behavior to use another search engine more privacy friendly such as https://duckduckgo.com or https://qwant.com.
 
 With both engines adding the "site:ikiwiki.info" string to the search terms limit results to these present on ikiwiki.info.
+
+> I've had a first stab at implementing this. It's in [my fork on
+> GitHub](https://github.com/jmtd/ikiwiki/tree/duckduckgo), specifically branch
+> "duckduckgo" commit
+> [8aeca188f96594f3fb314b75b7ef316f808b4271](https://github.com/jmtd/ikiwiki/commit/8aeca188f96594f3fb314b75b7ef316f808b4271).
+> It's also live on <https://jmtd.net/>. — [[Jon]] [[!tag patch]]

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index a78068cc8..c3d1156c1 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -5,6 +5,8 @@ Why doesn't the following work?..
 
 Sure it is. 
 
+I hope baby.
+
 Nope my friend.
 
 List:

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 8dfa9ad02..a78068cc8 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -1,5 +1,6 @@
 ###Is this a heading? 
 
+Why doesn't the following work?..
 [[!color  foreground=white background=#ff0000 text="White text on red background"]]
 
 Sure it is. 

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 95e772e0c..8dfa9ad02 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -1,5 +1,7 @@
 ###Is this a heading? 
 
+[[!color  foreground=white background=#ff0000 text="White text on red background"]]
+
 Sure it is. 
 
 Nope my friend.

Announce 3.20190228 and 3.20170111.1
diff --git a/doc/news/version_3.20171001.mdwn b/doc/news/version_3.20171001.mdwn
deleted file mode 100644
index 3d51b8776..000000000
--- a/doc/news/version_3.20171001.mdwn
+++ /dev/null
@@ -1,23 +0,0 @@
-ikiwiki 3.20171001 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * [ [[Joey Hess|joey]] ]
-   * htmlscrubber: Add support for the video tag's `loop` and `muted`
-     attributes. Those were not in the original html5 spec, but have been
-     added in the whatwg html living standard and have wide browser support.
-   * emailauth, passwordauth: Avoid leaving `cgisess_*` files in the
-     system temp directory.
- * [ [[Simon McVittie|smcv]] ]
-   * core: Don't decode the result of `strftime` if it is already tagged as
-     UTF-8, as it might be since Perl &gt;= 5.21.1. (Closes: #[869240](http://bugs.debian.org/869240))
-   * img: Strip metadata from resized images when the deterministic config
-     option is set. Thanks, [[intrigeri]]
-   * receive: Avoid `asprintf()` in `IkiWiki::Receive`, to avoid implicit
-     declaration, potential misbehaviour on 64-bit platforms, and lack
-     of portability to non-GNU platforms
-   * t: Add a regression test for untrusted git push
-   * receive: Fix untrusted git push with git (&gt;= 2.11) by passing through
-     the necessary environment variables to make the quarantine area work
-   * debian: Declare compliance with Debian Policy 4.1.1
- * [ [[Amitai Schleier|schmonz]] ]
-   * l10n: Fix the build with po4a 0.52, by ensuring that `msgstr` ends
-     with a newline if and only if `msgid` does"""]]
diff --git a/doc/news/version_3.20190228.mdwn b/doc/news/version_3.20190228.mdwn
new file mode 100644
index 000000000..c26e8ad51
--- /dev/null
+++ b/doc/news/version_3.20190228.mdwn
@@ -0,0 +1,43 @@
+ikiwiki 3.20190228 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * aggregate: Use LWPx::ParanoidAgent if available.
+     Previously blogspam, openid and pinger used this module if available,
+     but aggregate did not. This prevents server-side request forgery or
+     local file disclosure, and mitigates denial of service when slow
+     "tarpit" URLs are accessed.
+     ([[!debcve CVE-2019-9187]])
+   * blogspam, openid, pinger: Use a HTTP proxy if configured, even if
+     LWPx::ParanoidAgent is installed.
+     Previously, only aggregate would obey proxy configuration. If a proxy
+     is used, the proxy (not ikiwiki) is responsible for preventing attacks
+     like CVE-2019-9187.
+   * aggregate, blogspam, openid, pinger: Do not access non-http, non-https
+     URLs.
+     Previously, these plugins would have allowed non-HTTP-based requests if
+     LWPx::ParanoidAgent was not installed. Preventing file URIs avoids local
+     file disclosure, and preventing other rarely-used URI schemes like
+     gopher mitigates request forgery attacks.
+   * aggregate, openid, pinger: Document LWPx::ParanoidAgent as strongly
+     recommended.
+     These plugins can request attacker-controlled URLs in some site
+     configurations.
+   * blogspam: Document LWPx::ParanoidAgent as desirable.
+     This plugin doesn't request attacker-controlled URLs, so it's
+     non-critical here.
+   * blogspam, openid, pinger: Consistently use cookiejar if configured.
+     Previously, these plugins would only obey this configuration if
+     LWPx::ParanoidAgent was not installed, but this appears to have been
+     unintended.
+   * po: Always filter .po files.
+     The po plugin in previous ikiwiki releases made the second and
+     subsequent filter call per (page, destpage) pair into a no-op,
+     apparently in an attempt to prevent *recursive* filtering (which as
+     far as we can tell can't happen anyway), with the undesired effect
+     of interpreting the raw .po file as page content (e.g. Markdown)
+     if it was inlined into the same page twice, which is apparently
+     something that tails.org does. Simplify this by deleting the code
+     that prevented repeated filtering. Thanks, intrigeri
+     (Closes: #[911356](http://bugs.debian.org/911356))"""]]
+
+ikiwiki 3.20170111.1 was also released, backporting the LWP-related
+changes from 3.20190228 to the branch used in Debian 9 'stretch'.

Add an anchor for /security/#cve-2019-9187
diff --git a/doc/security.mdwn b/doc/security.mdwn
index 378a2e4bc..fcc33fd48 100644
--- a/doc/security.mdwn
+++ b/doc/security.mdwn
@@ -612,7 +612,7 @@ in version 3.20141016.4.
 
 ([[!debcve CVE-2017-0356]]/OVE-20170111-0001)
 
-## Server-side request forgery via aggregate plugin
+## <span id="cve-2019-9187">Server-side request forgery via aggregate plugin</span>
 
 The ikiwiki maintainers discovered that the [[plugins/aggregate]] plugin
 did not use [[!cpan LWPx::ParanoidAgent]]. On sites where the

Recommend against cvsps3 (haven't tried it).
diff --git a/doc/rcs/cvs.mdwn b/doc/rcs/cvs.mdwn
index 2b191f257..a8f2f2754 100644
--- a/doc/rcs/cvs.mdwn
+++ b/doc/rcs/cvs.mdwn
@@ -5,7 +5,8 @@ Versions System]] with ikiwiki.
 
 ### Usage
 7. Install [[!cpan File::chdir]], [[!cpan File::ReadBackwards]],
-   [cvsps](http://www.cobite.com/cvsps/), and
+   [cvsps](http://www.cobite.com/cvsps/)
+   (note: probably not [cvsps3](http://www.catb.org/~esr/cvsps/)), and
    [cvsweb](http://www.freebsd.org/projects/cvsweb.html) or the like.
 7. Adjust CVS-related parameters in your setup file.
 

doc: Document security issues involving LWP::UserAgent
Recommend the LWPx::ParanoidAgent module where appropriate.
It is particularly important for openid, since unauthenticated users
can control which URLs that plugin will contact. Conversely, it is
non-critical for blogspam, since the URL to be contacted is under
the wiki administrator's control.
diff --git a/doc/plugins/aggregate.mdwn b/doc/plugins/aggregate.mdwn
index 75123d923..b1db828d1 100644
--- a/doc/plugins/aggregate.mdwn
+++ b/doc/plugins/aggregate.mdwn
@@ -11,6 +11,10 @@ The [[meta]] and [[tag]] plugins are also recommended to be used with this
 one. Either the [[htmltidy]] or [[htmlbalance]] plugin is suggested, since
 feeds can easily contain html problems, some of which these plugins can fix.
 
+Installing the [[!cpan LWPx::ParanoidAgent]] Perl module is strongly
+recommended. The [[!cpan LWP]] module can also be used, but is susceptible
+to server-side request forgery.
+
 ## triggering aggregation
 
 You will need to run ikiwiki periodically from a cron job, passing it the
diff --git a/doc/plugins/blogspam.mdwn b/doc/plugins/blogspam.mdwn
index 745fc48e2..0ebae7d84 100644
--- a/doc/plugins/blogspam.mdwn
+++ b/doc/plugins/blogspam.mdwn
@@ -11,6 +11,8 @@ To check for and moderate comments, log in to the wiki as an admin,
 go to your Preferences page, and click the "Comment Moderation" button.
 
 The plugin requires the [[!cpan JSON]] perl module.
+The [[!cpan LWPx::ParanoidAgent]] Perl module is recommended,
+although this plugin can also fall back to [[!cpan LWP]].
 
 You can control how content is tested via the `blogspam_options` setting.
 The list of options is [here](http://blogspam.net/api/2.0/testComment.html#options).
diff --git a/doc/plugins/openid.mdwn b/doc/plugins/openid.mdwn
index 4c8e0d381..a061cb43f 100644
--- a/doc/plugins/openid.mdwn
+++ b/doc/plugins/openid.mdwn
@@ -7,8 +7,11 @@ into the wiki.
 The plugin needs the [[!cpan Net::OpenID::Consumer]] perl module.
 Version 1.x is needed in order for OpenID v2 to work.
 
-The [[!cpan LWPx::ParanoidAgent]] perl module is used if available, for
-added security. Finally, the [[!cpan Crypt::SSLeay]] perl module is needed
+The [[!cpan LWPx::ParanoidAgent]] Perl module is strongly recommended.
+The [[!cpan LWP]] module can also be used, but is susceptible to
+server-side request forgery.
+
+The [[!cpan Crypt::SSLeay]] Perl module is needed
 to support users entering "https" OpenID urls.
 
 This plugin is enabled by default, but can be turned off if you want to
diff --git a/doc/plugins/pinger.mdwn b/doc/plugins/pinger.mdwn
index 00d83e1bb..f37979ac6 100644
--- a/doc/plugins/pinger.mdwn
+++ b/doc/plugins/pinger.mdwn
@@ -10,9 +10,11 @@ can be kept up-to-date.
 To configure what URLs to ping, use the [[ikiwiki/directive/ping]]
 [[ikiwiki/directive]].
 
-The [[!cpan LWP]] perl module is used for pinging. Or the [[!cpan
-LWPx::ParanoidAgent]] perl module is used if available, for added security.
-Finally, the [[!cpan Crypt::SSLeay]] perl module is needed to support pinging
+The [[!cpan LWPx::ParanoidAgent]] Perl module is strongly recommended.
+The [[!cpan LWP]] module can also be used, but is susceptible
+to server-side request forgery.
+
+The [[!cpan Crypt::SSLeay]] perl module is needed to support pinging
 "https" urls.
 
 By default the pinger will try to ping a site for 15 seconds before timing
diff --git a/doc/security.mdwn b/doc/security.mdwn
index e7770dd27..378a2e4bc 100644
--- a/doc/security.mdwn
+++ b/doc/security.mdwn
@@ -611,3 +611,52 @@ This was fixed in ikiwiki 3.20170111, with fixes backported to Debian 8
 in version 3.20141016.4.
 
 ([[!debcve CVE-2017-0356]]/OVE-20170111-0001)
+
+## Server-side request forgery via aggregate plugin
+
+The ikiwiki maintainers discovered that the [[plugins/aggregate]] plugin
+did not use [[!cpan LWPx::ParanoidAgent]]. On sites where the
+aggregate plugin is enabled, authorized wiki editors could tell ikiwiki
+to fetch potentially undesired URIs even if LWPx::ParanoidAgent was
+installed:
+
+* local files via `file:` URIs
+* other URI schemes that might be misused by attackers, such as `gopher:`
+* hosts that resolve to loopback IP addresses (127.x.x.x)
+* hosts that resolve to RFC 1918 IP addresses (192.168.x.x etc.)
+
+This could be used by an attacker to publish information that should not have
+been accessible, cause denial of service by requesting "tarpit" URIs that are
+slow to respond, or cause undesired side-effects if local web servers implement
+["unsafe"](https://tools.ietf.org/html/rfc7231#section-4.2.1) GET requests.
+([[!debcve CVE-2019-9187]])
+
+Additionally, if the LWPx::ParanoidAgent module was not installed, the
+[[plugins/blogspam]], [[plugins/openid]] and [[plugins/pinger]] plugins
+would fall back to [[!cpan LWP]], which is susceptible to similar attacks.
+This is unlikely to be a practical problem for the blogspam plugin because
+the URL it requests is under the control of the wiki administrator, but
+the openid plugin can request URLs controlled by unauthenticated remote
+users, and the pinger plugin can request URLs controlled by authorized
+wiki editors.
+
+This is addressed in ikiwiki 3.20190228 as follows, with the same fixes
+backported to Debian 9 in version 3.20170111.1:
+
+* URI schemes other than `http:` and `https:` are not accepted, preventing
+  access to `file:`, `gopher:`, etc.
+
+* If a proxy is [[configured in the ikiwiki setup file|tips/using_a_proxy]],
+  it is used for all outgoing `http:` and `https:` requests. In this case
+  the proxy is responsible for blocking any requests that are undesired,
+  including loopback or RFC 1918 addresses.
+
+* If a proxy is not configured, and LWPx::ParanoidAgent is installed,
+  it will be used. This prevents loopback and RFC 1918 IP addresses, and
+  sets a timeout to avoid denial of service via "tarpit" URIs.
+
+* Otherwise, the ordinary LWP user-agent will be used. This allows requests
+  to loopback and RFC 1918 IP addresses, and has less robust timeout
+  behaviour. We are not treating this as a vulnerability: if this
+  behaviour is not acceptable for your site, please make sure to install
+  LWPx::ParanoidAgent or disable the affected plugins.
diff --git a/doc/tips/using_a_proxy.mdwn b/doc/tips/using_a_proxy.mdwn
new file mode 100644
index 000000000..39df3c42a
--- /dev/null
+++ b/doc/tips/using_a_proxy.mdwn
@@ -0,0 +1,22 @@
+Some ikiwiki plugins make outgoing HTTP requests from the web server:
+
+* [[plugins/aggregate]] (to download Atom and RSS feeds)
+* [[plugins/blogspam]] (to check whether a comment or edit is spam)
+* [[plugins/openid]] (to authenticate users)
+* [[plugins/pinger]] (to ping other ikiwiki installations)
+
+If your ikiwiki installation cannot contact the Internet without going
+through a proxy, you can configure this in the [[setup file|setup]] by
+setting environment variables:
+
+    ENV:
+        http_proxy: "http://proxy.example.com:8080"
+        https_proxy: "http://proxy.example.com:8080"
+        # optional
+        no_proxy: ".example.com,www.example.org"
+
+Note that some plugins will use the configured proxy for all destinations,
+even if they are listed in `no_proxy`.
+
+To avoid server-side request forgery attacks, ensure that your proxy does
+not allow requests to addresses that are considered to be internal.

Announce v3.20190207
diff --git a/doc/news/version_3.20170622.mdwn b/doc/news/version_3.20170622.mdwn
deleted file mode 100644
index 33962b769..000000000
--- a/doc/news/version_3.20170622.mdwn
+++ /dev/null
@@ -1,31 +0,0 @@
-ikiwiki 3.20170622 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * `t/git-cgi.t`: Wait 1 second before doing a revert that should work.
-     This hopefully fixes a race condition in which the test failed
-     around 6% of the time. (Closes: #[862494](http://bugs.debian.org/862494))
-   * Guard against set-but-empty `REMOTE_USER` CGI variable on
-     misconfigured nginx servers, and in general treat sessions with
-     a set-but-empty name as if they were not signed in.
-   * When the CGI fails, print the error to stderr, not "Died"
-   * mdwn: Don't mangle <code>&lt;style&gt;</code> into <code>&lt;elyts&gt;</code> under some circumstances
-   * mdwn: Enable footnotes by default when using the default Discount
-     implementation. A new `mdwn_footnotes` option can be used to disable
-     footnotes in MultiMarkdown and Discount.
-   * mdwn: Don't enable alphabetically labelled ordered lists by
-     default when using the default Discount implementation. A new
-     `mdwn_alpha_list` option can be used to restore the old
-     interpretation.
-   * osm: Convert savestate hook into a changes hook. savestate is not
-     the right place to write wiki content, and in particular this
-     breaks websetup if osm's dependencies are not installed, even
-     if the osm plugin is not actually enabled.
-     (Closes: #[719913](http://bugs.debian.org/719913))
-   * toc: if the heading is of the form `<h1 id="...">`, use that for
-     the link in the table of contents (but continue to generate
-     `<a name="index42"></a>` in case someone was relying on it).
-     Thanks, [[Antoine Beaupré|anarcat]]
-   * color: Do not leak markup into contexts that take only the plain
-     text, such as toc
-   * meta: Document `\[[!meta name="foo" content="bar"]]`
-   * debian: Use preferred https URL for Format of `debian/copyright`
-   * debian: Declare compliance with Debian Policy 4.0.0"""]]
diff --git a/doc/news/version_3.20190207.mdwn b/doc/news/version_3.20190207.mdwn
new file mode 100644
index 000000000..8e5696ffd
--- /dev/null
+++ b/doc/news/version_3.20190207.mdwn
@@ -0,0 +1,34 @@
+ikiwiki 3.20190207 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * [ Amitai Schleier ]
+   * graph: Add an optional "file" parameter
+   * emailauth: When email can't be sent, show the error message
+   * osm: Don't raise errors if tags don't have attached icons
+   * cgi: Avoid C compiler warnings for waitpid() on NetBSD
+ * [ Simon McVittie ]
+   * Hide popup template content from documentation (Closes: #[898836](http://bugs.debian.org/898836))
+   * meta: Make [[!meta date]] show an error if dates are invalid or
+     Date::Parse can't be loaded
+   * inline: Cope with non-ASCII `rootpage` parameter.
+     Thanks, Feng Shu
+   * table: Cope with non-ASCII content in CSV format tables.
+     Thanks, Feng Shu
+   * trail: Allow unescaped punctuation in `pagenames` parameter
+   * comments: Hide "add comment" link from print stylesheet.
+     Thanks, Antoine Beaupré
+   * recentchangesdiff, relativedate, toggle:
+     Import JavaScript at the end of the page content, not the beginning,
+     so that the browser can render content as soon as possible.
+     Thanks, Antoine Beaupré
+   * debian: Allow Breezy as an alternative to bzr
+     Thanks, Jelmer Vernooij
+   * inline: Add basic test coverage for [[!inline rootpage]]
+   * table: Add basic test coverage
+   * po: Add enough test coverage to reproduce Debian #911356
+   * comments: Improve test coverage
+   * tests: Exercise Unicode more
+ * [ Joey Hess ]
+   * aggregate: Fix aggregation of posts without a title.
+     Thanks, Alexandre Oliva
+   * poll: Added postlink and posttrail options for better multi-page polls.
+   * Fix permalink to comments."""]]
\ No newline at end of file

review
diff --git a/doc/todo/pagespec_aliases.mdwn b/doc/todo/pagespec_aliases.mdwn
index 396a93c0f..bd64a5040 100644
--- a/doc/todo/pagespec_aliases.mdwn
+++ b/doc/todo/pagespec_aliases.mdwn
@@ -1,3 +1,4 @@
+[[!tag reviewed]]
 [[!template id=gitbranch branch=jon/pagespec_alias author="[[Jon]]"]]
 [[!tag patch wishlist]]I quite often find myself repeating a boiler-plate
 [[ikiwiki/pagespec]] chunk, e.g.
@@ -175,3 +176,38 @@ that I'd got it up to a merge-request state; I've dusted it off and done some
 clean up and testing, but it's working (albeit not via websetup). I've revamped
 the docs and rebased the branch. Can someone please consider merging ([[joey]]
 or [[smcv]]?) or otherwise feed back on this? Thanks! — [[Jon]] (2018-09-25)
+
+> To hide it from `websetup`, the `example` needs to be a hash reference
+> like `example => { images => "*.png or *.jpg or *.gif" }`, I think?
+> (Please try it on a websetup-enabled wiki, possibly by copying
+> `t/manual/git_revert` to `t/manual/websetup` and adapting it as required.)
+>
+> For a less magical variant, you could consider using `alias(images)`
+> instead of `images()` for the pagespec syntax that is enabled by the
+> example above. I'm not sure which way is better.
+>
+> If `safe_key` fails, you probably want to log a warning, or even fail
+> `checkconfig` with a fatal `error`?
+>
+> If `checkconfig` detects that the given pagespec function already
+> exists, for example `title` after loading the meta plugin, you probably
+> want to log a warning or fail? It seems you can detect this with
+> `defined ref *$subname{CODE}`.
+>
+> If you define a loop of mutually recursive aliases (or even an alias
+> that refers to itself), I think you'll get infinite recursion.
+> You can probably bypass that with a construct like:
+>
+>     my $entered;
+>     *{ $subname } = sub {
+>         return IkiWiki::ErrorReason->new("Alias $key is defined recursively") if $entered;
+>         $entered = 1;
+>         my $result = IkiWiki::pagespec_match($path, $value);
+>         $entered = 0;
+>         return $result;
+>     }
+>
+> (but don't take my word for it, a regression test would tell you whether
+> this works.)
+>
+> --[[smcv]]

comment
diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index e3a57e184..690f89d5d 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -7,3 +7,16 @@ normally, however, HTML creation will be disabled and no reference to
 these translations will be visible on the website.
 
 See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15355>
+
+> From the downstream bug report it appears this branch is not yet
+> considered ready (as of February 2019), so I haven't attempted to
+> review it.
+>
+> As with everything else in the `po` plugin: I would really want to see
+> some regression test coverage before merging this, because as far as I'm
+> aware none of the ikiwiki maintainers use the `po` plugin, so we are
+> not able to detect regressions other than via the automated tests. That
+> isn't a good situation to be in for a plugin that uses `IkiWiki::inject`
+> to monkey-patch ikiwiki internals. If this plugin is important to you,
+> more test coverage would be very much appreciated.
+> --[[smcv]]

tag as reviewed
diff --git a/doc/todo/support_multi-row_table_headers.mdwn b/doc/todo/support_multi-row_table_headers.mdwn
index 07198fd5c..11bb909e2 100644
--- a/doc/todo/support_multi-row_table_headers.mdwn
+++ b/doc/todo/support_multi-row_table_headers.mdwn
@@ -1,4 +1,6 @@
 [[!template id=gitbranch branch=jon/table_headerblock author="[[Jon]]"]]
+[[!tag reviewed]]
+
 It would be great if it were possible to support multi-row table headers in the [[plugins/table]] plugin, so you could do e.g.
 
         \[[!table header="""

respond
diff --git a/doc/todo/support_multi-row_table_headers.mdwn b/doc/todo/support_multi-row_table_headers.mdwn
index 1d418a41b..07198fd5c 100644
--- a/doc/todo/support_multi-row_table_headers.mdwn
+++ b/doc/todo/support_multi-row_table_headers.mdwn
@@ -96,3 +96,33 @@ and easily underneath.
 
 I'd appreciate your take on the above suggestions [[smcv]] before I roll my sleeves up.
 Thanks! — [[Jon]] (2018-09-24)
+
+> I continue to think that the `header` parameter shouldn't be sometimes a
+> description of which parts of the table are header, and sometimes the header
+> data itself; so if you want an inline header, it should indeed have a
+> distinct name.
+>
+> If you can think of a good name for the new parameter, and can document it
+> reasonably clearly, then I would be OK with having a separate parameter that
+> is the externally-provided header. I don't know what the right name for that
+> parameter would be: `headercontent` or `headerblock` is unwieldy but I can't
+> think of anything better.
+>
+> It would maybe simplify things to make it mutually exclusive with `header`,
+> but then you wouldn't be able to express things like "the first column of my
+> CSV is a header, the first row is just an ordinary row, and please add
+> this literal header row to the top".
+>
+> It might help to write the documentation and/or tests first, and then
+> implement it afterwards, when you have an "API" you're happy with.
+>
+> Corner cases:
+>
+> How would it work if you want to add a literal header column on the left
+> rather than adding a literal header row on the top? If you add both, what
+> happens at the top left corner?
+>
+> Is it necessary to be able to add header columns on the right (for RTL
+> languages?), or header rows (footer rows, I suppose) on the bottom?
+>
+> --[[smcv]]

Exclude reviewed patches from this list
diff --git a/doc/patch.mdwn b/doc/patch.mdwn
index 7d0f9847c..800748873 100644
--- a/doc/patch.mdwn
+++ b/doc/patch.mdwn
@@ -8,5 +8,8 @@ If your patch is non-trivial and might need several iterations to get
 right, or you'd just like to make it easy for [[Joey]] to apply it,
 please consider publishing a [[git]] [[branch|branches]].
 
+Patches that have been reviewed and need changes before they are merged
+are listed separately, on the [[reviewed]] list.
+
 [[!inline pages="(todo/* or bugs/*) and link(patch) and !link(bugs/done) and
-!link(todo/done) and !*/Discussion" rootpage="todo" archive="yes"]]
+!link(todo/done) and !link(reviewed) and !*/Discussion" rootpage="todo" archive="yes"]]

close
diff --git a/CHANGELOG b/CHANGELOG
index d8ac33d6d..1fa0a7c92 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,6 +17,10 @@ ikiwiki (3.20180312) UNRELEASED; urgency=medium
   * trail: Allow unescaped punctuation in `pagenames` parameter
   * comments: Hide "add comment" link from print stylesheet.
     Thanks, Antoine Beaupré
+  * recentchangesdiff, relativedate, toggle:
+    Import JavaScript at the end of the page content, not the beginning,
+    so that the browser can render content as soon as possible.
+    Thanks, Antoine Beaupré
   * debian: Allow Breezy as an alternative to bzr
     Thanks, Jelmer Vernooij
   * inline: Add basic test coverage for [[!inline rootpage]]
diff --git a/doc/todo/fix_javascript_load_ordering.mdwn b/doc/todo/fix_javascript_load_ordering.mdwn
index 6a4e15ff2..ef07a3ae9 100644
--- a/doc/todo/fix_javascript_load_ordering.mdwn
+++ b/doc/todo/fix_javascript_load_ordering.mdwn
@@ -18,3 +18,5 @@ Javascript on the *closing* `</body>` tag instead of the *opening* tag.
 
 It also improves the regex to tolerate spaces before the `</body>` tag,
 as some templates have (proper) indentation for the tag.
+
+> [[Applied|done]], thanks --[[smcv]]

Mark as applied
diff --git a/CHANGELOG b/CHANGELOG
index 60701dbb6..d8ac33d6d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -15,6 +15,8 @@ ikiwiki (3.20180312) UNRELEASED; urgency=medium
   * table: Cope with non-ASCII content in CSV format tables.
     Thanks, Feng Shu
   * trail: Allow unescaped punctuation in `pagenames` parameter
+  * comments: Hide "add comment" link from print stylesheet.
+    Thanks, Antoine Beaupré
   * debian: Allow Breezy as an alternative to bzr
     Thanks, Jelmer Vernooij
   * inline: Add basic test coverage for [[!inline rootpage]]
diff --git a/doc/todo/hide_add_comment_button_in_print.mdwn b/doc/todo/hide_add_comment_button_in_print.mdwn
index cbfaca888..7ed2645b3 100644
--- a/doc/todo/hide_add_comment_button_in_print.mdwn
+++ b/doc/todo/hide_add_comment_button_in_print.mdwn
@@ -45,4 +45,6 @@ Thanks! -- [[anarcat]]
 [remove]: https://gitlab.com/anarcat/ikiwiki-bootstrap-anarcat/commit/94521766f4206882c44764253452ec666d90d5c1
 [this patch]: https://gitlab.com/anarcat/ikiwiki/commit/33630b561623b8dca946916b733807e9b8c97849.patch
 
+> [[Applied|done]] --[[smcv]]
+
 [[!tag patch]]

old regexp would have failed for old comment page names
diff --git a/doc/bugs/permalink_not_set_for_comments.mdwn b/doc/bugs/permalink_not_set_for_comments.mdwn
index b6ef5cb31..d41da9c35 100644
--- a/doc/bugs/permalink_not_set_for_comments.mdwn
+++ b/doc/bugs/permalink_not_set_for_comments.mdwn
@@ -37,4 +37,7 @@ two underscores. I think that is the root of the bug. --[[Joey]]
 >> * *d* marks `\d+` (one or more digits)
 >> * *u* marks the literal `_`
 >>
+>> The old regexp would have failed for the older format
+>> `foo/comment_1._comment`, though.
+>>
 >> --[[smcv]]

git-cgi.t: Exercise an alphanumeric, but non-ASCII, root page
My previous attempt to reproduce this bug used a non-alphanumeric
ASCII character. This is not currently considered to be a valid
value for rootpage, although for a "do what I mean" approach, perhaps
we should accept it and pass it through titlepage() or linkpage().
Using Chinese characters (which are considered to match [[:alnum:]]
even though the Chinese script is not, strictly speaking, an alphabet),
as in the original bug report, reproduces the bug.
diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index 29879e9f0..d45325711 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -64,28 +64,21 @@ not deal with Chinese char, the below link can work
     
 ---
 
-> Please could you try to make a minimal example or test, perhaps in the [[sandbox]]
-> on this wiki or as a unit test in `t/git-cgi.t` in the ikiwiki source code, that
-> demonstrates this bug and would be fixed by your patch? I tried to write a test
-> for this, and I was able to make a test that uses a UTF-8 `rootpage` and fails;
-> but your patch doesn't seem to fix it, so you must be seeing something different.
-> I think there might be more than one bug here.
+> [Request for clarification removed]
 >
-> If you've found multiple bugs, a separate example or test for each one would be
-> easiest to deal with.
+> I've now been able to reproduce this bug, and confirmed that your patch
+> fixes it. [[Patch now applied|done]].
 >
-> In your original report, you said the `rootpage` was ASCII and started with `./`:
-> `./bugs`. Then you mentioned Chinese characters (any non-ASCII character like é or ¬
-> should behave the same as Chinese here) and attached a patch that alters how those
-> are handled, without affecting what would happen to a `rootpage` that starts
-> with `./`; so I'm confused about what the bug was, and what you are fixing?
+> (For other maintainers' reference: when testing Unicode bugs that
+> relate to page titles, using Unicode that is considered to be
+> punctuation, like ¬ or emoji, will probably not work; page titles
+> treat `[:alnum:]` and `^[:alnum:]` differently.)
 >
-> I've added tests to `t/git-cgi.t` which demonstrate
-> [a blog form for a `rootpage` named `writable/blog` working correctly](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=9c0694b14c0c8ed0dee4ff4ed57f689919707cd7;hp=a10d86bbaebee2d6a30b66b4366d3f0247264678)
-> (which passes), and
-> [a `rootpage` named `writable/¬blog` not working correctly](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=2bd72cd0e01b8bb433b368e11ff9db779a21ccef;hp=9c0694b14c0c8ed0dee4ff4ed57f689919707cd7)
-> (which fails, and is marked as *TODO*).
-> The patch above doesn't seem to make the second new test pass.
+> In future bug reports it would be useful if you could provide a minimal
+> example or test, perhaps on the [[sandbox]] on this wiki or as a unit
+> test in `t/*.t` in the ikiwiki source code, that demonstrates this bug
+> and would be fixed by the patch. If you've found multiple bugs, a
+> separate example or test for each one would be easiest to deal with.
 >
 > You can run all the tests with:
 >
diff --git a/t/git-cgi.t b/t/git-cgi.t
index 79cd62f61..3556bc038 100755
--- a/t/git-cgi.t
+++ b/t/git-cgi.t
@@ -1,7 +1,9 @@
 #!/usr/bin/perl
+use utf8;
 use warnings;
 use strict;
 
+use Encode;
 use Test::More;
 
 BEGIN {
@@ -133,7 +135,7 @@ sub run_cgi {
 		} keys(%envvars);
 	});
 
-	return $out;
+	return decode_utf8($out);
 }
 
 sub run_git {
@@ -169,6 +171,8 @@ sub test {
 		'[[!inline pages="writable/blog/*" actions=yes rootpage=writable/blog postform=yes show=0]]');
 	write_old_file('doc/writable/__172__blog.mdwn', 't/tmp/in',
 		'[[!inline pages="writable/¬blog/*" actions=yes rootpage="writable/¬blog" postform=yes show=0]]');
+	write_old_file('doc/writable/中文.mdwn', 't/tmp/in',
+		'[[!inline pages="writable/中文/*" actions=yes rootpage="writable/中文" postform=yes show=0]]');
 
 	unless ($installed) {
 		ok(! system(qw(cp -pRL doc/wikiicons t/tmp/in/doc/)));
@@ -332,24 +336,20 @@ sub test {
 	);
 	like($content, qr{<option selected="selected" value="writable/blog/hello">writable/blog/hello</option>});
 
-	# This attempts to reproduce the bug from
-	# doc/bugs/About___37__2F_problem, in which you can't make new posts
-	# to a blog with a non-ASCII rootpage.
-	$content = readfile('t/tmp/out/writable/__172__blog/index.html');
-	like($content, qr{<input type="hidden" name="from" value="writable/¬blog"});
-	TODO: {
-	local $TODO = 'doc/bugs/About___37__2F_problem';
+	# Regression test for a bug in which we couldn't use an
+	# alphanumeric, but non-ASCII, root page.
+	$content = readfile('t/tmp/out/writable/中文/index.html');
+	like($content, qr{<input type="hidden" name="from" value="writable/中文"});
 	$content = run_cgi(method => 'get',
 		params => {
 			do => 'blog',
-			from => 'writable/¬blog',
+			from => 'writable/中文',
 			subpage => '1',
 			title => 'hello',
 		},
 	);
-	like($content, qr{<option selected="selected" value="writable/¬blog/hello">writable/¬blog/hello</option>});
+	like($content, qr{<option selected="selected" value="writable/中文/hello">writable/中文/hello</option>});
 	unlike($content, qr{Error: bad page name});
-	}
 }
 
 test();

link to recently-added tests
diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index 15f64b883..29879e9f0 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -80,9 +80,11 @@ not deal with Chinese char, the below link can work
 > are handled, without affecting what would happen to a `rootpage` that starts
 > with `./`; so I'm confused about what the bug was, and what you are fixing?
 >
-> I've added tests to `t/git-cgi.t` which demonstrate a blog form for a `rootpage`
-> named `writable/blog` working correctly (which passes), and a `rootpage` named
-> `writable/¬blog` not working correctly (which fails, and is marked as *TODO*).
+> I've added tests to `t/git-cgi.t` which demonstrate
+> [a blog form for a `rootpage` named `writable/blog` working correctly](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=9c0694b14c0c8ed0dee4ff4ed57f689919707cd7;hp=a10d86bbaebee2d6a30b66b4366d3f0247264678)
+> (which passes), and
+> [a `rootpage` named `writable/¬blog` not working correctly](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=2bd72cd0e01b8bb433b368e11ff9db779a21ccef;hp=9c0694b14c0c8ed0dee4ff4ed57f689919707cd7)
+> (which fails, and is marked as *TODO*).
 > The patch above doesn't seem to make the second new test pass.
 >
 > You can run all the tests with:

I'm confused about what the bug is, and what's being fixed. Can you give a complete test or example?
diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index f855485d2..15f64b883 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -62,6 +62,39 @@ not deal with Chinese char, the below link can work
     -- 
     2.19.0
     
+---
 
-
-
+> Please could you try to make a minimal example or test, perhaps in the [[sandbox]]
+> on this wiki or as a unit test in `t/git-cgi.t` in the ikiwiki source code, that
+> demonstrates this bug and would be fixed by your patch? I tried to write a test
+> for this, and I was able to make a test that uses a UTF-8 `rootpage` and fails;
+> but your patch doesn't seem to fix it, so you must be seeing something different.
+> I think there might be more than one bug here.
+>
+> If you've found multiple bugs, a separate example or test for each one would be
+> easiest to deal with.
+>
+> In your original report, you said the `rootpage` was ASCII and started with `./`:
+> `./bugs`. Then you mentioned Chinese characters (any non-ASCII character like é or ¬
+> should behave the same as Chinese here) and attached a patch that alters how those
+> are handled, without affecting what would happen to a `rootpage` that starts
+> with `./`; so I'm confused about what the bug was, and what you are fixing?
+>
+> I've added tests to `t/git-cgi.t` which demonstrate a blog form for a `rootpage`
+> named `writable/blog` working correctly (which passes), and a `rootpage` named
+> `writable/¬blog` not working correctly (which fails, and is marked as *TODO*).
+> The patch above doesn't seem to make the second new test pass.
+>
+> You can run all the tests with:
+>
+>     ./Makefile.PL
+>     make
+>     make test
+>
+> or a single test with something like:
+>
+>     ./Makefile.PL
+>     make
+>     PERL5LIB=. ./t/git-cgi.t
+>
+> --[[smcv]]

close bug
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index dc94db596..8e7aa6fc3 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -80,7 +80,9 @@ The below patch seem to deal with this problem:
      			debug(sprintf(gettext('parse fail at line %d: %s'), 
     -- 
     2.19.0
-    
+
+> Thanks, I've applied that patch and added test coverage. [[done]] --[[smcv]]
+
 ----
 
 I can confirm that the above patch fixes the issue for me. Thanks! I'm not an ikiwiki committer, but I would encourage them to consider the above. Whilst I'm at it, I would be *really* grateful for some input on [[todo/support_multi-row_table_headers]] which relates to the same plugin. [[Jon]]

respond
diff --git a/doc/bugs/permalink_not_set_for_comments.mdwn b/doc/bugs/permalink_not_set_for_comments.mdwn
index 2e74a2622..b6ef5cb31 100644
--- a/doc/bugs/permalink_not_set_for_comments.mdwn
+++ b/doc/bugs/permalink_not_set_for_comments.mdwn
@@ -23,3 +23,18 @@ two underscores. I think that is the root of the bug. --[[Joey]]
 > preprocessed again, not immediately. That's ok for notifyemail,
 > but other uses of permalink might need a wiki rebuild to get the bug fix.
 > --[[Joey]]
+>
+>> I'm not sure that I see how the regexp was wrong? It's looking for,
+>> for example,
+>>
+>>     foo/comment_1_eaab671848ee6129f6fe9399474eeac0._comment
+>>        sccccccccdu
+>>
+>> where
+>>
+>> * *s* marks the literal `/`
+>> * *cccc* marks `comments_pagename`
+>> * *d* marks `\d+` (one or more digits)
+>> * *u* marks the literal `_`
+>>
+>> --[[smcv]]

Fix syntax and escaping
diff --git a/doc/plugins/map.mdwn b/doc/plugins/map.mdwn
index c257d365f..5b009f424 100644
--- a/doc/plugins/map.mdwn
+++ b/doc/plugins/map.mdwn
@@ -15,5 +15,5 @@ Example:
 
 It's also possible to search for specific tags or links:
 
-    [[!map pages="todo/* and !todo/done and !link(todo/done)]]
+    \[[!map pages="todo/* and !todo/done and !link(todo/done)"]]
 """]]

Reset example
This reverts commit 0b53772b99248d2868fac688cdaa227ad61ac08e
diff --git a/doc/examples/blog/posts/hthn.mdwn b/doc/examples/blog/posts/hthn.mdwn
deleted file mode 100644
index 8fb80c2fa..000000000
--- a/doc/examples/blog/posts/hthn.mdwn
+++ /dev/null
@@ -1 +0,0 @@
-thonk

inline is another option of course
diff --git a/doc/tags.mdwn b/doc/tags.mdwn
index f16aa619b..c8f31423d 100644
--- a/doc/tags.mdwn
+++ b/doc/tags.mdwn
@@ -22,5 +22,5 @@ particular set of tags. Or just look at the [[BackLinks]] to a tag page to
 see all the pages that are tagged with it. [[Plugins]] can be written to do
 anything else with tags that you might desire.
 
-Once you have tags, you can use the [[plugins/pagestats]] or [[plugins/map]] plugins to
+Once you have tags, you can use the [[plugins/pagestats]], [[plugins/inline]] or [[plugins/map]] plugins to
 generate tag clouds and lists.

show tagging example
diff --git a/doc/plugins/map.mdwn b/doc/plugins/map.mdwn
index b164d5ca8..c257d365f 100644
--- a/doc/plugins/map.mdwn
+++ b/doc/plugins/map.mdwn
@@ -5,7 +5,15 @@ This plugin provides the [[ikiwiki/directive/map]] [[ikiwiki/directive]],
 which generates a hierarchical page map for the wiki.
 
 [[!if test="enabled(map)" then="""
-Here's an example map, for the plugins section of this wiki:
+This will create an a map, for the plugins section of this wiki:
+
+    \[[!map pages="(plugins or plugins/*) and !*/*/*"]]
+
+Example:
 
 [[!map pages="(plugins or plugins/*) and !*/*/*"]]
+
+It's also possible to search for specific tags or links:
+
+    [[!map pages="todo/* and !todo/done and !link(todo/done)]]
 """]]

link to the map plugin, which i find more useful to show tagged pages
diff --git a/doc/tags.mdwn b/doc/tags.mdwn
index 71d925b24..f16aa619b 100644
--- a/doc/tags.mdwn
+++ b/doc/tags.mdwn
@@ -22,5 +22,5 @@ particular set of tags. Or just look at the [[BackLinks]] to a tag page to
 see all the pages that are tagged with it. [[Plugins]] can be written to do
 anything else with tags that you might desire.
 
-Once you have tags, you can use the [[plugins/pagestats]] plugin to
-generate tag clouds.
+Once you have tags, you can use the [[plugins/pagestats]] or [[plugins/map]] plugins to
+generate tag clouds and lists.

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 681ec2ee1..95e772e0c 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -22,7 +22,7 @@ This is the [[SandBox]], a page anyone can edit to try out ikiwiki
 vvvv
 CamelCase ?
 
-[[!tag sandbox]]
+[[!tag sandbox tag2]]
 
 What about [[this page]], nono better [[that page]]?
 

followup
diff --git a/doc/bugs/permalink_not_set_for_comments.mdwn b/doc/bugs/permalink_not_set_for_comments.mdwn
index 9ca8200b5..2e74a2622 100644
--- a/doc/bugs/permalink_not_set_for_comments.mdwn
+++ b/doc/bugs/permalink_not_set_for_comments.mdwn
@@ -14,3 +14,12 @@ permalink:
 
 `comments_pagename` is `comment_` so the above code needs a comment page to contain
 two underscores. I think that is the root of the bug. --[[Joey]]
+
+> Removed the trailing underscore in the regexp, so it should be fixed,
+> though I have not tested the fix. Leaving this bug open until it's
+> confirmed fixed. (I deployed it to branchable.)
+> 
+> This will only fix the stored permalink metadata for a comment when its get
+> preprocessed again, not immediately. That's ok for notifyemail,
+> but other uses of permalink might need a wiki rebuild to get the bug fix.
+> --[[Joey]]

bug report
diff --git a/doc/bugs/permalink_not_set_for_comments.mdwn b/doc/bugs/permalink_not_set_for_comments.mdwn
new file mode 100644
index 000000000..9ca8200b5
--- /dev/null
+++ b/doc/bugs/permalink_not_set_for_comments.mdwn
@@ -0,0 +1,16 @@
+Changes to comments result in notifyemail sending emails with broken urls like 
+"http://whatever/foo/comment_1_10a49d69282155c5c3e66dc58f64f956/"
+
+notifyemail uses meta permalink if set, so it must not be set for comment
+pages.
+
+In the comments plugin, there's this code, which is supposed to set
+permalink:
+
+        if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) {
+                $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page})).
+                        "#".page_to_id($params{page});
+        }
+
+`comments_pagename` is `comment_` so the above code needs a comment page to contain
+two underscores. I think that is the root of the bug. --[[Joey]]

diff --git a/doc/examples/blog/posts/hthn.mdwn b/doc/examples/blog/posts/hthn.mdwn
new file mode 100644
index 000000000..8fb80c2fa
--- /dev/null
+++ b/doc/examples/blog/posts/hthn.mdwn
@@ -0,0 +1 @@
+thonk

User link and description changed
diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index 3a810a731..d14e4898c 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -194,7 +194,7 @@ Personal sites and blogs
 * [Salient Dream](http://www.salientdream.com/) - All Things Strange. 
 * [Anton Berezin's blog](http://blog.tobez.org/)
 * [Waldgarten]( http://waldgarten.greenonion.org/ ) News and documentation of a permaculture inspired neighbourhood-garden located in Hamburg, Germany.
-* [Frohdo](https://frohdo.de) - With raw food against back pain and other diseases
+* [Waldfarm](https://waldfarm.de) - Natural Life by Natural Farming, Natürliches Leben mit natürlicher Landwirtschaft
 * [[OscarMorante]]'s [personal site](http://oscar.morante.eu).
 * [Puckspage]( http://www.puckspage.org/ ) Political and personal blog in German. The name comes from the elf out of midsummer nights dream.  
 * [[LucaCapello]]'s [homepage](http://luca.pca.it)

markdown backquotes
diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 5a2a10987..681ec2ee1 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -39,9 +39,12 @@ pre formated text?
 ~~~
 
 ```
-testing markdown
+testing markdown  
+    with leading    and enclosed spaces
 ```
 
+markdown `inline` single-backquotes?
+
 # one
 
 - foo

diff --git a/doc/users/alexeidz.mdwn b/doc/users/alexeidz.mdwn
index f6ada1795..1fa4c251a 100644
--- a/doc/users/alexeidz.mdwn
+++ b/doc/users/alexeidz.mdwn
@@ -1,3 +1,4 @@
 PROBLEM_1
 PROBLEM_2
 PROBLEM_3
+PROBLEM_4

diff --git a/doc/users/alexeidz.mdwn b/doc/users/alexeidz.mdwn
new file mode 100644
index 000000000..f6ada1795
--- /dev/null
+++ b/doc/users/alexeidz.mdwn
@@ -0,0 +1,3 @@
+PROBLEM_1
+PROBLEM_2
+PROBLEM_3

po: Always filter .po files
The input to filter hooks is meant to be the content of a source file
on disk. If we only filter once per (page, destpage) pair, and a page
is inlined into the same destpage more than once, then the second
occurrence will render as the result of htmlizing .po source as if
it was Markdown (or whatever the type of the corresponding master page
is), which is never going to end well.
The alreadyfiltered mechanism was added in commit 1e874b3f to avoid
preprocessing loops, but I'm not sure where it could lead to a loop:
filter hooks are only called from IkiWiki::filter, which is only called
on page content from disk or on proposed content being previewed.
According to <https://bugs.debian.org/911356#41>, deleting the
alreadyfiltered mechanism resolves the problem, as well as simplifying
the code.
Closes: #911356
Tested-by: intrigeri
diff --git a/CHANGELOG b/CHANGELOG
index ad37e72e8..5237ee7b8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,18 @@
+ikiwiki (3.20190208) UNRELEASED; urgency=medium
+
+  * po: Always filter .po files.
+    The po plugin in previous ikiwiki releases made the second and
+    subsequent filter call per (page, destpage) pair into a no-op,
+    apparently in an attempt to prevent *recursive* filtering (which as
+    far as we can tell can't happen anyway), with the undesired effect
+    of interpreting the raw .po file as page content (e.g. Markdown)
+    if it was inlined into the same page twice, which is apparently
+    something that tails.org does. Simplify this by deleting the code
+    that prevented repeated filtering. Thanks, intrigeri
+    (Closes: #911356)
+
+ -- Simon McVittie <smcv@debian.org>  Sun, 24 Feb 2019 17:11:39 +0000
+
 ikiwiki (3.20190207) upstream; urgency=medium
 
   [ Amitai Schleier ]
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 418e8e58a..13b98b739 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -51,7 +51,6 @@ sub import {
 	hook(type => "checkcontent", id => "po", call => \&checkcontent);
 	hook(type => "canremove", id => "po", call => \&canremove);
 	hook(type => "canrename", id => "po", call => \&canrename);
-	hook(type => "editcontent", id => "po", call => \&editcontent);
 	hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
 	hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
@@ -303,9 +302,8 @@ sub filter (@) {
 	my $page = $params{page};
 	my $destpage = $params{destpage};
 	my $content = $params{content};
-	if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
+	if (istranslation($page)) {
 		$content = po_to_markup($page, $content);
-		setalreadyfiltered($page, $destpage);
 	}
 	return $content;
 }
@@ -520,15 +518,6 @@ sub canrename (@) {
 	return undef;
 }
 
-# As we're previewing or saving a page, the content may have
-# changed, so tell the next filter() invocation it must not be lazy.
-sub editcontent () {
-	my %params=@_;
-
-	unsetalreadyfiltered($params{page}, $params{page});
-	return $params{content};
-}
-
 sub formbuilder_setup (@) {
 	my %params=@_;
 	my $form=$params{form};
@@ -737,42 +726,6 @@ sub myisselflink ($$) {
 }
 
 # ,----
-# | Blackboxes for private data
-# `----
-
-{
-	my %filtered;
-
-	sub alreadyfiltered($$) {
-		my $page=shift;
-		my $destpage=shift;
-
-		return exists $filtered{$page}{$destpage}
-			 && $filtered{$page}{$destpage} eq 1;
-	}
-
-	sub setalreadyfiltered($$) {
-		my $page=shift;
-		my $destpage=shift;
-
-		$filtered{$page}{$destpage}=1;
-	}
-
-	sub unsetalreadyfiltered($$) {
-		my $page=shift;
-		my $destpage=shift;
-
-		if (exists $filtered{$page}{$destpage}) {
-			delete $filtered{$page}{$destpage};
-		}
-	}
-
-	sub resetalreadyfiltered() {
-		undef %filtered;
-	}
-}
-
-# ,----
 # | Helper functions
 # `----
 
@@ -1146,7 +1099,6 @@ sub commit_and_refresh ($) {
 		IkiWiki::rcs_update();
 	}
 	# Reinitialize module's private variables.
-	resetalreadyfiltered();
 	resettranslationscache();
 	flushmemoizecache();
 	# Trigger a wiki refresh.
diff --git a/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
index a926135b0..26d3717b9 100644
--- a/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
+++ b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
@@ -177,3 +177,6 @@ be resolved by renaming.
 
 If it's valid to remove the `alreadyfiltered` mechanism, my
 `wip/po-filter-every-time` branch does that. Please test?
+
+> intrigeri says [this change works as intended on tails.org](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=911356#41),
+> so I've applied it. [[done]] --[[smcv]]
diff --git a/t/po.t b/t/po.t
index 82f9e2078..ccb508bef 100755
--- a/t/po.t
+++ b/t/po.t
@@ -447,25 +447,10 @@ like($output{'debian911356.fr'}, qr{
 	\s*
 	<p>Entre\sles\sinlines</p>
 	\s*
-	.*	# TODO: This paragraph gets mangled (Debian #911356)
-	\s*
-	<p>Après\sles\sinlines</p>
-}sx);
-
-TODO: {
-local $TODO = "Debian bug #911356";
-like($output{'debian911356.fr'}, qr{
-	<p>Avant\sla\spremière\sinline</p>
-	\s*
-	<p>Contenu\sfrançais</p>
-	\s*
-	<p>Entre\sles\sinlines</p>
-	\s*
 	<p>Contenu\sfrançais</p>
 	\s*
 	<p>Après\sles\sinlines</p>
 }sx);
-};
 
 # Variation of Debian #911356 without using raw inlines.
 like($output{debian911356ish}, qr{
@@ -511,28 +496,6 @@ like($output{'debian911356ish.fr'}, qr{
 	\s*
 	<p>Entre\sles\sinlines</p>
 	\s*
-	.*	# TODO: This paragraph gets mangled (Debian #911356)
-	\s*
-	<p>Après\sles\sinlines</p>
-}sx);
-
-TODO: {
-local $TODO = "Debian bug #911356";
-like($output{'debian911356ish.fr'}, qr{
-	<p>Avant\sla\spremière\sinline</p>
-	\s*
-	<!--feedlinks-->
-	\s*
-	<div\sclass="inlinecontent">
-	\s*
-	<h6>debian911356-inlined\.fr</h6>
-	\s*
-	<p>Contenu\sfrançais</p>
-	\s*
-	</div><!--inlinecontent-->
-	\s*
-	<p>Entre\sles\sinlines</p>
-	\s*
 	<!--feedlinks-->
 	\s*
 	<div\sclass="inlinecontent">
@@ -545,6 +508,5 @@ like($output{'debian911356ish.fr'}, qr{
 	\s*
 	<p>Après\sles\sinlines</p>
 }sx);
-};
 
 done_testing;

remove the "add comment" button from printed media
diff --git a/doc/style.css b/doc/style.css
index 8c16e7a2f..9f8289969 100644
--- a/doc/style.css
+++ b/doc/style.css
@@ -286,6 +286,7 @@ div.progress-done {
 	#searchform { display: none; }
 	.blogform, #blogform { display: none; }
 	#backlinks { display: none; }
+	.addcomment { display: none; }
 }
 
 /* infobox template */

Remove unreachable git repositories
diff --git a/doc/git.mdwn b/doc/git.mdwn
index 0f959a2c3..1b21a93ac 100644
--- a/doc/git.mdwn
+++ b/doc/git.mdwn
@@ -33,12 +33,8 @@ think about merging them. This is recommended. :-)
 * [[gmcmanus]] `git://github.com/gmcmanus/ikiwiki.git`
 * [[jelmer]] `git://git.samba.org/jelmer/ikiwiki.git`
 * [[jon]] `git://github.com/jmtd/ikiwiki.git`
-* [[ikipostal|DavidBremner]] `git://pivot.cs.unb.ca/git/ikipostal.git`
-* [[ikimailbox|DavidBremner]] `git://pivot.cs.unb.ca/git/ikimailbox.git`
-* [[ikiplugins|DavidBremner]] `git://pivot.cs.unb.ca/git/ikiplugins.git`
 * [[jonas|JonasSmedegaard]] `git://source.jones.dk/ikiwiki-upstream`
 * [[arpitjain]] `git://github.com/arpitjain11/ikiwiki.git`
-* [[chrysn]] `git://prometheus.amsuess.com/ikiwiki`
 * [[schmonz]] `git://github.com/schmonz/ikiwiki.git`
 * [[KathrynAndersen]] `git://github.com/rubykat/ikiplugins.git`
 * [[ktf]] `git://github.com/ktf/ikiwiki.git`
@@ -48,18 +44,14 @@ think about merging them. This is recommended. :-)
 * [[privat]] `git://github.com/privat/ikiwiki.git`
 * [[blipvert]] `git://github.com/blipvert/ikiwiki.git`
 * [[wtk]] `git://github.com/wking/ikiwiki.git`
-* [[sunny256]] `git://github.com/sunny256/ikiwiki.git`
 * [[levitte]] `git://github.com/levitte/ikiwiki.git`
-* jo `git://git.debian.org/users/jo-guest/ikiwiki.git`
-  ([browse](http://git.debian.org/?p=users/jo-guest/ikiwiki.git;a=summary))
-* [[sajolida]] `http://un.poivron.org/~sajolida/ikiwiki.git/`
+* [[sajolida]] `https://un.poivron.org/~sajolida/ikiwiki.git/`
 * [[yds]] `git://github.com/yds/ikiwiki.git`
 * [[pelle]] `git://github.com/hemmop/ikiwiki.git`
 * [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git`
 * [[ttw]] `git://github.com/ttw/ikiwiki.git`
 * [[anarcat]] `https://gitlab.com/anarcat/ikiwiki.git`
 * anderbubble `git://civilfritz.net/ikiwiki.git`
-* frioux `git://github.com/frioux/ikiwiki`
 * llipavsky `git://github.com/llipavsky/ikiwiki`
 * [[mhameed]] `git://github.com/mhameed/ikiwiki.git`
 * [[spalax]] `git://github.com/paternal/ikiwiki.git` ([[browse|https://github.com/paternal/ikiwiki]])