Configuration
FlowForge v3 reads its configuration from a single file at the root of your project: .flowforge/config.yml. This file declares the project name, the issue tracker FlowForge talks to, the rule presets and overrides FlowForge enforces, and the quantitative coding standards FlowForge measures against. Every value has a sensible default, so the smallest valid config is just two lines.
This section is the authoritative reference for that file. If a behavior is not described here or on one of the linked sub-pages, it is not part of the v3 contract.
Where the config lives
Section titled “Where the config lives”your-project/├── .flowforge/│ └── config.yml ← FlowForge v3 configuration├── src/└── package.jsonThe path is relative to the project root and is fixed. FlowForge does not search parent directories and does not read configuration from package.json, pyproject.toml, or other ecosystem manifests. If .flowforge/config.yml does not exist, FlowForge applies the default configuration and continues — running FlowForge against an unconfigured project is supported.
Validation behavior
Section titled “Validation behavior”FlowForge validates config.yml against a strict schema each time the configuration is loaded. The schema is the single source of truth — every loader, command, and rule reads through it.
Two validation guarantees are worth calling out explicitly:
- Strict object shape. The top-level object is
.strict(). Any key other thanversion,project,tracking,rules, orstandardscauses a load-time error that lists the unknown key and the valid alternatives. This is intentional: it catches typos liketracker:(instead oftracking:) before they silently disable a feature. - Typed leaves with bounded ranges. Every leaf has an explicit type and, where applicable, a bounded range (for example
standards.testCoverageis constrained to0–100). A value that is the wrong type or out of range fails validation with the offending path included in the error message.
When validation fails, FlowForge raises an error of the form:
Invalid configuration in /path/to/.flowforge/config.yml: - <field path>: <message> - ...For unknown keys, the error message also enumerates the valid top-level keys, so a typo points immediately at its fix.
Defaults philosophy
Section titled “Defaults philosophy”FlowForge ships defaults that match the recommended professional baseline. Concretely:
- A config with only
versionandproject.nameis fully valid. - All other sections (
tracking,rules,standards) and every nested field have defaults applied by the schema. - Defaults reflect the FlowForge recommended baseline: GitHub for tracking, conventional commits, 80% test coverage, 700-line file ceiling, 50-line function ceiling, no preset rule sets, no overrides.
This means most projects only declare what they want to change. The full default-applied object is what the rules engine ultimately sees, regardless of how sparse the original file is.
Smallest valid config
Section titled “Smallest valid config”version: '3.0'project: name: my-appThis file passes validation and runs against every default. It is the recommended starting point for a brand-new FlowForge project; tune from there.
Configuration sections
Section titled “Configuration sections”The configuration file has five top-level sections. Each section has its own reference page:
| Section | Purpose | Reference |
|---|---|---|
version | FlowForge config schema version (must match 3.x). | config.yml schema |
project | Project name and ecosystem type. | config.yml schema |
tracking | Issue tracker provider, repository identifier, sync toggle. | Tracking providers |
rules | Preset extends and per-rule severity/option overrides. | Built-in rules |
standards | Quantitative coding standards (coverage, file/function caps, commit format). | Standards |
For ecosystem-tuned starter configs (Node, Python, Go, Rust), see Project type examples. For environment variable overrides that change FlowForge runtime behavior without editing config.yml, see Environment variables.
Configuration precedence
Section titled “Configuration precedence”The final FlowForge runtime state is computed from three sources, in order:
- Schema defaults. Whatever the schema declares as the default for an omitted field.
.flowforge/config.yml. The project’s on-disk configuration. Values from this file override schema defaults.- Environment variables. A small set of variables overrides specific runtime behaviors at the per-process level. Today the surface is minimal — see Environment variables for the implemented and planned set. Environment variables do not mutate
config.ymland are not persisted between sessions.
This layering keeps config.yml portable across machines while still allowing per-shell or CI-specific tweaks at the environment level.
Version compatibility
Section titled “Version compatibility”The version field must match the regex ^3\.\d+(?:\.\d+)?(?:-[\w.]+)?$. In practice this accepts:
'3.0','3.1','3.0.0','3.0.0-alpha.1'
It rejects:
'3.','3.xyz','2.0','3'
Quote the version in YAML so it is parsed as a string. Unquoted 3.0 is technically a float in YAML and will fail schema validation.
Where to go next
Section titled “Where to go next”- Need the full schema? config.yml schema walks every field, including types, defaults, and examples.
- Tuning rules? Built-in rules catalogs the eight rules that ship in v3 and shows the override syntax.
- Connecting your tracker? Tracking providers covers GitHub, Linear, Jira, Notion, and
local. - Setting standards? Standards explains the rationale for each default threshold.
- Working in a specific ecosystem? Project type examples ships ready-to-use configs for Node, Python, Go, and Rust.
- Tweaking runtime behavior? Environment variables lists the user-facing overrides.