# Effortless Configuration Management with check-config
**Keep your development environment consistent, shareable, and version-controlled**
check-config is a fast, lightweight, declarative configuration management tool that ensures your configuration files
contain exactly what they should. Instead of managing entire config files,
you declare specific parts that must be present - making configurations shareable, maintainable, and verifiable.
## How It Works
Define your configuration requirements in simple TOML files, then let check-config ensure they're applied:
```toml
# Set your preferred editor
[[lines_present]]
file = "~/.bashrc"
lines = "export EDITOR=hx"
```
```toml
# Ensure git signing is configured
[[lines_present]]
file = "~/.gitconfig"
lines = """
[gpg]
format = ssh
[commit]
gpgsign = true
"""
```
Run `check-config --fix` to apply changes, or `check-config` to verify everything is in sync.
## Why check-config?
### 🔧 **Shareable Configuration Snippets**
Traditional dotfile repositories force users to adopt entire configuration files. check-config lets you share just the essential parts:
- Share your preferred Python formatting rules without forcing your entire `pyproject.toml`
- Distribute security settings without overwriting personal aliases
- Collaborate on team standards while preserving individual preferences
### ✅ **Enforce Team Standards**
Ensure consistent development environments across your team:
```shell
# In CI: Verify configurations are up-to-date
check-config
# For developers: Apply required configurations
check-config --fix
```
Perfect for ensuring tools like Ruff, Black, and ESLint use consistent settings across all developers and CI pipelines.
### 📦 **Composable Configuration**
Combine multiple configuration files to build your complete setup:
- Base configurations for your team
- Personal tweaks and preferences
- Project-specific requirements
- Environment-specific overrides
## Beyond Simple Lines
check-config supports multiple checker types for different configuration needs:
- **Lines present/absent**: Shell configs, text files
- **Key-value pairs**: TOML, JSON, YAML files
- **File existence**: Ensure critical files exist
- **And more**: See [docs/checkers.md](docs/checkers.md) for all features
## Get Started
Make a `check-config.toml` according your needs:
```toml
# Set your preferred editor
[[lines_present]]
file = "~/.bashrc"
lines = "export EDITOR=hx"
```
And use it:
```shell
# Check if configurations match requirements
check-config
# Apply missing configurations
check-config --fix
```
## Documentation
📖 **[Full Documentation](https://check-config.readthedocs.io)** - Complete guides, examples, and API reference
---
*Declare what you need. Share what matters. Keep everything in sync.*
Raw data
{
"_id": null,
"home_page": "https://pypi.org/project/check-config/",
"name": "check-config",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "Marc Rijken <marc@rijken.org>",
"keywords": "automation, configuration",
"author": null,
"author_email": "Marc Rijken <marc@rijken.org>",
"download_url": "https://files.pythonhosted.org/packages/fb/17/3d25f84ab09912db193308f1a1a6c58c16373a98c774ada33976739f7f1e/check_config-0.9.10.tar.gz",
"platform": null,
"description": "\n\n# Effortless Configuration Management with check-config\n\n\n**Keep your development environment consistent, shareable, and version-controlled**\n\ncheck-config is a fast, lightweight, declarative configuration management tool that ensures your configuration files\ncontain exactly what they should. Instead of managing entire config files,\nyou declare specific parts that must be present - making configurations shareable, maintainable, and verifiable.\n\n## How It Works\n\nDefine your configuration requirements in simple TOML files, then let check-config ensure they're applied:\n\n```toml\n# Set your preferred editor\n[[lines_present]]\nfile = \"~/.bashrc\"\nlines = \"export EDITOR=hx\"\n```\n\n```toml\n# Ensure git signing is configured\n[[lines_present]]\nfile = \"~/.gitconfig\"\nlines = \"\"\"\n[gpg]\n format = ssh\n[commit]\n gpgsign = true\n\"\"\"\n```\n\nRun `check-config --fix` to apply changes, or `check-config` to verify everything is in sync.\n\n## Why check-config?\n\n### \ud83d\udd27 **Shareable Configuration Snippets**\n\nTraditional dotfile repositories force users to adopt entire configuration files. check-config lets you share just the essential parts:\n- Share your preferred Python formatting rules without forcing your entire `pyproject.toml`\n- Distribute security settings without overwriting personal aliases\n- Collaborate on team standards while preserving individual preferences\n\n### \u2705 **Enforce Team Standards**\n\nEnsure consistent development environments across your team:\n\n```shell\n# In CI: Verify configurations are up-to-date\ncheck-config\n\n# For developers: Apply required configurations \ncheck-config --fix\n```\n\nPerfect for ensuring tools like Ruff, Black, and ESLint use consistent settings across all developers and CI pipelines.\n\n### \ud83d\udce6 **Composable Configuration**\n\nCombine multiple configuration files to build your complete setup:\n- Base configurations for your team\n- Personal tweaks and preferences \n- Project-specific requirements\n- Environment-specific overrides\n\n## Beyond Simple Lines\n\ncheck-config supports multiple checker types for different configuration needs:\n- **Lines present/absent**: Shell configs, text files\n- **Key-value pairs**: TOML, JSON, YAML files\n- **File existence**: Ensure critical files exist\n- **And more**: See [docs/checkers.md](docs/checkers.md) for all features\n\n## Get Started\n\nMake a `check-config.toml` according your needs:\n\n```toml\n# Set your preferred editor\n[[lines_present]]\nfile = \"~/.bashrc\"\nlines = \"export EDITOR=hx\"\n```\n\nAnd use it:\n\n```shell\n# Check if configurations match requirements\ncheck-config\n\n# Apply missing configurations\ncheck-config --fix\n```\n\n## Documentation\n\n\ud83d\udcd6 **[Full Documentation](https://check-config.readthedocs.io)** - Complete guides, examples, and API reference\n\n---\n\n*Declare what you need. Share what matters. Keep everything in sync.*\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Check configuration files.",
"version": "0.9.10",
"project_urls": {
"Homepage": "https://pypi.org/project/check-config/",
"homepage": "https://check-config.readthedocs.io",
"source": "https://github.com/mrijken/check-config"
},
"split_keywords": [
"automation",
" configuration"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6a5642ceb54ae8d04aedfa94ce7f5ade955b809e949524fe3deea31e7f1f5517",
"md5": "24d396b3d0a813398dfad9e29b4d6a34",
"sha256": "3bac80e4b3ac355c30674d88e483acf9128e413ecc4930a8df7b299f3a4dbec5"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "24d396b3d0a813398dfad9e29b4d6a34",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 3814602,
"upload_time": "2025-11-05T23:39:30",
"upload_time_iso_8601": "2025-11-05T23:39:30.727046Z",
"url": "https://files.pythonhosted.org/packages/6a/56/42ceb54ae8d04aedfa94ce7f5ade955b809e949524fe3deea31e7f1f5517/check_config-0.9.10-py3-none-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "14c9aea5865ccca50eb8cd6499fdf1d3a04c3bfbf7da82691cf4e51234f3a9ef",
"md5": "6eea7409e1069a76e3308eb681ede80a",
"sha256": "786411b5289ad13cb5032252bb290da91918fdc7bf70fcf9fe425f3fdb76eb52"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "6eea7409e1069a76e3308eb681ede80a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 3899962,
"upload_time": "2025-11-05T23:39:32",
"upload_time_iso_8601": "2025-11-05T23:39:32.344197Z",
"url": "https://files.pythonhosted.org/packages/14/c9/aea5865ccca50eb8cd6499fdf1d3a04c3bfbf7da82691cf4e51234f3a9ef/check_config-0.9.10-py3-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fbd0ad7d60871c2851271b5c88144b2cc0bbfc7755b276e1646ae6976d2f8078",
"md5": "59915eed6e50be1f58da4c83e894d074",
"sha256": "86a50283067d394a886e41d38b1f6cd32bc1b017541b8caec1dec360459519e6"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "59915eed6e50be1f58da4c83e894d074",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 4538509,
"upload_time": "2025-11-05T23:39:34",
"upload_time_iso_8601": "2025-11-05T23:39:34.240783Z",
"url": "https://files.pythonhosted.org/packages/fb/d0/ad7d60871c2851271b5c88144b2cc0bbfc7755b276e1646ae6976d2f8078/check_config-0.9.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f7e927856fd02b3d510d5f10a6e3318db4a861e275ff4f7181c8886e440ce64e",
"md5": "638b52b8e7ffd5cc78ac2e0d56362abd",
"sha256": "b84d599dc3c819eb61ac4cf90911a6c30047cfd0826824ae68a865f81924859b"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "638b52b8e7ffd5cc78ac2e0d56362abd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 3915743,
"upload_time": "2025-11-05T23:39:35",
"upload_time_iso_8601": "2025-11-05T23:39:35.842735Z",
"url": "https://files.pythonhosted.org/packages/f7/e9/27856fd02b3d510d5f10a6e3318db4a861e275ff4f7181c8886e440ce64e/check_config-0.9.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bbe2b5fa24bf5d38732ced28d40e6630cf426f2eed224d2a40c7300640cf7451",
"md5": "b2733d56a04c4a949233150fdafefee8",
"sha256": "5b39fe3df5517f93e372037f67dfc2780dd11212acc3bbf46e2793a88342e944"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "b2733d56a04c4a949233150fdafefee8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 4597019,
"upload_time": "2025-11-05T23:39:37",
"upload_time_iso_8601": "2025-11-05T23:39:37.199778Z",
"url": "https://files.pythonhosted.org/packages/bb/e2/b5fa24bf5d38732ced28d40e6630cf426f2eed224d2a40c7300640cf7451/check_config-0.9.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "642b1af13feaca35c9336811058b0d5d3de920d409efd781e9a958ec3cafe6b6",
"md5": "ddf14093510aedb5213ccd2f6743c612",
"sha256": "d6097c7ca69ca40e4af96c05c0f93b0a60e862905cacc87295e91cdb42eec899"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ddf14093510aedb5213ccd2f6743c612",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 4581401,
"upload_time": "2025-11-05T23:39:38",
"upload_time_iso_8601": "2025-11-05T23:39:38.824930Z",
"url": "https://files.pythonhosted.org/packages/64/2b/1af13feaca35c9336811058b0d5d3de920d409efd781e9a958ec3cafe6b6/check_config-0.9.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4c61f8476d27dedd18da70dbf14ba561d4e273262312a8adf7bf7c924aba6483",
"md5": "65e321516716148b540ee3c092ac64ed",
"sha256": "bab9f3304686a15baf0cd5474ace7e85926b0d89cc9258a42f260c41fa543cb7"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-win32.whl",
"has_sig": false,
"md5_digest": "65e321516716148b540ee3c092ac64ed",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 2331630,
"upload_time": "2025-11-05T23:39:40",
"upload_time_iso_8601": "2025-11-05T23:39:40.501478Z",
"url": "https://files.pythonhosted.org/packages/4c/61/f8476d27dedd18da70dbf14ba561d4e273262312a8adf7bf7c924aba6483/check_config-0.9.10-py3-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9f3b6380fbb4e331b7b511bb95c5f5f421312b66685fb565c93630f894e00596",
"md5": "94a6734ea08bbda2ccf102c6dc2d4d25",
"sha256": "3e7802a26ff3a51cb68987f133e0b38083587cdb6b5686d7f8cb9671402a5886"
},
"downloads": -1,
"filename": "check_config-0.9.10-py3-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "94a6734ea08bbda2ccf102c6dc2d4d25",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 2525407,
"upload_time": "2025-11-05T23:39:41",
"upload_time_iso_8601": "2025-11-05T23:39:41.660679Z",
"url": "https://files.pythonhosted.org/packages/9f/3b/6380fbb4e331b7b511bb95c5f5f421312b66685fb565c93630f894e00596/check_config-0.9.10-py3-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fb173d25f84ab09912db193308f1a1a6c58c16373a98c774ada33976739f7f1e",
"md5": "0cd77596d1a031b3d99f1d103f82105e",
"sha256": "9056f3771924d90f5c80f8cf7049890ac6bd4fe8138b320c51b0bc86080fe3b2"
},
"downloads": -1,
"filename": "check_config-0.9.10.tar.gz",
"has_sig": false,
"md5_digest": "0cd77596d1a031b3d99f1d103f82105e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 75625,
"upload_time": "2025-11-05T23:39:42",
"upload_time_iso_8601": "2025-11-05T23:39:42.819937Z",
"url": "https://files.pythonhosted.org/packages/fb/17/3d25f84ab09912db193308f1a1a6c58c16373a98c774ada33976739f7f1e/check_config-0.9.10.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-05 23:39:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "mrijken",
"github_project": "check-config",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "check-config"
}