GroundCtrl: The Ultimate Indie Agency Stack

4 min read
GroundCtrl: The Ultimate Indie Agency Stack

GroundCtrl: The Ultimate Indie Agency Stack

We didn’t set out to build another generic orchestrator; we needed an infrastructure solution that actually made sense for our workflow. Clients needed a non-threatening, maintainable way to add blogs and content—without the bulk, tier-limits, and recurring stress of expensive third-party headless CMS platforms. GroundCtrl is our answer: a custom Express-native PaaS designed for speed, isolation, and portability.

Here’s a deep dive into the architectural decisions that shaped GroundCtrl and how we solved some of the most frustrating infrastructural headaches for indie agencies.

Killing the Docker Overhead: Why We Built an Express-Native PaaS for 2GB VPSs

Running a dozen Docker containers on a client’s 2GB VPS is a recipe for memory exhaustion and maintenance nightmares. The overhead of virtualization, networking, and image management often outweighs the benefits for small to medium setups.

Instead of spinning up 15 separate containers, GroundCtrl integrates the API Gateway, CMS, and Cron scheduler into a single Node/Express memory loop. This unified approach drastically reduces memory consumption and context-switching at the OS level. It’s significantly faster, vastly superior for resource-constrained servers, and eliminates the “Docker overhead” tax entirely.

Solving the Brittle Content Problem with Direct Database Integration

If you’ve ever managed a static site for a client, you know the nightmare: a client logs in, types a rogue : or unmatched quote in a markdown file, and suddenly the entire CI/CD pipeline crashes. Static files are brittle when exposed to non-technical users.

To fix this, we bypassed the file system entirely for client inputs. GroundCtrl keeps all raw content safely stored in a SQLite database. Then, using our high-performance content loader, we feed this content directly into the memory of our site generator during the build process. No more broken YAML frontmatter, no more rogue syntax errors crashing builds. Just raw, structured data flowing seamlessly into the final high-speed site.

Multi-Tenant SQLite in Production: Partitioning Databases per Client

Data isolation and portability are critical when managing multiple small-to-medium enterprise (SME) clients on a single node. You don’t want to mix client A’s blog posts with client B’s, and you certainly don’t want a monolithic database failure taking down every site.

Our architecture leverages isolated client_{id}.db SQLite files for each tenant, rather than a single monolithic master.db for content. This partition-by-default strategy offers unparalleled portability: backing up, migrating, or archiving a single client’s entire CMS is as simple as copying one .db file. It’s essentially a zero-config, ultra-portable database per project.

Building an Atomic “Vercel-like” Deployment Pipeline in 100 Lines of Bash/Node

The “magic” of modern PaaS platforms like Vercel isn’t actually magic—it’s just smart symlinking and process management. We wanted that same instant, zero-downtime deployment experience without locking ourselves into a proprietary ecosystem.

In just about 100 lines of Bash and Node, GroundCtrl achieves atomic deployments. We use a directory swapping strategy (/releases/[timestamp] -> symlink to current/), coupled with instant Nginx cache invalidation and PM2 zero-downtime reloads. When a new version is pushed, the symlink is atomically updated. If something breaks, rolling back is just moving a symlink. It’s incredibly robust, easy to reason about, and requires absolutely zero complex orchestration tools.

0%
0 min