A control panel I did not uninstall. Web.Casa on Caddy.


I have spent most of my career not using control panels. They were the thing running on the cheap VPS at the hosting company, with three PHP versions nobody chose and an update button that was really a hope. For my own servers it has been SSH, Ansible and a git repository, and that has been the right answer for fifteen years.

So the reason I now have a panel on two boxes is not the interface. It is the twenty percent of work that never makes it into the playbook. Adding a vhost at eleven at night. Reading a container’s logs when SSH from a phone is miserable. Letting a colleague restart a service without handing them a shell.

What it is

Web.Casa is a control panel for Caddy. Go and React, SQLite for state, Caddy driven as a managed subprocess through its admin API, and it installs with one command onto port 39921.

The selling point is size. A single binary, under 50MB, managing the whole stack without dragging in a Java runtime or a PHP interpreter just to render its own settings page. Given what a panel normally costs you in idle memory — the honest comparison is against the 300MB-plus panels — that is the feature.

Twelve plugins cover the parts I would otherwise do by hand: containers, Git deployment with webhook rollback, databases with a SQL console, file manager with a terminal, monitoring with threshold alerts, Kopia-based backup to local, S3, WebDAV or SFTP, firewall, PHP-FPM and FrankenPHP, cron, an app store of 269 apps, and the AI assistant.

Most of that is table stakes and none of it is why I kept it. The Caddy integration is why I kept it: certificates and reverse proxies are the part of server administration I most resent doing by hand, and the part Caddy is best at.

The AI part, honestly

This is the feature I was most sceptical about, and the one I use least for anything destructive. It is not a chat box bolted onto a settings page: dozens of built-in tools, and dangerous operations go through a confirmation step first. You bring your own API key — OpenAI, Anthropic, Gemini, DeepSeek, Moonshot, Zhipu or any compatible endpoint — encrypted at rest, with the claim that nothing routes through the vendor’s servers.

Where it earns its place is pasting a build failure and getting the real cause rather than the last line of the log, or generating a Caddyfile I was about to write from memory and get subtly wrong. It is fast autocomplete for configuration, and wrong often enough that I still read the diff. The MCP server is the more interesting piece for me: Cursor, Windsurf and Claude Code can drive the panel directly, so “create a vhost for this and give it a certificate” gets issued from the editor I am already in.

The honest trade-offs

Distribution support is narrow, and it is a hard stop rather than a caveat: EL9 and EL10 only. AlmaLinux, Rocky, CentOS Stream, RHEL, Oracle Linux, Fedora 41 and up. Debian and Ubuntu are explicitly not supported. If your fleet is Ubuntu — and most fleets are — this is not your tool today, and no amount of wanting it changes that.

Caddy only. It will not manage nginx or Apache, and there is no migration path for nginx vhosts. The documentation is blunt that the tight Caddy coupling is precisely why it stays small, which is a fair trade and still a trade.

Where I landed

Not as a replacement for configuration management. Ansible still owns the servers; the panel is a second, faster interface for the cases where SSH is the wrong tool.

The test I applied before keeping it was whether I would still want it with the AI removed. Yes — the Caddy integration and the container and backup plugins carry it. It is the first panel I have kept installed past a week, mostly because it does less than the others and is honest about what it will not do.