Commit messages,
done right.
A minimal, deterministic commit standard that replaces noise with signal. Built for teams. Designed to last.
// Before
feat(ui): Add accordion menu component
fix: Fix login redirect loop issue
refactor(core): Session cleanup and reorganization
chore(ci): Update pipeline for staging deployments
fix(a11y): Fix missing aria labels on modal
perf(db): optimize transaction batching
// OpenCommits
Add ui accordion menu
Fix login redirect loop
Ref core session cleanup
Chr ci update staging pipeline
Fix a11y missing aria labels
Opt db transaction batching
The Format
One structure.
Every commit.
Three components. No colons, parentheses, or mandatory footers. Just clarity.
Type[!]·[scope]·description
Typerequired
A 3-letter capitalized identifier describing the intent. Add, Fix, Ref and more.
!optional
Appended after Type. Signals a breaking change. Maps to SemVer MAJOR regardless of base type.
scopeoptional
Lowercase domain identifier — where the change lives. ui, api, db, auth.
descriptionrequired
Lowercase, concise, human-readable. No trailing period. Write for someone scanning git log at speed.
Types
Every commit
has a name.
Core Types are mandatory for compliance. Extended Types are officially defined — opt in when your team benefits.
Addminor
New features or capabilities
Introducing new behavior, components, endpoints, or flows.
Add ui accordion menu
Fixpatch
Bug fixes or incorrect behavior
Any correction of incorrect runtime behavior or bugs.
Fix api pagination off by one
Ref—
Refactor internal structure
Structural changes that do not alter external behavior.
Ref core session cleanup
Opt—
Performance optimizations
When the primary goal is speed, efficiency, or resource reduction.
Opt db transaction batching
Rmv—
Remove code or features
Dead code, obsolete functionality. Use Rmv! for breaking removals.
Rmv unused cache layer
Doc—
Documentation and comments
README, API docs, architecture docs, inline comments.
Doc auth token lifecycle
Tst—
Add or update tests
Any test-only change — adding, updating, or fixing tests.
Tst add jwt expiration edge cases
Sty—
Style and formatting
Purely cosmetic — formatting, linting, prettier. No logic changes.
Sty apply prettier across backend
Chr—
Chores
Tooling, CI/CD, dependency updates, build scripts, infrastructure.
Chr ci update staging pipeline
Rev—
Revert a previous commit
Reference the original Type and description. Rev! for breaking rollbacks.
Rev Add experimental sidebar
SemVer Mapping
Automation-ready
by design.
Every commit maps deterministically to a semantic version impact. No context. No guessing. Tooling reads it directly.
| Type | SemVer Impact | Rule |
|---|---|---|
| Any Type + ! | major | Breaking change overrides all defaults |
| Add | minor | New capability added |
| Dep | minor | Signals a future MAJOR |
| Fix, Sec | patch | Corrective change |
| Ref, Opt, Rmv, Mov, Rnm | internal | No version bump unless ! is used |
| Doc, Tst, Sty, Chr, Cfg, Rev | none | No version impact |
Validation
One regex.
CI-ready.
The normative pattern for OpenCommits v1.0.0. Defines the complete grammar of a valid subject line. Drop it into any linter.
Default profile — allows up to two scope tokens
^(Add|Fix|Ref|Opt|Rmv|Doc|Tst|Sty|Chr|Mov|Rnm|Dep|Sec|Cfg|Rev)(!)?( [a-z][a-z0-9]*){0,2} [a-z].+$
Strict profile — single scope only
^(Add|Fix|Ref|Opt|Rmv|Doc|Tst|Sty|Chr|Mov|Rnm|Dep|Sec|Cfg|Rev)(!)?( [a-z][a-z0-9]*)? [a-z].+$
Start using it
today.
Read the full specification, contribute to the standard, or drop the regex into your CI pipeline right now.