InstallationΒΆ

Quick startΒΆ

$ cd my-project
$ uvx -- repomatic init
$ git add .
$ git commit -m "Update repomatic files"
$ git push

Works for both new and existing repositories. Run repomatic init --help to see available components and options: the workflows then take it from there, opening issues and PRs to guide any remaining setup.

Try itΒΆ

Thanks to uv, you can run it in one command, without installation or venv:

$ uvx -- repomatic --help
$ repomatic --help
Usage: repomatic [OPTIONS] COMMAND [ARGS]...

Options:
  --time / --no-time           Measure and print elapsed execution time.
                               [default: no-time]
  --config CONFIG_PATH         Location of the configuration file. Supports
                               local path with glob patterns or remote URL.
                               [default: ~/.config/repomatic/{*.toml,*.yaml,*.ym
                               l,*.json,*.ini,pyproject.toml}]
  --no-config                  Ignore all configuration files and only use
                               command line parameters and environment
                               variables.
  --validate-config FILE       Validate the configuration file and exit.
  --accessible                 Accessibility mode: disable colors and render
                               tables in a plain, screen-reader-friendly format.
  --color [auto|always|never]  Colorize the output. A bare --color is the same
                               as --color=always; --no-color aliases
                               --color=never.  [default: auto]
  --progress / --no-progress   Show progress indicators during long operations.
                               Disabled for non-interactive output (pipes, dumb
                               terminals, CI) and by --accessible.  [default:
                               progress]
  --theme [dark|dracula|light|manpage|monokai|nord|solarized_dark]
                               Color theme used for help screens.  [default:
                               dark]
  --show-params                Show all CLI parameters, their provenance,
                               defaults and value, then exit.
  --table-format [aligned|asciidoc|colon-grid|csv|csv-excel|csv-excel-tab|csv-unix|double-grid|double-outline|fancy-grid|fancy-outline|github|grid|heavy-grid|heavy-outline|hjson|html|jira|json|json5|jsonc|latex|latex-booktabs|latex-longtable|latex-raw|mediawiki|mixed-grid|mixed-outline|moinmoin|orgtbl|outline|pipe|plain|presto|pretty|psql|rounded-grid|rounded-outline|rst|simple|simple-grid|simple-outline|textile|toml|tsv|unsafehtml|vertical|xml|yaml|youtrack]
                               Rendering style of tables.  [default: rounded-
                               outline]
  --verbosity LEVEL            Either CRITICAL, ERROR, WARNING, INFO, DEBUG.
                               [default: WARNING]
  -v, --verbose                Increase the default WARNING verbosity by one
                               level for each additional repetition of the
                               option.  [default: 0]
  -q, --quiet                  Decrease the default WARNING verbosity by one
                               level for each additional repetition of the
                               option.  [default: 0]
  --man                        Show the command's man page (roff) and exit.
  --version                    Show the version and exit.
  -h, --help                   Show this message and exit.

Project setup:
  init                      Bootstrap a repository to use reusable workflows
  metadata                  Output project metadata
  show-config               Print [tool.repomatic] configuration reference
  show-test-matrix          Render the CI test matrix as a grid
  workflow                  Lint downstream workflow caller files
  update-deps-graph         Generate dependency graph from uv lockfile
  update-docs               Regenerate Sphinx API docs and run update script
  convert-to-myst           Convert reST docstrings to MyST in Python files
  list-skills               List available Claude Code skills
  update-checksums          Update SHA-256 checksums for binary downloads
  format-images             Format images with lossless optimization

Release & versioning:
  changelog                 Maintain a Markdown-formatted changelog
  release-prep              Prepare files for a release
  version-check             Check if a version bump is allowed
  close-stale-bump-pr       Close a stale version-bump PR
  git-tag                   Create and push a Git tag
  scan-virustotal           Upload release binaries to VirusTotal

Sync:
  sync-gitignore            Sync .gitignore from gitignore.io templates
  sync-github-releases      Sync GitHub release notes from changelog
  sync-dev-release          Sync rolling dev pre-release on GitHub
  sync-mailmap              Sync Git's .mailmap file with missing contributors
  sync-uv-lock              Re-lock dependencies and roll cooldown overrides
                            forward
  sync-bumpversion          Sync bumpversion config from bundled template
  clean-unmodified-configs  Remove config files that match bundled defaults
  sync-labels               Sync repository labels via labelmaker

GitHub issues & PRs:
  sponsor-label             Label issues/PRs from GitHub sponsors
  broken-links              Manage broken links issue lifecycle
  setup-guide               Manage setup guide issue lifecycle
  unsubscribe-threads       Unsubscribe from closed, inactive notification
                            threads
  pr-body                   Generate PR body with workflow metadata

Linting & checks:
  verify-binary             Verify binary architecture using exiftool
  audit                     Report (and optionally fix) vulnerable dependencies
  check-renovate            Check Renovate migration prerequisites
  lint-repo                 Run repository consistency checks
  lint-changelog            Check changelog dates against release dates
  run                       Run an external tool with managed config
  cache                     Manage the download cache

Other commands:
  help                      Show help for a command.
$ uvx -- repomatic==6.28.0 --help
$ uvx --from "repomatic @ git+https://github.com/kdeldycke/repomatic" -- repomatic --help

Install methodsΒΆ

repomatic is available on a couple of package managers:

Easiest way is to install uv, then install repomatic system-wide with the uv tool command:

$ uv tool install repomatic

You can install the latest stable release and its dependencies with a simple pip call:

$ python -m pip install repomatic

If you have difficulties to use pip, see pip’s own installation instructions.

pipx is a great way to install Python applications globally:

$ pipx install repomatic

A repomatic package is available on AUR and can be installed with any AUR helper:

$ yay -S python-repomatic
$ paru -S python-repomatic
$ pacaur -S python-repomatic

Python compatibilityΒΆ

The table below shows which Python versions each repomatic release range supports, derived from the requires-python field and Programming Language :: Python classifiers across all release tags. Releases prior to 4.0.0 did not declare an explicit requires-python constraint and are not represented.

repomatic

Released

3.8

3.9

3.10

3.11

3.12

3.13

3.14

4.25.x β†’ 6.x

2025-12-05

❌

❌

βœ…

βœ…

βœ…

βœ…

βœ…

4.20.x β†’ 4.24.x

2025-10-10

❌

❌

❌

βœ…

βœ…

βœ…

βœ…

4.15.x β†’ 4.19.x

2025-03-05

❌

❌

❌

βœ…

βœ…

βœ…

❌

4.7.x β†’ 4.14.x

2024-11-03

❌

❌

βœ…

βœ…

βœ…

βœ…

❌

4.4.x β†’ 4.6.x

2024-07-27

❌

βœ…

βœ…

βœ…

βœ…

❌

❌

4.0.x β†’ 4.3.x

2024-06-29

βœ…

βœ…

βœ…

βœ…

βœ…

❌

❌

ExecutablesΒΆ

To ease deployment, standalone executables of repomatic’s latest version are available as direct downloads for several platforms and architectures:

That way you have a chance to try it out without installing Python or uv. Or embed it in your CI/CD pipelines running on minimal images. Or run it on old platforms without worrying about dependency hell.

Default dependenciesΒΆ

This is a graph of the default, main dependencies of the Python package:

        flowchart LR
    repomatic[["`repomatic`"]]

    subgraph primary-deps [Primary dependencies]
        click_extra{{"`click-extra`"}}
        vt_py{{"`vt-py`"}}
        pydriller{{"`pydriller`"}}
        wcmatch{{"`wcmatch`"}}
        py_walk{{"`py-walk`"}}
        pyproject_metadata{{"`pyproject-metadata`"}}
        tomlrt{{"`tomlrt`"}}
        packaging{{"`packaging`"}}
        pyyaml{{"`pyyaml`"}}
        boltons{{"`boltons`"}}
        extra_platforms{{"`extra-platforms`"}}
        backports_strenum{{"`backports-strenum`"}}
    end

    aiohttp(["`aiohttp`"])
    typing_extensions(["`typing-extensions`"])
    pygments(["`pygments`"])
    requests(["`requests`"])
    yarl(["`yarl`"])
    aiosignal(["`aiosignal`"])
    click_0(["`click`"])
    cloup(["`cloup`"])
    colorama(["`colorama`"])
    lizard(["`lizard`"])
    multidict(["`multidict`"])
    tomli(["`tomli`"])
    frozenlist(["`frozenlist`"])
    gitdb(["`gitdb`"])
    gitpython(["`gitpython`"])
    idna(["`idna`"])
    propcache(["`propcache`"])
    tabulate(["`tabulate`"])
    aiofiles(["`aiofiles`"])
    aiohappyeyeballs(["`aiohappyeyeballs`"])
    async_timeout(["`async-timeout`"])
    attrs(["`attrs`"])
    bracex(["`bracex`"])
    certifi(["`certifi`"])
    charset_normalizer(["`charset-normalizer`"])
    deepmerge(["`deepmerge`"])
    pathspec(["`pathspec`"])
    pytz(["`pytz`"])
    sly(["`sly`"])
    smmap(["`smmap`"])
    types_pytz(["`types-pytz`"])
    urllib3(["`urllib3`"])
    wcwidth(["`wcwidth`"])

    subgraph grp_docs [--group docs]
        sphinx{{"`sphinx >=8`"}}
        myst_parser{{"`myst-parser >=5.1`"}}
        furo{{"`furo >=2025.9.25`"}}
        jinja2(["`jinja2`"])
        sphinxcontrib_mermaid{{"`sphinxcontrib-mermaid >=1.2.3`"}}
        beautifulsoup4(["`beautifulsoup4`"])
        docutils(["`docutils`"])
        markdown_it_py(["`markdown-it-py`"])
        accessible_pygments(["`accessible-pygments`"])
        mdit_py_plugins(["`mdit-py-plugins`"])
        sphinx_autodoc_typehints{{"`sphinx-autodoc-typehints >=2.4`"}}
        sphinx_basic_ng(["`sphinx-basic-ng`"])
        sphinx_copybutton{{"`sphinx-copybutton >=0.5.2`"}}
        sphinx_design{{"`sphinx-design >=0.6`"}}
        sphinxext_opengraph{{"`sphinxext-opengraph >=0.13`"}}
        alabaster(["`alabaster`"])
        babel(["`babel`"])
        imagesize(["`imagesize`"])
        markupsafe(["`markupsafe`"])
        mdurl(["`mdurl`"])
        roman_numerals(["`roman-numerals`"])
        snowballstemmer(["`snowballstemmer`"])
        soupsieve(["`soupsieve`"])
        sphinxcontrib_applehelp(["`sphinxcontrib-applehelp`"])
        sphinxcontrib_devhelp(["`sphinxcontrib-devhelp`"])
        sphinxcontrib_htmlhelp(["`sphinxcontrib-htmlhelp`"])
        sphinxcontrib_jsmath(["`sphinxcontrib-jsmath`"])
        sphinxcontrib_qthelp(["`sphinxcontrib-qthelp`"])
        sphinxcontrib_serializinghtml(["`sphinxcontrib-serializinghtml`"])
    end

    subgraph grp_test [--group test]
        pytest{{"`pytest >=9`"}}
        pytest_cov{{"`pytest-cov >=4`"}}
        pytest_xdist{{"`pytest-xdist >=3.7`"}}
        coverage{{"`coverage >=7.11`"}}
        exceptiongroup(["`exceptiongroup`"])
        pluggy(["`pluggy`"])
        pytest_github_actions_annotate_failures{{"`pytest-github-actions-annotate-failures >=0.2`"}}
        pytest_randomly{{"`pytest-randomly >=3`"}}
        execnet(["`execnet`"])
        iniconfig(["`iniconfig`"])
        psutil(["`psutil`"])
    end

    subgraph grp_typing [--group typing]
        types_boltons{{"`types-boltons >=25.0.0.20250822`"}}
        types_pyyaml{{"`types-pyyaml >=6.0.12.9`"}}
    end

    repomatic ==>|" >=7.19 "| click_extra
    repomatic ==>|" >=2 "| pydriller
    repomatic ==>|" >=17 "| packaging
    repomatic ==>|" >=6.0.3 "| pyyaml
    repomatic ==>|" >=0.18 "| vt_py
    repomatic ==>|" >=10 "| wcmatch
    repomatic ==>|" >=25 "| boltons
    repomatic ==>|" >=12.0.2 "| extra_platforms
    repomatic ==>|" >=0.3.1 "| py_walk
    repomatic ==>|" >=0.9 "| pyproject_metadata
    repomatic ==>|" >=1.7.6 "| tomlrt
    repomatic ==>|" >=1 "| backports_strenum
    sphinx --> pygments
    sphinx --> requests
    sphinx --> jinja2
    sphinx ==> packaging
    sphinx --> colorama
    sphinx --> docutils
    sphinx --> alabaster
    sphinx --> babel
    sphinx --> imagesize
    sphinx --> roman_numerals
    sphinx --> snowballstemmer
    sphinx --> sphinxcontrib_applehelp
    sphinx --> sphinxcontrib_devhelp
    sphinx --> sphinxcontrib_htmlhelp
    sphinx --> sphinxcontrib_jsmath
    sphinx --> sphinxcontrib_qthelp
    sphinx --> sphinxcontrib_serializinghtml
    click_extra ==> sphinx
    click_extra --> pygments
    click_extra --> requests
    click_extra --> click_0
    click_extra --> cloup
    click_extra --> docutils
    click_extra --> tomli
    click_extra ==> wcmatch
    click_extra ==> boltons
    click_extra ==> extra_platforms
    click_extra --> tabulate
    click_extra --> deepmerge
    pytest --> pygments
    pytest ==> packaging
    pytest --> colorama
    pytest --> tomli
    pytest --> exceptiongroup
    pytest --> pluggy
    pytest --> iniconfig
    myst_parser ==> sphinx
    myst_parser --> jinja2
    myst_parser --> docutils
    myst_parser --> markdown_it_py
    myst_parser ==> pyyaml
    myst_parser --> mdit_py_plugins
    furo ==> sphinx
    furo --> pygments
    furo --> beautifulsoup4
    furo --> accessible_pygments
    furo --> sphinx_basic_ng
    pydriller --> lizard
    pydriller --> gitpython
    pydriller --> pytz
    pydriller --> types_pytz
    pytest_cov ==> pytest
    pytest_cov ==> coverage
    pytest_cov --> pluggy
    pytest_xdist ==> pytest
    pytest_xdist --> execnet
    pytest_xdist --> psutil
    sphinxcontrib_mermaid ==> sphinx
    sphinxcontrib_mermaid --> jinja2
    sphinxcontrib_mermaid ==> pyyaml
    coverage --> tomli
    vt_py --> aiohttp
    vt_py --> aiofiles
    wcmatch --> bracex
    py_walk --> sly
    pyproject_metadata ==> packaging
    pytest_github_actions_annotate_failures ==> pytest
    pytest_randomly ==> pytest
    sphinx_autodoc_typehints ==> sphinx
    sphinx_copybutton ==> sphinx
    sphinx_design ==> sphinx
    sphinxext_opengraph ==> sphinx
    tomlrt --> typing_extensions
    aiohttp --> typing_extensions
    aiohttp --> yarl
    aiohttp --> aiosignal
    aiohttp --> multidict
    aiohttp --> frozenlist
    aiohttp --> propcache
    aiohttp --> aiohappyeyeballs
    aiohttp --> async_timeout
    aiohttp --> attrs
    requests --> idna
    requests --> certifi
    requests --> charset_normalizer
    requests --> urllib3
    jinja2 --> markupsafe
    beautifulsoup4 --> typing_extensions
    beautifulsoup4 --> soupsieve
    click_0 --> colorama
    cloup --> typing_extensions
    cloup --> click_0
    lizard --> pygments
    lizard --> pathspec
    markdown_it_py --> mdurl
    accessible_pygments --> pygments
    exceptiongroup --> typing_extensions
    gitpython --> gitdb
    mdit_py_plugins --> markdown_it_py
    sphinx_basic_ng ==> sphinx
    tabulate --> wcwidth
    yarl --> multidict
    yarl --> idna
    yarl --> propcache
    aiosignal --> typing_extensions
    aiosignal --> frozenlist
    multidict --> typing_extensions
    gitdb --> smmap
    repomatic -.-> grp_docs
    repomatic -.-> grp_test
    repomatic -.-> grp_typing

    click accessible_pygments "https://pypi.org/project/accessible-pygments/" _blank
    click aiofiles "https://pypi.org/project/aiofiles/" _blank
    click aiohappyeyeballs "https://pypi.org/project/aiohappyeyeballs/" _blank
    click aiohttp "https://pypi.org/project/aiohttp/" _blank
    click aiosignal "https://pypi.org/project/aiosignal/" _blank
    click alabaster "https://pypi.org/project/alabaster/" _blank
    click async_timeout "https://pypi.org/project/async-timeout/" _blank
    click attrs "https://pypi.org/project/attrs/" _blank
    click babel "https://pypi.org/project/babel/" _blank
    click backports_strenum "https://pypi.org/project/backports-strenum/" _blank
    click beautifulsoup4 "https://pypi.org/project/beautifulsoup4/" _blank
    click boltons "https://pypi.org/project/boltons/" _blank
    click bracex "https://pypi.org/project/bracex/" _blank
    click certifi "https://pypi.org/project/certifi/" _blank
    click charset_normalizer "https://pypi.org/project/charset-normalizer/" _blank
    click click_0 "https://pypi.org/project/click/" _blank
    click click_extra "https://pypi.org/project/click-extra/" _blank
    click cloup "https://pypi.org/project/cloup/" _blank
    click colorama "https://pypi.org/project/colorama/" _blank
    click coverage "https://pypi.org/project/coverage/" _blank
    click deepmerge "https://pypi.org/project/deepmerge/" _blank
    click docutils "https://pypi.org/project/docutils/" _blank
    click exceptiongroup "https://pypi.org/project/exceptiongroup/" _blank
    click execnet "https://pypi.org/project/execnet/" _blank
    click extra_platforms "https://pypi.org/project/extra-platforms/" _blank
    click frozenlist "https://pypi.org/project/frozenlist/" _blank
    click furo "https://pypi.org/project/furo/" _blank
    click gitdb "https://pypi.org/project/gitdb/" _blank
    click gitpython "https://pypi.org/project/gitpython/" _blank
    click idna "https://pypi.org/project/idna/" _blank
    click imagesize "https://pypi.org/project/imagesize/" _blank
    click iniconfig "https://pypi.org/project/iniconfig/" _blank
    click jinja2 "https://pypi.org/project/jinja2/" _blank
    click lizard "https://pypi.org/project/lizard/" _blank
    click markdown_it_py "https://pypi.org/project/markdown-it-py/" _blank
    click markupsafe "https://pypi.org/project/markupsafe/" _blank
    click mdit_py_plugins "https://pypi.org/project/mdit-py-plugins/" _blank
    click mdurl "https://pypi.org/project/mdurl/" _blank
    click multidict "https://pypi.org/project/multidict/" _blank
    click myst_parser "https://pypi.org/project/myst-parser/" _blank
    click packaging "https://pypi.org/project/packaging/" _blank
    click pathspec "https://pypi.org/project/pathspec/" _blank
    click pluggy "https://pypi.org/project/pluggy/" _blank
    click propcache "https://pypi.org/project/propcache/" _blank
    click psutil "https://pypi.org/project/psutil/" _blank
    click py_walk "https://pypi.org/project/py-walk/" _blank
    click pydriller "https://pypi.org/project/pydriller/" _blank
    click pygments "https://pypi.org/project/pygments/" _blank
    click pyproject_metadata "https://pypi.org/project/pyproject-metadata/" _blank
    click pytest "https://pypi.org/project/pytest/" _blank
    click pytest_cov "https://pypi.org/project/pytest-cov/" _blank
    click pytest_github_actions_annotate_failures "https://pypi.org/project/pytest-github-actions-annotate-failures/" _blank
    click pytest_randomly "https://pypi.org/project/pytest-randomly/" _blank
    click pytest_xdist "https://pypi.org/project/pytest-xdist/" _blank
    click pytz "https://pypi.org/project/pytz/" _blank
    click pyyaml "https://pypi.org/project/pyyaml/" _blank
    click repomatic "https://pypi.org/project/repomatic/" _blank
    click requests "https://pypi.org/project/requests/" _blank
    click roman_numerals "https://pypi.org/project/roman-numerals/" _blank
    click sly "https://pypi.org/project/sly/" _blank
    click smmap "https://pypi.org/project/smmap/" _blank
    click snowballstemmer "https://pypi.org/project/snowballstemmer/" _blank
    click soupsieve "https://pypi.org/project/soupsieve/" _blank
    click sphinx "https://pypi.org/project/sphinx/" _blank
    click sphinx_autodoc_typehints "https://pypi.org/project/sphinx-autodoc-typehints/" _blank
    click sphinx_basic_ng "https://pypi.org/project/sphinx-basic-ng/" _blank
    click sphinx_copybutton "https://pypi.org/project/sphinx-copybutton/" _blank
    click sphinx_design "https://pypi.org/project/sphinx-design/" _blank
    click sphinxcontrib_applehelp "https://pypi.org/project/sphinxcontrib-applehelp/" _blank
    click sphinxcontrib_devhelp "https://pypi.org/project/sphinxcontrib-devhelp/" _blank
    click sphinxcontrib_htmlhelp "https://pypi.org/project/sphinxcontrib-htmlhelp/" _blank
    click sphinxcontrib_jsmath "https://pypi.org/project/sphinxcontrib-jsmath/" _blank
    click sphinxcontrib_mermaid "https://pypi.org/project/sphinxcontrib-mermaid/" _blank
    click sphinxcontrib_qthelp "https://pypi.org/project/sphinxcontrib-qthelp/" _blank
    click sphinxcontrib_serializinghtml "https://pypi.org/project/sphinxcontrib-serializinghtml/" _blank
    click sphinxext_opengraph "https://pypi.org/project/sphinxext-opengraph/" _blank
    click tabulate "https://pypi.org/project/tabulate/" _blank
    click tomli "https://pypi.org/project/tomli/" _blank
    click tomlrt "https://pypi.org/project/tomlrt/" _blank
    click types_boltons "https://pypi.org/project/types-boltons/" _blank
    click types_pytz "https://pypi.org/project/types-pytz/" _blank
    click types_pyyaml "https://pypi.org/project/types-pyyaml/" _blank
    click typing_extensions "https://pypi.org/project/typing-extensions/" _blank
    click urllib3 "https://pypi.org/project/urllib3/" _blank
    click vt_py "https://pypi.org/project/vt-py/" _blank
    click wcmatch "https://pypi.org/project/wcmatch/" _blank
    click wcwidth "https://pypi.org/project/wcwidth/" _blank
    click yarl "https://pypi.org/project/yarl/" _blank

    style repomatic stroke-width:3px
    style backports_strenum stroke-width:3px
    style boltons stroke-width:3px
    style click_extra stroke-width:3px
    style coverage stroke-width:3px
    style extra_platforms stroke-width:3px
    style furo stroke-width:3px
    style myst_parser stroke-width:3px
    style packaging stroke-width:3px
    style py_walk stroke-width:3px
    style pydriller stroke-width:3px
    style pyproject_metadata stroke-width:3px
    style pytest stroke-width:3px
    style pytest_cov stroke-width:3px
    style pytest_github_actions_annotate_failures stroke-width:3px
    style pytest_randomly stroke-width:3px
    style pytest_xdist stroke-width:3px
    style pyyaml stroke-width:3px
    style sphinx stroke-width:3px
    style sphinx_autodoc_typehints stroke-width:3px
    style sphinx_copybutton stroke-width:3px
    style sphinx_design stroke-width:3px
    style sphinxcontrib_mermaid stroke-width:3px
    style sphinxext_opengraph stroke-width:3px
    style tomlrt stroke-width:3px
    style types_boltons stroke-width:3px
    style types_pyyaml stroke-width:3px
    style vt_py stroke-width:3px
    style wcmatch stroke-width:3px

    style primary-deps fill:#1565C020,stroke:#42A5F5
    style grp_docs fill:#546E7A20,stroke:#90A4AE
    style grp_test fill:#546E7A20,stroke:#90A4AE
    style grp_typing fill:#546E7A20,stroke:#90A4AE