Over the past few weeks I shipped a family of ten independent Windows endpoint-security products — PortGuard, ElevateGuard, CryptoGuard, FreezeGuard, PatchGuard, AssetGuard, AppGuard, PrintGuard, WiFiGuard, and CredGuard — plus a unified console that ties them together at app.guardsuite.tech.
Each one is a real standalone SaaS: its own marketing site, its own console, its own Windows agent, its own API, its own DynamoDB table, its own Stripe product. But they all share:
The agents are all built from the same Rust core with product-specific plugins. The APIs are Python Lambdas with a shared guardsuite_common package that handles:
A new product is a few hundred lines of differentiated logic on top of several thousand lines of shared library.
Windows won't trust unsigned code. Ten products means ten .exe agents plus dozens of MSIs. Rather than keep EV certs per product, I wired everything through a single Azure Trusted Signing account in eastus. The GitHub Actions deploy pipeline signs on every release using a managed identity — no human touches a private key.
The interesting design decision was the master console at app.guardsuite.tech. When a customer signs up for one product, they get a GuardSuite account. When they add a second, it links automatically. The unified console shows all their subscribed products, lets them hop between product consoles with SSO, and consolidates billing into one invoice per month.
This is the feature that's hardest to build late. Ten disconnected SaaS accounts would have been easier to ship individually — but impossible to stitch together after the fact without customer-visible churn.
The phrase "ship a product every week" gets thrown around like it's a question of speed. What it's really about is reuse. My first product in the family took six weeks. The tenth took four days. The code wasn't ten times better — the decisions were.
Naming was the hardest part. I'm still not sure PrintGuard is a good name for a product that restricts which printers a device can reach. But I'm out of time to argue with myself about it, so it ships.