Skip to main content

vs alternatives

Comparing this stack to the most common alternatives. Strict — each row is verifiable. Pick the row that matters most to your team.

If you're migrating from one of these, the migration guides cover the mechanical parts. This page covers fit.

The big picture

Omnitron borrows the decorator-DI from NestJS, the end-to-end type ergonomics from tRPC, transport flexibility from Hono, the supervised-process model from PM2/systemd — and unifies them under one TypeScript codebase.

vs NestJS

NestJS is the closest neighbour.

AxisNestJSOmnitron stack
DI containerInversifyJS-styleNexus (custom; class-token-based with contextual injection)
Decorators@Module, @Injectable, @Controller, @Get, @Post, …@Module, @Injectable, @Service, @Public, @Validate, @Auth
TransportExpress / Fastify under the hood (HTTP only by default; microservices add-on for TCP/Redis/NATS)Native: HTTP / WS / TCP / Unix — same service surface
Type safety client ↔ serverOpenAPI codegen or separate .d.ts syncService interface IS the type; no codegen
Validationclass-validator + class-transformer (decorator-heavy DTOs)Zod schemas inline via @Validate(schema)
Module ecosystemHuge — most things have a @nestjs/* package16 focused official modules + community
TestingTest.createTestingModule()createTestApp() (similar shape)
LifecycleOnModuleInit, OnApplicationBootstrap, OnApplicationShutdownOnInit, OnStart, OnStop, OnDestroy (semantically similar)
Supervisor / fleetNot included; you run it under PM2 / systemd / k8sOmnitron daemon — supervised processes, 19+ RPC services, web console, MCP server
Bundle sizeLarger; pulls in metadata-reflect + RxJS for partsModular; pay-for-what-you-use

Pick NestJS when…

  • Your team already knows it.
  • You need the broad ecosystem (huge selection of @nestjs/* packages — auth strategies, GraphQL, gRPC, etc.).
  • HTTP-only is fine; transport flexibility doesn't matter.

Pick Omnitron when…

  • End-to-end TypeScript (no OpenAPI / protobuf step) is a hard requirement.
  • You'll use ≥2 transports (HTTP + WS, or HTTP + TCP, or all four).
  • You want operator surface (supervisor, fleet, web console, MCP) in the same stack — not a separate ops pipeline.
  • You want smaller per-app footprint.

→ Migration: from NestJS

vs tRPC

tRPC is the gold standard for type-safe RPC.

AxistRPCOmnitron stack
Type sharingInferred from router → typed on client; same monorepoService interface shared; same monorepo
TransportHTTP + WebSocket (built-in)HTTP + WS + TCP + Unix
DINone — plain functions in routersContainer DI with lifecycle
ValidationZod (or Yup, Superstruct, …) — schema-firstZod via @Validate decorator
Server frameworkAdapter pattern — runs on Express/Fastify/Next/Hono/etc.Standalone Titan framework
MiddlewarePer-procedure context middlewareDI middleware + Netron middleware (per-call)
SubscriptionsWebSocket-based via SubscriptionResolverAsyncIterable methods over WS
AuthContext-based — you wire ittitan-auth module + decorators
Caching client-sideReact Query (separate package)netron-react cache (built-in)
Cross-languageTS-only by designTS-only; MessagePack wire format extensible
Operator surfaceNone — you bring itFull Omnitron daemon

Pick tRPC when…

  • You want a minimal RPC layer on top of an existing HTTP server (Next.js API routes, Hono, Express).
  • The backend is small and doesn't need a full framework's DI / lifecycle / modules.
  • You're already invested in React Query for client cache.

Pick Omnitron when…

  • You want the full stack (DI + lifecycle + 16+ modules), not just the RPC layer.
  • You need transports beyond HTTP/WS (TCP / Unix for service-to-service).
  • You want auth / cache / retry / circuit breaker as framework-level concerns, not per-procedure code.

vs Fastify / Express / Hono

These are HTTP servers — different category, but often the starting comparison.

AxisFastify / Express / HonoOmnitron stack
ScopeHTTP onlyFull stack (HTTP + DI + RPC + UI + ops)
RoutingPath-based (app.get('/users/:id', ...))Service-based (UsersService.findById) — RPC abstracts paths
DINone — manual wiringContainer DI
ValidationPer-route via plugins (Fastify schema, Zod with adapter)Decorator on method (@Validate)
AuthPer-route middlewareApp-level + per-method decorators
WebSocketAdd-on pluginNative — same service over both transports
BundleTiny (Hono <15 kB on edge)Larger; framework-level
PerformanceFastify ~70K req/s, Hono ~150K req/s on edgeComparable HTTP perf; the cost is framework features

Pick the HTTP server when…

  • You're building a small, focused REST/HTTP service.
  • You want full control over routing, middleware order, request lifecycle.
  • You're targeting edge runtimes (Hono) or single-binary deploys.

Pick Omnitron when…

  • You need RPC semantics (typed methods, not HTTP endpoints).
  • You need DI / modules / lifecycle / multi-transport — building these on top of Express ends up reinventing 60% of Titan.

vs PM2 / systemd / Docker Compose

Omnitron is a supervisor + control plane, similar in scope to PM2 (for Node) or systemd (for any process) — but typed, opinionated for TypeScript services.

AxisPM2systemdDocker ComposeOmnitron
Process supervisionYes (Node-only)Yes (any)Container-levelYes (Node-first)
Health checksBasicManualhealthcheck: clausePer-app, per-process, typed
Cluster modeRound-robin Node clustern/aSwarm (separate)Leader election + state sync
LogsFile rotationjournaldPer-containerPer-app, structured (pino)
RPC into running appsNoneNoneNoneYes — same Netron protocol as clients
Configurationecosystem.config.jsUnit filesdocker-compose.ymlomnitron.config.ts + per-app defineSystem
TypeScript-nativeNo (any Node app)NoNoYes
Web consolePM2+ paid add-onNoPortainer (separate)Built-in
MCP for agentsNoNoNoBuilt-in (omnitron kb mcp)

Pick PM2 when…

  • Single-app Node deployment on one box.
  • You want lightweight; no opinion on app code.

Pick systemd when…

  • Mixed-language fleet.
  • You manage the OS layer too.

Pick Docker Compose / k8s when…

  • Container-first deployment.
  • Multi-language; Omnitron just becomes one service among many.

Pick Omnitron when…

  • All apps are Titan apps (or any decorated services).
  • You want typed control of the running fleet, not just process babysitting.

vs the typical "modern TypeScript stack"

A typical Next.js + Prisma + tRPC + Tailwind setup:

ConcernTypicalOmnitron stack
Backend frameworkNext.js API routes / Hono / tRPC serverTitan
RPCtRPCNetron
FrontendNext.js / Vite + ReactVite + React (Prism + netron-react)
Design systemshadcn/ui or Material-UIPrism (built on MUI v9)
DB layerPrisma / Drizzletitan-database (Kysely + Kysera plugins)
AuthNextAuth / Clerktitan-auth
Form libreact-hook-form + zodreact-hook-form + zod (via Prism <Field>)
CacheReact Querynetron-react QueryCache
StateZustand / JotaiZustand (via Prism createStore)
DeploymentVercel / Cloudflare / RenderDocker + supervised by Omnitron

If you're already deep in the typical stack, the migration cost is real. The tradeoff: Omnitron unifies it under one decorator grammar, end-to-end types, and one operator surface.

Honest tradeoffs

What this stack gives up:

  • HTTP routing flexibility. RPC services don't map cleanly to /api/v2/users/:id/profile.png. Custom routes are supported but feel bolted on.
  • Massive ecosystem. NestJS has more 3rd-party packages. npm has more shadcn-style components than Prism.
  • Edge runtime support. Titan + Omnitron daemon assume Node. You can't ship Titan to Cloudflare Workers.
  • One-runtime restriction for Omnitron. Apps can be Bun/Deno; the daemon needs Node.

What you get back:

  • One language end-to-end with no codegen.
  • One decorator grammar across DI / RPC / auth / validation.
  • One operator surface (CLI + web console + MCP) for any app.
  • Per-module independence (16+ modules, opt-in each).
  • Built-in fleet primitives (cluster, fleet, replication).

See also