Case study · Infrastructure
A custom remote-management system for a small Windows fleet.
A self-hosted RMM — Windows agent, Raspberry Pi server, web dashboard — for an office of five PCs that needed remote screenshots, terminal, and self-updating agents without enterprise-tier costs.
The challenge
Five office PCs, one remote IT person, no budget for enterprise RMM.
A small office had five Windows PCs and one IT person who worked from home. The off-the-shelf options — Atera, NinjaOne, ConnectWise — all started at $80 or more per technician per month, and most of their feature surface was overkill for five machines.
What was actually needed: see all five PCs at a glance, take screenshots, run terminal commands, and push updates without driving to the office. Office firewall blocked inbound connections, so the agent had to reach out, not the other way around.
The approach
An agent that connects out, a server that runs on a Pi.
We wrote a lightweight Windows agent in Python (compiled to a single .exe via PyInstaller) that connects out to a FastAPI WebSocket server. The server runs on a Raspberry Pi 4 on a home network, port-forwarded for GitHub Actions deploys. A single-page dashboard, served from the same server, shows every PC and their state.
GitHub Actions handles the build pipeline: push to main, the workflow builds a fresh signed .exe on a Windows runner, SCPs it to the Pi, restarts the server. Online agents check for updates on connect and self-update within ~60 seconds. No manual reinstalls, no driving to the office.
The result
Five PCs, one Pi, an hour a week saved.
Five Windows PCs reporting in. Screenshots, terminal, and update pushes available from the dashboard. Agents auto-update from each git push. Total ongoing cost: about $35 of hardware, the home-network electricity, and a domain.
A year in, the same architecture is being adapted for a second client — same agent, separate server tenant. The boring stack ages well.
The right amount of system, for the right size of fleet.
Have a project in mind?
Want something like this?
Tell us what you're working on. We'll tell you, honestly, whether we're the right fit.
Let's talk →