Mon
Project type: Open source
A TOML config declares what you care about — servers, websites, containers, repos — and a Bun agent (or a fleet of them) polls every minute, writes pings to Postgres, and a Next.js dashboard renders the results as a responsive grid of status tiles. Live config reloads, no restart.
The Challenge
Most teams stitch together Uptime Kuma, cron jobs, and a spreadsheet to track infrastructure health. Nothing covers hosts, websites, Docker containers, and GitHub repos in one place — and running distributed checks across multiple regions without standing up a SaaS usually means building something from scratch.
Our Approach
- Bun-based monorepo — agent, Next.js website, and Nextra docs — sharing a typed config schema and a Drizzle/Postgres data layer
- TOML config with Zod schema declares every monitor target and its expected behaviour, hot-reloaded by the website without a restart
- One agent or many — each authenticated with a token, all writing to the same database, so geographic checks come for free
- Per-tile renderer for each monitor type: host ping, HTTP, Docker container API, GitHub repo status, branded logo, and theme tiles
- `node-schedule` drives the polling loop; the schema uses prefixed tables (`mon_*`) so the database can be shared with other services
- Shipped as Docker images per app, deployed by SSH to any single host — no PaaS required
What It Achieved
- One dashboard covers infrastructure, websites, containers, and repo state — no tab-switching
- Adding a check is a TOML edit, picked up live without restarting anything
- Multi-agent setup gives geographic monitoring without a SaaS bill
- Full self-hosted stack — no third-party dependencies, no usage limits
Tech Stack
Next.js 14ReactTypeScriptBunnode-scheduleDrizzle ORMPostgreSQLZodTOMLDockerNextraTailwind CSS v4
Need a custom monitoring or operations dashboard?
If your team's status is spread across five tools, we'll consolidate it into one self-hosted board.
Book a discovery call