Skip to content
David Cumps

Immovlan

  • Immovlan
  • Since 2021

Immovlan is a Belgian property portal with more than 100,000 homes for sale or rent and over 3 million visitors a month. Behind the site sit about a dozen .NET services: the website, APIs for the core domain, search, saved-search alerts, images, authentication, newsletters, partners and agency software, plus some 60 scheduled batch jobs. I’ve worked on it as a freelancer since April 2021, straight after Basisregisters. My part is mostly the platform underneath, the mobile backend, and keeping a small team shipping.

Off the old servers, onto AWS. I architected and led the move from Sentia’s managed hosting to AWS. The Windows servers became Docker images, and the website, every API and every batch job now runs on Kubernetes, each with its own Helm chart. Along the way I replaced hand-run servers with cloud-native building blocks: databases on Amazon RDS, Redis on ElastiCache, RabbitMQ on Amazon MQ and search on Amazon OpenSearch Service, files on S3 and EFS, traffic through AWS load balancers, health probes on every service, and nodes that scale with the load through Karpenter.

A smaller AWS bill. The move came with a plan to bring the AWS costs down. One part of it was leaving SQL Server for PostgreSQL on Amazon RDS: I converted the Entity Framework model and migrations, wrote the data migration scripts and switched the services over one by one. A long series of smaller cuts in AWS followed, such as staging environments that shut down every night.

Builds and logs. I moved the code from an outdated, self-hosted Bitbucket server to GitHub and the builds from TeamCity to GitHub Actions, with a staging and production pipeline per service. Since 2021 every service logs centrally to Seq, with correlation IDs to follow one request across services. I also keep the services current, from .NET 5 in 2021 to .NET 10 today.

From one backend to separate services. The backend started out as one large repository holding every API, the batch jobs and the back office. Between late 2021 and early 2022 I split it into separate services, each with its own repository and pipeline, with their API clients published as NuGet packages. The database model moved into a shared package of its own: the Entity Framework model and migrations that every service uses, which I still maintain.

Building blocks. I set up the shared libraries every service builds on, published as internal NuGet packages: request middleware, correlation IDs, API client plumbing and messaging over RabbitMQ. For the batch jobs I built a common framework. A new batch starts from a template and gets configuration, logging, job status reporting and failure alerts in Slack for free, plus its own Helm chart and pipeline, and runs as a Kubernetes CronJob. About 60 batches, 9 long-running services and 10 tools use it today, from partner imports and CRM syncs to billing and sitemaps.

Integrations. Not everything I built is still in Immovlan’s repositories today. In 2021 and 2022 I built, almost on my own, the export of Immovlan’s listings to Facebook: a .NET service with several export pipelines driven by RabbitMQ. In 2022 I set up a daily export of West Flanders listings for a publishing partner, delivered as JSON over FTP, with its own build and deployment pipeline. For a points-of-interest service, which Geert Van Huychem started, I added the container build and deployment, logging to Seq, an importer for city data and location summaries.

E-mail and push notifications. In 2021 I built the notification service that sends Immovlan’s e-mail and push notifications, and the instant e-mail alerts for saved searches, so people hear about a new property as soon as it’s listed.

The mobile backend. I built the REST API behind the Immovlan iOS and Android apps from its first commit in 2023: list and map search with clustering, property, project and agency details, favourites, accounts, and saved searches whose instant alerts come from OpenSearch. The apps themselves were built by an external agency; I was their technical counterpart for everything the apps needed from the backend.

Security. Immovlan has its site and apps penetration-tested on a recurring basis, and I harden the services based on what the tests turn up, from brute-force protection on logins to closing information leaks and ending sessions when a password changes.

Secrets out of the repositories. In 2026 I moved the secrets of every service, across some twenty repositories, out of configuration files and into AWS Secrets Manager. External Secrets Operator syncs them into Kubernetes for staging and production and refreshes them every hour, all services read from one shared platform store, and builds get the token for the private package feed as a BuildKit secret instead of from a file.

Nixie, the team’s AI bot. I set up Nixie, an AI development bot that lives in Slack. Overnight it reviews pull requests against their Jira tickets, it triages new errors from Seq, and every morning it posts a summary. It can reject a pull request on its own, but approving and merging stays with a person. It runs as a self-hosted agent in Docker, built from my open-source template netclaw-nixie, on local AI: the models run on NVIDIA DGX Spark machines instead of a cloud API.

The team. I review a lot of my colleagues’ pull requests on GitHub, and testing the UI has been a regular part of my work as well. I also bring new technologies into the team and help everyone get going with them, from Docker, Kubernetes and Seq to AI agents like Nixie.

Technologies: C#, .NET 5 to 10, ASP.NET Core, Entity Framework Core, PostgreSQL, SQL Server, OpenSearch, RabbitMQ, Redis, Seq, Serilog, Docker, Kubernetes, Helm, Karpenter, AWS (EKS, RDS, ElastiCache, Amazon MQ, OpenSearch Service, S3, EFS, ECR, ALB, Secrets Manager), External Secrets Operator, SendGrid, Mandrill, GitHub Actions, TeamCity, Paket, NuGet, Ansible, Prometheus, Slack, Jira, AI agents, MCP, local LLMs on NVIDIA DGX Spark.

You May Also Like