Oddµ replaced Oddmuse as my preferred wiki software.
1. Oddµ is a **wiki** – a website that can be edited on the web, using a regular web browser on my phone, for example. Only I get to edit the wiki these days and there is no way to leave a comment. Send me an email, instead. I love getting email! 😍
2. Oddµ is a **static site generator** (SSG) so that I can in theory write a bunch of Markdown files locally, run Oddµ and upload the result to the web. The reason I don't use it like that is that this disables online search. If you don't need online search or you're using some other software to handle it, static files are a great option. Static files are also a great option if you need to archive or export the whole site for offline viewing. Anybody will be able to browse the HTML files offline.
Oddµ reacts to changes made as it runs, so I can edit the Markdown files remotely, using ssh and my favourite editor or I can edit the Markdown files locally and sync them with the server and the pages Oddµ serves reflect those changes immediately, no restart required. Earlier versions required a restart so that Oddµ would update its in-memory indexes of page names and titles.
Oddµ is also a program that doesn't take a config file. Oddmuse, its predecessor, was designed to be hackable. There were a gazillion options to set. You could hook into the parser and add new rules, add new actions, add new meta data, and on and on. The drawback was an incredible lock-in. After twenty years, I started to feel it: it was hard to remove features for any specific wiki because its pages used a markup that was incompatible with everything else. The sources files ended up being tied to the config files and the modules used.
Some of my Oddmuse wikis used the old UseMod markup. Some of my Oddmuse wikis used the newer Wiki Creole markup that some wiki engine authors wanted to push back in 2006. Some of my Oddmuse wikis used their own eclectic markup mix. Some of my Oddmuse wikis used Markdown. For a while I even added Gemtext to the mix! I didn't like this incompatibility between sites and sometimes even between old and new pages on the same site. This is why Oddµ only does Markdown with three minimal extensions: hashtags, wiki links and fedi account links. See oddmu(5) for more.
Oddµ generates HTML using templates so there is no need for options to control the HTML output. If you want it changed, edit the templates. See oddmu-templates(5) for more.
Oddµ doesn't know anything about users, passwords and permissions. If you want authentication and authorization (which you do, if your wiki is public), then you need to configure your webserver to ask for passwords and restrict access accordingly. See oddmu-apache(5) and oddmu-nginx(5) for more.
Over time, however, I did add a few configuration options to Oddµ. This happens via environment variables.
When stdin is a socket, Oddµ reads requests from it instead of listening on port. This allows for systemd-style socket activation. This is what I use at the moment. Otherwise, it listens on the address from **ODDMU_ADDRESS** and the port from **ODDMU_PORT**. ODDMU_ADDRESS may be either an IPV4 address or an IPv6 address. If ODDMU_ADDRESS is unspecified, then the listener listens on all available unicast addresses, both IPv4 and IPv6. If ODDMU_PORT is unspecified, it listens on port 8080. See oddmu(1) and oddmu.service(5) for more.
By default, Oddmu tries to identify the language used on every page in order to allow a style sheet to enable hyphenation for the correct language. This is important for multi-lingual sites. The library used detects over 70 languages. This takes memory and time. **ODDMU_LANGUAGES** allows admins to reduce the number of languages taken into account. This site, for example, only considers English and German. See oddmu(1) and oddmu-templates(5) for more.
A pretty hairy feature is activated using **ODDMU_FILTER**. Sometimes, subdirectories are separate sites. If you do not want to include those sites in searches or archives of the whole site, you need to identify them. The way to do this is via the environment variable ODDMU_FILTER. It's value is a regular expression matching separate sites. On this site, my dad's old site resides in such a subdirectory. I use this environment variable to exclude "his" pages from searches made on "my" pages. See oddmu-filter(7) for more.
And finally, since linking to fediverse accounts involves an outgoing Webfinger lookup, this feature is disabled by default. You can switch it on by setting **ODDMU_WEBFINGER** to "1". It's what I do. See oddmu(5) for more.
#Oddµ