Monlight

Self-hosted, lightweight monitoring for small teams. Four services, each under 20MB, running on less than 50MB RAM combined.

Built with Zig and SQLite. No external dependencies. No agents. No complex setup.

What’s in the stack

Service Port Purpose
Error Tracker 5010 Captures exceptions from backends and browsers
Log Viewer 5011 Indexes Docker container logs with full-text search
Metrics Collector 5012 Collects counters, histograms, and gauges with tiered retention
Browser Relay 5013 Authenticates and proxies browser telemetry, deobfuscates source maps

Client SDKs

SDK Package Runtime
JavaScript @monlight/browser Browser (zero dependencies, ~5KB gzipped)
Python monlight Python 3.10+ (FastAPI integration included)

How it works

Browser JS SDK ──► Browser Relay ──► Error Tracker
                        │              Metrics Collector
                        ▼
                   (DSN auth,
                    source maps,
                    CORS)

Python backend ──► Error Tracker (direct, X-API-Key)
                   Metrics Collector (direct, X-API-Key)

Docker containers ──► Log Viewer (reads log files directly)

The browser relay sits between untrusted browser clients and the backend services. It authenticates requests using DSN public keys, handles CORS, deobfuscates stack traces using uploaded source maps, and forwards data to the error tracker and metrics collector.

Backend services communicate directly with the error tracker and metrics collector using API keys.

The log viewer reads Docker JSON log files from the host filesystem – no log shipping agent required.