Commit Conventions
Commit messages are written in English using Conventional Commits with a
leading gitmoji:
<emoji> <type>(<scope>): <subject>
Valid types
The type must be one of: feat, fix, docs, style, refactor, perf,
test, build, ci, chore, revert.
The emoji identifies the change, the type must always be valid. Critical
hotfixes and security fixes are still a fix, never a new type:
| Gitmoji |
Type |
Meaning |
| ✨ |
feat |
New feature |
| 🐛 |
fix |
Bug fix |
| 🚑️ |
fix |
Critical hotfix |
| 🔒️ |
fix |
Security fix or hardening |
| 📝 |
docs |
Documentation |
| 🎨 |
style |
Formatting/style, no logic change |
| ♻️ |
refactor |
Refactoring |
| ⚡️ |
perf |
Performance improvement |
| ✅ |
test |
Tests |
| 👷 |
build |
Build changes |
| 💚 |
ci |
CI changes |
| 🔧 |
chore |
Chore/configuration |
| ⏪️ |
revert |
Revert |
| ⬆️ |
chore |
Dependency upgrade |
| ⬇️ |
chore |
Dependency downgrade |
| ➕ |
chore |
Add dependency |
| ➖ |
chore |
Remove dependency |
| 🔥 |
chore |
Remove code or files |
| 🗃️ |
chore |
Database schema/migration |
| 🚀 |
ci |
Deploy/release |
Scope
- The
scope is based on the affected file PATH: the service directory or a
module inside it, never a class name or symbol.
- Prefer short scopes derived from the service path (
payments for a payment
service, ui for a web client), not the full repo or module name.
- Omit the scope when it adds no signal or the header would exceed the limit.
Header length
- Maximum 72 characters excluding the emoji. Some gitmojis carry U+FE0F
(multiple code points), so counting the emoji would make the limit unstable;
exclude it.
- Aim for 60 characters or fewer.
- Subject: imperative mood, starts lowercase, no trailing punctuation.
- If the header is too long: tighten the subject, shorten the scope, drop the
scope, then move useful context into the body.
Body
- Omit the body when the subject expresses the change.
- Use it only for useful context: why the change was made, non-obvious design
decisions, reviewer context.
- Do not repeat the subject or describe the diff line by line.
- Separate subject and body with a blank line.
Breaking changes
- Add
! after type/scope and a BREAKING CHANGE: footer explaining the
impact.
Other rules
- Never reference tickets, issues, or PR numbers.
- Never include
Co-Authored-By: trailers in commit messages.
- Only return a commit message when asked to generate one.
Example:
✨ feat(auth): add JWT refresh-token rotation
1---2name: commit-conventions3description: Conventional Commits with a leading gitmoji - valid types, scope derived from file paths, header at most 72 characters excluding the emoji, subject/body/breaking-changes rules. Load when writing, reviewing, or generating a commit message.4---56# Commit Conventions78Commit messages are written in **English** using **Conventional Commits** with a9leading gitmoji:1011```text12<emoji> <type>(<scope>): <subject>13```1415## Valid types1617The `type` must be one of: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`,18`test`, `build`, `ci`, `chore`, `revert`.1920The emoji identifies the change, the type must **always** be valid. Critical21hotfixes and security fixes are still a `fix`, never a new type:2223| Gitmoji | Type | Meaning |24| ------- | ---------- | --------------------------------- |25| ✨ | `feat` | New feature |26| 🐛 | `fix` | Bug fix |27| 🚑️ | `fix` | Critical hotfix |28| 🔒️ | `fix` | Security fix or hardening |29| 📝 | `docs` | Documentation |30| 🎨 | `style` | Formatting/style, no logic change |31| ♻️ | `refactor` | Refactoring |32| ⚡️ | `perf` | Performance improvement |33| ✅ | `test` | Tests |34| 👷 | `build` | Build changes |35| 💚 | `ci` | CI changes |36| 🔧 | `chore` | Chore/configuration |37| ⏪️ | `revert` | Revert |38| ⬆️ | `chore` | Dependency upgrade |39| ⬇️ | `chore` | Dependency downgrade |40| ➕ | `chore` | Add dependency |41| ➖ | `chore` | Remove dependency |42| 🔥 | `chore` | Remove code or files |43| 🗃️ | `chore` | Database schema/migration |44| 🚀 | `ci` | Deploy/release |4546## Scope4748- The `scope` is based on the affected file **PATH**: the service directory or a49 module inside it, never a class name or symbol.50- Prefer short scopes derived from the service path (`payments` for a payment51 service, `ui` for a web client), not the full repo or module name.52- Omit the scope when it adds no signal or the header would exceed the limit.5354## Header length5556- Maximum **72 characters excluding the emoji**. Some gitmojis carry U+FE0F57 (multiple code points), so counting the emoji would make the limit unstable;58 exclude it.59- Aim for **60 characters or fewer**.60- Subject: imperative mood, starts lowercase, no trailing punctuation.61- If the header is too long: tighten the subject, shorten the scope, drop the62 scope, then move useful context into the body.6364## Body6566- Omit the body when the subject expresses the change.67- Use it only for useful context: why the change was made, non-obvious design68 decisions, reviewer context.69- Do not repeat the subject or describe the diff line by line.70- Separate subject and body with a blank line.7172## Breaking changes7374- Add `!` after type/scope and a `BREAKING CHANGE:` footer explaining the75 impact.7677## Other rules7879- Never reference tickets, issues, or PR numbers.80- Never include `Co-Authored-By:` trailers in commit messages.81- Only return a commit message when asked to generate one.8283Example:8485```text86✨ feat(auth): add JWT refresh-token rotation87```