@socialize/react-native-meteor is back as a ground-up TypeScript rewrite
Some of you may remember @socialize/react-native-meteor, my revamp of inProgress-team’s original React Native client. Unfortunately life gets busy and I’ve been building using other platforms for work projects, so It’s been dormant since 2021, and the ecosystem moved forward. Meteor went 3.x and async-first, React went concurrent, and every dependency the package relied on was abandonware (ddp.js, minimongo-cache, crypto-js@3…).
Rather than patch around that, the entire package has been rewritten. v4.0.0-beta.1 is now on npm under the next tag. If you’re working on a React Native project, I’d love for you to take it for a spin and kick the tires as they say.
npm install @socialize/react-native-meteor@next
What it is
A full Meteor client for React Native (works in plain React and Node too), strict TypeScript throughout, with only two runtime dependencies (ejson, @noble/hashes). Everything else, DDP, the local cache, Tracker, is typed, tested, in-package code.
Aligned with Meteor 3
- Meteor.callAsync / applyAsync (with a noRetry option for non-idempotent methods)
- Async accounts: loginWithPassword, loginWithToken, createUser, resetPassword, verifyEmail… all Promise-first, with v3 callback forms kept as wrappers
- subscription.readyPromise resolves on ready, rejects if the server denies the sub
Fully functional connection layer
- Single reconnect state machine using Meteor core’s backoff parameters
- Active heartbeat: half-open connections are detected and recycled
- Method calls survive reconnects (unacked methods re-send, Meteor-style)
- NetInfo is an input to the state machine, not a competing reconnect timer
Modern React
- useTracker rebuilt on useSyncExternalStore (correct under React 18/19 concurrent rendering — and no more listener leaks)
- useSubscribe, useFind (re-renders only on its collection’s changes), useUser, useUserId, useLoggingIn, useConnectionStatus
Optimistic UI done properly
- Full update-modifier support ($set $unset $inc $push $pull $addToSet…) with snapshot rollback on server error. v3 only handled $set and never rolled back
And the part I’m personally most excited about: isomorphic validation
The /model entry point ports typed:model to the client. One Zod 4 schema file validates on your Meteor server and in your app. Inserts and updates are validated (defaults applied, denyUntrusted fields fast-failed) before anything touches the wire, with full type inference.
Quality notes
250+ tests including DDP protocol transcript tests against a scripted server, plus a CI
e2e suite that scaffolds a fresh Meteor 3 app with accounts-password on every run and
drives the packed npm artifact through real login/pub-sub/method flows. Releases are
published via npm trusted publishing with provenance attestation — no tokens anywhere.
There’s a fresh Expo SDK 57 demo app in the repo (with a tiny standalone DDP dev server,
so node server.mjs && npm start is all it takes), and a full migration guide.
What I’d love from you
- Try the beta against your Meteor 3 apps and file issues — especially around reconnection behavior on flaky mobile networks, and the supported query/modifier subset
- Feedback on the /model API from anyone using typed:model server-side
Roadmap for 4.1: full client-side Meteor.methods stubs and optional offline cache persistence.
Repo: GitHub - copleykj/react-native-meteor: Full Meteor client with Tracker integration for React and React Native · GitHub (branch v4)