watching

termiwatch

Zero-config, one-line terminal dashboard for Node.js apps.
Real-time CPU, memory, event loop, HTTP metrics — in your terminal.

Get Started → Star on GitHub
$ npx termiwatch app.js
termiwatch — Terminal Dashboard
⚡ termiwatch ● RUNNING PID 1234 v22.10.0 ↑ 2h 14m express 4.21 ✔ 0 errors Overview Memory & GC HTTP Network & Workers Logs ← Tab → ┌─────────────── CPU ────────────────┐┌──────────────── MEMORY ────────────┐ 12.4% usr:9.1% sys:3.3% ││ RSS 84.2MB Heap 28.1/52.0MB ████████░░░░░░░░░░░░░░░░░░░░░░░ ││ Ext 2.1MB Buf 128KB ││ ⣿⣷⣶⣤⣄⡀⠀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⠀⣶⣿ ⣿⣷⣶⣤⣄⡀⠀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⠀⠀⣠⣤⣶⣿ ││ ⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿ ⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿ ││ ███████████████░░░░░░░░░░░░░░░░ ├─────────── EVENT LOOP ──────────┤├──────────────── GC ────────────────┤ 1.24ms p99:2.31 min:0.8 max:4.1││ 142 pauses avg:0.4ms max:12.1ms ELU 8% ████░░░░░░░░░░░░░░░░ ││ minor:128 major:8 incremental:6 ││ ▁▁▂▂▃▃▄▄▅▆▆▇▇██▇▇▆▅▅▄▃▃▂▂▁▁▁▂▂▃▃ ││ ▁▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁█▁▁▁▁▁▁▁▁▁▁▁▁▁ ├────────────── HTTP ───────────────┤├────────── SYSTEM ────────────────┤ 847 req/s total:24381 avg:1.2ms ││ Handles 12 ~ stable 200:23104 304:892 500:42 ││ Heap 52MB/4.1GB malloc:1.2MB ▅▆▇█▇▆▅▄▃▃▄▅▆▇█▇▆▅▄▃▃▄▅▆▇█▇▆▅▄▃▃ ││ ■new ■old ■code ■large ├────────────────── LOGS ──────────────┴────────────────────────────────────┤ 14:23:01 LOG [app] Request batch #847 processed 14:23:04 LOG [app] Cache cleared, 42 items evicted 14:23:07 ERR [app] Connection timeout to redis:6379 14:23:10 LOG [app] Health check OK - 12ms └──────────────────────────────────────────────────────────────────────────┘ Tab switch view q exit termiwatch v1.0.0
0
Metric Categories
CPU, Memory, GC, ELU...
0
Dependencies
Pure Node.js
0
Dashboard Views
Tab to cycle
0
Line of Code
import "termiwatch/auto"

Everything you need.
Nothing you don't.

Datadog-level metrics in your terminal. No agents, no config files, no external services.

🔥

CPU Monitoring

Real-time user/system CPU breakdown with historical sparklines. Normalized per-core usage.

process.cpuUsage()
📊

Memory & Heap

RSS, heap used/total, external, ArrayBuffers. Per-heap-space breakdown with V8 statistics.

v8.getHeapSpaceStatistics()

Event Loop

Latency histogram (mean, p99, min, max) plus Event Loop Utilization (ELU) tracking.

monitorEventLoopDelay()
♻️

GC Analytics

Pause frequency, duration, kind classification (minor/major/incremental). Max pause tracking.

PerformanceObserver('gc')
🌐

HTTP Metrics

Requests/sec, response times, status codes. Auto-patched — no middleware needed.

APM-style monkey-patch
📡

Network & DNS

Active sockets, bytes in/out, DNS lookup timing. Top connections sorted by throughput.

_getActiveHandles()
🧰

Worker Threads

Per-worker ELU and heap usage. Lifecycle tracking with auto-discovery via Module._load.

Proxy + Module._load
🔍

Auto-Detection

Detects Express, Fastify, Koa, NestJS, Next.js. Plus nodemon, PM2, tsx, bun runtime.

require.cache scan
📦

Zero Dependencies

Custom ANSI renderer using Unicode box-drawing and braille sparklines. No blessed, no ink.

U+2800-U+28FF braille

Three ways to start.
All instant.

Pick the approach that fits your workflow. Each one takes seconds.

01

One-Line Import

Add a single import at the top of your entry file. That's it.

import "termiwatch/auto"// Your app code below...const app = express()
02

CLI Wrapper

Zero code changes. Just prefix your start command.

# Instead of: node app.jsnpx termiwatch app.js# Works with any .js file
03

Manual API

Full control over configuration and lifecycle.

import { startNodewatch } from "termiwatch"startNodewatch({ refreshInterval: 2000, patchHttp: true})

Five views. Press Tab.

Cycle through purpose-built views. Each one designed for a specific debugging scenario.

Overview
All critical metrics at a glance: CPU, memory, event loop, GC, HTTP throughput, and system health in a single screen. CPU 12.4% ⣿⣷⣶⣤⣄⡀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄ MEM 28.1MB ELU 8% ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▁▂▃▄▅▆ GC 0.4ms avg 847 rps ▅▆▇█▇▆▅▄▃▃▄▅▆▇█▇▆▅▄▃▃ 12 handles
Memory & GC
Full-width braille memory chart, per-heap-space bars, GC pause detail, and handle leak trend monitor. Heap Usage ⣿⣷⣶⣤⣄⡀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⣶⣿ ⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿ new_space ████████░░░░░░░░ 48% old_space ██████████████░░ 87% code ███████████░░░░░ 68% large_obj ███░░░░░░░░░░░░░ 19% Handles 12 ~ stable trend: ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
HTTP
Large req/s braille chart, status code distribution, response time breakdown, and event loop correlation. 847 req/s ⣿⣷⣶⣤⣄⡀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⠀⠀⣠⣤⣶⣿⣿⣷⣶⣤⣄⡀⠀⣶⣿ ⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣿⣿ 200 ████████████████████████████████ 23,104 304 ██ 892 500 42 avg: 1.2ms total: 24,381 active: 3
Network & Workers
Network I/O braille, active sockets, DNS lookups, worker thread ELU/heap, async activity counters. Network I/O ⣿⣷⣶⣤⣄⡀⠀⠀⣠⣤⣶⣿ in ⣿⣷⣶⣤⣄⡀⠀⠀⣠⣤⣶⣿ out Active Sockets Workers (2 active) 127.0.0.1:5432 4.2KB Thread #1 ELU: 12% Heap: 8.4MB 10.0.0.5:6379 1.8KB Thread #2 ELU: 45% Heap: 12.1MB DNS avg: 2.3ms Async handles: 14 requests: 3
Logs
Full-screen log viewer capturing stdout, stderr, uncaught exceptions with timestamp and source tagging. 14:23:01 LOG [app] Server started on port 3000 14:23:02 LOG [db] Connected to PostgreSQL 14:23:04 LOG [cache] Redis connected, 42 keys loaded 14:23:07 WARN [app] Memory usage above 80% threshold 14:23:09 ERR [http] Connection timeout to redis:6379 14:23:10 LOG [health] Health check OK - 12ms stdout: 4 stderr: 1 errors: 1

Works with every framework.

termiwatch auto-detects your framework and runtime. HTTP metrics are patched at the http.createServer level — so it works with anything built on Node.

Node.js

Node.js

Plain Node.js apps, scripts, microservices

native
Express

Express

Auto-detected & HTTP metrics patched

auto-detect
Fastify

Fastify

Auto-detected & HTTP metrics patched

auto-detect
NestJS

NestJS

Add import to main.ts bootstrap

auto-detect
Next.js

Next.js

Server-side detection via require.cache

auto-detect

Express / Fastify / Koa / Hapi

Just add one import. termiwatch patches http.createServer automatically — no middleware needed.

import "termiwatch/auto" // ← add this lineimport express from "express"const app = express()app.listen(3000)

NestJS

Import at the top of your main.ts before the NestFactory bootstrap.

import "termiwatch/auto" // ← top of main.tsimport { NestFactory } from "@nestjs/core"import { AppModule } from "./app.module"const app = await NestFactory.create(AppModule)

CLI Wrapper (any framework)

Zero code changes. Works with any .js entry file regardless of framework.

# Works with Express, Fastify, NestJS, anythingnpx termiwatch dist/main.js# Also detects runtime: nodemon, PM2, tsx, bun

Also auto-detects your runtime: nodemon PM2 tsx ts-node node --watch bun deno

The rest are dead.

Every alternative is either archived, requires native compilation, or demands an entire ecosystem.

ToolStatusDependenciesSetup
nodejs-dashboardArchived (2022)blessed, socket.ioGlobal install + wrapper
clinic.jsDead (3 years)Native compilationCLI profiling sessions
appmetrics-dashDead (6 years)C++ native addonCode changes + browser
PM2 monitActiveEntire PM2 ecosystemFull process manager
termiwatchActive ✔ZeroOne line
Sounak Das

One import. Zero dependencies. Because monitoring shouldn't be harder than the bug you're hunting.

Sounak Das
Creator of termiwatch

Ready to see everything?

Add one line to your Node.js app and get a full terminal dashboard. No config, no dependencies, no excuses.

Get Started → View on GitHub