Skip to main content

ghfanout

GitHub Pages Coverage PyPI version Python versions License: MIT

Configuration-as-Code for many GitHub repositories. Manage shared configuration files (.gitignore, pom.xml, pyproject.toml, package.json, …) in one place — a single source of truth — and fan them out as pull requests (or direct pushes). Edit a file once, run one command, and every affected repository gets a PR.

  • No git clone of target repositories — everything goes through the GitHub Git Data API, so it works with nothing more than pip install
  • Kustomize-like base + overlay composition, with Jinja2 templating for per-repository values
  • Designed for microservice fleets that cannot be consolidated into a monorepo

Installation

pip install ghfanout        # or: uv tool install ghfanout

Requires Python 3.11 or later (tested on 3.11–3.14).

Quick start

# 1. Generate a config repository scaffold (with a working sample)
ghfanout init ./my-config --org myorg
cd my-config

# 2. Compose base + overlay locally and inspect the result (no git operations, no network)
ghfanout build example-service           # output: dist/example-service/

# 3. Authenticate, preview the diff against the real repository, then deploy
export GHFANOUT_TOKEN=ghp_xxxx
ghfanout deploy example-service --dry-run
ghfanout deploy example-service          # opens a PR if there is a diff

How it fits together — base/ holds the content, overlays/ selects who gets it:

ghfanout.yaml                # destination host / org
.ghfanoutignore              # optional: files under base/ to exclude (.gitignore syntax)
base/
  common/                    # distributed to every repository
    .gitignore
  java-service/              # a profile: distributed only to repos that opt in
    pom.xml.jinja            # .jinja = Jinja2 template, rendered per repository
  python-service/
    pyproject.toml
  node-service/
    package.json
overlays/
  user-service/              # directory name = target repository name
    manifest.yaml            # which profiles / branches this repo receives
  api-gateway/
    manifest.yaml

Documentation

Full documentation: https://seiya-koji.github.io/ghfanout/

  • Getting Started — install → init → build → deploy, end to end
  • Configuration — config repository layout, ghfanout.yaml, manifest.yaml, per-branch overrides
  • Templates — embedding per-repository values with Jinja2
  • Authentication — PAT and GitHub App
  • CLI Reference — commands, options, and behavior details
  • Development — local setup, tests, lint, and commit conventions

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ghfanout-0.2.0.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ghfanout-0.2.0-py3-none-any.whl (23.1 kB view details)

Uploaded Python 3

File details

Details for the file ghfanout-0.2.0.tar.gz.

File metadata

  • Download URL: ghfanout-0.2.0.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.27 {"installer":{"name":"uv","version":"0.11.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ghfanout-0.2.0.tar.gz
Algorithm Hash digest
SHA256 4e1dc2b76735537780998a7a3623c20e978b9d0248af2e30721205247ed9ec28
MD5 4d621e67e8b375b67a806d28bdd006a7
BLAKE2b-256 4f55c1eddfd94f7de32cf4b73cc8f2c3dd7cd8c0c97ec4f56deb100b8c8bb3cc

See more details on using hashes here.

File details

Details for the file ghfanout-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: ghfanout-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 23.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.27 {"installer":{"name":"uv","version":"0.11.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ghfanout-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 19e4ff148b2f92b472ce5403c8be9571fc5fa6aafd01d1e74feeb80f7c2b2d6a
MD5 705b172d9d3f827fcb463769fd888778
BLAKE2b-256 25d3daffafafb273ba3c9d48c99e666fcf9fc07d612b134103db44089b0009a6

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

2 files

0.3.0

2 files

This release

0.2.0 This release

2 files

0.1.0

2 files

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