TL;DR
- Choose Convex if you want a polished pure-TS experience, you’ll stay on their cloud (or accept their FSL-licensed self-host), and you don’t need game shards or facets.
- Choose Pylon if you want a single-binary self-host, FOSS license, native faceted search, or game shards alongside your app data.
Same shape
Both ship:- Reactive queries that auto-update the UI when data changes
- TypeScript-first server functions (mutation / query / action)
- Schema as code
- Real-time WebSocket sync
- Built-in auth + file storage
- Self-host options
- React, React Native, and Next.js SDKs
Where they differ
Process model
| Pylon | Convex | |
|---|---|---|
| Single binary | ✅ | ❌ |
| Multi-service docker-compose | n/a | ✅ |
| Default backing store | SQLite | Custom Convex DB |
License
| License | |
|---|---|
| Pylon | MIT OR Apache-2.0 |
| Convex | FSL (Functional Source License) — converts to Apache 2.0 after 2 years |
Search
Convex has full-text search — keyword + prefix matching. It does not have native facets — you’d build them with regular queries on top. Pylon ships SQLite FTS5 + roaring-bitmap facets out of the box.useSearch("Post", { facets: ["tags", "authorId"] }) returns hits + live facetCounts in one call. For an Algolia-style faceted UI without paying Algolia, Pylon is the cleaner story.
Game shards
Convex has no concept of authoritative tick-based game state. If you’re building a Slack-like app, you don’t need it. If you’re building a multiplayer game or a Figma-style cursor-presence app, Pylon’sShard<S: SimState> primitive is a real thing Convex doesn’t replicate.
Pricing
| Pylon | Convex | |
|---|---|---|
| Self-host | $0 (your infra) | $0 (your infra, FSL bound) |
| Free tier | 1M requests / mo on Pylon Cloud | Free dev project + limited production |
| Beyond free | $0.50 / 1M requests | $25/mo Pro then per-use |
Editor / Studio
| Pylon | Convex | |
|---|---|---|
| Built-in inspector | ✅ Pylon Studio at /studio | ✅ Convex dashboard |
| Self-hosted | Studio ships with the binary | Dashboard is hosted; OSS self-host has a separate dashboard |
CRDTs
Pylon integrates Loro for collaborative text/lists/maps/trees — true CRDTs with conflict-free convergence. Convex has reactive queries that automatically reconcile updates, but does not ship a CRDT library; for collaborative editing you’d integrate Yjs or Loro yourself.Where Convex is better
- Pure-TS dev loop — Convex has invested heavily in DX polish. Type inference flows end-to-end without codegen. Pylon requires
pylon codegen(one CLI call); Convex’s TypeScript flow is a bit tighter. - Larger team behind it — well-funded YC company, more docs, more examples.
- Cron + scheduled functions — Convex has clean primitives for scheduled jobs. Pylon has them too (the scheduler module + jobs queue) but Convex’s are more polished.
- Convex Vector Search — first-class vector search; Pylon has the
vector_searchplugin but Convex’s is more featureful.
Where Pylon is better
- Single binary —
scpto a VPS, runsystemctl start pylon. Done. - Faceted search — first-class with live counts. Convex requires custom queries.
- Game shards —
Shard<S: SimState>for tick-based authority. - Open license — MIT/Apache, not FSL.
- Plugin ecosystem — 32 built-in plugins (TOTP, audit log, Stripe, MCP, etc.) you flip on in the manifest.
- Self-host on day one — Convex’s self-host is recent and the OSS bundle hasn’t reached the polish of their hosted offering yet.
Migrating from Convex
| Convex | Pylon equivalent |
|---|---|
defineSchema(...) | buildManifest({ entities: [...] }) |
query, mutation, action | Same names; identical mental model |
useQuery(api.tasks.list) | useQuery("Task") |
ctx.db.insert("tasks", {...}) | ctx.db.insert("Task", {...}) |
| Convex auth | Magic codes / password / OAuth |
| Convex file storage | /api/files/upload + Stack0/S3 backends |
| Convex scheduled functions | crates/runtime scheduler + actions |
| Convex search index | Per-entity search config |