Exira
Exira was the hosting and web business I built and ran. It began in 2014 as a division of Cumps Consulting; in 2020 it became a company of its own, when Geert Van Huychem joined me, and we closed it in 2025, when we stopped the hosting business. It started as a handful of F# tools and nginx configs to put Cumps Consulting’s smaller clients online, grew into some fifteen Docker-hosted sites behind a shared reverse proxy with their own domain names and TLS certificates, and ended with a full rewrite of the whole thing in C#. The exira.com and git.exira.com domains don’t resolve any more, but the GitHub organisation is still there with its history of some 90 repositories, and a handful of the small libraries I published along the way are still being downloaded today.
The hosting platform. From 2016 every client site ran as its own Docker container behind two nginx front doors, exira1-nginx and exira2-nginx, each with a per-site TLS certificate, its own Diffie-Hellman parameters, a content security policy and rate limits; a third repo, url-forwarder, did plain domain forwarding for organisations that just needed their name to point somewhere. Images came from a private Docker registry I ran myself, built on the official registry:2 image, with Alpine and Ghost mirrored in as base images. The second nginx also fronted a self-hosted Gogs git server, a TeamCity build server, a wiki and KeeWeb for passwords, each behind an IP whitelist or HTTP basic auth. That Gogs server is also where I kept Taking Wing’s Learning Tools through 2017.
Client sites. The sites behind that platform belonged to small Belgian businesses and organisations, which I hosted and maintained: the real estate agency Brusimmo, De Drie Biggetjes, Demurrage Desk, Robazza International, the Ostend accountancy firm Kantoor Vandenabeele, Bakkerij Cloet, Pasha Dogs, Warmsphere, Walwyck, Toya Trading, Securilain, Miss Media, Klusatelier, Aegirbotra and Recomed. Some of them predate Exira: I built Kantoor Vandenabeele’s WordPress site in 2012, with its office, services, properties for rent and sale, and links, and it later moved onto the Exira platform. Domain forwarding went out further still, to organisations such as Belga News Agency, Media ID, Vlaamse Nieuwsmedia, Mindfulness VZW, Mannenkoor Tebasco and Taking Wing VOF.
F# services underneath. Before the containers, the plumbing was a set of F# microservices on OWIN: dns-ops/dns-service, user-ops and iis-ops, each a thin Web API that took a command, handed it to a domain command handler, and persisted events to GetEventStore. Registering a domain went through openprovider-api, a statically typed wrapper over OpenProvider’s XML API: I fed its XSD files to AntaniXml to generate sample XML, then fed that to F#’s XmlProvider to get typed access to the whole API without hand-writing a client.
Open-source libraries. A good part of that plumbing shipped as open-source NuGet packages under the Exira name, and some are still used: Exira.EventStore, an F# client for GetEventStore, with over 40,000 downloads, plus its .Runner, .Owin and .Logger companions; Exira.ErrorHandling for railway-oriented error handling, over 32,000 downloads; Exira.Route53Updater, Exira.VersionHeader.Owin, Exira.StaticMailer, Exira.GitBackup and Exira.SimpleHttpServer, which I later used to serve the Recomed site itself; Exira.CsrfValidation.Owin, Exira.EbsBackup, Exira.Jil and Exira.AwsS3Cache round out the fourteen packages, most still pulling in a few thousand downloads apiece a decade on.
A company of its own. When Exira became a separate company in 2020, Geert Van Huychem and I started rewriting the backend from scratch in C# on .NET 7, with Akka.NET and Akka.Persistence for event sourcing instead of GetEventStore, split into a landing site, an admin console, an API host and a sites service, backed by PostgreSQL through Dapper and Entity Framework Core. We wired in OpenProvider and GoGetSsl for domains and certificates, SendGrid for mail with its own double-opt-in cleanup job, Auth0 for sign-in, and a self-hosted Matomo for analytics. It launched in October 2021, ran on Exoscale in Frankfurt, and deployed through GitHub Actions to images on GHCR, with Seq for logging. Alongside it we worked out a GDPR plan. We kept extending the backend until February 2023, importing the old client accounts as the last piece of work, and ran the hosting business until 2025.
Running infrastructure myself rather than renting someone else’s is the same instinct I picked up again in 2025 with Selfhost.
Technologies: F#, C#, .NET 7, OWIN, ASP.NET Core, Akka.NET, Akka.Persistence, Entity Framework Core, Dapper, PostgreSQL, GetEventStore, FSharp.Data (XmlProvider), AntaniXml, Autofac, Serilog, NodaTime, Polly, Docker, Docker Compose, nginx, Alpine Linux, Ghost, Gogs, Git, TeamCity, GitLab, private Docker Registry, Rancher, KeeWeb, DNSimple, OpenProvider, GoGetSsl, Route 53, AWS S3, AWS EBS, SendGrid, Auth0, Matomo, Seq, Exoscale, GitHub Actions, GHCR, NuGet, Travis CI, Paket.
You May Also Like

How This Blog Is Served
The machinery behind the words you're reading: Hugo, an unprivileged nginx, a strict CSP, and a deploy script.

Keeping the Old Addresses Alive
Nobody migrates email in one day. Fetchmail, a receive-only alias domain, and permanent redirects bridge the old world into the new one.

Making Roundcube Not Look Like 2012
Webmail is the face of the platform, so it got a Gmail-shaped skin, real calendar and contacts integration, and some money spent on polish.




