Skip to main content

Config Ninja 🥷

Ruff 🎨 poe (push) pylint codecov pre-commit.ci status Checked with mypy docs: pdoc readthedocs PyPI version Downloads

Similar to confd, manage your system configuration files by populating Jinja2 templates with data from a remote provider.

The config-ninja agent monitors the backend source for changes. When the source data is changed, the agent updates the local configuration file with the new data:

sequenceDiagram
  loop polling
    config-ninja->>backend: query for changes
  end

  backend->>+config-ninja: [backend changed] fetch config
  config-ninja->>-filesystem: write updated configuration file

Features

  • ✅ Integration with AWS AppConfig for managing server configuration files
  • ✅ Extensible design supports backends for new providers and formats
  • ✅ jinja2 templating for arbitrary configuration file formats
  • ✅ Execute poethepoet tasks after updating files

Installation

config-ninja is installed using the official installer or with pip / pipx. After installation, you can enable config-ninja as a systemd service.

Official Installer

The recommended way to install config-ninja is with the official installer:

curl -sSL https://config-ninja.github.io/config-ninja/install.py | python3 -

To view available installation options, run the installer with the --help flag:

curl -sSL https://config-ninja.github.io/config-ninja/install.py | python3 - --help
usage: install [-h] [--version VERSION] [--pre] [--uninstall] [--force] [--path PATH] [--backends BACKENDS]

Installs the latest (or given) version of config-ninja

options:
  -h, --help           show this help message and exit
  --version VERSION    install named version
  --pre                allow pre-release versions to be installed
  --uninstall          uninstall config-ninja
  --force              respond 'yes' to confirmation prompts; overwrite existing installations
  --path PATH          install config-ninja to this directory
  --backends BACKENDS  comma-separated list of package extras to install, or 'none' to install no backends

With pip / pipx

Alternatively, use pip / pipx to install all available backends (or choose a specific one):

pipx install 'config-ninja[all]'

With uv

uv tool install 'config-ninja[all]'

Enable the systemd Service

After installing config-ninja, enable it as a systemd service for the current user:

# omit '--user' to install the agent at the system level
config-ninja self install --user

Multiple instances of the service can also be installed to reference different settings files. For example, the following command will create the service named etc-config--ninja-alternate.service:

sudo config-ninja self install --config /etc/config-ninja/alternate.yaml

How It Works

To demonstrate how the mechanics work (using the local backend):

  1. create a settings file for config-ninja:
    cat <<EOF >config-ninja-settings.yaml
    CONFIG_NINJA_OBJECTS:
      example-0:
        dest:
          format: json
          path: ./.local/settings.json
      source:
        backend: local
        format: toml
        init:
          kwargs:
            path: ./.local/config.toml
    EOF
    
  2. run config-ninja in monitor mode:
    config-ninja apply --poll
    
  3. in a separate shell, create the config.toml:
    cat <<EOF >./.local/config.toml
    [example-0]
    a = "first value"
    b = "second value
    EOF
    
  4. Inspect the settings.json file created by config-ninja:
    cat ./.local/settings.json
    
    {
      "example-0": {
        "a": "first value",
        "b": "second value"
      }
    }
    
  5. Make changes to the data in config.toml, and config-ninja will update settings.json accordingly:
    cat <<EOF >>./.local/config.toml
    [example-1]
    c = "third value"
    d = "fourth value
    EOF
    cat ./.local/settings.json
    
    {
      "example-0": {
        "a": "first value",
        "b": "second value"
      },
      "example-1": {
        "c": "third value",
        "d": "fourth value"
      }
    }
    

Chances are, you'll want to update the config-ninja-settings.yaml file to use a remote backend (instead of local). See config_ninja.contrib for a list of supported config providers.

Metadata

Release files for config-ninja 3.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for config-ninja 3.0.0
File Size Uploaded Provenance Actions
config_ninja-3.0.0.tar.gz 37.8 kB With provenance Details for config_ninja-3.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for config-ninja 3.0.0
File Interpreter ABI Platform Actions
config_ninja-3.0.0-py3-none-any.whl Python 3 none any Details for config_ninja-3.0.0-py3-none-any.whl

Total release size: 72.1 kB

Release files / config_ninja-3.0.0.tar.gz

Download URL config_ninja-3.0.0.tar.gz
Size 37.8 kB
Tags Source
SHA-256 checksum
How to use checksums
f8428e924fe4a0bdc468bf478da9a6a786c3c84de0604fd1120968b9caaf94fb
BLAKE2b-256 checksum
How to use checksums
c488d6878bebaf453f89046293909a1c1d813c2ff0f2523c5803e21ef1610ec1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 31, 2026.

Transparency log

Release files / config_ninja-3.0.0-py3-none-any.whl

Download URL config_ninja-3.0.0-py3-none-any.whl
Size 34.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0fe2709cf294f48fcbe9b318b248303e6581cd16aeff2f38840dc1f4fdb078ef
BLAKE2b-256 checksum
How to use checksums
15fe4e30ffd24f20272677cd52a3c565d8c4a27893ebbb19e1b41f9b97036021
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 31, 2026.

Transparency log

Security for config-ninja 3.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for config_ninja-3.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 31, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

3.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page