Open source · Self-hosted · MIT

Production-ready TypeScript server with built-in observability

Vision is your app server — traces, logs, API playground plus BullMQ pub/sub & cron. Use it standalone or drop 2 lines into the Express, Fastify, Hono or Next.js app you already have.

> Built on Elysia & BullMQ · In-memory dev, Redis prod · Ship traces via OTLP to Grafana / Honeycomb / Datadog

Works with the stack you already run via adapters

ExpressFastifyHonoElysiaNext.js

Add a span. Watch it appear.

Every request is traced automatically. Drop span(), context and logs where you want more detail — and see exactly what ran, in order, with timings.

users.module.ts
import { createModule } from '@getvision/server'

export const users = createModule({ prefix: '/users' })
  .get('/', ({ span, addContext, logger }) => {
    addContext({ 'user.plan': 'pro' })

    const rows = span('db.select', { 'db.table': 'users' }, () =>
      db.select().from(users).all()
    )
    const data = span('enrich.profiles', {}, () => enrich(rows))

    logger.info('loaded users', { count: rows.length })
    return data
  })
Vision · localhost:9500
TracesLogsPlayground
GET/users
200142 ms
GET /users
142ms
db.select
38ms
enrich.profiles
54ms
INFO loaded users count=12 user.plan=pro

Everything you need to see inside your API

One dashboard for traces, logs and testing — wired into your framework, not bolted on.

Auto-generated dashboard

Vision discovers your routes and services and builds the whole dashboard for you — no setup, no config, no schema files.

Real-time tracing

A live waterfall of every request — spans, timings and parent/child relationships as they happen.

Wide-event logs

Logs auto-linked to the active trace. Add context once and see it on every log in the request.

API playground

Fire requests at your own endpoints in a multi-tab client — no Postman, no context switch.

Schema-aware

Request templates auto-generated from your Zod, Valibot or Standard Schema validators.

Type-safe pub/sub

defineEvents() + emit() — Zod/Valibot validated, BullMQ with 3 retries & exponential backoff. Failed jobs queryable/re-drivable, no hidden DLQ.

Cron & repeatable jobs

defineCrons({ schedule: '0 0 * * *' }) — BullMQ repeatable jobs with atomic claim & key dedup. No ShedLock needed.

OpenTelemetry exportnew

Ship the same traces over OTLP/HTTP to Grafana, Honeycomb, Datadog or an OTel Collector.

Observability without the tradeoff

The usual options ask you to give something up. Vision doesn't.

Without the rewrite

Some tools give you a dashboard — but only if you rebuild your app on their framework. Vision is just middleware on the app you already have.

Without the wiring

Raw OpenTelemetry means an SDK, a collector and a backend before you see a single span. Vision works the moment you add it.

Without the lock-in

Self-hosted and MIT-licensed. Develop locally, then export to whatever production backend you already run.

Ready to see what your API is doing?

Add Vision in two lines and open the dashboard. No signup, no agent, no data leaving your machine.