Recent changes to this wiki:

Move summain manpage to code.liw.fi
diff --git a/summain.mdwn b/summain.mdwn
index 3705407..63aab2a 100644
--- a/summain.mdwn
+++ b/summain.mdwn
@@ -10,7 +10,7 @@ See also:
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/tree/NEWS)
-* [[manpage|summain.1.txt]]
+* [manpage](http://code.liw.fi/summain/summain.1.txt)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/>
 * Git clone: `git://git.liw.fi/summain/`
 * [[Bugs]]
diff --git a/summain/summain.1.txt b/summain/summain.1.txt
deleted file mode 100644
index 7ff82e7..0000000
--- a/summain/summain.1.txt
+++ /dev/null
@@ -1,149 +0,0 @@
-SUMMAIN(1)                                                          SUMMAIN(1)
-
-
-
-NAME
-       summain - gather file checksums and metadata
-
-SYNOPSIS
-       summain     [-c=CHECKSUM]     [--checksum=CHECKSUM]     [--config=FILE]
-       [--dump-config]  [--dump-memory-profile=METHOD]  [--dump-setting-names]
-       [--exclude=FIELD]     [--generate-manpage=TEMPLATE]    [-h]    [--help]
-       [--help-all]    [--list-config-files]    [--log=FILE]    [--log-keep=N]
-       [--log-level=LEVEL]     [--log-max=SIZE]     [--log-mode=MODE]     [-m]
-       [--mangle-paths]                       [--memory-dump-interval=SECONDS]
-       [--no-default-configs]     [--no-mangle-paths]    [--no-relative-paths]
-       [--output=FILE] [-f=OUTPUT-FORMAT] [--output-format=OUTPUT-FORMAT] [-r]
-       [--relative-paths] [--secret=SECRET] [--version] [FILE]...
-
-DESCRIPTION
-       summain gathers metadata about files, and computes their checksums.  It
-       is intended to create a manifest of the files.   The  manifest  can  be
-       used to see if something has changed: a new manifest can be created and
-       compared with the old one with diff(1).
-
-       The manifest looks like this:
-
-              Name: foo/bar/foobar
-              SHA1: 1234123413241324
-              Mtime: 2010-01-01 02:08:00.127651 +0000
-              Mode: 1755
-
-       The filename is URL-encoded to ensure it is purely ASCII.  Mode  is  in
-       octal.
-
-       Only  some  inode  fields are included.  It does not make sense to com-
-       pare, for example, the access time, so that is not included.
-
-       Time stamps are given using microsecond precision, for the  benefit  of
-       those  filesystems  that  can  support  precise timestamps.  (Should be
-       nanosecond,  but  Python  return  timestamps  as  floating  point,  and
-       nanosecond precision is too much for the floating point type.)
-
-       The  inode  and  device  number fields will not be reported accurately.
-       Instead, they are normalized so that manifests  are  useful  after  the
-       files have been restored from backups.  Accurate numbers would mean ev-
-       erything seems to have changed.  Normalized means that there will be no
-       differences.   The  numbers  are  reported  so  that  hard links can be
-       checked.
-
-       Directories named on the command line will be recursed automatically.
-
-OPTIONS
-       -c, --checksum=CHECKSUM
-              which checksums to compute: MD5, SHA1, SHA224,  SHA256,  SHA384,
-              SHA512; use once per checksum type (default is SHA1)
-
-       --exclude=FIELD
-              do not output or compute FIELD
-
-       --generate-manpage=TEMPLATE
-              SUPPRESSHELP
-
-       -h, --help
-              show this help message and exit
-
-       -m, --mangle-paths
-              mangle (obfuscate) paths
-
-       --no-mangle-paths
-
-
-       --no-relative-paths
-
-
-       --output=FILE
-              write output to FILE, instead of standard output
-
-       -f, --output-format=OUTPUT-FORMAT
-              choose output format (rfc822, csv, json)
-
-       -r, --relative-paths
-              print paths relative to arguments
-
-       --secret=SECRET
-              use SECRET to make mangled paths unguessable
-
-       --version
-              show program's version number and exit
-
-   Configuration files and settings
-       --config=FILE
-              add FILE to config files
-
-       --dump-config
-              write out the entire current configuration
-
-       --dump-setting-names
-              SUPPRESSHELP
-
-       --help-all
-              show all options
-
-       --list-config-files
-              SUPPRESSHELP
-
-       --no-default-configs
-              clear list of configuration files to read
-
-   Logging
-       --log=FILE
-              write  log entries to FILE (default is to not write log files at
-              all); use "syslog" to log to system log, or  "none"  to  disable
-              logging
-
-       --log-keep=N
-              keep last N logs (10)
-
-       --log-level=LEVEL
-              log  at LEVEL, one of debug, info, warning, error, critical, fa-
-              tal (default: debug)
-
-       --log-max=SIZE
-              rotate logs larger than SIZE, zero for never (default: 0)
-
-       --log-mode=MODE
-              set permissions of new log files to MODE (octal; default 0600)
-
-   Peformance
-       --dump-memory-profile=METHOD
-              make memory profiling dumps using METHOD, which is one of: none,
-              simple, meliae, or heapy (default: simple)
-
-       --memory-dump-interval=SECONDS
-              make memory profiling dumps at least SECONDS apart
-
-EXAMPLE
-       To  make  a complete manifest of a directory tree so that you can later
-       verify that nothing at all has changed:
-
-              summain foo > foo.summain
-
-       To verify that nothing has changed:
-
-              summain foo > foo.summain-2
-              diff -u foo.summain foo.summain-2
-
-
-
-                                                                    SUMMAIN(1)

Add links to ick manuals
diff --git a/ick.mdwn b/ick.mdwn
index c6eee9f..ed06849 100644
--- a/ick.mdwn
+++ b/ick.mdwn
@@ -6,5 +6,8 @@ needs. You probably want something else instead.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/tree/NEWS)
+* manual:
+  [HTML](http://code.liw.fi/ick/ick-manual.ci.html),
+  [PDF](http://code.liw.fi/ick/ick-manual.ci.pdf)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/>
 * Git clone: `git://git.liw.fi/ick/`

Move genbackupdata manpage to code.liw.fi
diff --git a/genbackupdata.mdwn b/genbackupdata.mdwn
index 9220fe8..d8fdb4c 100644
--- a/genbackupdata.mdwn
+++ b/genbackupdata.mdwn
@@ -5,7 +5,7 @@ genbackupdata is a program to generate test data for backup software testing.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/tree/NEWS)
-* [[manpage|genbackupdata.1.txt]]
+* [manpage](http://code.liw.fi/genbackupdata/genbackupdata.1.txt)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/>
 * Git clone: `git://git.liw.fi/genbackupdata/`
 * [[Bugs]]
diff --git a/genbackupdata/genbackupdata.1.txt b/genbackupdata/genbackupdata.1.txt
deleted file mode 100644
index 3ef0ac9..0000000
--- a/genbackupdata/genbackupdata.1.txt
+++ /dev/null
@@ -1,146 +0,0 @@
-GENBACKUPDATA(1)	    General Commands Manual	      GENBACKUPDATA(1)
-
-
-
-NAME
-       genbackupdata - generate backup test data
-
-SYNOPSIS
-       genbackupdata   [--chunk-size=SIZE]   [--config=FILE]   [--dump-config]
-       [--dump-setting-names]  [--generate-manpage=TEMPLATE]   [-h]   [--help]
-       [--help-all]  [--list-config-files]  [--version] [--no-default-configs]
-       [-cSIZE] [--create=SIZE] [--depth=DEPTH] [--dump-memory-profile=METHOD]
-       [--file-size=SIZE]   [--log=FILE]   [--log-keep=N]  [--log-level=LEVEL]
-       [--log-max=SIZE]       [--log-mode=MODE]        [--max-files=MAX-FILES]
-       [--memory-dump-interval=SECONDS] [--output=FILE] [--quiet] [--no-quiet]
-       [--seed=SEED] [FILE]...
-
-DESCRIPTION
-       genbackupdata generates test data sets for performance testing of back‐
-       up  software.  It creates a directory tree filled with files of differ‐
-       ent sizes.  The total size and the distribution of sizes between  small
-       and  big are configurable.  The program can also modify an existing di‐
-       rectory tree by creating new files, and deleting, renaming, or  modify‐
-       ing existing files.  This can be used to generate test data for succes‐
-       sive generations of backups.
-
-       The program is deterministic: with a given set  of  parameters  (and  a
-       given  pre-existing directory tree), it always creates the same output.
-       This way, it is possible to reproduce  backup  tests  exactly,  without
-       having to distribute the potentially very large test sets.
-
-       The data set consists of plain files and directories.  Files are either
-       small text files or big binary files.  Text files  contain  the	"lorem
-       ipsum"  stanza,	binary	files contain randomly generated byte streams.
-       The percentage of file data that is small text or big binary files  can
-       be set, as can the sizes of the respective file types.
-
-       Files  and  directories are named "fileXXXX" or "dirXXXX", where "XXXX"
-       is a successive integer, separate successions for  files  and  directo‐
-       ries.   There  is an upper limit to how many files a directory may con‐
-       tain.  After the file limit is reached, a new sub-directory is created.
-       The first set of files go into the root directory of the test set.
-
-       You  have  to  give one of the options --create, --delete, --rename, or
-       --modify for the program to do anything.  You can, however,  give  more
-       than  one of them, if DIR already exists.  (Giving the same option more
-       than once means that only the last instance is counted.)  (DIR) is cre‐
-       ated if it doesn't exist already.
-
-OPTIONS
-       --chunk-size=SIZE
-	      generate data in chunks of this size
-
-       -c, --create=SIZE
-	      how much data to create (default: 0)
-
-       --depth=DEPTH
-	      depth of directory tree
-
-       --file-size=SIZE
-	      size of one file
-
-       --generate-manpage=TEMPLATE
-	      SUPPRESSHELP
-
-       -h, --help
-	      show this help message and exit
-
-       --max-files=MAX-FILES
-	      max files/dirs per dir
-
-       --output=FILE
-	      write output to FILE, instead of standard output
-
-       --quiet
-	      do not report progress
-
-       --no-quiet
-	      opposite of --quiet
-
-       --seed=SEED
-	      seed for random number generator
-
-       --version
-	      show program's version number and exit
-
-   Configuration files and settings
-       --config=FILE
-	      add FILE to config files
-
-       --dump-config
-	      write out the entire current configuration
-
-       --dump-setting-names
-	      SUPPRESSHELP
-
-       --help-all
-	      show all options
-
-       --list-config-files
-	      SUPPRESSHELP
-
-       --no-default-configs
-	      clear list of configuration files to read
-
-   Logging
-       --log=FILE
-	      write  log entries to FILE (default is to not write log files at
-	      all); use "syslog" to log to system log, "stderr" to log to  the
-	      standard error output, or "none" to disable logging
-
-       --log-keep=N
-	      keep last N logs (10)
-
-       --log-level=LEVEL
-	      log  at LEVEL, one of debug, info, warning, error, critical, fa‐
-	      tal (default: debug)
-
-       --log-max=SIZE
-	      rotate logs larger than SIZE, zero for never (default: 0)
-
-       --log-mode=MODE
-	      set permissions of new log files to MODE (octal; default 0600)
-
-   Peformance
-       --dump-memory-profile=METHOD
-	      make memory profiling dumps using METHOD, which is one of: none,
-	      simple, or meliae (default: simple)
-
-       --memory-dump-interval=SECONDS
-	      make memory profiling dumps at least SECONDS apart
-
-EXAMPLES
-       Create data for the first generation of a backup:
-
-	      genbackupdata --create=10G testdir
-
-       Modify an existing set of backup data to create a new generation:
-
-	      genbackupdata -c 5% -d 2% -m 5% -r 0.5% testdir
-
-       The above command can be run for each new generation.
-
-
-
-							      GENBACKUPDATA(1)

Add link copyright-statement-lint manpage
diff --git a/copyright-statement-lint.mdwn b/copyright-statement-lint.mdwn
index b4900c0..66b036f 100644
--- a/copyright-statement-lint.mdwn
+++ b/copyright-statement-lint.mdwn
@@ -8,5 +8,6 @@ any of the statements you do have.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/NEWS)
+* [manpage](http://code.liw.fi/copyright-statement-lint/copyright-statement-lint.1.txt)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/>
 * Git clone: `git://git.liw.fi/copyright-statement-lint/`

Move cmdtest/yarn manpages to code.liw.fi
diff --git a/cmdtest.mdwn b/cmdtest.mdwn
index cbcd1fc..7c1bce3 100644
--- a/cmdtest.mdwn
+++ b/cmdtest.mdwn
@@ -11,6 +11,6 @@ If not, it reports a problem, and shows the differences.
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/tree/NEWS)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/>
 * Git clone: `git://git.liw.fi/cmdtest/`
-* [[cmdtest manpage|cmdtest.1.txt]]
-* [[yarn manpage|yarn.1.txt]]
+* [cmdtest manpage](http://code.liw.fi/cmdtest/cmdtest.1.txt)
+* [yarn manpage](http://code.liw.fi/cmdtest/yarn.1.txt)
 * [[Bugs]]
diff --git a/cmdtest/cmdtest.1.txt b/cmdtest/cmdtest.1.txt
deleted file mode 100644
index 2de3efd..0000000
--- a/cmdtest/cmdtest.1.txt
+++ /dev/null
@@ -1,221 +0,0 @@
-CMDTEST(1)		    General Commands Manual		    CMDTEST(1)
-
-
-
-NAME
-       cmdtest - blackbox testing of Unix command line tools
-
-SYNOPSIS
-       cmdtest	    [-c=COMMAND]      [--command=COMMAND]      [--config=FILE]
-       [--dump-config]	[--dump-memory-profile=METHOD]	[--dump-setting-names]
-       [--generate-manpage=TEMPLATE]  [-h] [--help] [--help-all] [-k] [--keep]
-       [--list-config-files] [--log=FILE]  [--log-keep=N]  [--log-level=LEVEL]
-       [--log-max=SIZE]   [--log-mode=MODE]   [--memory-dump-interval=SECONDS]
-       [--no-default-configs]	[--no-keep]   [--no-timings]   [--output=FILE]
-       [-t=TEST] [--test=TEST] [--timings] [--version] [FILE]...
-
-DESCRIPTION
-       cmdtest	black  box  tests  Unix  command  line tools.  Given some test
-       scripts, their inputs, and expected outputs, it verifies that the  com‐
-       mand  line  produces the expected output.  If not, it reports problems,
-       and shows the differences.
-
-       Each test case foo consists of the following files:
-
-       foo.script
-	      a script to run the test (this is required)
-
-       foo.stdin
-	      the file fed to standard input
-
-       foo.stdout
-	      the expected output to the standard output
-
-       foo.stderr
-	      the expected output to the standard error
-
-       foo.exit
-	      the expected exit code
-
-       foo.setup
-	      a shell script to run before the test
-
-       foo.teardown
-	      a shell script to run after test
-
-       Usually, a single test is not enough. All tests are put into  the  same
-       directory, and they may share some setup and teardown code:
-
-       setup-once
-	      a shell script to run once, before any tests
-
-       setup  a shell script to run before each test
-
-       teardown
-	      a shell script to run after each test
-
-       teardown-once
-	      a shell script to run once, after all tests
-
-       cmdtest	is given the name of the directory with all the tests, or sev‐
-       eral such directories, and it does the following:
-
-       · execute setup-once
-
-       · for each test case (unique prefix foo):
-
-	      — execute setup
-
-	      — execute foo.setup
-
-	      — execute the command, by running foo.script, and redirecting
-		standard input to come from foo.stdin, and capturing standard
-		output and error and exit codes
-
-	      — execute foo.teardown
-
-	      — execute teardown
-
-	      — report result of test: does exit code match foo.exit, standard
-		output match foo.stdout, and standard error match foo.stderr?
-
-       · execute teardown-once
-
-       Except for foo.script, all of these files are optional.	If a setup or
-       teardown script is missing, it is simply not executed.  If one of the
-       standard input, output, or error files is missing, it is treated as if
-       it were empty.  If the exit code file is missing, it is treated as if
-       it specified an exit code of zero.
-
-       The shell scripts may use the following environment variables:
-
-       DATADIR
-	      a temporary directory where files may be created by the test
-
-       TESTNAME
-	      name of the current test (will be empty for setup-once and tear‐
-	      down-once)
-
-       SRCDIR directory from which cmdtest was launched
-
-OPTIONS
-       -c, --command=COMMAND
-	      ignored for backwards compatibility
-
-       --generate-manpage=TEMPLATE
-	      SUPPRESSHELP
-
-       -h, --help
-	      show this help message and exit
-
-       -k, --keep
-	      keep temporary data on failure
-
-       --no-keep
-
-
-       --no-timings
-
-
-       --output=FILE
-	      write output to FILE, instead of standard output
-
-       -t, --test=TEST
-	      run only TEST (can be given many times)
-
-       --timings
-	      report how long each test takes
-
-       --version
-	      show program's version number and exit
-
-   Configuration files and settings
-       --config=FILE
-	      add FILE to config files
-
-       --dump-config
-	      write out the entire current configuration
-
-       --dump-setting-names
-	      SUPPRESSHELP
-
-       --help-all
-	      show all options
-
-       --list-config-files
-	      SUPPRESSHELP
-
-       --no-default-configs
-	      clear list of configuration files to read
-
-   Logging
-       --log=FILE
-	      write log entries to FILE (default is to not write log files at
-	      all); use "syslog" to log to system log, or "none" to disable
-	      logging
-
-       --log-keep=N
-	      keep last N logs (10)
-
-       --log-level=LEVEL
-	      log at LEVEL, one of debug, info, warning, error, critical, fa‐
-	      tal (default: debug)
-
-       --log-max=SIZE
-	      rotate logs larger than SIZE, zero for never (default: 0)
-
-       --log-mode=MODE
-	      set permissions of new log files to MODE (octal; default 0600)
-
-   Peformance
-       --dump-memory-profile=METHOD
-	      make memory profiling dumps using METHOD, which is one of: none,
-	      simple, meliae, or heapy (default: simple)
-
-       --memory-dump-interval=SECONDS
-	      make memory profiling dumps at least SECONDS apart
-
-EXAMPLE
-       To test that the echo(1) command outputs the expected string, create a
-       file called echo-tests/hello.script containing the following content:
-

(Diff truncated)
Move cachedir manpage to code.liw.fi
diff --git a/cachedir.mdwn b/cachedir.mdwn
index d6b7c04..82348b7 100644
--- a/cachedir.mdwn
+++ b/cachedir.mdwn
@@ -6,6 +6,6 @@ according to the <http://www.bford.info/cachedir/> specification.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/tree/NEWS)
-* [[manual page|cachedir.1.txt]]
+* [manual page](http://code.liw.fi/cachedir/cachedir.1.txt)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/>
 * Git clone: `git://git.liw.fi/cachedir/`
diff --git a/cachedir/cachedir.1.txt b/cachedir/cachedir.1.txt
deleted file mode 100644
index 01abad2..0000000
--- a/cachedir/cachedir.1.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-CACHEDIR(1)							   CACHEDIR(1)
-
-
-
-NAME
-       cachedir - tag/untag/find cache directories
-
-SYNOPSIS
-       cachedir [--config=FILE] [--dump-config] [--dump-memory-profile=METHOD]
-       [--dump-setting-names]  [--generate-manpage=TEMPLATE]   [-h]   [--help]
-       [--help-all]    [--list-config-files]	[--log=FILE]	[--log-keep=N]
-       [--log-level=LEVEL]	   [--log-max=SIZE]	     [--log-mode=MODE]
-       [--memory-dump-interval=SECONDS] [--no-default-configs] [--output=FILE]
-       [--version]
-
-       cachedir [options] help
-       cachedir [options] help-all
-
-DESCRIPTION
-       cachedir tags directories as cache directories, or remotes  such  tags,
-       or  finds  tagged  directories.	A cache directory tag is a file called
-       CACHEDIR.TAG with a specific content.  See the specification referenced
-       from the "SEE ALSO" section for details.
-
-OPTIONS
-       --generate-manpage=TEMPLATE
-	      SUPPRESSHELP
-
-       -h, --help
-	      show this help message and exit
-
-       --output=FILE
-	      write output to FILE, instead of standard output
-
-       --version
-	      show program's version number and exit
-
-   Configuration files and settings
-       --config=FILE
-	      add FILE to config files
-
-       --dump-config
-	      write out the entire current configuration
-
-       --dump-setting-names
-	      SUPPRESSHELP
-
-       --help-all
-	      show all options
-
-       --list-config-files
-	      SUPPRESSHELP
-
-       --no-default-configs
-	      clear list of configuration files to read
-
-   Logging
-       --log=FILE
-	      write  log entries to FILE (default is to not write log files at
-	      all); use "syslog" to log to system log, or  "none"  to  disable
-	      logging
-
-       --log-keep=N
-	      keep last N logs (10)
-
-       --log-level=LEVEL
-	      log  at LEVEL, one of debug, info, warning, error, critical, fa-
-	      tal (default: debug)
-
-       --log-max=SIZE
-	      rotate logs larger than SIZE, zero for never (default: 0)
-
-       --log-mode=MODE
-	      set permissions of new log files to MODE (octal; default 0600)
-
-   Peformance
-       --dump-memory-profile=METHOD
-	      make memory profiling dumps using METHOD, which is one of: none,
-	      simple, meliae, or heapy (default: simple)
-
-       --memory-dump-interval=SECONDS
-	      make memory profiling dumps at least SECONDS apart
-
-EXAMPLE
-       To tag a directory as a cache directory:
-
-	      cachedir tag $HOME/.cache
-
-       To remove a cache directory tag:
-
-	      cachedir untag $HOME/.cache
-
-       To find all cache directories below your home directory:
-
-	      cachedir find $HOME
-
-SEE ALSO
-       http://www.bford.info/cachedir/
-
-
-
-								   CACHEDIR(1)

Add title to extrautils page
diff --git a/extrautils.mdwn b/extrautils.mdwn
index 67138d1..1d167f0 100644
--- a/extrautils.mdwn
+++ b/extrautils.mdwn
@@ -1,3 +1,4 @@
+[[!meta title="extrautils - extra utilities for Unix systems"]]
 [[!tag program]]
 
 # Extra utilities for Unix

Move cliapp(5) to code.liw.fi
diff --git a/cliapp.mdwn b/cliapp.mdwn
index a454239..73ccb1a 100644
--- a/cliapp.mdwn
+++ b/cliapp.mdwn
@@ -10,8 +10,8 @@ compatible ways.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/tree/NEWS)
+* [cliapp(5) manual page](http://code.liw.fi/cliapp/cliapp.5.txt)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/>
 * Git clone: `git://git.liw.fi/cliapp/`
-* [[cliapp(5) manual page|cliapp.5.txt]]
 * [API documentation](http://code.liw.fi/cliapp/docs/)
 * [[Bugs]]
diff --git a/cliapp/cliapp.5.txt b/cliapp/cliapp.5.txt
deleted file mode 100644
index 9644ba7..0000000
--- a/cliapp/cliapp.5.txt
+++ /dev/null
@@ -1,155 +0,0 @@
-CLIAPP(5)		      File Formats Manual		     CLIAPP(5)
-
-
-
-NAME
-       cliapp  -  config  file	and option conventions for Python command line
-       framework
-
-DESCRIPTION
-       cliapp is a Python  programming	framework  for	writing  command  line
-       applications   for  Unix-like  operating  systems.   This  manual  page
-       describes the conventions for  configuration  files  and  command  line
-       parsing provided by cliapp.
-
-       Configuration  file  variables  and command line options are handled by
-       cliapp under a uniform abstraction: every setting is available both  in
-       configuration  files  and  command  line options.  There are a few set‐
-       tings, provided by the framework itself, which are  only  available  on
-       the command line.  For example, --help outputs a short help text, list‐
-       ing all the available options, and --dump-config outputs a list of cur‐
-       rent configuration settings.
-
-       Command	line parsing follows GNU conventions: short options start with
-       a single dash, long options with two dashes, and options  may  be  used
-       anywhere  on the command line.  The order of options versus non-options
-       does not matter.  The exception is some of the options provided by  the
-       framework,  which  are executed immediately when found, and may be pre‐
-       vent the rest of the options from being parsed.	(--dump-config is  one
-       of  these,  so  use it at the end of the command line only.)  Use -- on
-       the command line to signal the end of options: no arguments after  that
-       are considered to be option.
-
-       Some  settings  may have aliases, which can be only a single character,
-       and in that case they're parsed as single-character option names.
-
-       Some applications have subcommands, which means	that  the  first  non-
-       option  argument  is  used to tell the application what to do.  This is
-       similar to what many version control systems do, for example CVS,  svn,
-       bzr, and git.  Options are global, and are not specific to subcommands.
-       Thus, --foo means the same thing,  regardless  of  what	subcommand  is
-       being used.
-
-   Configuration files
-       Configuration  files  use INI file syntax.  All the settings are in the
-       [config] section.  Other sections are allowed, but  it  is  up  to  the
-       application to give meaning to them.
-
-       Multiple  configuration	files  may  be read.  Settings from later ones
-       override settings from earlier ones.  Options  override	settings  from
-       the configuration files.
-
-   String list settings
-       Some settings may be a list of values (each value being a string).  For
-       example, there might be a setting for patterns to search for, and  mul‐
-       tiple patterns are allowed.  On the command line, that happens by using
-       the option multiple times.  In the configuration file, all  values  are
-       given  on one line, separated by commas.  This is a non-standard exten‐
-       sion to the INI file syntax.  There is no way to escape commas.
-
-       Example:
-
-	      [config]
-	      pattern = foo, bar, foobar
-
-   Boolean (true/false or on/off or yes/no) settings
-       When a setting can be either on or off, it's called a Boolean  setting.
-       Such  settings  are turned off by default, and turned on if used on the
-       command line.  In a configuration file, they need to be set to a value:
-       if  the	value is one of yes, on, true, or the number 1, the setting is
-       turned on.  Any other value means it is turned off.
-
-	      [config]
-	      verbose = true
-	      attack-kittens = no
-
-       This turns the verbose setting on, but does not launch attack kittens.
-
-       For every boolean setting, two command line options are added.  If  the
-       setting	is  called foo, the option --foo will turn the setting on, and
-       --no-foo will turn it off.  The negation is only usable on the  command
-       line:  its  purpose  is to allow the command line to override a setting
-       from the configuration file.
-
-   Logging and log files
-       Programs using cliapp automatically support several options for config‐
-       uring  the  Python  logging  module.  See the --help output for options
-       starting with log for details.  Logging can happen to  a  file  or  the
-       system log.  Log files can be rotated automatically based on size.
-
-       The  --trace  option enables additional debug logging, which is usually
-       only useful for programmers.  The option configures the tracing library
-       for Python, by Lars Wirzenius, which allows logging values of variables
-       and other debug information in a way that is very lightweight when  the
-       tracing	is  turned  off.   The	option specifies for which source code
-       files to turn on tracing.  The actual logging happens  via  the	normal
-       Python logging facilities, at the debug level.
-
-   Python profiling support
-       You  can  run  the  application under the Python profiler (cProfile) by
-       setting an environment variable.  The name of the variable is  FOO_PRO‐
-       FILE,  where  FOO is the name of the program, as set by the application
-       code or determined by cliapp automatically.  The value of the  environ‐
-       ment variable is the name of the file to which the resulting profile is
-       to be written.
-
-   Manual page generation
-       cliapp can generate parts of a manual page: the	SYNOPSIS  and  OPTIONS
-       sections.   It fills these in automatically based on the subcommand and
-       settings that a	program  supports.   Use  the  --generate-manpage=FILE
-       option,	which  is added automatically by cliapp.  The FILE is a manual
-       page marked up using the -man macros  for  troff(1).   It  should  have
-       empty SYNOPSIS and OPTIONS sections, and cliapp will fill them in.  The
-       output it to the standard output.
-
-       For example:
-
-	      foo --generate-manpage=foo.1.in > foo.1
-
-       You would keep the source code for the manual page in foo.1.in and have
-       your Makefile produce foo.1 as shown above.
-
-   Subcommands
-       cliapp  provides  a way for the application to have subcommands, in the
-       style of git(1), for example.  If the application is called  foo,  then
-       it  can have subcommands such as foo search, and foo print.  The appli‐
-       cation gets to define the name and meaning of  each  subcommand.   How‐
-       ever,  all  settings  (options and configuration files) are global, and
-       can be used with all subcommands.  It is up  to	each  subcommand  what
-       settings it obeys.
-
-       If  there  are any subcommands, cliapp automatically adds the help sub‐
-       command.  It allows you to get the help text for a specific  subommand:
-       foo help print, for example.
-
-FILES
-       cliapp reads a list of configuration files at startup, on behalf of the
-       application.  The name of the application is included in the name.   In
-       the filenames below, the application name is progname.
-
-       /etc/progname.conf
-	      Global configuration file.
-
-       /etc/progname/*.conf
-	      More global configuration files.	These are read in ASCII sorted
-	      order.
-
-       ~/.progname.conf
-	      Per-user configuration file.
-
-       ~/.config/progname/*.conf
-	      More per-user configuration files.  Again, ASCII sorted order.
-
-
-
-								     CLIAPP(5)

Remove now-obsolete Obnam release checklist
diff --git a/obnam/release.mdwn b/obnam/release.mdwn
deleted file mode 100644
index 75a4725..0000000
--- a/obnam/release.mdwn
+++ /dev/null
@@ -1,19 +0,0 @@
-[[!meta title="Making an Obnam release"]]
-
-Follow my [generic release checklist](http://liw.fi/release/),
-with the following notes:
-
-* Automatic tests (see also [[README]] section "Hacking"): 
-  - `make -s clean all check network-tests`
-* Bug tracker is using Ikiwiki, at
-  <http://liw.fi/obnam/bugs/>.
-* Announcements:
-  * blog, using tag `obnam`
-  * Obnam mailing list
-* Copy `NEWS` and `README` and formatted manpage to `liw.fi/obnam`.
-* Push updated wiki to server.
-* Run benchmark on the release version.
-
-As a special consideration, note that the 
-[B-tree library](http://liw.fi/btree/) Obnam uses may also need to
-be released at the same time.

Update my release checklist
diff --git a/release.mdwn b/release.mdwn
index 5bed040..e51bb4f 100644
--- a/release.mdwn
+++ b/release.mdwn
@@ -1,26 +1,19 @@
 [[!meta title="Software release checklist"]]
 [[!tag checklist]]
 
-1. Run full test suite.
-1. Prepare README, NEWS, setup.py, debian/changelog, version numbers (in
-   all places), and other files for release. Commit. Push.
-1. Run
-   `jenkinstool --config jenkinstool-real.conf run-jobs liw-real.conf $project`
-   to make sure things work.
-1. Tag the project with the version number.
-1. Run
-   `jenkinstool --config jenkinstool-real.conf run-jobs liw-real.conf $project`
-   to create release artifacts.
-1. Download release artifacts for all architectures.
-1. Run `debsign` and upload to `code.liw.fi` and, if appropriate, to Debian.
-1. Copy `NEWS`, `README`, examples, other relevant files to the project
-   home page.
-1. Upload to pypi, if relevant. (Under review: is pypi worth it?)
-  - `# python setup.py register`
+I used to have a long, detailed manual checklist here for making a
+release. Most of it has been replaced by using a CI system ([[ick]]).
+What remains here are the manual steps:
+
+1. Prepare README, NEWS, setup.py, debian/changelog for the release.
+1. Tag release: `git -sam "Release version x.y" foo-x.y`
+1. Run ick. This runs tests, builds release packages, and uploads them
+   to [[code.liw.fi|code]] and Debian, as needed.
 1. Announce on the relevant forums.
   - my blog
-  - a dedicated announcement mailing list
+  - the announcement mailing list, if any
   - identi.ca
+  - twitter
   
 On version numbers
 ------------------

Fix broken links
diff --git a/larch.mdwn b/larch.mdwn
index 3b45354..dda00d1 100644
--- a/larch.mdwn
+++ b/larch.mdwn
@@ -44,8 +44,8 @@ are your best hope.
 
 **Contributions are welcome.** Every level of contribution is most
 appreciated: bug reports, spelling and grammar fixes, code patches,
-questions on how to get started, etc. See [[README]] for information
-on how to modify the code. And if anything's unclear, ask!
+questions on how to get started, etc. See the README (link below) for
+information on how to modify the code. And if anything's unclear, ask!
 
 Status: in production use. The on-disk file format is not expected
 to change anymore.
diff --git a/seivot.mdwn b/seivot.mdwn
index d73b2a5..20713d7 100644
--- a/seivot.mdwn
+++ b/seivot.mdwn
@@ -14,8 +14,6 @@ It is licensed under the GPL, version 3 or later.
 
 See also:
 
-* [[README]]
-* [[NEWS]]
 * [[Bugs]]
 
 Downloads:

Add list of broken links
diff --git a/admin.mdwn b/admin.mdwn
new file mode 100644
index 0000000..5153b80
--- /dev/null
+++ b/admin.mdwn
@@ -0,0 +1,5 @@
+[[!meta title="wiki admin stuff"]]
+
+# Broken internal links
+
+[[!brokenlinks  pages="* and !recentchanges"]]

Remove obsolete copies of README, NEWS for all programs
diff --git a/cachedir/NEWS.mdwn b/cachedir/NEWS.mdwn
deleted file mode 100644
index 94cf506..0000000
--- a/cachedir/NEWS.mdwn
+++ /dev/null
@@ -1,13 +0,0 @@
-cachedir NEWS
-============
-
-Version 1.1, released 2013-03-15
---------------------------------
-
-* Test suite fixes.
-
-Version 1.0, released 2012-10-13
---------------------------------
-
-* First release.
-
diff --git a/cachedir/README.mdwn b/cachedir/README.mdwn
deleted file mode 100644
index b6cfe91..0000000
--- a/cachedir/README.mdwn
+++ /dev/null
@@ -1,24 +0,0 @@
-The cachedir cache directory tagging utility
-============================================
-
-cachedir is a tiny utility for tagging directories as cache directories,
-according to the <http://www.bford.info/cachedir/> specification.
-
-Legalese
---------
-
-Copyright 2012, 2013  Lars Wirzenius
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
diff --git a/cliapp/NEWS.mdwn b/cliapp/NEWS.mdwn
deleted file mode 100644
index 1890f7b..0000000
--- a/cliapp/NEWS.mdwn
+++ /dev/null
@@ -1,507 +0,0 @@
-NEWS for cliapp
-===============
-
-Version 1.20150829
-------------------
-
-Important, backwards incompatible bug fixes:
-
-* Jan Gerber fixed string list option handling. Command line options
-  no longer parse values by commas, so that `--foo=bar,foobar` results
-  in a single value `bar,foobar`, instead of two values (`bar` and
-  `foobar`). Also, in configuration files, values may be quoted with
-  double quotes.
-
-Bug fixes:
-
-* Memory use profiling with Meliae was fixed.
-
-New features:
-
-* Richard Ipsum added the `cliapp.Application.get_subcommand_usage`
-  method to return a short usage text for a subcommand. This allows
-  better error message.
-
-Version 1.20150701
-------------------
-
-* Lars Wirzenius added the `ssh_options` keyword argument to
-  `cliapp.ssh_runcmd` to allow adding command line options to the ssh
-  program.
-
-* Lars Wirzenius added the `remote_cwd` keyword argument to
-  `cliapp.ssh_runcmd` to allow the caller to easily change to a
-  directory on the server.
-
-* Support for `heapy` memory profile has been dropped. It's not
-  packaged for Debian, and is rarely available anywhere.
-
-
-Version 1.20150305
-------------------
-
-* Richard Ipsum added callbacks to `cliapp.runcmd` for handling
-  captured stdout/stderr output from the pipeline. This allows, for
-  example, progress reporting during a long-running command.
-
-* Richard Maw and Richard Ipsum fixed `cliapp.runcmd` to close file
-  descriptors correctly, to make `cliapp.runcmd(['cat', '/dev/zero'],
-  ['false'])` work correctly. Previously, the pipeline would never
-  finish, but now it does, because closing an unnecessary file
-  descriptor in the parent results in `SIGPIPE` being sent to the
-  `cat` process once `false` terminates.
-
-* Richard Maw changed `cliapp.runcmd` so that the stderr of all
-  commands in the pipeline are collected, when stderr is set to
-  `subprocess.PIPE`.
-
-Version 1.20140719
-------------------
-
-* The way logging is set up has been split into smaller methods, to
-  allow overriding better. See `setup_logging_handler_for_file`,
-  `setup_logging_formatter_for_file`, and
-  `setup_logging_formatter_for_syslog`.
-
-* Plugins no longer need to define a `disable` method: the default
-  implementation is now a no-op, instead of raising
-  `NotImplementedError`.
-
-Bug fixes:
-
-* When getting help for a subcommand, cliapp would crash saying
-  `get_help_text_formatter` couldn't be found. This has been fixed.
-
-Version 1.20140315
-------------------
-
-* Portability patch to disable VmRSS reporting on non-Linux platforms.
-  The code assumed that /proc/self/status exists, but that's only true
-  on Linux. Patch from Itamar Turner-Trauring.
-
-* `cliapp` now logs the current working directory, uid, effective uid,
-  gid, and effective gid at startup.
-
-* `cliapp` (`Settings.load_configs`) now reports an unknown
-  variable in a configuration file with a nice error message, rather
-  than a stack trace.
-
-* A new method, `cliapp.Application.get_subcommand_help_formatter`
-  allows overriding how the full help text for a subcommand is to be
-  formatted. This can be useful for allowing help texts be marked up
-  in, say, Markdown.
-
-* The `cliapp.Settings.require` method now accepts many setting names,
-  and check for all of them. Patch by Stephen Judd.
-
-Version 1.20130808
-------------------
-
-* Bug fix to cliapp.runcmd pipeline handling: the pipeline now returns
-  failure if any of the processes fails, rather than only the last one.
-  Found and reported by Richard Maw.
-* Fix a problem in the pipeline code in runcmd. Reported and fix provided
-  by Richard Maw.
-
-Version 1.20130613
-------------------
-
-* cliapp(5) now mentions subcommands and the automatic subcommand
-  "help".
-* `ssh_runcmd` now has the `tty` keyword argument to enable ssh
-  allocation of pseudo-TTYs. Patch from Jannis Pohlmann.
-* The `help` subcommand now writes a useful error message, instead of
-  a stack trace, if given an unknown subcommand. Reported by Rob Taylor.
-
-Version 1.20130424
-------------------
-
-* The API documentation has been split into more than one page.
-
-Bug fixes:
-
-* `cliapp.runcmd` no longer dies from the `SIGWINCH` signal.
-
-Version 1.20130313
-------------------
-
-* Add `cliapp.Application.compute_setting_values` method. This allows
-  the application to have settings with values that are computed after
-  configuration files and the command line are parsed.
-* Cliapp now logs the Python version at startup, to aid debugging.
-* `cliapp.runcmd` now logs much less during execution of a command. The
-  verbose logging was useful while developing pipeline support, but has
-  now not been useful for months.
-* More default settings and options have an option group now, making
-  `--help` output prettier.
-* The `--help` output and the output of the `help` subcommand now only
-  list summaries for subcommands. The full documentation for a subcommand
-  can be seen by giving the name of the subcommand to `help`.
-* Logging setup is now more overrideable. The `setup_logging` method
-  calls `setup_logging_handler_for_syslog`,
-  `setup_logging_handler_for_syslog`, or
-  `setup_logging_handler_to_file`, and the last one calls
-  `setup_logging_format` and `setup_logging_timestamp` to create the
-  format strings for messages and timestamps. This allows applications

(Diff truncated)
Update titles for some program pages
diff --git a/cmdtest.mdwn b/cmdtest.mdwn
index c232057..cbcd1fc 100644
--- a/cmdtest.mdwn
+++ b/cmdtest.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="cmdtest"]]
+[[!meta title="cmdtest - black box testing of Unix command line tools"]]
 [[!tag program]]
 
 `cmdtest` black box tests Unix command line tools.
diff --git a/coverage-test-runner.mdwn b/coverage-test-runner.mdwn
index 33ef9ff..b60f20c 100644
--- a/coverage-test-runner.mdwn
+++ b/coverage-test-runner.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="CoverageTestRunner"]]
+[[!meta title="CoverageTestRunner - run unit tests with coverage measurement"]]
 [[!tag program]]
 
 **CoverageTestRunner** is a [Python](http://www.python.org/) module for
diff --git a/distix.mdwn b/distix.mdwn
index 9e32c4a..005b99c 100644
--- a/distix.mdwn
+++ b/distix.mdwn
@@ -1,4 +1,4 @@
-[[!meta title="distix"]]
+[[!meta title="distix - distributed ticketing system"]]
 [[!tag program]]
 
 Distix will be a distributed ticketing system. It is very much a
diff --git a/vmdebootstrap.mdwn b/vmdebootstrap.mdwn
index 148173a..400b436 100644
--- a/vmdebootstrap.mdwn
+++ b/vmdebootstrap.mdwn
@@ -1,3 +1,4 @@
+[[!meta title="vmdebootstrap - create Debian disk images for real and virtual machines"]]
 [[!tag program]]
 
 `debootstrap` installs a basic Debian system into a directory, for use with

Update links for ttystatus
diff --git a/ttystatus.mdwn b/ttystatus.mdwn
index 4db96fb..8a508a8 100644
--- a/ttystatus.mdwn
+++ b/ttystatus.mdwn
@@ -22,17 +22,10 @@ incompatible ways.
 
 See also:
 
-* [[README]]
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ttystatus/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ttystatus/tree/NEWS)
+* [example.py](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ttystatus/tree/example.py)
 * [API documentation](http://code.liw.fi/ttystatus/docs/)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ttystatus/>
+* Git clone: `git://git.liw.fi/ttystatus/`
 * [[Bug tracking page|ttystatus/bugs]]
-
-Downloads:
-
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ttystatus/>
-  * `git clone git://git.liw.fi/ttystatus`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/p/python-ttystatus/>
-

Update links for tracing
diff --git a/tracing.mdwn b/tracing.mdwn
index 5d71947..4577117 100644
--- a/tracing.mdwn
+++ b/tracing.mdwn
@@ -20,10 +20,10 @@ Status: in production use.
 
 See also:
 
-* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/README)
-* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/NEWS)
-* [example.py](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/example.py)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/python-tracing/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/python-tracing/tree/NEWS)
+* [example.py](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/python-tracing/tree/example.py)
 * [Documentation](http://code.liw.fi/python-tracing/docs/)
-* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/>
-* Git clone: `git://git.liw.fi/tracing/`
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/python-tracing/>
+* Git clone: `git://git.liw.fi/python-tracing/`
 * [[Bugs]]

Update links for tracing
diff --git a/tracing.mdwn b/tracing.mdwn
index 90fd103..5d71947 100644
--- a/tracing.mdwn
+++ b/tracing.mdwn
@@ -20,14 +20,10 @@ Status: in production use.
 
 See also:
 
-* [[NEWS]]
-* [[README]]
-* [[example.py]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/NEWS)
+* [example.py](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/tree/example.py)
 * [Documentation](http://code.liw.fi/python-tracing/docs/)
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/python-tracing/>
-  * `git clone git://git.liw.fi/python-tracing`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/p/python-tracing/>
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/tracing/>
+* Git clone: `git://git.liw.fi/tracing/`
 * [[Bugs]]

Update links for summain
diff --git a/summain.mdwn b/summain.mdwn
index cdb07da..3705407 100644
--- a/summain.mdwn
+++ b/summain.mdwn
@@ -8,17 +8,9 @@ generated for a directory tree at different points in time and compared
 
 See also:
 
-* [[README]]
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/tree/NEWS)
 * [[manpage|summain.1.txt]]
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/>
+* Git clone: `git://git.liw.fi/summain/`
 * [[Bugs]]
-
-Downloads:
-
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/summain/>
-  * `git clone git://git.liw.fi/summain`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/s/summain/>
-

Update links for larch
diff --git a/larch.mdwn b/larch.mdwn
index 077746b..3b45354 100644
--- a/larch.mdwn
+++ b/larch.mdwn
@@ -50,16 +50,12 @@ on how to modify the code. And if anything's unclear, ask!
 Status: in production use. The on-disk file format is not expected
 to change anymore.
 
-* [[README]] (updated at release time)
-* [[NEWS]] (updated at release time)
-* [[example.py]] (an example program)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/larch/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/larch/tree/NEWS)
+* [example.py](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/larch/tree/example.py)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/larch/>
+* Git clone: `git://git.liw.fi/larch/`
 * [API documentation](http://code.liw.fi/larch/docs/)
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/larch/>
-  * `git clone git://git.liw.fi/larch`
-* Release tarballs and Debian packages:
-  <http://code.liw.fi/debian/pool/main/p/python-larch/>
 * [[Benchmark results|benchmarks]]
 * [[Release checklist|larch/release]]
 * [[Bug tracking page|larch/bugs]]

Update links for ick
diff --git a/ick.mdwn b/ick.mdwn
index 943b699..c6eee9f 100644
--- a/ick.mdwn
+++ b/ick.mdwn
@@ -4,7 +4,7 @@
 ick is a command line continous integration system I wrote for my own
 needs. You probably want something else instead.
 
-* Version control:
-    - <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/>
-    - `git clone git://git.liw.fi/ick`
-* [Using stuff on code.liw.fi](http://liw.fi/code/)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/>
+* Git clone: `git://git.liw.fi/ick/`

Update links for genbackupdata
diff --git a/genbackupdata.mdwn b/genbackupdata.mdwn
index c0642c8..9220fe8 100644
--- a/genbackupdata.mdwn
+++ b/genbackupdata.mdwn
@@ -3,17 +3,9 @@
 
 genbackupdata is a program to generate test data for backup software testing.
 
-* [[README]]
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/tree/NEWS)
 * [[manpage|genbackupdata.1.txt]]
-* [Using stuff on code.liw.fi](http://liw.fi/code/)
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/>
-  * `git clone git://git.liw.fi/genbackupdata`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/g/genbackupdata/>
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/genbackupdata/>
+* Git clone: `git://git.liw.fi/genbackupdata/`
 * [[Bugs]]
-
-See also:
-
-* [seivot](http://liw.fi/seivot/)

Update links for extrautils
diff --git a/extrautils.mdwn b/extrautils.mdwn
index dc0aafe..67138d1 100644
--- a/extrautils.mdwn
+++ b/extrautils.mdwn
@@ -10,10 +10,8 @@ that it needs to be free software and needs to work.
 
 See also:
 
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/extrautils/>
-  * `git clone git://git.liw.fi/extrautils`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/e/extrautils/>
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/extrautils/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/extrautils/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/extrautils/>
+* Git clone: `git://git.liw.fi/extrautils/`
 * [[Bugs]]

Update links for dupfiles
diff --git a/dupfiles.mdwn b/dupfiles.mdwn
index 72e9c79..94fcf22 100644
--- a/dupfiles.mdwn
+++ b/dupfiles.mdwn
@@ -20,7 +20,6 @@ not. Worked for me, but please be careful. Patches most welcome.
 
 See also:
 
-* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/tree/README)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/tree/NEWS)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/>
 * Git clone: `git://git.liw.fi/dupfiles/`

Update links for dupfiles
diff --git a/dupfiles.mdwn b/dupfiles.mdwn
index 6e5209b..72e9c79 100644
--- a/dupfiles.mdwn
+++ b/dupfiles.mdwn
@@ -20,16 +20,12 @@ not. Worked for me, but please be careful. Patches most welcome.
 
 See also:
 
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/dupfiles/>
+* Git clone: `git://git.liw.fi/dupfiles/`
 * [[Bugs]]
 
-Downloads:
-
-* [[Using stuff on code.liw.fi|code]]
-* Version control: `bzr branch http://code.liw.fi/dupfiles/bzr/trunk/`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/d/dupfiles/>
-
 Benchmark results
 -----------------
 
@@ -44,8 +40,6 @@ the source tree). I made a copy of my laptop home directory to a server
 
 Times are in seconds. hardlink is the clear winner in this case.
 
-I'd be interested in results from other data sets.
-
 Other tools
 ------------
 

Update links for drop-caches
diff --git a/drop-caches.mdwn b/drop-caches.mdwn
index 5d25c31..731c4e4 100644
--- a/drop-caches.mdwn
+++ b/drop-caches.mdwn
@@ -15,6 +15,5 @@ So I wrote a tiny utility for this.
 See also:
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/tree/README)
-* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/tree/NEWS)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/>
 * Git clone: `git://git.liw.fi/drop-caches/`

Update links for drop-caches
diff --git a/drop-caches.mdwn b/drop-caches.mdwn
index 083dece..5d25c31 100644
--- a/drop-caches.mdwn
+++ b/drop-caches.mdwn
@@ -14,5 +14,7 @@ So I wrote a tiny utility for this.
 
 See also:
 
-* [[README]]
-* [Git](http://git.gitano.org.uk/personal/liw/drop-caches.git/)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/drop-caches/>
+* Git clone: `git://git.liw.fi/drop-caches/`

Update links for distix
diff --git a/distix.mdwn b/distix.mdwn
index d8a59a4..9e32c4a 100644
--- a/distix.mdwn
+++ b/distix.mdwn
@@ -8,9 +8,9 @@ develop distix.
 You want the [[performance-art]] subpage for now.
 
 * [this will become the home page](http://distix.eu)
-* [[README]]
-* [[NEWS]] (release notes)
-* [[TUTORIAL]]
-* [git](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix/)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix/tree/NEWS)
+* [TUTORIAL](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix/tree/TUTORIAL)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix/>
+* Git clone: `git://git.liw.fi/distix/`
 * [distix bugs](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/distix-bugs/)
-* Debian packages on [[code.liw.fi|code]].

Update links for desktop-cronish
diff --git a/desktop-cronish.mdwn b/desktop-cronish.mdwn
index 2f7f8c1..9a6c464 100644
--- a/desktop-cronish.mdwn
+++ b/desktop-cronish.mdwn
@@ -12,7 +12,7 @@ configured to get the IMAP password from the GNOME Keyring.
 
 See also:
 
-* [[README]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/desktop-cronish/>
-  * `git clone git://git.liw.fi/desktop-cronish`
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/desktop-cronish/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/desktop-cronish/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/desktop-cronish/>
+* Git clone: `git://git.liw.fi/desktop-cronish/`

Update links for coverage-test-runner
diff --git a/coverage-test-runner.mdwn b/coverage-test-runner.mdwn
index dec86a5..33ef9ff 100644
--- a/coverage-test-runner.mdwn
+++ b/coverage-test-runner.mdwn
@@ -30,15 +30,10 @@ CoverageTestRunner is licensed under the
 [[GNU_General_Public_License,_version_3|licenses/gpl3]], or (at your
 option) any later version.
 
-# Downloads
+# Links
 
-* [[README]]
-* [[NEWS]]
-* [[Using stuff on code.liw.fi|code]]
-
-# Development stuff
-
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/coverage-test-runner/>
-  * `git clone git://git.liw.fi/coverage-test-runner`
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/coverage-test-runner/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/coverage-test-runner/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/coverage-test-runner/>
+* Git clone: `git://git.liw.fi/coverage-test-runner/`
 * [[Bugs]]

Update links for copyright-statement-lint
diff --git a/copyright-statement-lint.mdwn b/copyright-statement-lint.mdwn
index 797643e..b4900c0 100644
--- a/copyright-statement-lint.mdwn
+++ b/copyright-statement-lint.mdwn
@@ -7,7 +7,6 @@ statement, or the latest commit year is not included in the years of
 any of the statements you do have.
 
 * [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/README)
-* [README.yarn](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/README.yarn)
 * [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/NEWS)
 * Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/>
 * Git clone: `git://git.liw.fi/copyright-statement-lint/`

Update links for copyright-statement-lint
diff --git a/cmdtest.mdwn b/cmdtest.mdwn
index 88c0791..c232057 100644
--- a/cmdtest.mdwn
+++ b/cmdtest.mdwn
@@ -14,5 +14,3 @@ If not, it reports a problem, and shows the differences.
 * [[cmdtest manpage|cmdtest.1.txt]]
 * [[yarn manpage|yarn.1.txt]]
 * [[Bugs]]
-
-
diff --git a/copyright-statement-lint.mdwn b/copyright-statement-lint.mdwn
index 69d8a13..797643e 100644
--- a/copyright-statement-lint.mdwn
+++ b/copyright-statement-lint.mdwn
@@ -6,12 +6,8 @@ git, for copyright statements, and whinges if you don't have a
 statement, or the latest commit year is not included in the years of
 any of the statements you do have.
 
-* [[README]] (updated at release time)
-* [[NEWS]] (updated at release time)
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/>
-  * `git clone git://git.liw.fi/copyright-statement-lint`
-* Release tarballs and Debian packages:
-  <http://code.liw.fi/debian/pool/main/c/copyright-statement-lint/>
-* Copyright license: GNU GPL3 or later.
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/README)
+* [README.yarn](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/README.yarn)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/copyright-statement-lint/>
+* Git clone: `git://git.liw.fi/copyright-statement-lint/`

Update links for cmdtest
diff --git a/cmdtest.mdwn b/cmdtest.mdwn
index 3507ee4..88c0791 100644
--- a/cmdtest.mdwn
+++ b/cmdtest.mdwn
@@ -6,18 +6,13 @@ Roughly, it is given a command line and input files, and the expected output,
 and it verifies that the command line produces the expected output.
 If not, it reports a problem, and shows the differences.
 
-* [[README]] for cmdtest
-* [[README.yarn]] for yarn
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/tree/README)
+* [README.yarn](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/tree/README.yarn)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/>
+* Git clone: `git://git.liw.fi/cmdtest/`
 * [[cmdtest manpage|cmdtest.1.txt]]
 * [[yarn manpage|yarn.1.txt]]
+* [[Bugs]]
 
-See also:
 
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cmdtest/>
-  * `git clone git://git.liw.fi/cmdtest`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/c/cmdtest/>
-* [[Bugs]]

Update links for cliapp
diff --git a/cliapp.mdwn b/cliapp.mdwn
index c35ab39..a454239 100644
--- a/cliapp.mdwn
+++ b/cliapp.mdwn
@@ -8,16 +8,10 @@ parsing the command line for options, and iterating over input files.
 Status: in production. New features will happen in backwards
 compatible ways.
 
-* [[README]]
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/>
+* Git clone: `git://git.liw.fi/cliapp/`
 * [[cliapp(5) manual page|cliapp.5.txt]]
-* Examples: [[example.py]], [[example2.py]], [[example3.py]],
-  [[example4.py]], [[example5.py]].
 * [API documentation](http://code.liw.fi/cliapp/docs/)
-* [[Using stuff on code.liw.fi|code]]
-* Version control:
-  * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp/>
-  * `git clone git://git.liw.fi/cliapp`
-* Tarball and Debian packages: 
-  <http://code.liw.fi/debian/pool/main/p/python-cliapp/>
 * [[Bugs]]
diff --git a/cliapp/example.py b/cliapp/example.py
deleted file mode 100644
index fe282be..0000000
--- a/cliapp/example.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (C) 2011  Lars Wirzenius
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-
-'''Example for cliapp framework.
-
-This implements an fgrep-like utility.
-
-'''
-
-
-import cliapp
-import logging
-
-
-class ExampleApp(cliapp.Application):
-
-    '''A little fgrep-like tool.'''
-
-    def add_settings(self):
-        self.settings.string_list(
-            ['pattern', 'e'],
-            'search for regular expression PATTERN',
-            metavar='REGEXP')
-
-        self.settings.boolean(
-            ['dummy'],
-            'this setting is ignored',
-            group='Test Group')
-
-        self.settings.string(
-            ['yoyo'],
-            'yoyo',
-            group=cliapp.config_group_name)
-
-        self.settings.string(
-            ['nono'],
-            'nono',
-            default=None)
-
-    # We override process_inputs to be able to do something after the last
-    # input line.
-    def process_inputs(self, args):
-        self.matches = 0
-        cliapp.Application.process_inputs(self, args)
-        self.output.write('There were %s matches.\n' % self.matches)
-
-    def process_input_line(self, name, line):
-        logging.debug('processing %s:%s', name, self.lineno)
-        for pattern in self.settings['pattern']:
-            if pattern in line:
-                self.output.write('%s:%s: %s' % (name, self.lineno, line))
-                self.matches += 1
-                logging.debug('Match: %s line %d', name, self.lineno)
-
-
-app = ExampleApp(version='0.1.2')
-app.settings.config_files = ['example.conf']
-app.run()
-
diff --git a/cliapp/example2.py b/cliapp/example2.py
deleted file mode 100644
index 972e880..0000000
--- a/cliapp/example2.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (C) 2011  Lars Wirzenius
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-
-'''Example for cliapp framework.
-
-Greet or insult people.
-
-'''
-
-
-import cliapp
-
-
-class ExampleApp(cliapp.Application):
-
-    cmd_synopsis = {
-        'greet': '[USER]...',
-        'insult': '[USER]...',
-    }
-
-    def cmd_greet(self, args):
-        '''Greet the user.
-
-        The user is treated to a a courteus,
-        but terse form of greeting.
-
-        '''
-        for arg in args:
-            self.output.write('greetings, %s\n' % arg)
-
-    def cmd_insult(self, args):
-        '''Insult the user.
-
-        Sometimes, though rarely, it happens that a user is really a bit of
-        a prat, and needs to be told off. This is the command for that.
-
-        '''
-        for arg in args:
-            self.output.write('you suck, %s\n' % arg)
-
-
-app = ExampleApp(
-    version='0.1.2',
-    description='''
-Greet the user.
-Or possibly insult them. User's choice.
-''',
-    epilog='''
-This is the epilog.
-
-I hope you like it.
-''')
-
-app.run()
-
diff --git a/cliapp/example3.py b/cliapp/example3.py
deleted file mode 100644
index 163231d..0000000
--- a/cliapp/example3.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (C) 2012  Lars Wirzenius
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

(Diff truncated)
Update links for clab
diff --git a/clab.mdwn b/clab.mdwn
index 4b721d1..5cba5fe 100644
--- a/clab.mdwn
+++ b/clab.mdwn
@@ -4,7 +4,7 @@
 clab is a small command line address book application I wrote after
 I got disappointed by abook losing data.
 
-* Version control:
-    - <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/clab/>
-    - `git clone git://git.liw.fi/clab`
-* [Using stuff on code.liw.fi](http://liw.fi/code/)
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/clab/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/clab/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/clab/>
+* Git clone: `git://git.liw.fi/clab/`

Update links for cachedir
diff --git a/cachedir.mdwn b/cachedir.mdwn
index 39aa7a6..d6b7c04 100644
--- a/cachedir.mdwn
+++ b/cachedir.mdwn
@@ -4,11 +4,8 @@
 cachedir is a tiny utility for tagging directories as cache directories,
 according to the <http://www.bford.info/cachedir/> specification.
 
-* [[README]]
-* [[NEWS]]
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/tree/NEWS)
 * [[manual page|cachedir.1.txt]]
-* [Using stuff on code.liw.fi](http://liw.fi/code/)
-* Version control:
-    - <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/>
-    - `git clone git://git.liw.fi/cachedir`
-
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cachedir/>
+* Git clone: `git://git.liw.fi/cachedir/`

Add git links to bumper
diff --git a/bumper.mdwn b/bumper.mdwn
index ee2d0c0..279cd9a 100644
--- a/bumper.mdwn
+++ b/bumper.mdwn
@@ -4,4 +4,7 @@
 I use Bumper to update the version number and create a git release tag
 when making a software release.
 
-* Git: <git://git.liw.fi/bumper/>
+* [README](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/bumper/tree/README)
+* [NEWS](http://git.liw.fi/cgi-bin/cgit/cgit.cgi/bumper/tree/NEWS)
+* Git browse: <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/bumper/>
+* Git clone: `git://git.liw.fi/bumper/`

Add link to HTTP statuses
diff --git a/links.mdwn b/links.mdwn
index a924c3c..b20e104 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -12,6 +12,7 @@ incarnation of that web page.
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
 [Kierrätys](http://www.kierratys.info/)
+[HTTP status codes](http://www.restapitutorial.com/httpstatuscodes.html)
 
 **Books:**
 [OpenLibrary](http://openlibrary.org)

Update genbackupdata NEWS, manpage
diff --git a/genbackupdata/NEWS.mdwn b/genbackupdata/NEWS.mdwn
index 882cb8a..dc75dea 100644
--- a/genbackupdata/NEWS.mdwn
+++ b/genbackupdata/NEWS.mdwn
@@ -1,6 +1,19 @@
 NEWS for genbackupdata
 ======================
 
+Version 1.9, released 2015-17-18
+--------------------------------
+
+* Fix progress reporting to always output something, even if the
+  program ran very fast. Previously, there would just be an empty
+  line.
+
+Version 1.8, released 2015-07-14
+--------------------------------
+
+* Change how binary data gets generated. It is now much less repetetive.
+  Suggested by Rob Kendrick.
+
 Version 1.7, released 2012-09-29
 --------------------------------
 
diff --git a/genbackupdata/genbackupdata.1.txt b/genbackupdata/genbackupdata.1.txt
index 2004536..3ef0ac9 100644
--- a/genbackupdata/genbackupdata.1.txt
+++ b/genbackupdata/genbackupdata.1.txt
@@ -1,4 +1,4 @@
-GENBACKUPDATA(1)					      GENBACKUPDATA(1)
+GENBACKUPDATA(1)	    General Commands Manual	      GENBACKUPDATA(1)
 
 
 
@@ -6,22 +6,22 @@ NAME
        genbackupdata - generate backup test data
 
 SYNOPSIS
-       genbackupdata	 [--chunk-size=SIZE]	 [--config=FILE]     [-c=SIZE]
-       [--create=SIZE]		   [--depth=DEPTH]	       [--dump-config]
-       [--dump-memory-profile=METHOD]			[--dump-setting-names]
-       [--file-size=SIZE]    [--generate-manpage=TEMPLATE]    [-h]    [--help]
-       [--list-config-files]  [--log=FILE]  [--log-keep=N] [--log-level=LEVEL]
+       genbackupdata   [--chunk-size=SIZE]   [--config=FILE]   [--dump-config]
+       [--dump-setting-names]  [--generate-manpage=TEMPLATE]   [-h]   [--help]
+       [--help-all]  [--list-config-files]  [--version] [--no-default-configs]
+       [-cSIZE] [--create=SIZE] [--depth=DEPTH] [--dump-memory-profile=METHOD]
+       [--file-size=SIZE]   [--log=FILE]   [--log-keep=N]  [--log-level=LEVEL]
        [--log-max=SIZE]       [--log-mode=MODE]        [--max-files=MAX-FILES]
-       [--no-default-configs]	 [--output=FILE]    [--quiet]	 [--seed=SEED]
-       [--version] [FILE]...
+       [--memory-dump-interval=SECONDS] [--output=FILE] [--quiet] [--no-quiet]
+       [--seed=SEED] [FILE]...
 
 DESCRIPTION
-       genbackupdata generates test data sets for performance testing of back-
-       up  software.  It creates a directory tree filled with files of differ-
+       genbackupdata generates test data sets for performance testing of back‐
+       up  software.  It creates a directory tree filled with files of differ‐
        ent sizes.  The total size and the distribution of sizes between  small
-       and  big are configurable.  The program can also modify an existing di-
-       rectory tree by creating new files, and deleting, renaming, or  modify-
-       ing existing files.  This can be used to generate test data for succes-
+       and  big are configurable.  The program can also modify an existing di‐
+       rectory tree by creating new files, and deleting, renaming, or  modify‐
+       ing existing files.  This can be used to generate test data for succes‐
        sive generations of backups.
 
        The program is deterministic: with a given set  of  parameters  (and  a
@@ -36,62 +36,84 @@ DESCRIPTION
        be set, as can the sizes of the respective file types.
 
        Files  and  directories are named "fileXXXX" or "dirXXXX", where "XXXX"
-       is a successive integer, separate successions for  files  and  directo-
-       ries.   There  is an upper limit to how many files a directory may con-
+       is a successive integer, separate successions for  files  and  directo‐
+       ries.   There  is an upper limit to how many files a directory may con‐
        tain.  After the file limit is reached, a new sub-directory is created.
        The first set of files go into the root directory of the test set.
 
        You  have  to  give one of the options --create, --delete, --rename, or
        --modify for the program to do anything.  You can, however,  give  more
        than  one of them, if DIR already exists.  (Giving the same option more
-       than once means that only the last instance is counted.)  (DIR) is cre-
+       than once means that only the last instance is counted.)  (DIR) is cre‐
        ated if it doesn't exist already.
 
 OPTIONS
        --chunk-size=SIZE
-	      generate data in chunks of this size (default: 16384)
-
-       --config=FILE
-	      add FILE to config files
+	      generate data in chunks of this size
 
        -c, --create=SIZE
 	      how much data to create (default: 0)
 
        --depth=DEPTH
-	      depth of directory tree (default: 3)
-
-       --dump-config
-	      write out the entire current configuration
-
-       --dump-memory-profile=METHOD
-	      make memory profiling dumps using METHOD, which is one of: none,
-	      simple, meliae, or heapy (default: simple)
-
-       --dump-setting-names
-	      write out all names of settings and quit
+	      depth of directory tree
 
        --file-size=SIZE
-	      size of one file (default: 16384)
+	      size of one file
 
        --generate-manpage=TEMPLATE
-	      fill in manual page TEMPLATE
+	      SUPPRESSHELP
 
        -h, --help
 	      show this help message and exit
 
+       --max-files=MAX-FILES
+	      max files/dirs per dir
+
+       --output=FILE
+	      write output to FILE, instead of standard output
+
+       --quiet
+	      do not report progress
+
+       --no-quiet
+	      opposite of --quiet
+
+       --seed=SEED
+	      seed for random number generator
+
+       --version
+	      show program's version number and exit
+
+   Configuration files and settings
+       --config=FILE
+	      add FILE to config files
+
+       --dump-config
+	      write out the entire current configuration
+
+       --dump-setting-names
+	      SUPPRESSHELP
+
+       --help-all
+	      show all options
+
        --list-config-files
-	      list all possible config files
+	      SUPPRESSHELP
 
+       --no-default-configs
+	      clear list of configuration files to read
+
+   Logging
        --log=FILE
-	      write log entries to FILE (default is to not write log files  at
-	      all);  use  "syslog"  to log to system log, or "none" to disable
-	      logging
+	      write  log entries to FILE (default is to not write log files at
+	      all); use "syslog" to log to system log, "stderr" to log to  the
+	      standard error output, or "none" to disable logging
 
        --log-keep=N
 	      keep last N logs (10)
 
        --log-level=LEVEL
-	      log at LEVEL, one of debug, info, warning, error, critical,  fa-
+	      log  at LEVEL, one of debug, info, warning, error, critical, fa‐
 	      tal (default: debug)
 
        --log-max=SIZE
@@ -100,23 +122,13 @@ OPTIONS
        --log-mode=MODE
 	      set permissions of new log files to MODE (octal; default 0600)
 
-       --max-files=MAX-FILES
-	      max files/dirs per dir (default: 128)
-
-       --no-default-configs
-	      clear list of configuration files to read
-
-       --output=FILE
-	      write output to FILE, instead of standard output
-
-       --quiet
-	      do not report progress
-
-       --seed=SEED
-	      seed for random number generator (default: 0)
+   Peformance
+       --dump-memory-profile=METHOD
+	      make memory profiling dumps using METHOD, which is one of: none,

(Diff truncated)
Close old wishlist bugs
diff --git a/dupfiles/bugs/cmdtest.mdwn b/dupfiles/bugs/cmdtest.mdwn
index 5ab0c15..7abe8d3 100644
--- a/dupfiles/bugs/cmdtest.mdwn
+++ b/dupfiles/bugs/cmdtest.mdwn
@@ -1,3 +1,5 @@
 dupfiles should use yarn for black box testing. It should also have
 test for `--no-act` for hardlinking, removals, and that when removing, it
 keeps a copy in the last directory given on the command line. --liw
+
+[[done]] (old wishlist bug, nothing happening for years) -- liw
diff --git a/dupfiles/bugs/progress-hardlinking.mdwn b/dupfiles/bugs/progress-hardlinking.mdwn
index 43bd292..9f4bbc0 100644
--- a/dupfiles/bugs/progress-hardlinking.mdwn
+++ b/dupfiles/bugs/progress-hardlinking.mdwn
@@ -1 +1,3 @@
 `--progress` doesn't do anything for hardlinking. --liw
+
+[[done]] (old wishlist bug, nothing happening for years) --liw

Close bug
diff --git a/cliapp/bugs/manpage-should-include-subcommand-descriptions.mdwn b/cliapp/bugs/manpage-should-include-subcommand-descriptions.mdwn
index 0d3d548..c431368 100644
--- a/cliapp/bugs/manpage-should-include-subcommand-descriptions.mdwn
+++ b/cliapp/bugs/manpage-should-include-subcommand-descriptions.mdwn
@@ -1,2 +1,5 @@
 The documentation for subcommands is already in the code, so including
-it in the manpage would be good.
+it in the manpage would be good. --liw
+
+[[done]] because this is a wishlist bug that's been open for years without
+happening. --liw

Close bug
diff --git a/cliapp/bugs/better-list-support-on-config-files.mdwn b/cliapp/bugs/better-list-support-on-config-files.mdwn
index 265c78f..d99b7f6 100644
--- a/cliapp/bugs/better-list-support-on-config-files.mdwn
+++ b/cliapp/bugs/better-list-support-on-config-files.mdwn
@@ -4,3 +4,5 @@ config file format might be nice: yaml? --liw
 
 YAML would be nice, but adds a dependency outside of stdlib.
 That's not good. --liw
+
+[[done]] by support YAML. --liw

Close bug
diff --git a/cliapp/bugs/help-does-not-include-list-config-option.mdwn b/cliapp/bugs/help-does-not-include-list-config-option.mdwn
index 132be45..e100f2b 100644
--- a/cliapp/bugs/help-does-not-include-list-config-option.mdwn
+++ b/cliapp/bugs/help-does-not-include-list-config-option.mdwn
@@ -1,2 +1,4 @@
 `foo --help` doesn't seem to include `--list-config` and maybe other
 command-line-only options that cliapp itself adds. --liw
+
+[[done]] --liw

Add link to thehuone
diff --git a/links.mdwn b/links.mdwn
index b0c33b4..a924c3c 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -80,6 +80,7 @@ incarnation of that web page.
 [Slaters](http://www.slaters.co.uk/)
 [Specsavers](http://www.specsavers.co.uk/)
 [Algerian Coffee](http://www.algcoffee.co.uk)
+[Théhuone](http://www.thehuone.com/fi/)
 
 **Organizations:**
 [EFFI](http://www.effi.org/)

Add home page for bumper
diff --git a/bumper.mdwn b/bumper.mdwn
new file mode 100644
index 0000000..ee2d0c0
--- /dev/null
+++ b/bumper.mdwn
@@ -0,0 +1,7 @@
+[[!meta title="bumper: Update version numbers and make release tag"]]
+[[!tag program]]
+
+I use Bumper to update the version number and create a git release tag
+when making a software release.
+
+* Git: <git://git.liw.fi/bumper/>

Tweak links
diff --git a/links.mdwn b/links.mdwn
index 3f4cc1c..b0c33b4 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -11,8 +11,7 @@ incarnation of that web page.
 **Frequent:**
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
-[Aukiolot](http://www.pty.fi/kaupan-toiminta/aukioloajat/kaupan-aukioloajat-2015/)
-[Liikenne-tilanne](http://liikennetilanne.liikennevirasto.fi/)
+[Kierrätys](http://www.kierratys.info/)
 
 **Books:**
 [OpenLibrary](http://openlibrary.org)

Add link to Cimos
diff --git a/links.mdwn b/links.mdwn
index 5fb91c0..3f4cc1c 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -64,6 +64,7 @@ incarnation of that web page.
 [verkkokauppa](http://www.verkkokauppa.com)
 [jimms](http://www.jimms.fi)
 [TKV](http://www.tkvfinland.fi/)
+[Cimos](http://www.cimos.fi/)
 
 **Approved content sources:**
 [Amazon UK](http://www.amazon.co.uk/)

Fix typo (thanks, iDunno)
diff --git a/vmdebootstrap.mdwn b/vmdebootstrap.mdwn
index 593bf8a..148173a 100644
--- a/vmdebootstrap.mdwn
+++ b/vmdebootstrap.mdwn
@@ -4,7 +4,7 @@
 `chroot`(8). `vmdeboostrap` is a wrapper around it to install Debian into a disk
 image, which can be used with a virtual machine (such as KVM).
 
-`vmdebootstrap` is now mainteind by Neil Williams.
+`vmdebootstrap` is now maintained by Neil Williams.
 
 * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/vmdebootstrap>
 * `git clone git://git.liw.fi/vmdebootstrap`

creating tag page tag/idea
diff --git a/tag/idea.mdwn b/tag/idea.mdwn
new file mode 100644
index 0000000..d7f58c7
--- /dev/null
+++ b/tag/idea.mdwn
@@ -0,0 +1,4 @@
+[[!meta title="pages tagged idea"]]
+
+[[!inline pages="tagged(idea)" actions="no" archive="yes"
+feedshow=10]]

Add idea fstabcmd
diff --git a/ideas/fstabcmd.mdwn b/ideas/fstabcmd.mdwn
new file mode 100644
index 0000000..94c8560
--- /dev/null
+++ b/ideas/fstabcmd.mdwn
@@ -0,0 +1,35 @@
+[[!meta title="fatab command"]]
+[[!tag idea]]
+
+Sometimes I wish for a command to edit `/etc/fstab`. Something like
+the follow.
+
+Add a new entry:
+
+    fstab add -s LABEL=scratch -w /scratch -o rw -o user_xattr -t btrfs
+
+Add an entry based on an existing mount (get device, other settings,
+from the mount point):
+
+    fstab add -m /scratch
+
+Remove an entry:
+
+    fstab remove /scratch
+
+Modify an existing entry:
+
+    fstab edit /scratch -o +foo -o -bar -t auto
+
+Check that `/etc/fstab` looks OK:
+
+    fstab check
+
+Edit `/etc/fstab` in an editor and, afterwards, check that it looks OK
+(c.f. `visudo`).
+
+    fstab vi
+
+Re-format `/etc/fstab` so that it looks pretty:
+
+    fstab prettify

Update cmdtest NEWS
diff --git a/cmdtest/NEWS.mdwn b/cmdtest/NEWS.mdwn
index 2220611..a1d18cc 100644
--- a/cmdtest/NEWS.mdwn
+++ b/cmdtest/NEWS.mdwn
@@ -3,6 +3,24 @@ NEWS for cmdtest
 
 This file summarizes changes between releases of cmdtest.
 
+Version 0.18, released 2015-11-06
+---------------------------------
+
+* Code blocks that are examples are now supported.
+
+* Snapshot directories are now created only when `--snapshot` is used.
+
+Version 0.17, released 2015-09-21
+---------------------------------
+
+* Yarn now flushes outputs (stdout, stderr) whenever it writes
+  anything. This should avoid some problems with programs that capture
+  yarn output, such as CI systems, and get the timings differently
+  from what would happen on a terminal.
+
+* The `--require-assumptions` option has been added to tell Yarn to
+  treat failing ASSUMPTIONS steps as errors.
+
 Version 0.16, released 2015-06-30
 ---------------------------------
 

Add link to distix.eu
diff --git a/distix.mdwn b/distix.mdwn
index 1a211f1..d8a59a4 100644
--- a/distix.mdwn
+++ b/distix.mdwn
@@ -7,6 +7,7 @@ develop distix.
 
 You want the [[performance-art]] subpage for now.
 
+* [this will become the home page](http://distix.eu)
 * [[README]]
 * [[NEWS]] (release notes)
 * [[TUTORIAL]]

Add sources.list line for jessie
diff --git a/code.mdwn b/code.mdwn
index bb077c8..41110f8 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -26,6 +26,7 @@ You're welcome to use the repository. To do so, add **one of** the
 following to your `sources.list` file:
 
     deb http://code.liw.fi/debian wheezy main
+    deb http://code.liw.fi/debian jessie main
     deb http://code.liw.fi/debian unstable main
 
 The [PGP key that is used to sign the Release 

Remove obsolete links
diff --git a/links.mdwn b/links.mdwn
index 10513d2..5fb91c0 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -132,10 +132,6 @@ incarnation of that web page.
 [Calumet](http://www.calumetphoto.co.uk/)
 [Camera Price Buster UK](http://www.camerapricebuster.co.uk/)
 
-**Offices:**
-[Ring Table](http://www.tmproductions.com/RingTable/)
-[Tame cables](http://www.pcworld.com/article/92925/stepbystep_eight_tips_to_tame_cables.html)
-
 **Travel/transport:**
 [International power and plugs](http://www.dbicorporation.com/internat/intpower.htm)
 [IEC connector](http://en.wikipedia.org/wiki/IEC_connector)

Update cliapp NEWS
diff --git a/cliapp/NEWS.mdwn b/cliapp/NEWS.mdwn
index 7066dee..1890f7b 100644
--- a/cliapp/NEWS.mdwn
+++ b/cliapp/NEWS.mdwn
@@ -1,6 +1,27 @@
 NEWS for cliapp
 ===============
 
+Version 1.20150829
+------------------
+
+Important, backwards incompatible bug fixes:
+
+* Jan Gerber fixed string list option handling. Command line options
+  no longer parse values by commas, so that `--foo=bar,foobar` results
+  in a single value `bar,foobar`, instead of two values (`bar` and
+  `foobar`). Also, in configuration files, values may be quoted with
+  double quotes.
+
+Bug fixes:
+
+* Memory use profiling with Meliae was fixed.
+
+New features:
+
+* Richard Ipsum added the `cliapp.Application.get_subcommand_usage`
+  method to return a short usage text for a subcommand. This allows
+  better error message.
+
 Version 1.20150701
 ------------------
 

Close bug
diff --git a/larch/bugs/remove_range-slow.mdwn b/larch/bugs/remove_range-slow.mdwn
index 546ae66..7c8623e 100644
--- a/larch/bugs/remove_range-slow.mdwn
+++ b/larch/bugs/remove_range-slow.mdwn
@@ -1,3 +1,6 @@
 The `remove_range` method is implemented in a simplistic manner,
 and is fairly slow. It should be optimized, but my attempts to
 do so have resulted in bugs so far. --liw
+
+[[done]] Larch is in serious-bug-fixes-only mode. This isn't serious enough.
+--liw

Close bug
diff --git a/larch/bugs/insert-remove-code-too-tricky.mdwn b/larch/bugs/insert-remove-code-too-tricky.mdwn
index fde35d7..5b8c220 100644
--- a/larch/bugs/insert-remove-code-too-tricky.mdwn
+++ b/larch/bugs/insert-remove-code-too-tricky.mdwn
@@ -1,3 +1,5 @@
 The B-tree insert and remove code should be simplified so it is not
 so tricky (and, hence, fragile if there's a need to change).  --liw
 
+[[done]] Larch is in serious-bug-fixes-only mode. This isn't serious enough.
+--liw

Close bug
diff --git a/larch/bugs/vivify-unnecessary-round-trip.mdwn b/larch/bugs/vivify-unnecessary-round-trip.mdwn
index dc6b474..06067e5 100644
--- a/larch/bugs/vivify-unnecessary-round-trip.mdwn
+++ b/larch/bugs/vivify-unnecessary-round-trip.mdwn
@@ -1,2 +1,5 @@
 It seems `_vivify` does a "test, then do" thing, instead of doing a
 "do, handle error" thing. This costs an extra round trip. --liw
+
+[[done]] Larch is in serious-bug-fixes-only mode. This isn't serious enough.
+--liw

Close bug
diff --git a/larch/bugs/does-not-remove-empty-dirs-from-journal.mdwn b/larch/bugs/does-not-remove-empty-dirs-from-journal.mdwn
index adceae2..706b398 100644
--- a/larch/bugs/does-not-remove-empty-dirs-from-journal.mdwn
+++ b/larch/bugs/does-not-remove-empty-dirs-from-journal.mdwn
@@ -1,2 +1,5 @@
 When committing the journal, empty dirs in the `new` subdir should
 be removed, so they do not accumulate indefinitely. --liw
+
+[[done]] Larch is in serious-bug-fixes-only mode. This isn't serious enough.
+--liw

Close bug
diff --git a/larch/bugs/use-listdir2-in-journal.mdwn b/larch/bugs/use-listdir2-in-journal.mdwn
index 5c3750b..c85ef6e 100644
--- a/larch/bugs/use-listdir2-in-journal.mdwn
+++ b/larch/bugs/use-listdir2-in-journal.mdwn
@@ -2,3 +2,6 @@ For performance, larch's journal should use listdir2 so it does not
 need to stat everything manually. sftp provides the stat results
 with a single roundtrip for everything in the directory. However,
 this needs to be done carefully, for backwards compatbility. --liw
+
+[[done]] larch is in maintenance-only mode and I won't be fixing this
+unless it's crucial. --liw

Close bug
diff --git a/genbackupdata/bugs/too-compressible.mdwn b/genbackupdata/bugs/too-compressible.mdwn
index 24d8083..e83cda9 100644
--- a/genbackupdata/bugs/too-compressible.mdwn
+++ b/genbackupdata/bugs/too-compressible.mdwn
@@ -6,3 +6,7 @@ slow. --liw
 
 Check out http://bzr.rjek.com/public/arcfour for code that generates
 random data quickly. It's in C, which may be necessary. --liw
+
+---
+
+[[done]] --liw

Close bug
diff --git a/cliapp/bugs/app-or-user-specified-plugin-dirs.mdwn b/cliapp/bugs/app-or-user-specified-plugin-dirs.mdwn
index 690f083..ff3cccf 100644
--- a/cliapp/bugs/app-or-user-specified-plugin-dirs.mdwn
+++ b/cliapp/bugs/app-or-user-specified-plugin-dirs.mdwn
@@ -1,2 +1,4 @@
 Add to cliapp a way for app or user to add a list of directories to scan
 for plugins.
+
+[[done]] Another long-lived-nothing-happend wishlist bug. --liw

Close bug
diff --git a/cliapp/bugs/multiple-log-files.mdwn b/cliapp/bugs/multiple-log-files.mdwn
index 00c2b12..6dd3b81 100644
--- a/cliapp/bugs/multiple-log-files.mdwn
+++ b/cliapp/bugs/multiple-log-files.mdwn
@@ -1 +1,6 @@
 It would be nice to have multiple log files, at different levels.
+
+---
+
+[[done]] Another long-lived wishlist bug that has not happened.
+This can be done by doing things with the `logging` library directly. --liw

Close bugs
diff --git a/cliapp/bugs/runcmd-output-capture-callbacks.mdwn b/cliapp/bugs/runcmd-output-capture-callbacks.mdwn
index 8e67c0f..17b4153 100644
--- a/cliapp/bugs/runcmd-output-capture-callbacks.mdwn
+++ b/cliapp/bugs/runcmd-output-capture-callbacks.mdwn
@@ -2,3 +2,5 @@ It would be nice to be able to capture, in real time, the output from the comman
 cliapp.runcmd runs, via callbacks or otherwise. Ideally, such callbacks could
 also filter/modify the output: if nothing else, this could reduce the amount of
 data runcmd keeps in memory at once. --liw
+
+[[done]]
diff --git a/cliapp/bugs/whence-setting-value.mdwn b/cliapp/bugs/whence-setting-value.mdwn
index 5e0f5a4..2fb1a8c 100644
--- a/cliapp/bugs/whence-setting-value.mdwn
+++ b/cliapp/bugs/whence-setting-value.mdwn
@@ -3,3 +3,9 @@ of where the value of each setting comes from: default? option?
 from a config file? which config file? and line in that file?
 
 Suggested-By: Daniel Silverstone
+
+---
+
+This is a good idea, but it's been on the wishlist for years and nothing happens.
+I'll implement it when there's an acute need, and for that I don't need a bug
+open. [[done]] --liw

Remove obsolete cafepress links
diff --git a/index.mdwn b/index.mdwn
index e0291f0..0d45ca7 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -15,7 +15,6 @@ Hello. I am Lars Wirzenius. Welcome to my little corner of cyberspace.
 * [My blog](http://blog.liw.fi)
 * [[My CV|cv]]
 * [Getting Things Done for Hackers](http://gtdfh.branchable.com/)
-* [Trunktees T-shirts](http://www.cafepress.com/trunktees)
 * [Branchable](http://www.branchable.com/) where this site is hosted
 
 <hr />
diff --git a/t.mdwn b/t.mdwn
index e7a63fb..0109d20 100644
--- a/t.mdwn
+++ b/t.mdwn
@@ -1,9 +1,6 @@
 Welcome!
 
-* [T-shirts](http://www.cafepress.com/trunktees)
 * [Getting Things Done for Hackers](http://gtdfh.branchable.com/)
   is my e-book about personal productivity for people who spend a
   lot of time with their computers.
 * [[Obnam]] is my backup software.
-
-See the sidebar for more links.

Add ick home page
diff --git a/ick.mdwn b/ick.mdwn
new file mode 100644
index 0000000..943b699
--- /dev/null
+++ b/ick.mdwn
@@ -0,0 +1,10 @@
+[[!meta title="ick - continuous integration"]]
+[[!tag program]]
+
+ick is a command line continous integration system I wrote for my own
+needs. You probably want something else instead.
+
+* Version control:
+    - <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/ick/>
+    - `git clone git://git.liw.fi/ick`
+* [Using stuff on code.liw.fi](http://liw.fi/code/)

Update cmdtest home page for new release
diff --git a/cmdtest/NEWS.mdwn b/cmdtest/NEWS.mdwn
index 340a5dc..2220611 100644
--- a/cmdtest/NEWS.mdwn
+++ b/cmdtest/NEWS.mdwn
@@ -3,6 +3,20 @@ NEWS for cmdtest
 
 This file summarizes changes between releases of cmdtest.
 
+Version 0.16, released 2015-06-30
+---------------------------------
+
+* Flush terminal status output whenever a new scenario or step is
+  started. This ensures the terminal isn't showing an earlier, very
+  fast step, when the actual current step is slow.
+
+Version 0.15, released 2015-06-29
+---------------------------------
+
+* Steps are indented when yarn is run in `--verbose` mode.
+
+* Failed scenarios are listed at the end of yarn output.
+
 Version 0.14, released 2015-03-05
 ---------------------------------
 

Update cliapp home page for new release
diff --git a/cliapp/NEWS.mdwn b/cliapp/NEWS.mdwn
index f600b9c..7066dee 100644
--- a/cliapp/NEWS.mdwn
+++ b/cliapp/NEWS.mdwn
@@ -1,6 +1,21 @@
 NEWS for cliapp
 ===============
 
+Version 1.20150701
+------------------
+
+* Lars Wirzenius added the `ssh_options` keyword argument to
+  `cliapp.ssh_runcmd` to allow adding command line options to the ssh
+  program.
+
+* Lars Wirzenius added the `remote_cwd` keyword argument to
+  `cliapp.ssh_runcmd` to allow the caller to easily change to a
+  directory on the server.
+
+* Support for `heapy` memory profile has been dropped. It's not
+  packaged for Debian, and is rarely available anywhere.
+
+
 Version 1.20150305
 ------------------
 
diff --git a/cliapp/example.py b/cliapp/example.py
index 14a56db..fe282be 100644
--- a/cliapp/example.py
+++ b/cliapp/example.py
@@ -31,16 +31,25 @@ class ExampleApp(cliapp.Application):
     '''A little fgrep-like tool.'''
 
     def add_settings(self):
-        self.settings.string_list(['pattern', 'e'],
-                                  'search for regular expression PATTERN',
-                                   metavar='REGEXP')
-
-        self.settings.boolean(['dummy'], 'this setting is ignored',
-                              group='Test Group')
-
-        self.settings.string(['yoyo'], 'yoyo', group=cliapp.config_group_name)
-
-        self.settings.string(['nono'], 'nono', default=None)
+        self.settings.string_list(
+            ['pattern', 'e'],
+            'search for regular expression PATTERN',
+            metavar='REGEXP')
+
+        self.settings.boolean(
+            ['dummy'],
+            'this setting is ignored',
+            group='Test Group')
+
+        self.settings.string(
+            ['yoyo'],
+            'yoyo',
+            group=cliapp.config_group_name)
+
+        self.settings.string(
+            ['nono'],
+            'nono',
+            default=None)
 
     # We override process_inputs to be able to do something after the last
     # input line.
@@ -50,12 +59,12 @@ class ExampleApp(cliapp.Application):
         self.output.write('There were %s matches.\n' % self.matches)
 
     def process_input_line(self, name, line):
-        logging.debug('processing %s:%s' % (name, self.lineno))
+        logging.debug('processing %s:%s', name, self.lineno)
         for pattern in self.settings['pattern']:
             if pattern in line:
                 self.output.write('%s:%s: %s' % (name, self.lineno, line))
                 self.matches += 1
-                logging.debug('Match: %s line %d' % (name, self.lineno))
+                logging.debug('Match: %s line %d', name, self.lineno)
 
 
 app = ExampleApp(version='0.1.2')
diff --git a/cliapp/example2.py b/cliapp/example2.py
index 1f061b9..972e880 100644
--- a/cliapp/example2.py
+++ b/cliapp/example2.py
@@ -23,7 +23,6 @@ Greet or insult people.
 
 
 import cliapp
-import logging
 
 
 class ExampleApp(cliapp.Application):
@@ -54,14 +53,17 @@ class ExampleApp(cliapp.Application):
             self.output.write('you suck, %s\n' % arg)
 
 
-app = ExampleApp(version='0.1.2', description='''
+app = ExampleApp(
+    version='0.1.2',
+    description='''
 Greet the user.
 Or possibly insult them. User's choice.
 ''',
-epilog='''
+    epilog='''
 This is the epilog.
 
 I hope you like it.
 ''')
+
 app.run()
 
diff --git a/cliapp/example4.py b/cliapp/example4.py
index f500bbd..c6ba78f 100644
--- a/cliapp/example4.py
+++ b/cliapp/example4.py
@@ -16,7 +16,6 @@
 
 
 import cliapp
-import logging
 
 
 class ExampleApp(cliapp.Application):
diff --git a/cliapp/example5.py b/cliapp/example5.py
index 2e83bae..c6ab7b2 100644
--- a/cliapp/example5.py
+++ b/cliapp/example5.py
@@ -16,7 +16,6 @@
 
 
 import cliapp
-import logging
 
 
 class LoggerApp(cliapp.Application):

Remove broken links
diff --git a/links.mdwn b/links.mdwn
index 2a9c182..10513d2 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -91,7 +91,6 @@ incarnation of that web page.
 [K&amp;R2 answers](http://clc-wiki.net/wiki/K%26R2_solutions)
 [The C10K problem](http://www.kegel.com/c10k.html)
 [Portland Pattern Repository](http://c2.com/cgi/wiki)
-[Pentomino](http://yucs.org/~gnivasch/pentomino/)
 [Kuhn UTF-8 test](http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt)
 [Hsieh hash](http://www.azillionmonkeys.com/qed/hash.html)
 [rsync](http://www.samba.org/rsync/tech_report/)
@@ -119,7 +118,6 @@ incarnation of that web page.
 
 **General net:**
 [feed validator](http://feedvalidator.org/)
-[showmyip](http://www.showmyip.com/)
 [pagerank](http://www.prchecker.info/check_page_rank.php)
 [down?](http://downforeveryoneorjustme.com/)
 [Reply-To munging still harmful](http://woozle.org/~neale/papers/reply-to-still-harmful.html)

Add link to liikennetilanne
diff --git a/links.mdwn b/links.mdwn
index 0d8e4a9..2a9c182 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -12,6 +12,7 @@ incarnation of that web page.
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
 [Aukiolot](http://www.pty.fi/kaupan-toiminta/aukioloajat/kaupan-aukioloajat-2015/)
+[Liikenne-tilanne](http://liikennetilanne.liikennevirasto.fi/)
 
 **Books:**
 [OpenLibrary](http://openlibrary.org)

Add link to Tuxedoe
diff --git a/links.mdwn b/links.mdwn
index 7ce2b8a..0d8e4a9 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -55,6 +55,7 @@ incarnation of that web page.
 [pcpartpicker](http://pcpartpicker.com/)
 [N40L](http://n40l.wikia.com/wiki/HP_MicroServer_N40L_Wiki)
 [Lenovo PSREF](http://lenovo.com/psref/)
+[Tuxedo](http://www.tuxedocomputers.com/)
 
 **Computer stores:**
 [crucial](http://www.crucial.com/uk/index.aspx)

Add note to idea
diff --git a/ideas/remote-executor.mdwn b/ideas/remote-executor.mdwn
index e918936..82e8adf 100644
--- a/ideas/remote-executor.mdwn
+++ b/ideas/remote-executor.mdwn
@@ -24,3 +24,6 @@ easier to handle in C.
 * Server sends a termination message when subprocess ends.
 * Client might send messages to do specific system calls (e.g., load
   average, statfs, etc).
+
+Possibly this should be stateless, or otherwise so that it's very easy
+to use from shell scripts that invoke ssh to run individual commands.

Add link to pcpartpicker
diff --git a/links.mdwn b/links.mdwn
index 410d631..7ce2b8a 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -52,6 +52,7 @@ incarnation of that web page.
 [luxio](http://www.rjek.com/bin/luxio/)
 
 **Hardware:**
+[pcpartpicker](http://pcpartpicker.com/)
 [N40L](http://n40l.wikia.com/wiki/HP_MicroServer_N40L_Wiki)
 [Lenovo PSREF](http://lenovo.com/psref/)
 

Remove dead link
diff --git a/links.mdwn b/links.mdwn
index fdc95f3..410d631 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -11,7 +11,6 @@ incarnation of that web page.
 **Frequent:**
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
-[Pyhäpäivät](http://www.juhlapyhät.fi/viralliset-pyhapaivat-ja-vapaapaivat)
 [Aukiolot](http://www.pty.fi/kaupan-toiminta/aukioloajat/kaupan-aukioloajat-2015/)
 
 **Books:**

Add idea about remote executor
diff --git a/ideas/remote-executor.mdwn b/ideas/remote-executor.mdwn
new file mode 100644
index 0000000..e918936
--- /dev/null
+++ b/ideas/remote-executor.mdwn
@@ -0,0 +1,26 @@
+It's often necessary to run commands on a remote Unix host. For
+example, a CI system will run jobs on worker machines, or a system
+test might do that to test a server. This is reasonably easy to do by
+running a command at a time over an ssh connection. However, it might
+be nice to have an agent on the remote end. The agent should be
+written in portable C and have a minimal size, so that it can be run
+even on embedded devices. (Most CI systems have an agent like this,
+but they're usually written in Java or another language that makes
+things difficult.)
+
+The agent would read messages from its stdin, and write messages to
+its stdout. Messages are in some systematic, structured form, perahps
+soething like JSON or YAML, but maybe with less overhead and perhaps
+easier to handle in C.
+
+* Client would request executing processes.
+    - argv
+    - env
+    - redirections, pipelines
+* Server responds with messages to confirm start of process, and
+  sending its stdout, stderr output (without extra buffering).
+* Client can send messages with data to feed to the process' stdin.
+* Client can send control messages, to send signals.
+* Server sends a termination message when subprocess ends.
+* Client might send messages to do specific system calls (e.g., load
+  average, statfs, etc).

Remove now-unnecessary computer store links
diff --git a/links.mdwn b/links.mdwn
index 1d85eae..fdc95f3 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -57,17 +57,8 @@ incarnation of that web page.
 [Lenovo PSREF](http://lenovo.com/psref/)
 
 **Computer stores:**
-[ccl](http://www.cclonline.com/)
-[micro direct](http://www.microdirect.co.uk/Home/)
-[pc world](http://pcworld.co.uk/gbuk/index.html)
-[maplin](http://www.maplin.co.uk/)
-[plugs](http://www.plugcomputer.org/)
-[pcspecialist](http://pcspecialist.co.uk/)
 [crucial](http://www.crucial.com/uk/index.aspx)
-[aria](http://www.aria.co.uk/)
-[Cubieboard](http://linux-sunxi.org/Cubieboard)
 [Tier 1](http://www.tier1online.com/)
-[Span](http://www.span.com/)
 [verkkokauppa](http://www.verkkokauppa.com)
 [jimms](http://www.jimms.fi)
 [TKV](http://www.tkvfinland.fi/)

Remove people section in links
diff --git a/links.mdwn b/links.mdwn
index 7bc6117..1d85eae 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -56,10 +56,6 @@ incarnation of that web page.
 [N40L](http://n40l.wikia.com/wiki/HP_MicroServer_N40L_Wiki)
 [Lenovo PSREF](http://lenovo.com/psref/)
 
-**People:**
-[Arno Wirzenius](http://www.iki.fi/arno.w/)
-[Jukka Rajala](http://www.jukkar.com/)
-
 **Computer stores:**
 [ccl](http://www.cclonline.com/)
 [micro direct](http://www.microdirect.co.uk/Home/)

Add page about taking notes
diff --git a/notetaking.mdwn b/notetaking.mdwn
new file mode 100644
index 0000000..c892004
--- /dev/null
+++ b/notetaking.mdwn
@@ -0,0 +1,60 @@
+[[!meta title="Note taking"]]
+[[!tag article]]
+
+I'm developing a system for taking notes, by hand and on my laptop.
+The note taking usually happens in a meeting or during a presentation.
+
+
+Manually
+========
+
+For notes taken by hand, pen on paper, I use the following system:
+
+* A title containing a date, plus a few words about the meeting or
+  whatever. For example, "2015-03-16 Backend architecture design".
+* A series of bullet points. The shape of the bullet point has
+  meaning.
+  - A standard bullet point: a note about something I should remember,
+    or something that was brought up in the meeting.
+  - A small square: an open action item for me. This may be something
+    I've explicitly committed to, or an idea for me to pursue after
+    the meeting if I decide to.
+  - A small square with a tick mark: an action item I've done. The
+    tick may be added after the meeting, as I do the action.
+  - A dash: something I want to bring up in the meeting.
+  - A plus (dash plus vertical line crossing it): something that's
+    already been brought up in the meeting.
+  - A cross (large X) over a square or dash: I've decided not to do
+    the action or bring up the point.
+  - A circle around a standard bullet point, square, or dash: I've
+    transferred this to my digital GTD system.
+* I leave a bit of margin on the left and right side of the page, and
+  try to do notes with an empty line or two between them, to allow
+  later additions and remarks on the notes.
+* I try to start each title on a new right-hand page, so that I can,
+  if need be, rip out the notes for a specific meeting, but only
+  those.
+* When I process my notes, I either mark individual points (see
+  above), or I draw a diagonal line across the whole page, to indicate
+  I've processed the notes and there's nothing remaining to do. The
+  diagonal line still leaves the page readable later, if need be.
+
+
+Digitally
+=========
+
+I take notes digitally on my laptop, using a text editor to a text
+file using Markdown. Since typing is faster than longhand, I tend to
+add more detail, and add subtitles etc.
+
+Notes from a meeting tend to have the following structure:
+
+* Date and title, summarising the purpose of the meeting.
+* People present.
+* Bullet points of notes from discussions, decisions. I go into as
+  much or as little detail as is necessary.
+* A separate list of actions to take. I usually only note actions that
+  are mine, or that I am blocked on, unless I'm writing full meeting
+  minutes to be shared.
+
+I keep these notes in my digital journal.

Remove temporary SO note
diff --git a/index.mdwn b/index.mdwn
index a525b83..e0291f0 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -24,7 +24,3 @@ All content on this site is copyrighted by Lars Wirzenius and possibly
 other authors (it's a wiki), and licensed under a <a rel="license"
 href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons
 Attribution-Share Alike 3.0 Unported License</a>.
-
-----
-
-Hello, Stack Overflow. Both liw@iki.fi and liw@liw.fi are my e-mail addresses.

Update for SO account recovery
diff --git a/index.mdwn b/index.mdwn
index e0291f0..a525b83 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -24,3 +24,7 @@ All content on this site is copyrighted by Lars Wirzenius and possibly
 other authors (it's a wiki), and licensed under a <a rel="license"
 href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons
 Attribution-Share Alike 3.0 Unported License</a>.
+
+----
+
+Hello, Stack Overflow. Both liw@iki.fi and liw@liw.fi are my e-mail addresses.

Update cliapp files for new release
diff --git a/cliapp.mdwn b/cliapp.mdwn
index b258a6b..c35ab39 100644
--- a/cliapp.mdwn
+++ b/cliapp.mdwn
@@ -12,7 +12,7 @@ compatible ways.
 * [[NEWS]]
 * [[cliapp(5) manual page|cliapp.5.txt]]
 * Examples: [[example.py]], [[example2.py]], [[example3.py]],
-  [[example4.py]].
+  [[example4.py]], [[example5.py]].
 * [API documentation](http://code.liw.fi/cliapp/docs/)
 * [[Using stuff on code.liw.fi|code]]
 * Version control:
diff --git a/cliapp/NEWS.mdwn b/cliapp/NEWS.mdwn
index 8c1a2f6..f600b9c 100644
--- a/cliapp/NEWS.mdwn
+++ b/cliapp/NEWS.mdwn
@@ -1,6 +1,24 @@
 NEWS for cliapp
 ===============
 
+Version 1.20150305
+------------------
+
+* Richard Ipsum added callbacks to `cliapp.runcmd` for handling
+  captured stdout/stderr output from the pipeline. This allows, for
+  example, progress reporting during a long-running command.
+
+* Richard Maw and Richard Ipsum fixed `cliapp.runcmd` to close file
+  descriptors correctly, to make `cliapp.runcmd(['cat', '/dev/zero'],
+  ['false'])` work correctly. Previously, the pipeline would never
+  finish, but now it does, because closing an unnecessary file
+  descriptor in the parent results in `SIGPIPE` being sent to the
+  `cat` process once `false` terminates.
+
+* Richard Maw changed `cliapp.runcmd` so that the stderr of all
+  commands in the pipeline are collected, when stderr is set to
+  `subprocess.PIPE`.
+
 Version 1.20140719
 ------------------
 
diff --git a/cliapp/README.mdwn b/cliapp/README.mdwn
index 448d44d..3e48aa6 100644
--- a/cliapp/README.mdwn
+++ b/cliapp/README.mdwn
@@ -33,7 +33,7 @@ Legalese
 --------
 
 * Copyright (C) 2011-2014  Lars Wirzenius
-* Copyright (C) 2012-2013  Codethink Limited
+* Copyright (C) 2012-2015  Codethink Limited
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/cliapp/cliapp.5.txt b/cliapp/cliapp.5.txt
index 7b7df85..9644ba7 100644
--- a/cliapp/cliapp.5.txt
+++ b/cliapp/cliapp.5.txt
@@ -1,31 +1,31 @@
-CLIAPP(5)                                                            CLIAPP(5)
+CLIAPP(5)		      File Formats Manual		     CLIAPP(5)
 
 
 
 NAME
-       cliapp  -  config  file  and option conventions for Python command line
+       cliapp  -  config  file	and option conventions for Python command line
        framework
 
 DESCRIPTION
-       cliapp is a Python  programming  framework  for  writing  command  line
+       cliapp is a Python  programming	framework  for	writing  command  line
        applications   for  Unix-like  operating  systems.   This  manual  page
        describes the conventions for  configuration  files  and  command  line
        parsing provided by cliapp.
 
        Configuration  file  variables  and command line options are handled by
        cliapp under a uniform abstraction: every setting is available both  in
-       configuration  files  and  command  line options.  There are a few set-
+       configuration  files  and  command  line options.  There are a few set‐
        tings, provided by the framework itself, which are  only  available  on
-       the command line.  For example, --help outputs a short help text, list-
-       ing all the available options, and --dump-config outputs a list of cur-
+       the command line.  For example, --help outputs a short help text, list‐
+       ing all the available options, and --dump-config outputs a list of cur‐
        rent configuration settings.
 
-       Command  line parsing follows GNU conventions: short options start with
+       Command	line parsing follows GNU conventions: short options start with
        a single dash, long options with two dashes, and options  may  be  used
        anywhere  on the command line.  The order of options versus non-options
        does not matter.  The exception is some of the options provided by  the
-       framework,  which  are executed immediately when found, and may be pre-
-       vent the rest of the options from being parsed.  (--dump-config is  one
+       framework,  which  are executed immediately when found, and may be pre‐
+       vent the rest of the options from being parsed.	(--dump-config is  one
        of  these,  so  use it at the end of the command line only.)  Use -- on
        the command line to signal the end of options: no arguments after  that
        are considered to be option.
@@ -33,11 +33,11 @@ DESCRIPTION
        Some  settings  may have aliases, which can be only a single character,
        and in that case they're parsed as single-character option names.
 
-       Some applications have subcommands, which means  that  the  first  non-
+       Some applications have subcommands, which means	that  the  first  non-
        option  argument  is  used to tell the application what to do.  This is
        similar to what many version control systems do, for example CVS,  svn,
        bzr, and git.  Options are global, and are not specific to subcommands.
-       Thus, --foo means the same thing,  regardless  of  what  subcommand  is
+       Thus, --foo means the same thing,  regardless  of  what	subcommand  is
        being used.
 
    Configuration files
@@ -45,44 +45,44 @@ DESCRIPTION
        [config] section.  Other sections are allowed, but  it  is  up  to  the
        application to give meaning to them.
 
-       Multiple  configuration  files  may  be read.  Settings from later ones
-       override settings from earlier ones.  Options  override  settings  from
+       Multiple  configuration	files  may  be read.  Settings from later ones
+       override settings from earlier ones.  Options  override	settings  from
        the configuration files.
 
    String list settings
        Some settings may be a list of values (each value being a string).  For
-       example, there might be a setting for patterns to search for, and  mul-
+       example, there might be a setting for patterns to search for, and  mul‐
        tiple patterns are allowed.  On the command line, that happens by using
        the option multiple times.  In the configuration file, all  values  are
-       given  on one line, separated by commas.  This is a non-standard exten-
+       given  on one line, separated by commas.  This is a non-standard exten‐
        sion to the INI file syntax.  There is no way to escape commas.
 
        Example:
 
-              [config]
-              pattern = foo, bar, foobar
+	      [config]
+	      pattern = foo, bar, foobar
 
    Boolean (true/false or on/off or yes/no) settings
        When a setting can be either on or off, it's called a Boolean  setting.
        Such  settings  are turned off by default, and turned on if used on the
        command line.  In a configuration file, they need to be set to a value:
-       if  the  value is one of yes, on, true, or the number 1, the setting is
+       if  the	value is one of yes, on, true, or the number 1, the setting is
        turned on.  Any other value means it is turned off.
 
-              [config]
-              verbose = true
-              attack-kittens = no
+	      [config]
+	      verbose = true
+	      attack-kittens = no
 
        This turns the verbose setting on, but does not launch attack kittens.
 
        For every boolean setting, two command line options are added.  If  the
-       setting  is  called foo, the option --foo will turn the setting on, and
+       setting	is  called foo, the option --foo will turn the setting on, and
        --no-foo will turn it off.  The negation is only usable on the  command
        line:  its  purpose  is to allow the command line to override a setting
        from the configuration file.
 
    Logging and log files
-       Programs using cliapp automatically support several options for config-
+       Programs using cliapp automatically support several options for config‐
        uring  the  Python  logging  module.  See the --help output for options
        starting with log for details.  Logging can happen to  a  file  or  the
        system log.  Log files can be rotated automatically based on size.
@@ -91,30 +91,30 @@ DESCRIPTION
        only useful for programmers.  The option configures the tracing library
        for Python, by Lars Wirzenius, which allows logging values of variables
        and other debug information in a way that is very lightweight when  the
-       tracing  is  turned  off.   The  option specifies for which source code
-       files to turn on tracing.  The actual logging happens  via  the  normal
+       tracing	is  turned  off.   The	option specifies for which source code
+       files to turn on tracing.  The actual logging happens  via  the	normal
        Python logging facilities, at the debug level.
 
    Python profiling support
        You  can  run  the  application under the Python profiler (cProfile) by
-       setting an environment variable.  The name of the variable is  FOO_PRO-
+       setting an environment variable.  The name of the variable is  FOO_PRO‐
        FILE,  where  FOO is the name of the program, as set by the application
-       code or determined by cliapp automatically.  The value of the  environ-
+       code or determined by cliapp automatically.  The value of the  environ‐
        ment variable is the name of the file to which the resulting profile is
        to be written.
 
    Manual page generation
-       cliapp can generate parts of a manual page: the  SYNOPSIS  and  OPTIONS
+       cliapp can generate parts of a manual page: the	SYNOPSIS  and  OPTIONS
        sections.   It fills these in automatically based on the subcommand and
-       settings that a  program  supports.   Use  the  --generate-manpage=FILE
-       option,  which  is added automatically by cliapp.  The FILE is a manual
+       settings that a	program  supports.   Use  the  --generate-manpage=FILE
+       option,	which  is added automatically by cliapp.  The FILE is a manual
        page marked up using the -man macros  for  troff(1).   It  should  have

(Diff truncated)
Update cmetest files for 0.14
diff --git a/cmdtest/NEWS.mdwn b/cmdtest/NEWS.mdwn
index 9c3eb04..340a5dc 100644
--- a/cmdtest/NEWS.mdwn
+++ b/cmdtest/NEWS.mdwn
@@ -3,6 +3,15 @@ NEWS for cmdtest
 
 This file summarizes changes between releases of cmdtest.
 
+Version 0.14, released 2015-03-05
+---------------------------------
+
+* Yarn now supports continuation lines: start a line with `...` and it
+  continues the previous line.
+
+* Yarn now works with UTF-8 input. No other character sets are
+  supported; sorry (but patches welcome).
+
 Version 0.12, released 2014-03-28
 ---------------------------------
 
diff --git a/cmdtest/README.mdwn b/cmdtest/README.mdwn
index b83eabc..0b4166b 100644
--- a/cmdtest/README.mdwn
+++ b/cmdtest/README.mdwn
@@ -15,6 +15,11 @@ If not, it reports problems, and shows the differences.
 
 See the manual page for details on how to use the program.
 
+`cmdtest` is now in maintenance mode. I do not expect to add any new
+features, but I will fix bugs. `yarn` is now the preferred tool, as it
+seems to actually fit better the kinds of testing I and others have
+been trying to do with `cmdtest`.
+
 
 yarn
 ----
@@ -36,7 +41,7 @@ See README.yarn for more details.
 Legalese
 --------
 
-Copyright 2011-2013 Lars Wirzenius
+Copyright 2011-2015 Lars Wirzenius
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/cmdtest/README.yarn.mdwn b/cmdtest/README.yarn.mdwn
index 5f1c7a2..843fac8 100644
--- a/cmdtest/README.yarn.mdwn
+++ b/cmdtest/README.yarn.mdwn
@@ -99,7 +99,9 @@ A test document is written in [Markdown][markdown], with block
 quoted code blocks being interpreted specially. Each block
 must follow the syntax defined here.
 
-* Every step in a scenario is one line, and starts with a keyword.
+* Every step in a scenario is one logical line, and starts with a
+  keyword. A step can be continued on the next physical line by
+  starting the next line with `...` (three dots, followed by a space).
 
 * Each implementation (IMPLEMENTS) starts as a new block, and
   continues until there is a block that starts with another
diff --git a/cmdtest/cmdtest.1.txt b/cmdtest/cmdtest.1.txt
index 866a5b8..2de3efd 100644
--- a/cmdtest/cmdtest.1.txt
+++ b/cmdtest/cmdtest.1.txt
@@ -1,4 +1,4 @@
-CMDTEST(1)                                                          CMDTEST(1)
+CMDTEST(1)		    General Commands Manual		    CMDTEST(1)
 
 
 
@@ -6,83 +6,82 @@ NAME
        cmdtest - blackbox testing of Unix command line tools
 
 SYNOPSIS
-       cmdtest      [-c=COMMAND]      [--command=COMMAND]      [--config=FILE]
-       [--dump-config]  [--dump-memory-profile=METHOD]  [--dump-setting-names]
+       cmdtest	    [-c=COMMAND]      [--command=COMMAND]      [--config=FILE]
+       [--dump-config]	[--dump-memory-profile=METHOD]	[--dump-setting-names]
        [--generate-manpage=TEMPLATE]  [-h] [--help] [--help-all] [-k] [--keep]
        [--list-config-files] [--log=FILE]  [--log-keep=N]  [--log-level=LEVEL]
        [--log-max=SIZE]   [--log-mode=MODE]   [--memory-dump-interval=SECONDS]
-       [--no-default-configs]   [--no-keep]   [--no-timings]   [--output=FILE]
+       [--no-default-configs]	[--no-keep]   [--no-timings]   [--output=FILE]
        [-t=TEST] [--test=TEST] [--timings] [--version] [FILE]...
 
 DESCRIPTION
-       cmdtest  black  box  tests  Unix  command  line tools.  Given some test
-       scripts, their inputs, and expected outputs, it verifies that the  com-
+       cmdtest	black  box  tests  Unix  command  line tools.  Given some test
+       scripts, their inputs, and expected outputs, it verifies that the  com‐
        mand  line  produces the expected output.  If not, it reports problems,
        and shows the differences.
 
        Each test case foo consists of the following files:
 
        foo.script
-              a script to run the test (this is required)
+	      a script to run the test (this is required)
 
        foo.stdin
-              the file fed to standard input
+	      the file fed to standard input
 
        foo.stdout
-              the expected output to the standard output
+	      the expected output to the standard output
 
        foo.stderr
-              the expected output to the standard error
+	      the expected output to the standard error
 
        foo.exit
-              the expected exit code
+	      the expected exit code
 
        foo.setup
-              a shell script to run before the test
+	      a shell script to run before the test
 
        foo.teardown
-              a shell script to run after test
+	      a shell script to run after test
 
        Usually, a single test is not enough. All tests are put into  the  same
        directory, and they may share some setup and teardown code:
 
        setup-once
-              a shell script to run once, before any tests
+	      a shell script to run once, before any tests
 
        setup  a shell script to run before each test
 
        teardown
-              a shell script to run after each test
+	      a shell script to run after each test
 
        teardown-once
-              a shell script to run once, after all tests
+	      a shell script to run once, after all tests
 
-       cmdtest  is given the name of the directory with all the tests, or sev-
+       cmdtest	is given the name of the directory with all the tests, or sev‐
        eral such directories, and it does the following:
 
-       o execute setup-once
+       · execute setup-once
 
-       o for each test case (unique prefix foo):
+       · for each test case (unique prefix foo):
 
-              -- execute setup
+	      — execute setup
 
-              -- execute foo.setup
+	      — execute foo.setup
 
-              -- execute the command, by running foo.script, and redirecting
-                standard input to come from foo.stdin, and capturing standard
-                output and error and exit codes
+	      — execute the command, by running foo.script, and redirecting
+		standard input to come from foo.stdin, and capturing standard
+		output and error and exit codes
 
-              -- execute foo.teardown
+	      — execute foo.teardown
 
-              -- execute teardown
+	      — execute teardown
 
-              -- report result of test: does exit code match foo.exit,
-                standard output match foo.stdout, and standard error match
-                foo.stderr?
+	      — report result of test: does exit code match foo.exit, standard
+		output match foo.stdout, and standard error match foo.stderr?
 
-       o execute teardown-once
+       · execute teardown-once
 
-       Except for foo.script, all of these files are optional.  If a setup or
+       Except for foo.script, all of these files are optional.	If a setup or
        teardown script is missing, it is simply not executed.  If one of the
        standard input, output, or error files is missing, it is treated as if
        it were empty.  If the exit code file is missing, it is treated as if
@@ -91,26 +90,26 @@ DESCRIPTION
        The shell scripts may use the following environment variables:
 
        DATADIR
-              a temporary directory where files may be created by the test
+	      a temporary directory where files may be created by the test
 
        TESTNAME
-              name of the current test (will be empty for setup-once and tear-
-              down-once)
+	      name of the current test (will be empty for setup-once and tear‐
+	      down-once)
 
        SRCDIR directory from which cmdtest was launched
 
 OPTIONS
        -c, --command=COMMAND

(Diff truncated)
Switch back to real provider
diff --git a/index.mdwn b/index.mdwn
index df40543..e0291f0 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -1,5 +1,6 @@
 [[!meta openid="http://liw.fi/"
-server="http://www.livejournal.com/openid/server.bml"]]
+server="http://openid.kitenet.net:8081/simpleid/"]]
+
 
 # Welcome
 

Fix LJ provider
diff --git a/index.mdwn b/index.mdwn
index c00dccd..df40543 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -1,5 +1,5 @@
 [[!meta openid="http://liw.fi/"
-server="http://liwliw.livejournal.com/"]]
+server="http://www.livejournal.com/openid/server.bml"]]
 
 # Welcome
 

Temporarily switch to LJ provider
diff --git a/index.mdwn b/index.mdwn
index 62df1e0..c00dccd 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -1,5 +1,5 @@
 [[!meta openid="http://liw.fi/"
-server="https://openid.stackexchange.com/openid/provider"]]
+server="http://liwliw.livejournal.com/"]]
 
 # Welcome
 

Temporarily switch to SO provider
diff --git a/index.mdwn b/index.mdwn
index a0fc317..62df1e0 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -1,5 +1,5 @@
 [[!meta openid="http://liw.fi/"
-server="http://openid.kitenet.net:8081/simpleid/"]]
+server="https://openid.stackexchange.com/openid/provider"]]
 
 # Welcome
 

Tag dynstr as orphaned
diff --git a/dynstr.mdwn b/dynstr.mdwn
index d0d0c9d..569ff01 100644
--- a/dynstr.mdwn
+++ b/dynstr.mdwn
@@ -1,5 +1,5 @@
 [[!meta title="Dynamic string library for C"]]
-[[!tag program]]
+[[!tag orphaned-project]]
 
 This is a library for managing dynamic C strings of bytes (not
 multibyte characters). It is also a training vehicle for me to

Tag uninteresting bug as done
diff --git a/summain/bugs/exclude-paths.mdwn b/summain/bugs/exclude-paths.mdwn
index ec9214b..dbb17f2 100644
--- a/summain/bugs/exclude-paths.mdwn
+++ b/summain/bugs/exclude-paths.mdwn
@@ -2,3 +2,6 @@ Would be nice if Summain could exclude specific paths, e.g., .git directories,
 when it recurses. Or read the list of paths to include in the manifest, without
 recursing over directories, from the stdin, so the paths could be selected
 with find. --liw
+
+This is better done by being able to feed things to summain from find.
+[[done]] --liw

Note that vmdebootstrap is now by codehelp
diff --git a/vmdebootstrap.mdwn b/vmdebootstrap.mdwn
index d3ed3eb..593bf8a 100644
--- a/vmdebootstrap.mdwn
+++ b/vmdebootstrap.mdwn
@@ -4,6 +4,8 @@
 `chroot`(8). `vmdeboostrap` is a wrapper around it to install Debian into a disk
 image, which can be used with a virtual machine (such as KVM).
 
+`vmdebootstrap` is now mainteind by Neil Williams.
+
 * <http://git.liw.fi/cgi-bin/cgit/cgit.cgi/vmdebootstrap>
 * `git clone git://git.liw.fi/vmdebootstrap`
 * [Debian](http://packages.qa.debian.org/v/vmdebootstrap.html)

Tag xchat-plugins-liw as orphaned
diff --git a/xchat-plugins-liw.mdwn b/xchat-plugins-liw.mdwn
index b50c01c..3a8fa79 100644
--- a/xchat-plugins-liw.mdwn
+++ b/xchat-plugins-liw.mdwn
@@ -1,4 +1,4 @@
-[[!tag program]]
+[[!tag orphaned-project]]
 
 I use xchat as my IRC client, and I have a couple of plugins I use with it.
 

Add links
diff --git a/links.mdwn b/links.mdwn
index ea46ba7..7bc6117 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -11,6 +11,8 @@ incarnation of that web page.
 **Frequent:**
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
+[Pyhäpäivät](http://www.juhlapyhät.fi/viralliset-pyhapaivat-ja-vapaapaivat)
+[Aukiolot](http://www.pty.fi/kaupan-toiminta/aukioloajat/kaupan-aukioloajat-2015/)
 
 **Books:**
 [OpenLibrary](http://openlibrary.org)

Add link to TKV
diff --git a/links.mdwn b/links.mdwn
index 2d95cc4..ea46ba7 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -72,6 +72,7 @@ incarnation of that web page.
 [Span](http://www.span.com/)
 [verkkokauppa](http://www.verkkokauppa.com)
 [jimms](http://www.jimms.fi)
+[TKV](http://www.tkvfinland.fi/)
 
 **Approved content sources:**
 [Amazon UK](http://www.amazon.co.uk/)

Add parallel-cp idea
diff --git a/ideas/parallel-cp.mdwn b/ideas/parallel-cp.mdwn
new file mode 100644
index 0000000..3f5d076
--- /dev/null
+++ b/ideas/parallel-cp.mdwn
@@ -0,0 +1,5 @@
+It would be nice to be able to copy multiple lines in parallel
+("cp --parallel=16"). This would be useful when several files
+can be accessed at the same speed as one, e.g., because they're
+on different disks, or they're produced by mp3fs or similar FUSE
+filesystem.

Add system-imager idea
diff --git a/ideas/system-imager.mdwn b/ideas/system-imager.mdwn
new file mode 100644
index 0000000..a0fcc91
--- /dev/null
+++ b/ideas/system-imager.mdwn
@@ -0,0 +1,3 @@
+It would be nice to be able to image an existing system. The image should be
+possible to transfer to another system, or run as a VM, e.g., for testing
+upgrades without breaking the real system.

Add recompress idea
diff --git a/ideas/recompress.mdwn b/ideas/recompress.mdwn
new file mode 100644
index 0000000..5d9d0db
--- /dev/null
+++ b/ideas/recompress.mdwn
@@ -0,0 +1,7 @@
+Every decade or so there's a new cool tool for lossless data compression.
+This results in a need to re-compress all existing files, to gain benefit from the
+new tool. A general re-compression tool would be nice.
+
+It should be paranoid about losing data and not get rid of the previous file until
+it's clear that the new file is OK. Ideally, it should also avoid re-compressing
+a file unless the new file is smaller.

Add fstablint idea
diff --git a/ideas/fstablint.mdwn b/ideas/fstablint.mdwn
new file mode 100644
index 0000000..8b6ae41
--- /dev/null
+++ b/ideas/fstablint.mdwn
@@ -0,0 +1,2 @@
+A tool for checking, in great nitpicking detail, /etc/fstab. For exmaple,
+it should tell me if I'm missing a nofail mount option.

Add idea
diff --git a/ideas/webcam-whiteboard.mdwn b/ideas/webcam-whiteboard.mdwn
new file mode 100644
index 0000000..ba584a9
--- /dev/null
+++ b/ideas/webcam-whiteboard.mdwn
@@ -0,0 +1,2 @@
+It'd be cool to mount a webcam so it can monitor a whiteboard, and
+automatically take a snapshot when it has been drawn on.

Remove UK bank holidays link
diff --git a/links.mdwn b/links.mdwn
index 6aa3c4e..2d95cc4 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -11,7 +11,6 @@ incarnation of that web page.
 **Frequent:**
 [Valuutat](http://www.suomenpankki.fi/en/tilastot/valuuttakurssit/Pages/tilastot_valuuttakurssit_valuuttakurssit_today_en.aspx)
 [Sanakirja](http://www.sanakirja.org/)
-[UK Bank holidays](http://www.direct.gov.uk/en/Employment/Employees/Timeoffandholidays/DG_073741)
 
 **Books:**
 [OpenLibrary](http://openlibrary.org)

Orphan seivot
diff --git a/seivot.mdwn b/seivot.mdwn
index 6e174a3..d73b2a5 100644
--- a/seivot.mdwn
+++ b/seivot.mdwn
@@ -1,5 +1,8 @@
 [[!meta title="seivot: backup benchmarking"]]
-[[!tag program]]
+[[!tag orphaned-project]]
+
+**Note that I do not develop seivot anymore. It has probably bit-rotted badly by now.
+If you would like to take over it, please do.**
 
 Seivot is a program I wrote with Richard Braakman to run simple
 benchmarks for backup programs.

Add current job to CV
diff --git a/cv.mdwn b/cv.mdwn
index f4b2948..0f9a0e4 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -25,7 +25,9 @@ Stuff I know best:
 
 ## Experience and training
 
-**Codethink 2011-current.** I have served in a variety of roles,
+**Suomen Tilaajavastuu 2014-current.** Architect web services.
+
+**Codethink 2011-2014.** I have served in a variety of roles,
 including technical lead, architect, and developer, for
 [Baserock](http://wiki.baserock.org/), a new way of building and
 developing embedded and appliance Linux systems. Baserock is open

Update CV
diff --git a/cv.mdwn b/cv.mdwn
index cef0f11..f4b2948 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -1,216 +1,109 @@
-[[!meta title="CV / Lars Wirzenius"]]
-
-## Contact information
+# CV for Lars Wirzenius
 
     Lars Wirzenius
     E-mail: liw@liw.fi
-    (Other information available on request.)
+    (Other contact information available on request.)
 
 ## Introduction
 
-I am a computer programmer, and have been programming since 1984.
-
-My main programming languages are C and Python. I know TDD, HTML, 
-TCP/IP, and many other acronyms.
+I am a computer programmer, since 1984. I am an expert in the Linux
+environment, and have developed free and open source software for
+decades. I develop software at all levels, from architectural design
+down to writing even the lowest level of the code.
 
-I am an expert in the Linux environment. Linux and Unix environments
-are the only ones I am looking to work in.
+I am a Finnish citizen, and speak Finnish, Swedish, and English, with
+a smidgen of German.
 
-I want to develop software, at all levels from architectural design
-down to writing even the lowest level code to implement the
-architecture. I am not a tester, and I prefer to do very limited
-amounts of system or network administration work.
-
-## Stuff I know best
+Stuff I know best:
 
 * The Python language. I've used Python since 1993, and most of my new
   code in the past decade has been written in Python.
-  - code samples: see my [programs](http://liw.fi/tag/program/) page
-  - [Tutorial](http://wiki.debian.org/DebianWomen/PythonTutorial)
-    I gave for the Debian-Women project about Python, in 2006
-* The C language. I've used C since 1987, mainly on various Unix-like
-  environments, plus a little bit of embedded development. (I don't
-  know much C++.)
-* Linux in general, Debian in particular.
-
-I also know, at least somewhat, a variety of other things: Ikiwiki,
-Perl, Markdown, HTML/CSS.
+* The C language. I've used C since 1987, mainly in various Unix-like
+  environments, though originally on 8086 under MS-DOS, plus a little
+  bit of embedded development. (I don't know much C++.)
+* Linux in general, and the Debian distribution in particular.
 
-## Work and training
+## Experience and training
 
 **Codethink 2011-current.** I have served in a variety of roles,
 including technical lead, architect, and developer, for
 [Baserock](http://wiki.baserock.org/), a new way of building and
-developing embedded and appliance Linux systems.
+developing embedded and appliance Linux systems. Baserock is open
+source.
 
 **Consultant 2005-2011.** I've worked on variety of projects for
-several clients. In 2005-2006 I was under contract to improve the
-technical quality of the Debian operating system, and as part of
-that work developed [piuparts](http://piuparts.debian.org/), 
-a package testing tool for checking
-that packages can be installed, upgraded, and removed without 
-problems.
-
-In 2007-2009 I contracted to Canonical, Ltd. to
-do Ubuntu development. As part of that I developed the [Computer
-Janitor](https://launchpad.net/computer-janitor) 
-tool to find unnecessary packages, and do some configuration
-tweaks, such as adding or removing mount options to improve
-performance.
-
-In 2010 I contracted to Catalyst, Ltd, in New Zealand, to work
-on [Koha](http://koha-community.org/), an integrated library
-management system.
+several clients, mainly on open source projects, such as Debian. In
+2005-2006 I was under contract to improve the technical quality of the
+Debian Linux distribution, and as part of that work developed
+[piuparts](http://piuparts.debian.org/), a package testing tool for
+checking that packages can be installed, upgraded, and removed without
+problems. Piuparts is open source. I also analysed bug reports and
+fixed bugs.
+
+In 2007-2009 I contracted to Canonical, Ltd. to develop Ubuntu.
+
+In 2010 I contracted to Catalyst, Ltd, in New Zealand, to work on
+[Koha](http://koha-community.org/), an open source integrated library
+management system. I helped with automated testing, and made Debian
+packages of the software.
 
 **[Collabora Ltd](http://www.collabora.co.uk/) 2011** I helped a client
 package some of their internal things for MeeGo. Was let go because
-client decided to not do much MeeGo stuff anymore.
+client decided to not do MeeGo stuff anymore.
 
-**[Branchable](http://www.branchable.com/) 2010-current.** This is
-a blog/wiki/website hosting service built on top of 
+**[Branchable](http://www.branchable.com/) 2010-current.** This is a
+blog/wiki/website hosting service built on top of
 [ikiwiki](http://ikiwiki.info/), together with Joey Hess. The entire
-stack is free software. Business model is to charge site owners,
-rather than try to milk venture capitalists or insert sites into
-sites and try to get revenue from that. The goal is not maximize
-sites, but to provide a service to those who value freedom for
-themselves and their sites.
-
-**[Oliotalo](http://www.oliotalo.fi/) 2002-2004.** Oliotalo develops
-applications for machine to machine communication: embedded computers
-are attached to vehicles, waste collectors, or other such machines, and
-communicate wirelessly with a server. This allows remote monitoring and
-telemetry and improves logistics and lowers maintenance costs. I have
-designed and implemented the embedded Lisp interpreter
-[Hedgehog](http://hedgehog.oliotalo.fi/) with which the embedded
-computers are programmed in Oliotalo projects. Using Hedgehog, I have
-developed alone and with others several embedded applications. I have
-also been responsible for Linux system administration for the company.
-
-**pieni.net, 2001-** Started a miniature shell-server ISP on the
-side with two friends.
-
-**Akumiitti Telematics / Keko Technologies 2001-2002.**
-Keko developed a platform for machine to machine communication.
-I designed and implemented an embedded software platform, the KEKO
-Terminal. Keko went bankrupt just as the product was getting
-finished for its first release, but before the product could be used.
-
-**Wapit Ltd 1999-2001.** I was project and team leader for the
-[Kannel](http://www.kannel.org/), an SMS and WAP gateway. Kannel is a
-multithreaded, multiprocess server that can handle high traffic loads. I
-was responsible for architectural design, implementation, and project
-management. Wapit went bankrupt, but Kannel is still in commercial
-production use worldwide.
-
-**Helsinki University of Technology / CS laboratory / [HiBase
-project](http://hibase.cs.hut.fi/) 1997-1999.** HiBase was a research
-project to develop a main memory database and functional programming
-language. The project ended in 2001 when Nokia withdrew funding. I
-participated in its implementation by doing C programming and Linux
-system administration.
-
-**University of Helsinki / Department of Computer Science
-1993-1996.** I was a teaching assistant, helping students with
-homework and checking their answers. I gave one lectured course on
-C programming.
-
-**Translator examination board summer 1990.** I implemented a database
-of official translators with dBase IV.
+stack is open source. This is a side project.
+
+**[Obnam](http://obnam.org) 2006-current.** I wrote a backup
+application and attempted to start a business providing backup
+services. The software is still in use and under development, the
+business didn't succeed.
+
+**[Oliotalo](http://www.oliotalo.fi/) 2002-2004.** Oliotalo developed
+applications for machine to machine communication and telemetry:
+embedded computers are attached to vehicles, waste collectors, or
+other such machines, get data from various sensors, and communicate
+wirelessly with a server. I designed and co-implemented the embedded
+Lisp interpreter, Hedgehog, with which the embedded computers were
+programmed in Oliotalo projects. Hedgehog was released as open source,
+but its website no longer exists.
+
+**pieni.net, 2001-2011** A shell-server ISP on the side.
+
+**Akumiitti Telematics / Keko Technologies 2001-2002.** Keko developed
+a platform for machine to machine communication. I designed and
+implemented the client-side embedded application platform.
+
+**Wapit Ltd 1999-2001.** I was project and team leader, and chief
+architect for the [Kannel](http://www.kannel.org/) SMS and WAP
+gateway. Kannel is an open source, multithreaded, multiprocess server
+that can handle high traffic loads. I was responsible for
+architectural design, implementation, and project management. Wapit
+went bankrupt, but Kannel is still in commercial production use
+worldwide.
+
+**Helsinki University of Technology / CS laboratory /
+[HiBase project](http://hibase.cs.hut.fi/) 1997-1999.** HiBase was a
+research project to develop a main memory database and functional
+programming language. I wrote C code and did some Linux system
+administration. HiBase was released as open source.
+
+**University of Helsinki / Department of Computer Science 1993-1996.**
+I was a teaching assistant, helping students with homework and
+checking their answers. I gave one full course on C programming.
 
 **University of Helsinki / Department of Computer Science 1988-2002.**
 Student, part-time studies from 1993 onwards on account of working full
 time. Not graduated.
 

(Diff truncated)