{"id":13589894,"url":"https://github.com/config-ninja/config-ninja","last_synced_at":"2025-12-24T23:19:59.561Z","repository":{"id":214254091,"uuid":"735436877","full_name":"config-ninja/config-ninja","owner":"config-ninja","description":"Manage your system configuration files in the cloud","archived":false,"fork":false,"pushed_at":"2024-10-29T11:28:18.000Z","size":6554,"stargazers_count":2,"open_issues_count":3,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-29T13:20:47.357Z","etag":null,"topics":["aws","config","configuration","python"],"latest_commit_sha":null,"homepage":"https://config-ninja.readthedocs.org/home.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/config-ninja.png","metadata":{"files":{"readme":"README.md","changelog":"changelog/CHANGELOG.md.j2","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-12-24T23:39:40.000Z","updated_at":"2024-10-29T11:24:42.000Z","dependencies_parsed_at":"2024-01-18T03:52:22.337Z","dependency_job_id":"b32a5242-2bbd-426b-99bd-624a4a2b8218","html_url":"https://github.com/config-ninja/config-ninja","commit_stats":null,"previous_names":["bryant-finney/config-ninja"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/config-ninja%2Fconfig-ninja","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/config-ninja%2Fconfig-ninja/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/config-ninja%2Fconfig-ninja/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/config-ninja%2Fconfig-ninja/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/config-ninja","download_url":"https://codeload.github.com/config-ninja/config-ninja/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223314459,"owners_count":17125090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","config","configuration","python"],"created_at":"2024-08-01T16:00:35.915Z","updated_at":"2025-12-24T23:19:59.489Z","avatar_url":"https://github.com/config-ninja.png","language":"Python","funding_links":[],"categories":["python"],"sub_categories":[],"readme":"# Config Ninja 🥷\n\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![🎨 poe (push)](https://github.com/config-ninja/config-ninja/actions/workflows/push-poe.yaml/badge.svg)](https://github.com/config-ninja/config-ninja/actions/workflows/push-poe.yaml)\n[![pylint](https://config-ninja.github.io/config-ninja/reports/pylint.svg)](https://config-ninja.github.io/config-ninja/reports/pylint-report.txt)\n[![codecov](https://codecov.io/gh/config-ninja/config-ninja/graph/badge.svg?token=R3DFDSNK9U)](https://codecov.io/gh/config-ninja/config-ninja)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/config-ninja/config-ninja/main.svg)](https://results.pre-commit.ci/latest/github/config-ninja/config-ninja/main)\n[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://config-ninja.github.io/config-ninja/reports/mypy-html)\n[![docs: pdoc](https://img.shields.io/badge/docs-pdoc-blueviolet?logo=github)](https://config-ninja.github.io/config-ninja/config_ninja.html)\n[![readthedocs](https://readthedocs.org/projects/config-ninja/badge/?version=latest)](https://config-ninja.readthedocs.io/en/latest/home.html)\n[![PyPI version](https://badge.fury.io/py/config-ninja.svg)](https://badge.fury.io/py/config-ninja)\n[![Downloads](https://static.pepy.tech/badge/config-ninja/month)](https://pepy.tech/project/config-ninja)\n\nSimilar to [`confd`](https://github.com/kelseyhightower/confd), manage your system configuration files by populating [Jinja2](https://jinja.palletsprojects.com/en/3.1.x/) templates with data from a remote provider.\n\nThe `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:\n\n```mermaid\nsequenceDiagram\n  loop polling\n    config-ninja-\u003e\u003ebackend: query for changes\n  end\n\n  backend-\u003e\u003e+config-ninja: [backend changed] fetch config\n  config-ninja-\u003e\u003e-filesystem: write updated configuration file\n```\n\n## Features\n\n- ✅ Integration with [AWS AppConfig](https://jinja.palletsprojects.com/en/3.1.x/) for managing server configuration files\n- ✅ Extensible design supports backends for new providers and formats\n- ✅ [`jinja2`](https://jinja.palletsprojects.com/en/3.1.x/) templating for arbitrary configuration file formats\n- ✅ Execute [`poethepoet`](https://poethepoet.natn.io/index.html) tasks after updating files\n\n## Installation\n\n`config-ninja` is installed using the official installer or with `pip` / `pipx`. After installation, you can enable `config-ninja` as a `systemd` service.\n\n### Official Installer\n\nThe recommended way to install `config-ninja` is with the official installer:\n\n```sh\ncurl -sSL https://config-ninja.github.io/config-ninja/install.py | python3 -\n```\n\nTo view available installation options, run the installer with the `--help` flag:\n\n```sh\ncurl -sSL https://config-ninja.github.io/config-ninja/install.py | python3 - --help\n```\n\n```\nusage: install [-h] [--version VERSION] [--pre] [--uninstall] [--force] [--path PATH] [--backends BACKENDS]\n\nInstalls the latest (or given) version of config-ninja\n\noptions:\n  -h, --help           show this help message and exit\n  --version VERSION    install named version\n  --pre                allow pre-release versions to be installed\n  --uninstall          uninstall config-ninja\n  --force              respond 'yes' to confirmation prompts; overwrite existing installations\n  --path PATH          install config-ninja to this directory\n  --backends BACKENDS  comma-separated list of package extras to install, or 'none' to install no backends\n```\n\n#### With `pip` / `pipx`\n\nAlternatively, use `pip` / `pipx` to install [all available backends](https://config-ninja.github.io/config-ninja/config_ninja/contrib.html#available-backends) (or choose a specific one):\n\n```sh\npipx install 'config-ninja[all]'\n```\n\n#### With [`uv`](https://github.com/astral-sh/uv)\n\n```sh\nuv tool install 'config-ninja[all]'\n```\n\n### Enable the `systemd` Service\n\nAfter installing `config-ninja`, enable it as a `systemd` service for the current user:\n\n```sh\n# omit '--user' to install the agent at the system level\nconfig-ninja self install --user\n```\n\nMultiple 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`:\n\n```sh\nsudo config-ninja self install --config /etc/config-ninja/alternate.yaml\n```\n\n## How It Works\n\nTo demonstrate how the mechanics work (using the [local backend](https://config-ninja.readthedocs.io/en/latest/config_ninja/contrib/local.html)):\n\n1. create a settings file for `config-ninja`:\n   ```sh\n   cat \u003c\u003cEOF \u003econfig-ninja-settings.yaml\n   CONFIG_NINJA_OBJECTS:\n     example-0:\n       dest:\n         format: json\n         path: ./.local/settings.json\n     source:\n       backend: local\n       format: toml\n       init:\n         kwargs:\n           path: ./.local/config.toml\n   EOF\n   ```\n2. run `config-ninja` in monitor mode:\n   ```sh\n   config-ninja apply --poll\n   ```\n3. in a separate shell, create the `config.toml`:\n   ```sh\n   cat \u003c\u003cEOF \u003e./.local/config.toml\n   [example-0]\n   a = \"first value\"\n   b = \"second value\n   EOF\n   ```\n4. Inspect the `settings.json` file created by `config-ninja`:\n   ```sh\n   cat ./.local/settings.json\n   ```\n   ```json\n   {\n     \"example-0\": {\n       \"a\": \"first value\",\n       \"b\": \"second value\"\n     }\n   }\n   ```\n5. Make changes to the data in `config.toml`, and `config-ninja` will update `settings.json` accordingly:\n   ```sh\n   cat \u003c\u003cEOF \u003e\u003e./.local/config.toml\n   [example-1]\n   c = \"third value\"\n   d = \"fourth value\n   EOF\n   cat ./.local/settings.json\n   ```\n   ```json\n   {\n     \"example-0\": {\n       \"a\": \"first value\",\n       \"b\": \"second value\"\n     },\n     \"example-1\": {\n       \"c\": \"third value\",\n       \"d\": \"fourth value\"\n     }\n   }\n   ```\n\nChances are, you'll want to update the `config-ninja-settings.yaml` file to use a remote backend (instead of `local`). See [config_ninja.contrib](https://config-ninja.github.io/config-ninja/config_ninja/contrib.html) for a list of supported config providers.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconfig-ninja%2Fconfig-ninja","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconfig-ninja%2Fconfig-ninja","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconfig-ninja%2Fconfig-ninja/lists"}