| Month | Freeze Week | Merge Friday | Snapshot | Quarter | Tag |
|---|---|---|---|---|---|
| Jan | 2024-12-27 | 2025-01-03 | 2025-01-10 | Q1 | 25.1.1 |
| 2025-01-10 | 2025-01-17 | 2025-01-24 | Q3 | 25.1.3 | |
| Feb | 2025-01-31 | 2025-02-07 | 2025-02-14 | Q1 | 25.2.1 |
| 2025-02-14 | 2025-02-21 | 2025-02-28 | Q3 | 25.2.3 | |
| Mar | 2025-02-28 | 2025-03-07 | 2025-03-14 | Q1 | 25.3.1 |
| 2025-03-14 | 2025-03-21 | 2025-03-28 | Q3 | 25.3.3 | |
| Apr | 2025-03-28 | 2025-04-04 | 2025-04-11 | Q1 | 25.4.1 |
| 2025-04-11 | 2025-04-18 | 2025-04-25 | Q3 | 25.4.3 | |
| May | 2025-04-25 | 2025-05-02 | 2025-05-09 | Q1 | 25.5.1 |
| 2025-05-09 | 2025-05-16 | 2025-05-23 | Q3 | 25.5.3 | |
| Jun | 2025-05-30 | 2025-06-06 | 2025-06-13 | Q1 | 25.6.1 |
| 2025-06-13 | 2025-06-20 | 2025-06-27 | Q3 | 25.6.3 | |
| Jul | 2025-06-27 | 2025-07-04 | 2025-07-11 | Q1 | 25.7.1 |
| 2025-07-11 | 2025-07-18 | 2025-07-25 | Q3 | 25.7.3 | |
| Aug | 2025-07-25 | 2025-08-01 | 2025-08-08 | Q1 | 25.8.1 |
| 2025-08-08 | 2025-08-15 | 2025-08-22 | Q3 | 25.8.3 | |
| Sep | 2025-08-29 | 2025-09-05 | 2025-09-12 | Q1 | 25.9.1 |
| 2025-09-12 | 2025-09-19 | 2025-09-26 | Q3 | 25.9.3 | |
| Oct | 2025-09-26 | 2025-10-03 | 2025-10-10 | Q1 | 25.10.1 |
| 2025-10-10 | 2025-10-17 | 2025-10-24 | Q3 | 25.10.3 | |
| Nov | 2025-10-31 | 2025-11-07 | 2025-11-14 | Q1 | 25.11.1 |
| 2025-11-14 | 2025-11-21 | 2025-11-28 | Q3 | 25.11.3 | |
| Dec | 2025-11-28 | 2025-12-05 | 2025-12-12 | Q1 | 25.12.1 |
| 2025-12-12 | 2025-12-19 | 2025-12-26 | Q3 | 25.12.3 |
- Development - All development and PRs target
dev - Release Candidate - On Freeze Week, merge
devβrc(release-candidate). Only bug fixes and stabilization allowed inrc.devremains open for new features. - Release - Merge
rcβmastertwice per month (1st Quarter & 3rd Quarter of the Month) - Snapshot - Create snapshot releases from stable
masterbranch
Note: The
devbranch is always open for new features and development every week, regardless of the release cycle. Only therc(release-candidate) branch is frozen for testing and bug fixes during release preparation.
- Week before 1st/3rd Friday (Freeze Week):
- π Merge latest
devβrc(release-candidate) - π«
rcbranch is frozen: Only bug fixes and stabilization allowed - β
devbranch remains open: New features and PRs accepted
- π Merge latest
- 1st/3rd Friday:
- π Merge
rcβmaster - π¦ Snapshot release (when
masteris stable) - π Preparation for next cycle/month
- β
devbranch remains open: New features and PRs accepted
- π Merge
Week before 1st/3rd Friday (Freeze Week):
- π Merge
devβrc - π« rc freeze - Only bug fixes and stabilization in
rc - β dev open - New features and PRs accepted
1st/3rd Friday:
- π Merge
rcβmaster - π¦ Snapshot release (when
masteris stable) - π Preparation for next cycle/month
| Quarter | Freeze Week | Merge Friday | Snapshot Friday | Dev Status | RC Status |
|---|---|---|---|---|---|
| 1st Quarter | Week before 1st Fri | 1st Friday | 2nd Friday | β OPEN | π« FROZEN |
| 3rd Quarter | Week before 3rd Fri | 3rd Friday | 4th Friday | β OPEN | π« FROZEN |
Key Rules:
- π«Freeze weeks: Merge
devβrc. Only bug fixes torc.devremains open for new features. - β
Open weeks: All development welcomed in
dev - π¦Snapshots: Only when
masteris stable - π4th Friday: Preparation for next cycle/month
| Phase | Dev Branch Status | RC Branch Status | Allowed Changes | Description |
|---|---|---|---|---|
| Freeze Week (before 1st & 3rd Friday) | β OPEN | π«FROZEN | β No new features in rcβ Bug fixes in rcβ All dev in dev |
Testing and validation |
| Merge Friday (1st & 3rd of month) | β OPEN | πMERGING | π Merge rc to master |
Deploy stable code |
| Stabilization Week (after merge) | β OPEN | β OPEN | β
All development in devπ§ Critical hotfixes in rc |
Monitor master & develop |
| Snapshot Release | β OPEN | π¦RELEASE | π¦ Create release | When master is stable |
| Period | Dev Status | RC Status | Master Status | Activity | Focus |
|---|---|---|---|---|---|
| Week before 1st Friday | β OPEN | π«FROZEN | π§ Previous fixes | Testing & validation | π§ͺ Prepare for merge |
| 1st Friday | β OPEN | πMERGING | π₯ Receives new code | Merge rc β master |
π Deploy |
| Week after 1st Friday | β OPEN | β OPEN | π§ Hotfixes only | Active development | π New features to dev |
| 2nd Friday | β OPEN | β OPEN | π¦SNAPSHOT | Release when stable | π¦ Release |
| Week before 2nd-to-last Friday | β OPEN | π«FROZEN | π§ Minor fixes only | Testing & validation | π§ͺ Prepare for merge |
| 2nd-to-last Friday | β OPEN | πMERGING | π₯ Receives new code | Merge rc β master |
π Deploy |
| Week after 2nd-to-last Friday | β OPEN | β OPEN | π§ Hotfixes only | Active development | π New features to dev |
| Last Friday | β OPEN | β OPEN | π¦SNAPSHOT | Release when stable | π¦ Release |
Freeze periods: ~2 weeks per month (handles variable month lengths)
We use year.month.quarter format (YY.M.Q) instead of traditional semantic versioning for several reasons:
- Release-cycle aligned: Matches our bi-monthly release schedule perfectly
- Time-based clarity: Instantly shows when a release was made
- Predictable progression: Always
.1then.3each month - No arbitrary numbers: No confusion about what constitutes "major" vs "minor"
- User-friendly: Easy to understand -
25.7.1= "July 2025, 1st Quarter of the Month"
- All pull requests should be made against
devbranch - Pull requests should be reviewed and approved by at least one other developer before merging
- Pull requests can be created anytime, but should be merged to
devbranch before releasing onmasterbranch - Pull requests should not be merged directly into
masterbranch - Pull requests should be merged within the release window for
masterbranch
Here are some visuals to help you understand the flowchart better.
graph TD
A[Normal Development<br/>β
All PRs to dev] --> B{Week Before<br/>1st/3rd Friday?}
B -->|Yes| C[π DEV β RC<br/>rc frozen<br/>π§ͺ Testing Phase]
B -->|No| A
C --> D[π MERGE DAY<br/>1st/3rd Friday<br/>rc β master]
D --> E[β
DEV & RC REOPEN<br/>New features to dev]
E --> F[π¦ SNAPSHOT RELEASE<br/>2nd/4th Friday<br/>When master stable]
F --> G[π Prep Next Cycle]
G --> A
style A fill:#a9b1d6,stroke:#252737,stroke-width:2px,color:#252737
style C fill:#ebbcba,stroke:#252737,stroke-width:2px,color:#252737
style D fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style E fill:#a9b1d6,stroke:#252737,stroke-width:2px,color:#252737
style F fill:#c79bf0,stroke:#252737,stroke-width:2px,color:#252737
style G fill:#ebbcba,stroke:#252737,stroke-width:2px,color:#252737
graph LR
subgraph "Dev Branch"
DEV[dev branch] --> RC[π MERGE<br/>to rc]
RC --> FROZEN[π« rc FROZEN<br/>fixes only]
FROZEN --> MERGE[π MERGING<br/>rc to master]
MERGE --> OPEN[β
OPEN<br/>all dev]
OPEN --> RC
end
subgraph "RC Branch"
RC2[rc branch] --> FROZEN2[π« FROZEN<br/>fixes only]
FROZEN2 --> MERGE2[π MERGING<br/>to master]
MERGE2 --> OPEN2[β
OPEN<br/>accepts new dev]
OPEN2 --> RC2
end
subgraph "Master Branch"
MASTER[master branch] --> PREV[π§ Previous fixes]
PREV --> RECEIVE[π₯ RECEIVES<br/>new code]
RECEIVE --> RELEASE[π¦ RELEASE<br/>when stable]
RELEASE --> PREV
end
MERGE -.-> RECEIVE
MERGE2 -.-> RECEIVE
style DEV fill:#252737,stroke:#a9b1d6,stroke-width:2px,color:#a9b1d6
style RC fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style FROZEN fill:#ebbcba,stroke:#252737,stroke-width:2px,color:#252737
style MERGE fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style OPEN fill:#a9b1d6,stroke:#252737,stroke-width:2px,color:#252737
style RC2 fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style FROZEN2 fill:#ebbcba,stroke:#252737,stroke-width:2px,color:#252737
style MERGE2 fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style OPEN2 fill:#a9b1d6,stroke:#252737,stroke-width:2px,color:#252737
style MASTER fill:#252737,stroke:#a9b1d6,stroke-width:2px,color:#a9b1d6
style PREV fill:#c79bf0,stroke:#252737,stroke-width:2px,color:#252737
style RECEIVE fill:#a9b1dc,stroke:#252737,stroke-width:2px,color:#252737
style RELEASE fill:#a9b1d6,stroke:#252737,stroke-width:2px,color:#252737
gantt
title Monthly Release Schedule
dateFormat X
axisFormat %a %d
section Week 1
β
Dev Open :devopen1, 1, 7d
π Dev β RC :devrc1, 2, 1d
π« RC Freeze & Testing :rctest1, 3, 5d
section Week 2
β
Dev Open :devopen2, 8, 7d
π RC β Master (Friday) :rcmaster1, 9, 1d
π§ͺ Master Testing :mastertest1, 10, 3d
π¦ Snapshot (Friday) :release1, 14, 1d
section Week 3
β
Dev Open :devopen3, 15, 7d
π Dev β RC :devrc2, 16, 1d
π« RC Freeze & Testing :rctest2, 17, 5d
section Week 4
β
Dev Open :devopen4, 22, 7d
π RC β Master (Friday) :rcmaster2, 23, 1d
π§ͺ Master Testing :mastertest2, 24, 3d
π¦ Snapshot (Friday) :release2, 1, 1d