Skip to main content

Overview

HelixCommit offers flexible configuration through configuration files, command-line flags, and environment variables. You can customize how commits are processed, what gets included in release notes, and how output is formatted.

Configuration methods

Configuration files

Store project defaults in .helixcommit.toml or .helixcommit.yaml. Best for team-wide settings.

Command-line flags

Pass options directly when running commands. Best for one-off customizations and testing.

Environment variables

Set variables in your shell or CI/CD environment. Ideal for credentials and secrets.

Configuration precedence

When the same option is set in multiple places, HelixCommit uses this precedence (highest to lowest):
  1. Command-line flags - Always take priority
  2. Configuration file - Project defaults from .helixcommit.toml or .helixcommit.yaml
  3. Built-in defaults - Fallback values

Configuration files

HelixCommit looks for configuration files in your repository root in this order:
  1. .helixcommit.toml (TOML format)
  2. .helixcommit.yaml (YAML format)
The first file found is used. Configuration files are optional - HelixCommit works without them.

Custom config file location

Use the --config flag to specify a custom config file location instead of the default discovery:
# Use a specific config file
helixcommit generate --config /path/to/my-config.toml

# Use project-specific configs
helixcommit generate --config configs/release.yaml

# Use environment-specific configs
helixcommit generate --config ~/.helixcommit/production.toml
The --config flag is available on both generate and generate-commit commands.
Maintain different configurations for different release types:
# configs/major-release.toml
helixcommit generate --config configs/major-release.toml --unreleased

# configs/patch-release.toml
helixcommit generate --config configs/patch-release.toml --unreleased
Store team-wide settings in a central location:
# Use shared config from home directory
helixcommit generate --config ~/.helixcommit/team-config.yaml

# Or from a network location
helixcommit generate --config /shared/configs/helixcommit.toml
Use different configs per CI environment:
# GitHub Actions example
- name: Generate release notes (staging)
  run: helixcommit generate --config .ci/staging-config.toml --unreleased

- name: Generate release notes (production)
  run: helixcommit generate --config .ci/production-config.toml --unreleased
Template paths in custom config files are resolved relative to the config file’s location, not the repository root.
Create a .helixcommit.toml file in your repository root:
# .helixcommit.toml - HelixCommit configuration

[generate]
format = "markdown"           # Output format: markdown, html, text, json
include_scopes = true         # Show commit scopes in output
no_merge_commits = false      # Exclude merge commits
no_prs = false                # Skip PR/MR lookups
fail_on_empty = false         # Exit with error if no commits found

# Advanced filtering (v1.2+)
include_types = []            # Only include these commit types (e.g., ["feat", "fix"])
exclude_scopes = []           # Exclude commits with these scopes (e.g., ["deps", "ci"])
author_filter = ""            # Regex to filter by author name or email

[ai]
enabled = false               # Enable AI-powered summaries (--use-llm)
provider = "openrouter"       # AI provider: openai or openrouter
openai_model = "gpt-4o-mini"
openrouter_model = "x-ai/grok-4.1-fast:free"
include_diffs = false         # Include diffs for better AI context
domain_scope = "software release notes"
expert_roles = ["Product Manager", "Tech Lead", "QA Engineer"]
rag_backend = "simple"        # RAG backend: simple or chroma
Never store API keys or tokens in configuration files. Use environment variables for sensitive credentials like OPENAI_API_KEY, GITHUB_TOKEN, etc.

Environment variable expansion

Configuration files support environment variable expansion using the ${VAR} syntax. This allows you to reference environment variables directly in your config files, making configurations more portable across different environments.
Use ${VAR_NAME} to reference an environment variable:
# .helixcommit.toml
[ai]
enabled = true
openai_model = "${AI_MODEL}"
domain_scope = "${PROJECT_DOMAIN}"
# .helixcommit.yaml
ai:
  enabled: true
  openai_model: "${AI_MODEL}"
  domain_scope: "${PROJECT_DOMAIN}"
Set the variables before running:
export AI_MODEL=gpt-4o
export PROJECT_DOMAIN=e-commerce
helixcommit generate --unreleased
Use environment variables to switch between development and production settings:
# .helixcommit.toml
[generate]
format = "${OUTPUT_FORMAT:-markdown}"

[ai]
enabled = true
provider = "${AI_PROVIDER:-openrouter}"
openai_model = "${OPENAI_MODEL:-gpt-4o-mini}"
openrouter_model = "${OPENROUTER_MODEL:-x-ai/grok-4.1-fast:free}"
domain_scope = "${DOMAIN_SCOPE:-software release notes}"
Then configure per environment:
# Development
export AI_PROVIDER=openrouter
export OPENROUTER_MODEL=x-ai/grok-4.1-fast:free

# Production
export AI_PROVIDER=openai
export OPENAI_MODEL=gpt-4o
Reference template directories via environment variables:
# .helixcommit.toml
[templates]
markdown = "${TEMPLATE_DIR:-templates}/changelog.md.j2"
html = "${TEMPLATE_DIR:-templates}/changelog.html.j2"
Configure expert roles per team member or CI environment:
# .helixcommit.toml
[ai]
enabled = true
expert_roles = ["${PRIMARY_ROLE:-Product Manager}", "${SECONDARY_ROLE:-Tech Lead}"]
If an environment variable is not set and no default is provided, the reference (e.g., ${UNDEFINED_VAR}) is kept as-is in the config value.
Environment variable expansion is for non-sensitive configuration values like model names, domains, and paths. Never use this feature for API keys or tokens - those should always be set as environment variables directly and accessed by the application.

Configuration reference

OptionTypeDefaultDescription
formatstring"markdown"Output format: markdown, html, text, or json
include_scopesbooleantrueShow commit scopes (e.g., feat(api))
no_merge_commitsbooleanfalseExclude merge commits from output
no_prsbooleanfalseSkip GitHub/GitLab/Bitbucket PR lookups
fail_on_emptybooleanfalseExit with code 1 if no commits found
include_typesstring[][]Only include commits of these types (e.g., ["feat", "fix"])
exclude_scopesstring[][]Exclude commits with these scopes (e.g., ["deps", "ci"])
author_filterstringnullRegex pattern to filter commits by author name or email
OptionTypeDefaultDescription
enabledbooleanfalseEnable AI-powered summaries
providerstring"openrouter"AI provider: openai or openrouter
openai_modelstring"gpt-4o-mini"OpenAI model to use
openrouter_modelstring"x-ai/grok-4.1-fast:free"OpenRouter model to use
include_diffsbooleanfalseInclude commit diffs for AI context
domain_scopestringnullDomain context for AI prompts
expert_rolesstring[][]Expert roles for multi-perspective analysis
rag_backendstring"simple"RAG backend: simple or chroma

Example configurations

# .helixcommit.toml
[ai]
enabled = true
provider = "openrouter"
Then set your API key:
export OPENROUTER_API_KEY=sk-or-...
helixcommit generate --unreleased
# .helixcommit.toml
[generate]
format = "markdown"
no_merge_commits = true
fail_on_empty = true
# .helixcommit.toml
[generate]
format = "markdown"
no_merge_commits = true

# Only include features, fixes, and performance improvements
include_types = ["feat", "fix", "perf"]

# Exclude dependency updates and CI changes
exclude_scopes = ["deps", "ci"]

# Only include commits from team members
author_filter = ".*@mycompany\\.com"
# .helixcommit.yaml equivalent
generate:
  format: markdown
  no_merge_commits: true
  include_types:
    - feat
    - fix
    - perf
  exclude_scopes:
    - deps
    - ci
  author_filter: ".*@mycompany\\.com"

Core configuration areas

Commit range selection

Control which commits are included in your release notes.
Use semantic version tags to define ranges:
# Between two specific tags
helixcommit generate \
  --since-tag v1.2.0 \
  --until-tag v1.2.1

# From tag to HEAD (unreleased)
helixcommit generate \
  --since-tag v1.2.1 \
  --until HEAD
The --unreleased flag automatically uses the latest tag as the starting point.

Output formatting

Customize how release notes are formatted and where they’re saved.
format
string
default:"markdown"
Choose the output format that fits your publishing workflow.Markdown - Perfect for GitHub releases and documentation sites
helixcommit generate --format markdown --out RELEASE_NOTES.md
HTML - Ready for embedding in websites
helixcommit generate --format html --out changelog.html
Text - Plain text for email notifications or chat
helixcommit generate --format text --out changes.txt
JSON - Machine-readable for programmatic use
helixcommit generate --format json --out changelog.json
output destination
string
Control where output is written.Standard output (default)
gitreleasegen generate --format markdown
File output
gitreleasegen generate --out /path/to/output.md
Parent directories are created automatically if they don’t exist.

Filtering commits

Fine-tune which commits appear in your release notes.
# Exclude merge commits (cleaner output)
gitreleasegen generate --no-merge-commits

# Include merge commits (default)
gitreleasegen generate
Merge commits often duplicate information. Excluding them typically produces cleaner release notes.
# Process only the last 50 commits
gitreleasegen generate --max-items 50
Useful for testing or when you only need recent changes.
# With scopes (default)
gitreleasegen generate --include-scopes
# Output: "**api**: Add authentication endpoint"

# Without scopes
gitreleasegen generate --no-include-scopes
# Output: "Add authentication endpoint"
Scopes are extracted from Conventional Commits format: feat(api): message

GitHub integration

Configure how GitReleaseGen interacts with GitHub’s API.

Authentication

1

Create a GitHub token

Visit github.com/settings/tokens and create a personal access token.For public repositories: No special permissions neededFor private repositories: Select the repo scope
2

Set the token

export GITHUB_TOKEN=ghp_your_token_here

# Use in commands
gitreleasegen generate --unreleased
Never commit tokens to version control. Use environment variables or CI/CD secrets.

Rate limiting and retries

GitReleaseGen handles GitHub API rate limits automatically with exponential backoff.
GITRELEASEGEN_GH_MAX_RETRIES
integer
default:"3"
Maximum number of retry attempts for failed requests.
export GITRELEASEGEN_GH_MAX_RETRIES=5
GITRELEASEGEN_GH_BACKOFF_BASE_SEC
float
default:"0.5"
Initial delay between retries in seconds.
export GITRELEASEGEN_GH_BACKOFF_BASE_SEC=1.0
GITRELEASEGEN_GH_BACKOFF_CAP_SEC
float
default:"8"
Maximum delay between retries in seconds.
export GITRELEASEGEN_GH_BACKOFF_CAP_SEC=16

Caching

Reduce API calls and improve performance with caching.
GITRELEASEGEN_GH_CACHE
boolean
default:"false"
Enable persistent caching of GitHub API responses.
export GITRELEASEGEN_GH_CACHE=1
gitreleasegen generate --unreleased
Valid values: 1, true, yes, on
GITRELEASEGEN_GH_CACHE_DIR
path
default:".gitreleasegen-cache/github"
Directory where cache files are stored.
export GITRELEASEGEN_GH_CACHE_DIR=.cache/gh-api
GITRELEASEGEN_GH_CACHE_TTL_MINUTES
integer
default:"10"
How long cache entries remain valid in minutes.
export GITRELEASEGEN_GH_CACHE_TTL_MINUTES=30
Enable caching in CI/CD environments to speed up repeated runs and reduce API usage.

Skip GitHub integration

Work offline or skip PR lookups:
helixcommit generate --unreleased --no-prs
Using --no-prs means no GitHub API calls are made. Perfect for offline work or when PR metadata isn’t needed.

GitLab integration

HelixCommit automatically detects GitLab repositories (including self-hosted instances) and enriches release notes with merge request data.

Authentication

export GITLAB_TOKEN=glpat-your_token_here

helixcommit generate --unreleased
Required permissions: read_api and read_repository for private projects.
For more details, see the GitLab integration guide.

Bitbucket integration

HelixCommit automatically detects Bitbucket Cloud repositories and enriches release notes with pull request data.

Authentication

export BITBUCKET_TOKEN=your_app_password_here

helixcommit generate --unreleased
Required permissions: Repositories: Read, Pull requests: Read
For more details, see the Bitbucket integration guide.

AI configuration

Configure AI-powered summarization features.

Provider selection

export OPENAI_API_KEY=sk-...

gitreleasegen generate \
  --unreleased \
  --use-llm \
  --openai-model gpt-4o-mini
Recommended models:
  • gpt-4o-mini - Fast and cost-effective (recommended)
  • gpt-4o - Most capable
  • gpt-3.5-turbo - Budget option
Get your API key at platform.openai.com/api-keys

Summary caching

AI summaries are cached to minimize token usage and costs.
# Use custom cache location
gitreleasegen generate \
  --use-llm \
  --summary-cache .cache/ai-summaries.json

# Default cache location
# .gitreleasegen-cache/summaries.json
Delete the cache file to regenerate all summaries with updated prompts or settings.

Prompt engineering

Customize AI behavior with advanced options:
domain-scope
string
Set the domain context for better AI summaries.
gitreleasegen generate \
  --use-llm \
  --domain-scope "software release notes"
Examples: "conservation", "healthcare", "finance", "e-commerce"
expert-role
string[]
Define expert roles for multi-perspective analysis.
gitreleasegen generate \
  --use-llm \
  --expert-role "Product Manager" \
  --expert-role "Tech Lead" \
  --expert-role "Security Engineer"
Default roles: Product Manager, Tech Lead, QA Engineer
rag-backend
string
default:"simple"
Choose the retrieval backend for context.
# Simple keyword matching (default)
gitreleasegen generate --use-llm --rag-backend simple

# Vector-based retrieval (requires chromadb)
pip install chromadb
gitreleasegen generate --use-llm --rag-backend chroma

Example configurations

Generate release notes with no external dependencies:
gitreleasegen generate \
  --unreleased \
  --no-prs \
  --no-merge-commits \
  --format markdown \
  --out RELEASE_NOTES.md
Perfect for local development or air-gapped environments.
Fast generation for automated pipelines:
#!/bin/bash
export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
export GITRELEASEGEN_GH_CACHE=1
export GITRELEASEGEN_GH_CACHE_TTL_MINUTES=60

gitreleasegen generate \
  --since-tag $PREVIOUS_TAG \
  --until-tag $CURRENT_TAG \
  --no-merge-commits \
  --format markdown \
  --out RELEASE_NOTES.md \
  --fail-on-empty
Balanced configuration for team use:
# .env file
export GITHUB_TOKEN=ghp_...
export GITRELEASEGEN_GH_CACHE=1
export GITRELEASEGEN_GH_MAX_RETRIES=5

# Generate command
gitreleasegen generate \
  --unreleased \
  --include-scopes \
  --format markdown

Custom templates

GitReleaseGen uses formatters to render output. You can customize the look and feel by modifying templates.

Template locations

Templates are located in the GitReleaseGen package:
gitreleasegen/formatters/
├── markdown.py    # Markdown formatter
├── html.py        # HTML formatter
└── text.py        # Text formatter

Creating custom formatters

1

Copy an existing formatter

cp src/gitreleasegen/formatters/markdown.py my_formatter.py
2

Modify the template

Edit the rendering logic to match your needs. Formatters use Jinja2 templates for rendering.
3

Use programmatically

from gitreleasegen.changelog import ChangelogBuilder
import my_formatter

builder = ChangelogBuilder()
changelog = builder.build(...)
output = my_formatter.render(changelog)
For more details on programmatic usage, see the Python API reference.

Environment file

Create a .env file to store configuration:
.env
# GitHub configuration
GITHUB_TOKEN=ghp_your_token_here
GITRELEASEGEN_GH_CACHE=1
GITRELEASEGEN_GH_CACHE_TTL_MINUTES=30

# AI configuration
OPENAI_API_KEY=sk-...
# or
OPENROUTER_API_KEY=sk-or-...

# Rate limiting
GITRELEASEGEN_GH_MAX_RETRIES=5
GITRELEASEGEN_GH_BACKOFF_CAP_SEC=16
Load it before running commands:
source .env
gitreleasegen generate --unreleased
Add .env to your .gitignore to avoid committing secrets.

Next steps

CLI reference

Complete list of all CLI options

AI features

Learn about AI-powered summarization

Examples

See configuration in action

GitHub integration

Deep dive into GitHub API features