Change config once.
Every service, every environment gets it right.

50 services in 5 environments means 250 config files that slowly drift apart. With Microconfig you write shared settings once, in plain YAML or properties, and it builds every file: application.yaml, Helm values, logback.xml, anything. No new language, no server, no lock-in.

brew tap microconfig/microconfig && brew install microconfig

or get a binary for macOS, Linux, Windows or a Java jar

GitHub stars Latest release License Open source since 2019

Try it right here: change one line

Two services, two environments. Edit a highlighted value in the sources: on the right, the lines that change in each generated config light up, everything else stays dimmed.

Component: a folder in components/ with a service's configs or a shared part. Environment: a file in envs/ listing the services it runs; files like application.prod.yaml override values for one environment.

What you write
your-git-repo/ · one repository for all services
components/common/monitoring/application.yaml
# shared: included by every service
monitoring:
  base-path: /monitoring
  endpoints: 
components/payments/payment-backend/application.yaml
#include monitoring, postgres

name: payment-backend
server:
  port: 80
  context: 
components/payments/payment-frontend/application.yaml
#include monitoring

name: payment-frontend
payment-backend:
  path: ${payment-backend@server.context}
components/common/postgres/application.prod.yaml
# prod only
#var dbHost: 
What changes in build/

By hand, every updated file is a separate edit. With 50 services in 5 environments, one shared change means up to 250 files.

Sound familiar?

Everyday configuration pain in a microservice system, and what it looks like with Microconfig.

See seven use cases in detail, with the files they take →

Who it's for

Microconfig pays off as soon as configuration starts repeating itself.

You probably don't need Microconfig yet if you run a handful of services in a single environment. Plain files are fine there.

Already using something else?

Microconfig is a build step, not a platform: it keeps configuration for many services in one place and builds plain files. So it works alongside the tools you already have.

How it fits your pipeline

Microconfig runs as one step in CI, between your config repository and your delivery tools.

  1. Sources in Git

    One repository with components/ and envs/ for all services.

  2. Build in CI

    microconfig -e prod takes seconds even for hundreds of services and fails on any broken reference.

  3. Plain files

    build/<service>/ with application configs, Helm values, templates.

  4. Your delivery

    Helm, kubectl or Kustomize, a config server, or a plain copy to hosts.

.github/workflows/configs.ymlGitHub Actions example
on: [push]
jobs:
  configs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Microconfig
        run: |
          curl -sSL -o microconfig.zip https://github.com/microconfig/microconfig/releases/latest/download/microconfig-linux.zip
          unzip -q microconfig.zip
      - name: Build prod configs
        run: ./microconfig -e prod -d build
      - uses: actions/upload-artifact@v4
        with:
          name: prod-configs
          path: build/

Works the same in GitLab CI, Jenkins or any other runner. In real pipelines, pin a release instead of latest.

Questions teams ask before trying

Short answers. The documentation has the details.

Where do secrets go?

Neither into Git nor into generated configs. Keep only references in the repository, like a Vault path or the name of a Kubernetes Secret, and let the secret values be injected at deploy time or at startup. Microconfig has a separate .secret config type for describing these references.

Is it only for Java services?

No. Microconfig is written in Java, but it produces plain files: YAML, properties or any text template. Services in any language can read them, and the native binary doesn't need Java installed. Spring Boot is the most natural fit: it reads these files without any glue.

Does it work with Kubernetes and Helm?

Yes. Next to application configs, Microconfig builds Helm values (*.helm) and Kubernetes configs (*.k8s) for each service and environment. Deploy the result with the tools you already use.

Do we have to migrate everything at once?

No. Your existing YAML and properties files are valid Microconfig sources as they are. Put them under components/, list services in an environment file, then move copy-pasted blocks to shared components one at a time. The output is plain files and nothing runs in production, so stopping is just as easy as starting.

What do the generated files look like?

Ordinary files your services read as they are. Two things to know: comments from the sources stay in Git and are not copied to the result, and keys in generated YAML come out sorted alphabetically.

Does it reload config in running services?

No. Microconfig runs at build time and produces files. Deliver them with your usual tools, or serve them from a config server that supports refresh.

How does config diff work?

Each build compares the new files with the previous build in the same output folder and writes diff-application.yaml and similar files next to them: added, removed and changed properties.

Does it run on Windows?

Yes. There is a native Windows binary, and the executable jar runs anywhere with Java 17+. See Download.

What does it cost?

Nothing. Microconfig is open source under the Apache 2.0 license, developed on GitHub since 2019 with regular releases.

See it on a real example in 2 minutes

Install, clone the example, change one line, see what happens to every service.

brew tap microconfig/microconfig && brew install microconfig
Open the quickstart →