Oddmuse is the wiki engine running all the wikis at emacswiki.org – including EmacsWiki itself. My main interests are:

See OddmuseRoadmap for my thoughts about the design of Oddmuse.

2018-03-17 Oddmuse and the EU

I have started working on a plan for Oddmuse regarding the EU Data Protection Directive, today. You can read about it on the Oddmuse Wiki.

The basic idea is that I want to get rid of IP numbers as far as possible. I got rid of hostnames a while back already. But IP numbers are still to be found all over the place.

My plans:

  1. run the strip-host.pl script for all my sites
  2. work on the remaining issues as listed on link above


Add Comment

2018-03-05 Troff

When writing for this wiki, I am always conscious of how it will look using Gopher. Basically raw mode. This includes thinking about line breaks. And I end up not liking inline linking so much. It makes the plain text really hard to read. But writing the plain text with manual line breaks on a handheld device runs into the problem that iOS will autocapitalize all line beginnings. You have to “fix” that manually. And it uses “real” quotes, which are neither ASCII nor Latin-1 so older Gopher clients fail to display them correctly.

Into all this mess comes a Gopher post by dbucklin about using Troff. That’s an old formatting tool from the very early days. Way older than LaTeX, and that’s pretty old, too. It’s an excellent introduction for somebody who knows nothing about it. I want to give it a try because all the the things that are old but that have been kept alive by enthusiasts have their own ways of being super efficient.

I guess that’s why I use Emacs, too. It’s weird, but it works, if you adapt to it’s way of working. These things are like living fossils. We like to think that those are species that split off from the rest millennial ago and thus they are “primitive” but not so: they just evolved on their own, for exactly the same amount of time, and they are just as adapted to their niche as whatever mainstream is to its niche.

Anyway, looking at troff was very cool, but I think I will continue to manually write Markdown on these wiki pages and I just hope that future changes to this site will be able to automatically migrate from one format to the next. Then again, if you look at the old pages, you will see how well that worked in past as I switched markup rules. If you look hard enough, you will see how badly it worked, actually.

There is a lot of cover-up at work. HTML is being cached, for example. But every global search-and-replace operation that touches a page discards the cached HTML and regenerates it and therefore if those global search-and-replace operations don’t do their job, the leftover markup is broken, and the HTML cache is useless.

Oh well. Here is to hoping that Markdown will last longer than WikiWiki markup, UseModWiki markup, or WikiCreole markup. At least it’s not limited to just the wiki world!

I’m sure there is a Troff markup wiki somewhere. It would Be beautiful in plain text, HTML, or PDF. (I assume?) But I will stick to manually formatting the text I write in Markdown, for now.

That reminds me that my implementation of CommonMark is still sorely lacking.


Add Comment

2018-02-12 Gay Halifax

Every now and then I’m surprised to learn that the Rainbow Community for Halifax, Nova Scotia uses Oddmuse for their site. Daniel MacKay runs the site and that makes him the biggest Oddmuse user other than me, I think.

Oddmuse is the wiki engine running this site. A wiki is a kind of light weight content management system with an emphasis on simplicity (ideally, hah!). Basically anybody is can edit pages. Originally there was not much more to it than that and projects like Smallest Wiki showed how you could get these going in just a few lines of code. Or this wiki I wrote in Go a few years ago: Oddµ.

If you want to come and talk to us, fire up your IRC clients and join us on Freenode, in the #oddmuse channel. The link takes you to a web chat thing so that you can get a feel for it without having to struggle with an IRC client.


Add Comment

2018-02-02 Markdown

I’m having fun implementing the CommonMark Spec 0.28 for Oddmuse using their spec file for automated testing. Current status:

# Looks like you failed 493 tests of 624.

Implementing simple stuff is fun. :)


Comments on 2018-02-02 Markdown

OK, sometimes it is not as fun it could be:

This is not emphasis, because the closing * is preceded by whitespace:
*foo bar *

This is hard for the Oddmuse parser because it works like a state machine and prints immediately when looking at every token. So for Oddmuse, starting at the first * it sees a legal beginning of emphasis and prints <em> without considering whether there is a legal end to this emphasis. Oddmuse will print the closing tag when the paragraph ends. But that’s not what CommonMark wants us to do. And I can’t use a simple positive look-ahead as that will fail in this situation as the closing emphasis is actually within a code element and thus it seems to me that I need to parse and backtrack in order to solve this problem. Gaaaah.

*foo `bar* bar`

– Alex Schroeder 2018-02-03 13:03 UTC

Add Comment

2018-01-03 Gopher Mode

Yeah, I’ve been working on Gopher stuff over the holidays.

  1. a Gopher server wrapper around Oddmuse wiki (and this site is running it, see gopher://alexschroeder.ch)
  2. a proposal of a new item type to write to a Gopher server with examples based on netcat, i.e. nc
  3. improvements to the Emacs Gopher client with support for HTML and the new item type (see this branch on GitHub)

Isn’t that amazing.


Add Comment

2017-12-27 Markdown for Campaign Wiki

I’m experimenting with letting users switch between the default (Wiki Creole) and Markdown on Campaign Wiki. You start a page with “#MARKDOWN” on a line of its own and that switches some stuff around. Most of the text formatting rules still apply – you can still use bbCode, for example. But it switches off Creole and it switches on Markdown.

Here’s an example page, Halberds & Helmets: Treasure.

What do you think? Do you foresee any problems?


Add Comment

2017-12-27 Gopher Server

The wiki is available as a Gopher server. This is weird, but it works.

Try it. lynx is a good Gopher client:

lynx gopher://alexschroeder.ch


lynx gopher://alexschroeder.ch/02017-12-27_Gopher_Server

Does anybody know why I need to start the pagename with the gopher type character? (or any character at all)?

As for monitoring, I use monit and have set up the following:

check process gopher-server with pidfile /home/alex/alexschroeder-gopher-server.pid
      start program = "/home/alex/perl5/perlbrew/perls/perl-5.24.0/bin/perl /home/alex/farm/gopher-server.pl --setsid --user=alex --group=alex --port=70 --log_level=2 --log_file=/home/alex/farm/gopher-server.log --pid_file=/home/alex/farm/gopher-server.pid --wiki=/home/alex/farm/wiki.pl --wiki_dir=/home/alex/alexschroeder --wiki_pages=SiteMap --wiki_pages=About"
    stop program = "/bin/bash -c 'kill -s SIGTERM `cat /home/alex/alexschroeder-gopher-server.pid`'"
    if failed
	host alexschroeder.ch
	port 70
	type tcp
        send "Alex\r\n"
	expect "#REDIRECT.*"
	for 5 cycles
	then restart
    if totalmem > 100 MB for 5 cycles then restart
    if 3 restarts within 15 cycles then timeout

The Net::Server is where you find stuff regarding all the command line options. --wiki, --wiki_pages and --wiki_dir are the ones I added.

Why gopher? Well...

“It’s actually rather nice to have a small ecosystem because no one’s running annoying ads in Gopherspace or trying to track your browsing habits,” he says. “The protocol makes the former hard and the latter almost impossible.” – Cameron Kaiser being quoted in The rise and fall of the Gopher protocol.
«The modern web is an ugly, massive, broken mess. This isn’t a secret or a new take or a controversial opinion. We stuff our webpages so full of tracking cookies and bitcoin mining advertisements and javascript apps that monitor your every move that it’s no wonder that modern web browsers are less effecient than ever.» — Gopher: Remembering the web that wasn't

This is nothing we can’t fix using HTML and HTTPS, but Gopher forces us to go without JavaScript and CSS and all that.


Comments on 2017-12-27 Gopher Server

RFC 1436 remains relevant, I guess.

– Alex 2017-12-28 16:44 UTC

Work continues. I’ve added menus for page filtering, for search, for recent changes both major changes only and including minor changes.

Next up: page history.

Is there much else? I think soon enough the lingering question will be: how do we edit pages via gopher?

– Alex 2017-12-29 14:31 UTC

Writing unit tests makes me feel so much better.

– Alex 2017-12-30 04:56 UTC

On the Gopher web (what’s the name to use here, do we like the -verse suffix?), all the encoding problems of the early web are coming back. Latin 1 instead of UTF 8? No content negotiation? Not even encoding labeling? What are we going to do? Surely limiting ourselves to Latin 1 for menu texts is not good enough.

From RFC 1436: “It is highly recommended that the User_Name field contain only printable characters, since many different clients will be using it. However if eight bit characters are used, the characters should conform with the ISO Latin1 Character Set.”

It’s a different world out there. We need to talk about indicating encoding to clients.

Menu type m for metadata? e.g.


I’ve been using a Gopher client on iOS for a bit and being German speaker, I soon stumbled over encoding issues. If I search Gopherpedia for „Zürich“, the client crashes. If I search for „Zurich“ and click on the first link, „Zürich“, it also crashes.

– Alex 2017-12-30 09:51 UTC

Add Comment

2017-12-15 Including Mastodon Comments

Steve Ivy suggested pulling in replies to a Mastodon status referring to a blog post, and suggested using the regular API for it, because displaying a status and its context doesn’t require authorization. Interesting idea!

But then again: Am I no longer going to expire these toots?

shower thought: wondering if I could automate posting links to my blog posts on mastodon, then pull in replies and boosts via *javascript* (like masto-discus)


Add Comment

2017-11-14 CSS Naked Day

I should write an Oddmuse module for CSS Naked Day (April 9).

Try this site without CSS!

Get dressed again...

I wrote about this back in 2007 and never thought of it again. If I had a module, I’d get reminded of it, every April.

Today I was reminded of it because my browser at the office has 11 tabs with Wikipedia pages. I plugged in the laptop after yesterday’s meeting elsewhere, opened the browser, and the 11 tabs came back—but without styling! I had forgotten to plug in the networking cable and apparently Chrome caches the Wikipedia HTML but not the Wikipedia CSS.

Anyway, the code would be something like this:

$ModulesDescription .= '<p><a href="https://alexschroeder.ch/wiki/2017-11-14_CSS_Naked_Day">No CSS Day</a></p>';
*NoCssOldGetCss = \&GetCss;
*GetCss = \&NoCssNewGetCss;
sub NoCssNewGetCss {
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($Now);
  # $mon: April is 3
  if ($mday == 9 and $mon == 3) {
    return '';
  } else {
    return NoCssOldGetCss(@_);


Also, I had never heard of the term “international day” before. The code on the CSS Naked day website has a funkier test than mine above and here’s why:

CSS Naked Day lasts for one international day. Technically speaking, it will be “April 9th” somewhere in the world for 48 hours. This is to ensure that everyone’s website will be publicly nude for the entire world to see at any given time during April 9. [1]


Add Comment

2017-07-07 Markdown

I’ve been working on Markdown support for Oddmuse and added nested list, and mixed list support.

There are still issues, unfortunately.

1. item

-- signature

The signature looks like a second list item containing “- signature” because the space after the dash is not mandatory. Should it be? Or should two dashes simply be the exception? Or should the character after the dash be a word character based on Unicode properties?


Add Comment



Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.