N.O.R.A
Homelab Visibility Without the Work
Nexus Operations Recon & Alerts, a self-hosted monitoring, event capture, and notification platform.
Every homelabber eventually hits the same wall. The stack is running. Things are probably fine. But "probably" is doing a lot of heavy lifting, and there is no real way to know without going looking.
The standard answer is Grafana. Prometheus. Loki. Alertmanager. And that answer is technically correct, in the same way that "build a car" is technically the correct answer to "I need to get to work." The tooling exists. It is capable. It will give you exactly the visibility you need, if you are prepared to make standing up an observability stack your next project.
Most people are not. So they skip it, stay blind, and find out something broke when a user tells them, or when a drive silently fills up, or when a container has been restarting every three minutes for six hours and nobody noticed.
NORA started as a direct response to that. One install. One UI. No pipelines to build. No dashboards to configure. The goal was visibility that does not require becoming an observability engineer to set up.








What It Does
NORA sits between your homelab and your attention. It receives, checks, collects, and surfaces, so you are not manually going looking.
Monitoring covers the basics without an agent: ping checks, URL and HTTP status verification, SSL certificate expiry with configurable warning thresholds, and DNS query validation. Each check runs on a schedule, supports manual runs, and keeps its own event history.
Webhook ingest gives apps a place to send events. Each app gets its own token, so a compromised token does not affect the rest. App profiles normalize different payload shapes into a consistent event model, which means Sonarr, n8n, Duplicati, and 26 other apps all look the same on the receiving end.
Infrastructure integrations go deeper than containers. NORA connects directly to Docker, Proxmox, Portainer, Traefik, Synology, and SNMP targets. It is polling the actual infrastructure, not waiting to be told something happened.
Notifications are browser-native Web Push, no app store, no third-party relay. Alert rules let you define conditions on any event field and fire a notification when they match. There is also a scheduled digest email for a quieter, periodic summary.
User management includes admin and member roles, TOTP two-factor authentication, global MFA enforcement, and per-user password policy. It is not an afterthought.
How It Was Built
NORA is built with Claude Code. Every feature starts as a GitHub issue. Every change lands in a pull request with documented reasoning. Nothing is committed directly to main. Nothing ships without being understood.
That last part is the constraint that matters. The risk with AI-assisted development is not that the code is wrong, it is that the code is accepted without being understood. If you cannot explain what shipped and why, you do not own the codebase, you are renting it.
The process here is deliberate: conversational scoping to define what needs to exist and why, a tracked issue that instructs the implementation agent to audit existing patterns before writing anything new, a PR that documents what changed, and a review that closes the loop. The issue history and PR notes are public. The process is the proof.
The stack reflects the same thinking. Go for the backend, because a single binary with no runtime dependencies is operationally simpler than the alternatives. SQLite for the database, because a single file with no external process is the right tradeoff for a homelab tool. React and Vite for the frontend, compiled and embedded in the same Docker image. The final image is around 50 MB. No node_modules. No Go toolchain. No source in production.
Three-stage Docker build. One image. One docker run command to be up.
The Decisions That Shaped It
A few things were decided early that shaped everything else.
Simplicity is a hard requirement, not a preference. The target user is a homelabber, not an SRE team. Every feature that made it into the design had to justify its presence. Several did not survive that test. The ones that did were either genuinely useful or genuinely necessary.
App profiles are YAML, not code. Each app that NORA knows about, Sonarr, Radarr, Proxmox, n8n, and the rest, has a YAML profile that defines how to handle its events, what API endpoints to poll, what fields to extract, and what to surface. Adding a new app means writing a profile file, not touching backend code. That boundary matters for maintainability and for community contributions.
The event pipeline is unified. Everything that happens in NORA flows through the same event model with the same severity scale: debug, info, warn, error, critical. Whether it came from a webhook, a monitor check, a Docker event, or an infrastructure poll, it lands in the same place and looks the same. That consistency is what makes the dashboard possible without building separate views for every data source.
Notifications stay browser-native. Web Push with VAPID keys means no third-party notification service, no account to create, no privacy tradeoff. NORA auto-generates VAPID keys on first run. Subscribe a browser, get notifications. That is the entire setup.
Retention is severity-based. Not everything deserves to live forever. Info events age out. Errors stay longer. Monthly rollups are kept indefinitely. The design reflects a real operational question: what do you actually need to look back at, and how far back do you need to go?
App Library
NORA ships with 29 pre-built profiles covering the apps a homelab actually runs.
Media: Plex, Sonarr, Radarr, Lidarr, Prowlarr, Tautulli, Overseerr, Tubesync, NZBGet
Automation: n8n, Home Assistant, Mealie
Infrastructure: Traefik, Unifi, WG-Easy
Security & DNS: AdGuard Home, Cloudflare DDNS, Vaultwarden
Backup & Updates: Duplicati, Watchtower, DIUN
Notifications & Comms: Gotify, Ghost, Matrix, Maubot
Other: Uptime Kuma, Homepage, Zwavejs2mqtt
The custom profile editor handles anything not on that list.
Stack
| Layer | Choice | Why |
|---|---|---|
| Backend | Go | Single binary, zero runtime dependencies, straightforward to reason about |
| Database | SQLite | Single file, no external process, right-sized for the use case |
| Frontend | React + Vite | PWA, installable, compiled into the same image |
| Push | Web Push / VAPID | Browser-native, no third-party relay required |
| Deployment | Single Docker image (~50 MB) | One command to run, nothing to maintain |
Try It
docker run -d \
-p 8081:8081 \
-v ./data:/data \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-e NORA_SECRET=your-secret-here \
ghcr.io/digitalcheffe/nora:latest
Open http://localhost:8081. Create your admin account. Add your first app.
The Docker socket mount is optional. NORA runs without it; you just lose the container visibility layer until you add it.
Source and issue history are at github.com/Digitalcheffe/N.O.R.A. Profile contributions are welcome via GitHub issue or discussion.