FerrFlow reads ferrflow.toml from the root of your repository. If no config file is found, it auto-detects common version files in the current directory.

[workspace]

Global settings that apply to all packages.

[workspace]
remote = "origin"   # Git remote to push to (default: "origin")
branch = "main"     # Branch to push to (default: auto-detected from remote HEAD)

[[package]]

Defines a package to version. You can have one or many.

[[package]]
name      = "api"                        # Used in git tags: api@v1.2.0
path      = "packages/api"               # Path to the package root
changelog = "packages/api/CHANGELOG.md"  # Where to write the changelog
shared_paths = ["packages/shared/"]      # Changes here also trigger this package
Field Required Description
name yes Package identifier, used in git tag prefix
path yes Relative path to the package directory
changelog no Path to the changelog file (defaults to {path}/CHANGELOG.md)
shared_paths no List of paths — changes in any of them trigger this package

[[package.versioned_files]]

Files where the version number should be updated.

[[package.versioned_files]]
path   = "packages/api/Cargo.toml"
format = "toml"
format File Field updated
toml Cargo.toml, pyproject.toml [package].version
json package.json version
xml pom.xml First <version> element
gradle build.gradle, build.gradle.kts version = "..."
gomod go.mod No file update — version comes from git tags only

A package can have multiple versioned files:

[[package.versioned_files]]
path   = "Cargo.toml"
format = "toml"

[[package.versioned_files]]
path   = "npm/package.json"
format = "json"

Complete example

[workspace]
remote = "origin"
branch = "main"

[[package]]
name      = "api"
path      = "packages/api"
changelog = "packages/api/CHANGELOG.md"
shared_paths = ["packages/shared/"]

[[package.versioned_files]]
path   = "packages/api/Cargo.toml"
format = "toml"

[[package]]
name      = "site"
path      = "packages/site"
changelog = "packages/site/CHANGELOG.md"
shared_paths = ["packages/shared/"]

[[package.versioned_files]]
path   = "packages/site/package.json"
format = "json"