migrate-to-meteor-3
Skill10 starsChanged 3 months agoMITView on GitHub
Use when migrating a Meteor 2.x application to Meteor 3.x. Triggers on callAsync, *Async Mongo, removed Fibers, implicit-global ReferenceError, lost Blaze reactivity, a publish function returning a Promise, a scheduler dropping a Promise, a read API receiving update modifiers, async allow/deny, an Iron Router controller not running, "Method stub took too long", Atmosphere resolution, Express 5 WebApp handlers, lost async context, rawCollection callbacks, TypeScript declaration failures during upgrades, useTracker, and useSubscribe. Use this skill when the user asks about upgrading Meteor, async caller propagation, iterators with await, or replacing and forking packages. Standalone declarations and type-checking belong to meteor-typescript.
1 other project uses a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- wekan/wekanedited, first seen Oct 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 1
- wekan/wekan★ 21k95% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository21 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .claude/CLAUDE.mdCLAUDE.md
- release-publishingSkill
- skill-gap-auditSkill
- skill-maintenanceSkill
- meteor-accountsSkill
- meteor-blazeSkill
- meteor-cli-installationSkill
- meteor-community-packagesSkill
- meteor-debuggingSkill
- meteor-deploymentSkill
- meteor-methodsSkill
- meteor-modern-build-stackSkill
- meteor-mongo-minimongoSkill
- meteor-nativeSkill
- meteor-pubsubSkill
- meteor-reactSkill
- meteor-securitySkill
- meteor-testingSkill
- meteor-typescriptSkill
- migrate-to-rspackSkill
The file
We split this skill into the rules it gives an agent
11 rules. About 0 are common, 2 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 37
Update the project to the latest 2.x release.
- Very specific: line 38
Run the app with WARN_WHEN_USING_OLD_API=true meteor run.
- Very specific: line 116
Do not run meteor update --release=3 first.
- Very specific: line 118
Do not global-replace findOne with findOneAsync.
- Distinctive: line 120
Do not mechanically rewrite client Minimongo calls to async.
- Very specific: line 124
Do not rely on Iron Router controller naming-convention lookup.
- Very specific: line 126
Do not mix await and .then() in the same function.
- Very specific: line 127
Do not assume implicit globals work.
- Very specific: line 129
Do not invent async replacements.
- Very specific: line 131
Do not use an arrow as a method or publication handler when it reads framework-bound this.
- Very specific: line 134
Do not rewrite api.addFiles or api.export only because the app moved to Meteor 3.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Migrate a Meteor 2.x application to Meteor 3.x
Meteor 3 removed Fibers. Server-side Mongo APIs are async. The module system enforces strict mode. Client reactivity inside async code needs care. Atmosphere packages often need forking or replacement. Approach the migration in phases. Do not flip the framework version flag first.
Recommended strategy
For 3.6-beta.3 or 3.6-rc.0, prepare retained local data under the previous release before updating.
- Update the project to the latest 2.x release.
- Run the app with
WARN_WHEN_USING_OLD_API=true meteor run. The console logs every sync-API call that needs an async sibling, giving you a to-do list before the framework flip. - Migrate server-side sync Mongo calls to
*Asyncsiblings while still on 2.x. Trace each changed function through every server-side caller: await where the caller consumes the value, forward Promises deliberately, and restructure sync-only boundaries. Stop only at an async-capable framework boundary. Seereferences/async-rewrites.mdandreferences/call-vs-callAsync.md. A community jscodeshift codemod automates the easy cases, but it misses non-standard collection imports (for example,meteor/<publisher>:collections). Review the diff by hand, then audit callback Promise ownership and collection argument shapes. - Audit Atmosphere packages. Find replacements or fork outdated ones;
pin
api.versionsFrom(['2.x', '3.0']). Seereferences/package-triage.md. Save.meteor/versionsand npm lockfile checkpoints so package-major changes remain distinguishable from Meteor. - Upgrade to the selected Meteor 3.x release.
- Sweep implicit globals; rewrite to
constorexport/import. Seereferences/module-system.md. - Audit Blaze helpers and
Tracker.autorunblocks for lost reactivity afterawait. Seereferences/client-reactivity.md. - Replace iterators that contain
await(forEach,map,filter) withfor...oforPromise.all. Seereferences/js-iterators.md. - Audit publications using internal cursor APIs (
_cursorDescription, manualsub.added) and framework handlers that read invocationthis. Both synchronous and async publish handlers may return cursors; keep cursor transforms synchronous and use ordinary functions when Meteor must bindthis. When a package patchesMeteor.publishwith anEnvironmentVariable, scopepublish.callat the wrapper's top level, not inside the invoked handler. Verify invocation context before and afterawait. Seereferences/publications.mdandreferences/other-breaking-changes.md. - For TypeScript projects, inspect the target release and existing declaration
provider. Keep working
@types/meteororzodern:typessetups. Meteor 3.6-beta.1 adds explicit native opt-in throughmeteor types; earlier releases retain the legacy workflow. Seereferences/typescript-migration.md, then usemeteor-typescriptfor provider changes and checking. - For React projects, decide whether to adopt the Suspense-aware
react-meteor-dataimport. Seereferences/react-migration.md, then usemeteor-reactfor current hook, scaffold, and build guidance.
Symptom router
| Symptom | Reference |
TypeError: Collection.findOne is not a function | references/async-rewrites.md |
Method returns undefined or returns a Promise | references/async-rewrites.md |
Downstream caller receives or reads from a Promise | references/async-rewrites.md |
| Cron, hook, timer, or event callback drops a Promise | references/async-rewrites.md |
Read method receives $set, $push, or another modifier | references/async-rewrites.md |
allow / deny validator needs an async database read | references/async-rewrites.md |
Meteor.call callback never fires | references/call-vs-callAsync.md |
ReferenceError: X is not defined at startup | references/module-system.md |
| Template renders, no data, Minimongo empty | references/module-system.md |
| Iron Router controller silently does not run | references/module-system.md |
{{> partial}} renders nothing in Blaze | references/module-system.md |
| Page renders but live data never updates | references/client-reactivity.md |
Blaze helper returns a Promise | references/client-reactivity.md |
Cursor transform errors with "returned a Promise" | references/publications.md |
sub.added writes never reach the client | references/publications.md |
Method or publication loses this.userId | references/publications.md |
| Atmosphere package fails to resolve or build | references/package-triage.md |
forEach/map/filter with await skips items | references/js-iterators.md |
Middleware on WebApp.connectHandlers not firing | references/webapp-express.md |
| Route uses an unnamed wildcard after Meteor 3.1 | references/webapp-express.md |
rawCollection callback never fires | references/other-breaking-changes.md |
Patched publication loses Meteor.userId() or async context | references/other-breaking-changes.md |
meteor reset did not wipe the local Mongo | references/other-breaking-changes.md |
Method stub (X) took too long console warning | references/call-vs-callAsync.md |
"Cannot enlarge memory array" during meteor update | references/other-breaking-changes.md |
External callback lost this.userId or env vars | references/other-breaking-changes.md |
Monkey-patched Meteor.publish never runs | references/other-breaking-changes.md |
meteor/* imports resolve to any in TypeScript | references/typescript-migration.md |
useTracker or useSubscribe not re-running | references/react-migration.md |
Anti-patterns
- Do not run
meteor update --release=3first. Async-convert and package-triage on 2.x first. - Do not global-replace
findOnewithfindOneAsync. Many callers need rewriting, not justawait. - Do not mechanically rewrite client Minimongo calls to async. Both APIs work
on the client. Prefer sync calls in naturally synchronous Blaze and Tracker
code; use async calls in shared or already-async flows. Wrap reactive reads
after an
awaitwithTracker.withComputation. - Do not rely on Iron Router controller naming-convention lookup. Pass
controller:explicitly on every route. - Do not mix
awaitand.then()in the same function. Pick one. - Do not assume implicit globals work. Every top-level identifier in 3.x
must be
const,let, orexport-ed. - Do not invent async replacements.
Meteor.userId()remains synchronous inside methods and publications; there is noMeteor.userIdAsync(). - Do not use an arrow as a method or publication handler when it reads
framework-bound
this. An arrow ignores the invocation context Meteor supplies. - Do not rewrite
api.addFilesorapi.exportonly because the app moved to Meteor 3. They remain supported for Atmosphere packages.
See also
- Async:
async-rewrites.md,call-vs-callAsync.md,async-cheatsheet.md,js-iterators.md,removed-functions.md. - Runtime:
module-system.md,client-reactivity.md,publications.md,webapp-express.md,other-breaking-changes.md. - Project:
package-triage.md,typescript-migration.md,react-migration.md,eval-cases.md. - Current Meteor React integration after the upgrade:
meteor-react.
For requested case studies, read
references/community-case-studies.md; use the symptom router for fixes.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

