What lives here
This page is served by my home server, nousowl—a small, headless Fedora box that holds the parts of my work that belong on my own hardware. It hosts this static site, a private Carnap instance, a small private Zulip server, and Sylloge—a journal-tracking tool of my own—and it doubles as my testbed for learning self-hosting by running these systems myself.
Services and plans
Carnap
Carnap is an open-source Haskell framework for formal logic, used to run interactive courseware at dozens of universities: students build Fitch-style proofs, fill in truth tables, and construct counter-models, all checked in real time in the browser. My instance is live at carnap.nousowl.net, built from source with Nix on my desktop, shipped over as an image, and run here as a Docker container backed by PostgreSQL. I teach propositional and first-order logic at UC Davis (PHI 12 and PHI 112) from forall x: Calgary, but this instance isn’t the one my students use—it’s where I write and test course material and tinker with the code itself. Registration is currently closed, but feel free to get in touch if you’d like to figure out a way to interact with it.
Zulip
Zulip is like Slack but with LaTeX syntax support and better asynchronous threading. My instance is live at chat.nousowl.net, self-hosted alongside Carnap behind the same reverse proxy and running as a set of containers with its own PostgreSQL. It’s small and private—invitation only rather than open registration—mostly somewhere for a few collaborators, though part of the motivation is still seeing what a group like LLEMMMa might get out of one.
Sylloge
Sylloge is a tool of my own, named for the old word for a scholarly collection: it pulls the metadata of some thirty-five philosophy and logic journals from Crossref into SQLite and serves a keyboard-driven reading room for triaging what they publish—scroll the inbox, expand what looks interesting, dismiss what doesn’t, rate and collect what matters. My instance is live at sylloge.nousowl.net, and unlike its neighbors it runs natively as a systemd service rather than in a container: it’s dependency-free Python over SQLite, so there was nothing to isolate. It began as a pair of synced installs on my laptop and desktop and moved here to become a single instance reachable from any browser tab. It’s single-user by design and sits behind a password—of everything here it’s the only service that isn’t for anyone else at all, just the piece of my research workflow that now follows me to any machine.
The following are things I’d like to eventually host on nousowl but haven’t set up yet.
Isabelle/HOL
Isabelle/HOL is the proof assistant behind the computational side of my research. I use it to formalize non‑normal modal and deontic logics—machine-checking how their axioms and semantics correspond, and working toward completeness (an early piece lives here). Work like LogiKEy first drew me to it. Like Carnap, it takes some configuration on each machine and won’t run on an iPad or a phone, so a dedicated instance here would let me reach it from anywhere. The simple version is to run Isabelle in the shell on the server—workable, if not much fun. The more ambitious one is to serve jEdit as a web app with a single scratch buffer, reachable by URL, that I can paste working theories into.
Git hub
Yes, lowercase “h”. Why not make a single machine my everything? I could use RAID to back everything up. I imagine, though, that having such a machine would require more sophisticated hardware than I’m currently using.
System Information
Hardware
Software
- OS: Fedora Server 44 (Fedora Linux)
- Web server / reverse proxy: Caddy
- Management: Headless via SSH (LAN) and Tailscale VPN
- Workloads: Static sites, Carnap and Zulip instances in Docker, and Sylloge running natively under systemd; it also keeps encrypted copies of my own working files, which it stores without holding the key to read them. Further services are planned.
Security
- Exposure: Only HTTP/HTTPS (ports 80/443) are reachable from the public internet, over IPv4 and IPv6; SSH is limited to the local network and VPN. The Wi-Fi and Bluetooth radios are switched off.
- Segmentation: The server sits alone on its own network segment. My two workstations
reach it fully; everything else in the house reaches it over HTTP/HTTPS or not at all; and it
reaches nothing on the other networks in return.
- Access control: SSH key-based login; password authentication disabled.
- Hardening: Host firewall, SELinux enforcing, and fail2ban.
- DNS: The
nousowl.net zone is hosted at Cloudflare and signed with DNSSEC.
- Updates: Automatic system updates enabled.
Status
The machine has been pared down to a server: it runs the services above and what they need, and nothing else—no compilers, no LaTeX, no experiments left running. I prioritize staying current over maximizing uptime, so it patches itself and reboots when an update requires it, typically in the small hours. It shuts itself down cleanly if the UPS runs low.
A single memory cell turned out to be defective—one 64-bit word, always the same one, found by memtest86+ after a firmware update, and very likely the cause of a run of unexplained crashes. The kernel now reserves the small region containing it, so nothing is ever allocated there; the rest of the 64 GB is unaffected. Everything important is backed up nightly elsewhere regardless.