I’ve been thinking about this a lot lately and wanted to get a discussion going.
When someone picks up Rails, Laravel, or even newer frameworks like Wasp or RedwoodJS, there’s a set of things they just expect to work without reaching for third-party packages. These are the “app building blocks” — the stuff that every real application needs, but that nobody wants to build from scratch. The less time you spend on plumbing, the more time you spend on the thing that makes your app different.
Meteor has always had some of these covered really well. Real-time data? Best in class, still. Accounts? Incredibly easy to get started. Methods/RPC? Simple and effective. But there are gaps, and when a developer is evaluating frameworks for a new project, gaps become reasons to pick something else.
I want to put together a list of what I think those building blocks are and where Meteor stands today, and I’d love to hear what you think is missing or what needs attention.
The checklist
Here’s my take on what a modern full-stack JavaScript framework should provide:
Meteor has strong answers for:
-
Accounts & authentication —
accounts-base,accounts-password, OAuth providers. This has been a Meteor strength since day one. Login, logout, enrollment, password reset — it just works. -
RPC / methods —
Meteor.methodsandMeteor.call. Simple, validated, works on client and server. The new async API is a nice improvement. -
Real-time data — Publications, subscriptions, oplog tailing (ChangeStreams soon?
). Still the thing that makes people’s eyes light up in demos. Nobody else does this as seamlessly. -
Database — MongoDB integration is deep and well-tested. Collections, schemas via community packages, good query API.
-
Build system — Isobuild handles a lot. Code splitting, dynamic imports, isomorphic code. It’s opinionated but it works.
-
Authorization / permissions — The
rolespackage has been integrated into core, giving Meteor a built-in answer for role-based access control. Assign roles, check permissions, scope them to groups — it’s the kind of thing that used to require a community package and now ships with the framework. -
Testing — Tinytest for packages, integration with Mocha/Jest for apps. Could be better documented but the pieces are there.
Meteor has partial or outdated answers for:
-
Background jobs — There’s no built-in solution today. You either use
percolate:synced-cron(unmaintained),msavin:sjobs(limited), or roll your own withsetInterval. Every Rails app has Active Job. Every Laravel app has Queues. This is table stakes. -
Email —
emailpackage exists and sends mail. But modern apps need templating, queuing, bounce handling, and deliverability tooling. Right now you’re on your own for anything beyondEmail.send(). That said, there’s good community energy here — @dupontbertrand recently proposed a built-in mail preview UI for dev mode, which is exactly the kind of DX improvement that makes a framework feel polished. Rails has this with Action Mailer previews, and it’s one of those small things that saves real time during development. -
HTTP API layer — Meteor’s
webapppackage is built on Express 5, so the foundation for HTTP routes is already there. But there’s no structured convention for building REST endpoints alongside your DDP methods — no route generation, no serialization layer, no API versioning. If you need a public API or webhook endpoints, you can wire it up throughWebApp.connectHandlers, but you’re doing all the scaffolding yourself. -
Validation / schemas —
checkexists for runtime argument validation, but there’s no integrated schema layer for data models. Most people reach forsimpl-schemaorzod, but there’s no convention, so every app does it differently. -
Rate limiting —
ddp-rate-limiterexists but it’s DDP-only and pretty basic. No general-purpose rate limiting for HTTP routes, API endpoints, or anything outside of DDP. A production app needs rate limiting across the board.
Meteor doesn’t address today:
-
File uploads & storage — No built-in answer. Community packages like
ostrio:filesfill the gap but it’s not first-party. Rails has Active Storage. Laravel has filesystem disks. Uploading and storing files (S3, GridFS, local disk) is something nearly every app needs and developers shouldn’t have to evaluate five community packages to get it. -
Caching — No built-in caching layer. For an app that talks to external APIs or does expensive computations, you’re building your own cache or using Redis directly. Rails gives you
Rails.cachewith pluggable backends out of the box. -
Logging & observability — No structured logging, no standard event hooks, no built-in error tracking, no request tracing. You’re wiring up Winston or Pino yourself and figuring out how to correlate logs across methods, publications, and jobs. A framework should give you standardized lifecycle hooks that observability tools can plug into. On the bright side, @italojs has OpenTelemetry support on the roadmap for Meteor — that would be huge. OTel is the industry standard and having native instrumentation would mean Meteor apps plug into Datadog, Grafana, Honeycomb, etc. out of the box.
-
Admin panel / backoffice — Rails has ActiveAdmin, Laravel has Nova/Filament. A way to browse and manage your data without building a whole UI. Meteor has nothing here. Even a basic auto-generated CRUD interface for your collections would save significant time for internal tools and early-stage products.
-
Internationalization (i18n) — No built-in i18n. Community options exist (
universe:i18n,tap:i18n) but nothing standardized. For any app that serves users outside a single locale, this ends up being a foundational concern that touches every layer of the stack. -
Push notifications — Google FCM, Apple APNS — every mobile-facing app needs these eventually. No framework handles this particularly well, but having a first-party package with a unified API for both platforms would remove a lot of boilerplate that every team ends up writing.
-
Search — Full-text search across collections. MongoDB has
$textand Atlas Search, but there’s no Meteor-level abstraction. Not every app needs this, but the ones that do really need it.
Some of this is already in progress
I’ve been working on closing a few of these gaps and have PRs open against Meteor core:
-
mongo-schema: native MongoDB schema validation — A new core package that brings schema validation using MongoDB’s native$jsonSchema. SameattachSchema()API thatsimpl-schemausers are familiar with, but backed by database-level enforcement. No more choosing between five community schema packages. -
thread-context: worker thread bridge for Meteor APIs — A primitive that letsworker_threadstransparently access Collections, Methods, and Settings over a MessageChannel. This is the foundation that makes CPU-heavy work possible without giving up Meteor’s runtime context. -
jobs: first-class job queue system — Built on top ofthread-context. MongoDB-backed job queue with scheduling, cron, retries, deduplication, cancellation, cluster concurrency, leader election, monitoring publications, and optional worker-thread offloading. No Redis, no external services.
On the observability side, I’ve been building SkySignal — a monitoring and observability platform designed for Meteor apps, with the kind of standardized event hooks and lifecycle tracing that the framework should integrate with natively.
These are a start, but they don’t cover everything on the list. That’s part of why I’m posting this — I want to know what the community thinks the priorities should be.
What would move the needle?
I think the honest answer is: Meteor doesn’t need to do everything. No framework does. But there’s a minimum set of building blocks that, if missing, will cost you developers during evaluation. A developer comparing frameworks is looking at checklists, and “reach for a community package” is not the same as “it’s built in.”
If I had to rank the remaining gaps by impact:
- File uploads & storage — too common a need to not have a first-party answer
- Better email — templating and queuing at minimum
- Push notifications — FCM/APNS with a unified API
- Rate limiting — beyond just DDP, across the whole app
- Caching — performance is a feature, and caching is how you get there
- i18n — foundational for any app with international users
- Admin panel — massive time saver for internal tools and early development