As our library of containerised Shopify apps has grown, so has the complexity of managing their infrastructure.
We run our apps in Docker Swarm using a custom deployment manager, with every deployment relying on four separate configuration files. As the number of apps has grown, keeping those files consistent has become more time-consuming, slowing deployments and increasing the risk of manual errors.
To solve that problem, we built a browser-based tool that generates every required configuration file from a single source of truth.
Building a schema-driven configuration tool
We built a bespoke single-page application using HTML5, Alpine.js and Tailwind CSS. At its core is a single configuration model covering more than 50 settings, from routing and API credentials through to optional infrastructure features.
Rather than simply generating configuration files, the tool can also import existing ones. It maps recognised values back into the interface while preserving any custom variables, making it much easier to update legacy applications without losing environment-specific settings.
The first real test came when we needed to roll out infrastructure updates across every application. Instead of manually editing configuration files for each environment, we updated the schema once and regenerated the required files in a consistent way. We also used the tool to introduce more granular CPU and RAM limits across our containers, alongside updates to our Laravel queue workers to help prevent memory leaks in long-running processes.
Testing the generator in production
The impact was immediate. Generating the four configuration files needed for a new environment now takes seconds instead of minutes, while built-in validation catches common configuration mistakes before deployment.
The import feature also makes it much easier to bring older applications in line with new infrastructure standards, removing much of the manual effort previously involved in large-scale updates.
As the tool grew, managing dozens of interconnected configuration options within a single application became more challenging. Building the import process also required plenty of trial and error, as older configuration files often contained inconsistent formatting, unexpected escaping or undocumented legacy variables that needed to be handled gracefully.
Why schema-driven tooling pays off
Was building a bespoke configuration generator worth the development time? Absolutely.
Keeping the tool entirely client-side means there's no backend, database or build step to maintain. It runs directly in the browser, while sensitive API keys never leave the user's machine.
For teams managing repetitive .ini, .yml or .env files across multiple services, standardising that process behind a schema-driven interface quickly pays for itself. It reduces repetitive manual work, improves consistency and turns knowledge that's often spread across documentation, scripts and individual experience into an internal tool that's easier to maintain and update.
Related articles