Release cadence discussion

Helloooooooooo :wave:

I would like to start a discussion about Meteor’s current release cadence, especially regarding release candidates and small patches.

My feeling is that we sometimes wait too long before making relatively small improvements available to users. A minor fix or quick win may be merged, but then remain bundled into a much larger release candidate, or even the next minor release, and effectively stay unavailable for several weeks or months.

I understand why this happens. Releases require coordination, testing, documentation, and confidence that we are not introducing regressions. Meteor is a mature framework used in production, so stability must obviously remain a priority.

However, I think the current development environment is changing rapidly. AI-assisted development makes it possible to implement, review, test, and iterate on changes much faster than before. This does not mean that we should merge or release untested code. It means that our release process should perhaps become more compatible with shorter feedback loops.

Instead of accumulating many unrelated changes into large release candidates, could we release smaller and more focused patches more frequently?

For example:

  • bug fixes and low-risk improvements could be released independently;

  • release candidates could contain fewer changes and be published more often;

  • fixes discovered while testing an RC could lead to a new RC quickly, rather than waiting for another larger batch of work;

  • changes that are already reviewed, tested, and ready would not remain blocked by unrelated features.

The goal would not necessarily be to develop more features or rush maintainers. It would be to reduce the delay between “this change is ready” and “users can actually test or use it.”

There is also a community benefit. Smaller releases are easier to test, easier to understand, and easier to troubleshoot. They give contributors faster feedback on their work and make it easier to identify which change introduced a regression.

I also think this could help with contribution momentum. It can be frustrating to contribute a useful fix, see it merged, and then wait one or two months before it becomes available in an official version. Faster releases would make contributions feel more concrete and would allow the community to validate them earlier.

Of course, this raises practical questions:

  • What is currently slowing down the release process?

  • Which parts could be automated?

  • Could some trusted contributors help prepare or validate releases? ( Hello there )

  • Should Meteor distinguish more clearly between low-risk patches and larger feature releases?

  • Would a predictable cadence, weekly, biweekly, or otherwise, help?

I am not proposing a specific process yet. I mainly want to understand the current constraints and discuss whether Meteor could move toward smaller, more frequent, and more incremental releases :+1:

At a time when the entire software industry is learning to iterate faster, I believe shortening Meteor’s feedback loop could be an important competitive advantage, provided we continue to protect quality and backward compatibility :chart_with_upwards_trend:

What do you think? :heart:

5 Likes

Hey, this is a good topic to discuss. We have talked about parts of this process here and there, and we agree that the time between a merged change and an official release can sometimes feel too long.

Short answer: yes, we should keep improving the cadence, especially for clear regressions and low-risk fixes. Smaller, focused patches can make sense. Narrower RCs and quicker follow-up RCs can also help users test ready work sooner. At the same time, major or riskier overhauls and modernizations need more time for feedback, iteration, compatibility work, and validation before they become stable. That inevitably slows the release cadence. Even then, while we address feedback, we try to include compatible, low-risk improvements in an ongoing beta when they fit its scope and do not make validation harder.

What sets the current pace

The main constraint is capacity. Across the three developers working on Meteor core, we have roughly 2 to 2.5 full-time capacity. That covers implementation, reviews, testing, support, documentation, release preparation, community follow-up, meetings, recordings, articles, ideation, cross-area compatibility, and cross-OS support and validation.

AI does help us move faster. It can investigate old issues, produce focused fixes, implement changes, and add tests quickly. That is genuinely useful. But it is also a double-edged tool.

Code volume is no longer the main limitation. Review capacity, confidence in a change, follow-up ownership, specialist knowledge, CI time, and real-world validation do not grow at the same rate. AI can produce a plausible answer to an issue, but it cannot by itself tell us whether that answer is safe for a legacy flow, compatible with the current architecture, still relevant to the roadmap, or likely to create integration issues in other untested or fragile parts of Meteor. We still need people who understand an area to make those calls.

A release is also a feedback cycle

Releasing is not especially hard by itself, and we have automated a lot of it. But it is not just pressing a button either. Each release needs a considered scope, changelogs and documentation, CI and E2E review, testing in examples and Cloud-related flows, and confidence that it is in good shape for real projects. When everything goes well, that can still take a full work day.

Release planning starts before a beta and continues while it is being tested. We define each beta’s scope before, then use its feedback window to triage, integrate, and validate the planned, compatible contributions for the next beta. This lets us prepare the next release without weakening the test focus of the beta already under test.

Historically, we have used the Meteor 3.x minor releases to keep focus on larger modernization work, including the bundler, Change Streams, and other architectural changes. Patches have mainly been the way to respond to feedback and regressions after those changes reach larger production applications.

This focused, iterative approach is how we have been able to deliver much of Meteor’s recent modernization despite limited capacity and a period of uncertainty for the project. Much of that work began before AI-assisted development made implementation and experimentation faster. Today, AI certainly helps us produce and evaluate more work faster, but the quality of delivery still depends on sustained technical planning, execution, and validation, rather than simply increasing the amount of code we can produce.

We also try to leave enough time for betas. That is not because we want changes to sit around unnecessarily. It is because the beta period gives people time to test, report problems, and help us fix them before an official release. We want to ship quality, not only quantity.

For us, release cadence is not only about how quickly we can publish a version. It is also about creating a useful feedback cycle: make a focused change available, give people enough time to try it in real projects, understand the feedback, and use that feedback to prepare the next release. Different teams adopt at different times, so some issues will only appear after a beta or an official release reaches a wider audience. A healthy cadence should make room for that learning without letting every release grow into an unrelated batch of work.

We have tried running releases in parallel as well. Meteor 3.4.1 and Meteor 3.5 had betas around the same time. In practice, that created more conflicts between versions, more release work, and less focus for roadmap priorities and community reviews. AI can help with some of that work, but it does not remove the need for specialist review or coordination.

At the same time, keeping a beta focused on a defined set of changes gives us a stable target for isolated testing and debugging. For example, the first Meteor 3.6 beta can focus on Rspack 2.x rather than combining many unrelated changes in the same beta. That focus also makes it easier to identify which changes cause regressions and fix them quickly. This is especially important when a minor release contains a platform-scale overhaul, as several recent Meteor minor releases have done. In those cases, the scope and compatibility risk can be closer to a future major release than to a routine patch.

What we are trying to improve

We agree that we should distinguish more clearly between a well-understood, low-risk patch and a larger feature release. We should keep releases focused, avoid letting unrelated work block a clear fix where possible, and make it easier to prepare a follow-up RC when beta testing finds a problem.

A predictable cadence is useful when the release scope and validation capacity support it. For the Meteor 3.5.x series, we are aiming for a roughly three-week cycle when conditions allow it: one week for implementation, triage, merging, and wrapping up ready candidates; one for beta validation; and one for the official release. That is a target, not a promise. We would rather keep that cycle focused and reliable than promise a weekly or biweekly schedule that creates more parallel branches, conflicts, and release overhead.

Meteor 3.6 already has material ready for its first beta, including Rspack 2.0 work, and it will follow Meteor 3.5.2. We are avoiding parallel releases again because they can end up delaying both versions. There is also important work already implemented and waiting for future releases, including the CapacitorJS beta.

We also think the cadence will improve as we complete the major platform overhauls that still need focused attention, including native support, TypeScript, and testing infrastructure. Those efforts require concentrated technical time for planning, implementation, testing, compatibility work, and validation. They should not be rushed simply to increase release frequency. The goal is to turn that work into stable, well-understood processes that provide lasting value for Meteor. As we complete those larger efforts, we will have more room to accelerate smaller, focused releases without compromising the quality that makes the framework dependable.

Earlier validation and community help

We also want to encourage developers and testers to work from Meteor checkouts when they want to try an ongoing change before an official or even a beta release is available. For example, we plan to provide clear instructions for experimenting with CapacitorJS before it reaches beta. That is not a replacement for stable releases, but it can give contributors and maintainers much faster feedback.

We also understand that waiting a long time for a merged contribution to reach users can be frustrating. Early validation through checkouts and betas can help contributors see the effect of their work sooner, even when a stable release still needs more time and coordination. Not every useful new contribution needs to enter Meteor core immediately, either. A third-party Atmosphere package can be a good way to experiment, publish value independently, and build community validation. It lets contributors move on a cadence that fits their work instead of waiting directly on the core release cycle, while still creating feedback and evidence that can help both the package and a possible future core integration.

Trusted contributors can absolutely help with reproduction, testing, triage, documentation, and validation. The important part is giving that help clear scope and keeping specialist review where compatibility or architectural decisions are involved. Every PR, release candidate, and branch still asks for shared attention, and reviewed code is not automatically ready for an independent release if its compatibility or support risk is still unclear.

Communication also needs to improve. The ongoing governance proposal is an important step, and we hope it helps give contributors clearer paths for discussion, experimentation, triage, and decisions before work becomes blocked in the shared queue. Better communication will help the community support core efforts and make the whole release process more agile.

So we do not think the answer is only “release more often”. It is also about keeping releases focused, reducing unrelated work in the review queue, reaching clear merge-or-close decisions, and using betas, checkouts, and community testing to get feedback earlier.

We are always trying to speed things up, but we also need to be realistic about our capacity. We appreciate the discussion, and we would be glad to keep it open for ideas on which parts of the process we can streamline further without losing the quality and stability people expect from Meteor. Practical support can help across the full path from contribution to release: reproduction and triage, proportionate test coverage, CI validation, integration with the latest deliveries, documentation, E2E coverage where needed, local-checkout testing when the change requires it, and cross-OS validation.

2 Likes

Thanks a lot for this @nachocodoner, genuinely. Getting this level of detail on how you actually work is really valuable, and I think this post will help a lot of people understand where Meteor stands right now, well beyond the release question :pray:

The parallel 3.4.1 and 3.5 betas is something I had noticed from the outside, and it explains a few misunderstandings I ran into on some PRs at the time. Good to know it looked the same way from your side :+1:

The capacity numbers put a lot of things in perspective, so let me ask the question that matters most to me from here: what would be actionable with little or no extra effort on your side?

(Two ideas, and I’m honestly curious whether they’d help or just add noise:

  • labels on PRs marking what’s being considered for the next RC or patch, so contributors can see what’s in flight without having to ask;

  • a clearer way to raise “this one is small and low risk, could it ride along with the next release” instead of it staying an implicit judgement call. )

On the community side, I’ll be honest with myself here: opening PRs and proposing things is always more attractive than triaging issues and reviewing other people’s work. That’s a weak spot of mine, and saying it isn’t the same as fixing it. So I’m up for taking some of that on :smiling_imp:

On documentation, I’d rather have a scoping conversation with you (meteor team) before touching anything. I genuinely don’t know what would be most useful, and guessing would only create more review work for you.

On testing, I need to get seriously back into it. I let it go quiet, including #14477, and that one’s on me to pick back up :grimacing:

1 Like

Currently, candidate PRs for a release are tracked using that release’s GitHub milestone. We don’t use labels for this, only milestones (e.g. Meteor 3.6 milestone, All Milestones), which also appear in the right column of each PR. Any PR added to a milestone is considered a candidate for that release and should be ready to merge into the next available beta, unless there is a strategic reason to delay its inclusion and eventually gets released on a later beta of the same version. Being ready means review feedback has been addressed (including valid coderabbitai feedback these days), test coverage is in place, CI is green, and any other required checks have passed. We also try to prioritize reviews for those PRs/issues on the milestone when we focus on that release.

We don’t mark which exact beta a PR will land in, but if it’s in the milestone, approved, and ready, it will normally be included in the next valid beta. It’s important to keep the PR healthy and up to date. If a PR is no longer ready, lacks feedback, etc, we simply move it to another milestone.

Also, if a ready PR needs attention, it’s always fine to ping us privately, on Discord, or on the forums, especially if it gets lost in the daily queue and overload. I hope we can improve this further with the governance work and clearer communication channels for all core contributors.

I agree. We should have those discussions earlier while deciding the release candidates. We’ll improve this over time, but at the very least, if a PR has been added to a release milestone, it means we’re committed to including it, with its risk level already taken into account, since what normally influences that decision is the type of release (minor vs patch / breaking changes vs backward-compatible changes / etc), its area of focus and roadmap alignment. From there, the remaining requirement is simply making sure all the green signals are in place before merging.

1 Like

I see value in making patch releases more often, and backporting patches to previous releases when it’s viable to do so.

Meteor had an unusual (by Meteor standards) sequence of releases that were non-trivial to upgrade to. 3.3, 3.4 and 3.5 specifically, when compared to typical pre-3.x releases.

I think the trade-offs made sense and Meteor is at the best it has been. But IMO, from now on, minimizing churn and update fatigue is the way to go. Even if LLMs can help end users upgrade, it’s still time and tokens spent on dep upgrades that weren’t spent improving their own programs.

Regarding where I’d prefer the dev team and community to spend its energy, my personal list is:

  • More patch releases backporting fixes to previous versions, when upgrading to the next one isn’t trivial (3.3, 3.4 and 3.5 specially).

  • Minimizing breakage caused by upgrading external dependencies, like rspack. If an upstream dependency changes an API or a configuration format, it’s worth our time to minimize the impact on Meteor users. If a compatibility layer is viable to write and maintain, IMO that’s a better solution than making every single user figure it out.

  • No fixed release cadence, unless a big dependency forces it (like a new Node.js LTS version). Releasing things once they’re ready is preferable.

  • Make sure users are delighted when a new release comes out, rather than worried about what’s going to break next.

I prefer LTS/Debian-style stability compared to the alternatives, so certainly that reflects on the above. :slight_smile: Whether it’s a business or hobbyist development, “move fast, break things” isn’t worth the headache for a lot of people.

I think reaching out to businesses running Meteor to work with them on testing new releases would be useful. But I don’t know if we have the bandwidth for that at the moment.

2 Likes

WeKan, from previous time, when there was no tests at all:

production

For WeKan:

Running big test suite takes time, because it needs to be run sequentially. I don’t have enough RAM to run all tests parallel. Running parallel also sometimes causes flaky test results.

It is not enough that AI fixes something, often it requires testing manually, and having many fixes. For example, for mobile UI, I had to check many times that text is visible at smartphone mobile UI, and add more fixes.

AI may make some parts of development process faster. But it’s not useful to do too much at once with many agents, that can corrupt code files that are edited by multiple agents at the same time. Fixing one bug at a time is better. There usually is also required making design decisions, what UI should look like, does adding feature make WeKan better or worse, what would be most logical place for some button, etc.

YMMV.

2 Likes

Thanks for the detailed explanation, @nachocodoner . I agree with your assessment, especially regarding our current capacity and the additional review and validation work created by parallel releases.

I think we already have a good release process and have learned a lot from the recent cycles. I am not proposing a major redesign, but I see a few areas where we could structure the existing process more clearly and improve it through small, targeted adjustments.

Release documentation

We already have parts of the process documented:

However, we still lack a single end-to-end operational runbook covering topics such as:

  • Responsibilities and ownership
  • Scope and prioritization decisions
  • Patch and backport rules
  • Required tests and validation
  • Branch synchronization
  • Entry and exit criteria for each release stage
  • Communication with contributors and the community
  • Recovery steps when something goes wrong

Much of this knowledge is currently fragmented or implicit. Consolidating it would reduce our dependency on tribal knowledge and make it easier for other contributors to participate in the process.

Patch and feature release lanes

I agree that our previous attempt to run releases in parallel did not bring meaningful benefits. However, I wonder whether the problem was parallelism itself or the fact that two similar release processes were competing for the same limited review, testing, and coordination capacity.

One possible adjustment would be to maintain two clearly separated release lanes.

Patch releases

A patch lane could:

  • Start from the latest stable version
  • Include only regressions, bug fixes, and well-understood low-risk improvements
  • Run more frequently when eligible fixes are ready
  • Use a shorter beta validation period of approximately one week
  • Follow a small and predictable checklist

Feature releases

A feature or minor release lane could:

  • Follow a longer cycle of approximately three months
  • Publish incremental betas throughout the cycle
  • Give the community more time to test larger changes
  • Allow completed features to be tested while other planned work continues
  • Move unfinished work to the next cycle instead of delaying everything that is already ready

The main benefit would be that a completed feature would not need to remain unavailable simply because another feature planned for the same release is still under development.

This would not be entirely new for Meteor

Historically, Meteor has already maintained patch and feature release lines in parallel at different points.

For example, on September 19, 2019, the team prepared both:

The Meteor 1.8.2 release discussion also explicitly mentions that the 1.8.2 line was reaching RC while the 1.9 branch was entering beta.

A similar pattern appeared again in 2020:

The same happened during the Meteor 2.x period. Meteor 2.7.3 had already been released when the older 2.5 line received another maintenance patch:

The preparation and community validation of that older maintenance release can also be seen in this Meteor Forum discussion and its follow-up messages about the 2.5.8 beta and official release.

These examples demonstrate that Meteor has used parallel maintenance and feature lines in practice. They do not necessarily prove that there was a formal, predictable two-lane policy with fixed rules and schedules.

Our proposal would therefore formalize and simplify a pattern that Meteor has used before, rather than introduce an entirely new release strategy.

Improving the current process

Today, because Nacho and I are the main people coordinating releases, patch fixes and larger feature work often become coupled into the same process.

Separating these concerns, with strict scope rules, clearer documentation, and more automation, could help us release low-risk fixes sooner without rushing larger changes or recreating two equally complex release processes.

Again, I do not think we need to replace the current process. I would prefer to evolve what already works through a few practical improvements rather than introduce a large new process with additional overhead.

Learning from other projects

It would also be valuable if people could share concrete examples of how other mature open-source projects organize patch and feature releases, especially projects with limited maintainer capacity.

Understanding which practices work elsewhere, and why, could help us identify small changes that fit Meteor instead of designing a process only from theory.

2 Likes

Node.js

Node’s releases page gives every line a status, and the Release WG README defines what each status accepts:

  • Current: most non-breaking changes from main
  • Active LTS: features and fixes audited by the release team
  • Maintenance: critical bug fixes and security updates

Everything lands on main first. Each LTS line has a release branch (v24.x) and a staging branch (v24.x-staging) where backports accumulate, and a change is expected to live in Current for at least two weeks before it gets backported

Starting with Node.js 27, the schedule changes: one major per year, with a new Alpha phase (October to March, semver-major allowed, signed releases tested against the ecosystem through CITGM, flexible cadence), then Current (April to October), then 30 months of LTS :+1:

The reasoning is the part I find most relevant for us:

Managing security releases across four or five active release lines has become difficult to sustain. Each additional line increases backporting complexity.

Facing limited volunteer capacity, Node chose fewer concurrent lines :thinking:

Rails: minors can break

Rails’ maintenance policy uses a shifted semver: patch releases contain fixes only, while minor releases can contain breaking changes, announced by deprecations in the previous release.

  • New features only go to main
  • Bug fixes land on main and are backported to the x-y-stable branch of the latest series “if there is sufficient need”. A patch release is built once “enough bugs fixes have been added”, with no fixed schedule :man_shrugging:
  • Each minor series gets bug fixes for 1 year and security fixes for 2 years
  • Security releases are built from the last released version plus the security patch only, not from the stable branch. On July 29 they shipped 8.1.3.1, 8.0.5.1 and 7.2.3.2 on the same day

Laravel: weekly releases, because minors never break :smile:

Laravel ships one major per year and minor or patch releases “as often as every week”. In practice, every week since early August has had a Tuesday release, usually for 12.x and 13.x on the same day. Each major gets bug fixes for 18 months and security fixes for 2 years :scream:

Their contribution guide names the target branch explicitly: all bug fixes go to the latest stable branch (13.x), never to master; backward-compatible features can go there too; breaking changes go to master. Maintainers then merge upward (12.x → 13.x → master)

That weekly cadence works because a Laravel minor never breaks anything, and the yearly major is kept deliberately small (“update to a new major release in one day or less”)

Side by side

Node.jsRailsLaravelMeteor today
Where a fix lands firstmain, backported downmain, backported downstable branch, merged updevel or the open release-X branch, merged back into devel
Branch modellong-lived per line (v24.x + v24.x-staging)long-lived per line (8-1-stable)long-lived per line (13.x)one per version (release-3.5.1, release-3.5.2…)
Can a minor break?noyesnoin practice, sometimes (platform overhauls)
Published support windowdated, per line1 year fixes, 2 years security18 months fixes, 2 years securityper major in SECURITY.md (3.x: all security issues)

What I take from this for Meteor

I’m looking at this from the outside, with only public policies and git tags to go on, so there are certainly constraints that are obvious from the inside. With that caveat, three things stand out to me.

1. A weekly train for small, non-breaking changes. Meteor minors look like Rails minors: as @nachocodoner said, recent 3.x minors carry platform-scale overhauls. But that’s a constraint on minors, not on patches. Laravel ships every week because those releases never break anything, and a weekly patch train on the current line, limited to changes that can’t break anything and skipped whenever nothing is ready, would apply the same idea at the patch level.

There’s material for it: right now, 30 of the 155 open non-draft PRs change 20 lines or fewer, and 7 of those show as approved. To take one of my own, #14304 replaces +new Date with Date.now() in three places (+3/−3) and got an approving review in April. Nobody needs a new minor to ship that kind of change.

The catch is release cost. Nacho mentioned that a release can take a full work day even when everything goes well; every week, that’s roughly a tenth of the 2 to 2.5 FTE he described. So the train only makes sense if a patch made only of small changes is much cheaper to cut than a regular release, and that’s where your point about automation matters most. Which steps of that day could be automated or lightened for such a patch?

2. Named phases could carry the scope rules. SECURITY.md already has a supported-versions table at the major level. Extending it down to minor lines, with Node-style statuses and what each status accepts, would turn “is this eligible for the patch lane?” into a written rule rather than a per-PR call. It would also cover @gr4vitywall’s points about backports and predictability. Only to show the shape (the actual statuses and windows are the team’s decision):

LineStatusAccepts
3.6Betaeverything planned for the minor
3.5Currentregressions, bug fixes, well-understood low-risk improvements
3.4Maintenancesecurity and critical fixes
≤ 3.3??

3. The main counter-argument to more lanes comes from Node itself. Every extra line adds backport work, and Node cut its lines for exactly that reason. When a minor contains an overhaul like Rspack 2, devel also drifts away from the current line quickly, and backports start to conflict. Laravel’s merge-up flow sidesteps part of that, since the fix is written against the stable code and flows forward, and Meteor already works that way with release-X branches merged back into devel. So two lanes look sustainable to me as long as only two lines receive regular fixes (current patches + next minor). Maintenance would then be the exception rather than a third lane: security and critical fixes only, cut on demand from the last release, the way Rails builds its security releases.

One question on the branch side: would a long-lived branch per line (say release-3.5.x, instead of one branch per patch version) help? Fix PRs would get a stable target to open against from day one. I don’t know what it would cost on the release tooling side, though :grimacing:

1 Like

Two release lines sounds interesting but it bring a longer minor releases as a trade off. IMO, the best and most feasible approach is to start with two release lines and adjust our beta/testing period:

Patches
We can ship patches roughly every 2 weeks (It doesn’t need to be a strict schedule). This gets bug and security fixes to the community faster, and we can also update the current beta with the same patches.

Minors
On the other hand, faster patches mean slower minors. Given our capacity, I propose one minor release per quarter (every three months). Each minor would stay in beta/RC longer than it does today (usually ~1 month), which gives the community more time to test it before the final release.

Node.js has a dedicated release team. Our community is much smaller, so I don’t think we need one but with the core maintainers helping to triage and review PRs, I believe we can make this work.

2 Likes

Absolutely agree with Bertrand. I run an AI factory (still improving it though) and such small changes are usually assessed as minor impact and are thus being approved automatically by agents itself (you can have a different view on that).

But the main message is the same, in this day and age you need to pick up speed. With AI agents becoming more and more popular, a lot more people are adding a lot more change requests, exponentially. I don’t think Tiny will add exponentially more people, so you need to embrace a new release process that takes care or the bottleneck becomes even bigger until it’s a deadlock.

Just my two cents,

Andreas

1 Like

Through Meteor 1.7, Meteor used to release patch security updates for the last 1 or 2 minor releases. Even though Meteor was very careful about breaking changes back then, it was still really nice for companies to be able to stay secure while updating to the newest minor release on their own schedule.

When this stopped around Meteor 1.8, some companies silently migrated away from Meteor because they were now forced to update to the newest release, with any breaking changes or unexpected bugs, to be able to use a secure version of Node. Besides 2.2, Meteor hasn’t again kept older releases up to date with Node’s security updates.

I think this has been discussed above, but I wanted to provide more context. I think whatever release method is decided on, it’s important for there to be a solution to this.

2 Likes