{"id":35122787,"url":"https://github.com/brege/monitorat","last_synced_at":"2026-02-25T09:07:43.990Z","repository":{"id":323627411,"uuid":"1094009499","full_name":"brege/monitorat","owner":"brege","description":"A federated offline-friendly dashboard and documentation system for homelabs and Linux servers","archived":false,"fork":false,"pushed_at":"2026-02-15T00:35:14.000Z","size":6428,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-15T04:26:33.222Z","etag":null,"topics":["chartjs","dashboard","federation","flask","gunicorn","javascript","linux","markdown-it","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/monitorat","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brege.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-11T06:07:22.000Z","updated_at":"2026-02-15T00:35:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brege/monitorat","commit_stats":null,"previous_names":["brege/monitorat"],"tags_count":29,"template":false,"template_full_name":null,"purl":"pkg:github/brege/monitorat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brege%2Fmonitorat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brege%2Fmonitorat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brege%2Fmonitorat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brege%2Fmonitorat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brege","download_url":"https://codeload.github.com/brege/monitorat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brege%2Fmonitorat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29596336,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T20:59:56.587Z","status":"ssl_error","status_checked_at":"2026-02-18T20:58:41.434Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chartjs","dashboard","federation","flask","gunicorn","javascript","linux","markdown-it","python"],"created_at":"2025-12-28T00:54:35.577Z","updated_at":"2026-02-25T09:07:43.975Z","avatar_url":"https://github.com/brege.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://monitorat.brege.org\"\u003e\u003cimg src=\"./docs/img/masthead.svg\" alt=\"monitor@/monitorat masthead that shows the french IPA phonetics and the tagline 'a system for observing and documenting status' and an icon with a monitor and superimposed at-character\" width=\"100%\"\u003e\u003c/a\u003e\n\n# \u003cdiv align=center\u003e [ [demo](https://monitorat.brege.org) ] \u003c/div\u003e\n\n**Monitorat** is a federated dashboard and documentation system.\n\nIts philosophy is to make system monitoring and documentation continuous, much like the way tables and figures are integrated within journal articles or [Wikipedia](https://wikipedia.org/).\n\nAvailable widgets:\n- [metrics](#system-metrics)\n- [network](#network)\n- [reminders](#reminders)\n- [services](#services)\n- [speedtest](#speedtest)\n- [wiki](#wiki)\n\nWidgets have a general, self-contained structure where both API and UI are straightforward to create.\n\n```\n~/.config/monitorat/widgets/\n└── my-widget\n    ├── api.py\n    ├── default.yaml\n    ├── index.html\n    └── app.js\n```\n\nDocumentation is editable in-browser and handled by proliferating Wiki widgets across your dashboard. Each document fragment added is a new widget instance. All documents you add to your wiki will be rendered in GitHub-flavored Markdown via [markdown-it](https://github.com/markdown-it/markdown-it).\n\n## Gallery\n\n[**The Demo**](https://monitorat.brege.org) is a fully interactive version of the application and provides complete resource parity between widget layouts and their YAML config snippets. In that sense, *the demo is the documentation*.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/dark/101.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/dark/102.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/dark/103.png\" width=\"100%\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/dark/100.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/light/110.png\" width=\"100%\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/light/111.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/light/112.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/desktop/light/113.png\" width=\"100%\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/mobile/dark/201.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/mobile/dark/202.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/mobile/light/211.png\" width=\"100%\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/screenshots/mobile/light/212.png\" width=\"100%\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Features\n\n- Beautiful documentation for your Homelab and media servers.\n- Completely headless and works offline.\n- Responsive design for mobile and desktop, with light and dark modes.\n- Track [how hot your CPU gets](https://monitorat.brege.org/#metrics-widget) over the course of the day.\n- Be alerted [when under extremely high load](#alerts).\n- Keep a record of [internet speedtests](https://monitorat.brege.org/#speedtest-widget) even when AFK.\n- List [all your reverse-proxied services](https://monitorat.brege.org/#services-widget) with offline-friendly bookmarks.\n- Even runs on Raspberry Pi 2/3 w/ Pi-Hole, Unraid, and other homelab systems.\n- Has [**federation**](https://monitorat.brege.org/federation): you can monitor services, metrics data, and documentation across many machines from a central command.\n\n---\n\n## Installation\n\n### PyPI\n\nTry the demo in 3 seconds:\n```bash\nuv tool install monitorat \u0026\u0026 monitorat demo\n```\nThen open http://localhost:6100.\n\nSee: **[Package Install](./docs/install/package.md)** for installing from PyPI with pip or uv.\n\n### Docker\n\nSee: **[Docker Install](./docs/install/docker.md)** for installation in a container.\n\n### Source\n\nSee: **[Source Install](./docs/install/source.md)** for git-based installations or deployments to `/opt`.\n\n---\n\n## The Dashboard\n\nOpen `http://localhost:6161`, or your specified port, or configure through a reverse proxy.\n\n### Configuration\n\nThese are the basic monitorat settings for your system, assuming you want to keep all icons and data close to your config file (usually `~/.config/monitorat/`):\n\n```yaml\nsite:\n  name: \"@my-nas\"\n  title: \"Dashboard @my-nas\"\n  editing: true\n\npaths:\n  data: data/\n  img: img/  # or /home/user/.config/monitorat/img/\n\nwidgets: { ... }\n\n# privacy: { ... }\n# alerts: { ... }\n# notifications: { ... }\n```\n\n## Widgets\n\n**Monitorat** has an extensible widget system. You can add any number of widgets to your dashboard multiple times over, re-order them, and enable/disable any you don't need. \n\n### Configuration\n\nYou can add more widgets of other origin in `~/.config/monitorat/widgets/`.\n\n```yaml\nwidgets:\n  enabled:             # dashboard positions: from top to bottom\n    - my-server-notes  # type: wiki\n    - services\n    - metrics\n    - # reminders      # '#' disables this widget\n    - network\n    - speedtest\n    - my-widget        # in ~/.config/monitorat/widgets/\n```\n\nEach widget can be configured in its own YAML block. To configure a widget in its own file:\n```yaml\nincludes:\n  - \"/home/user/.config/monitorat/widgets/my-widget.yaml\"\n```\nor do this for every widget through config snippets:\n```yaml\nincludes:\n  - snippets/services.yaml\n  - snippets/metrics.yaml\n  - # ... wikis, user widgets, etc\n```\n\n##### Making your own\n\nWidgets are also quite easy to build with AI. Widget built with Codex in 12 minutes:\n\u003e [Agentic Archetype: Building Widgets with AI](docs/contributing.md#agentic-archetype)\n\n## Available Widgets\n\n### **Services**  \n- monitor systemd services, timers, and Docker containers in real time\n- can be used as *homelab bookmarks* in compact cards layout\n- simultaneously provides both your URL (or WAN IP) and local address (or LAN IP) for use offline\n- **monitorat is completely encapsulated and works offline even when internet is down**\n\n### **Wiki**  \n- uses [markdown-it](https://github.com/markdown-it/markdown-it) and GitHub-flavored markdown\n- can columnate multiple documents/Markdown fragments\n- editor can be used to spruce up system docs in the browser\n- supports [Mermaid](https://mermaid-js.github.io/mermaid/#/) diagrams\n- inline LaTeX math via [KaTeX](https://katex.org/)\n- supports [GitHub admonitions](https://github.com/antfu/markdown-it-github-alerts)\n\n### **System Metrics**  \n- provides an overview of system performance over time in `metrics.csv`\n- measures CPU, memory, disk and network usage, temperature, etc.\n- get notified when system metrics exceed configured thresholds:\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eConfiguring Alerts\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\nalerts:\n  cooldown_minutes: 60  # Short cooldown for testing\n  rules:\n    high_load:\n      threshold: 2.5    # load average (e.g., the '1.23' in 1.23 0.45 0.06)\n      priority: 0       # normal priority\n      message: High CPU load detected\n    high_temp:\n      threshold: 82.5   # celsius\n      priority: 1       # high priority  \n      message: High temperature warning\n    low_disk:\n      threshold: 95     # percent\n      priority: 0       # normal priority\n      message: Low disk space warning\n```\n\n\u003c/details\u003e\n\n### **Speedtest**  \n- keep a record of your internet performance over time\n- currently does not perform automated runs\n\n### **Network**  \nThe network widget is best used on machines with continuous uptime. Two options:\n- (a) using a `ddclient`-style log, or\n- (b) use the built-in chirper\n\n### **Reminders**  \n- facilitated by [Apprise URLs](https://github.com/caronc/apprise) (see [below](#notifications)).\n- ping yourself for system chores, key changes, etc.\n\n### Summary of Widget Features\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eWidget\u003c/th\u003e\n      \u003cth\u003eChart\u003c/th\u003e\n      \u003cth\u003eFilters\u003c/th\u003e\n      \u003cth\u003eSnapshot\u003c/th\u003e\n      \u003cth\u003eRecording\u003c/th\u003e\n      \u003cth\u003eEditing\u003c/th\u003e\n      \u003cth\u003eFederation Merge\u003c/th\u003e\n      \u003cth\u003eNotify\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eS. Metrics\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#section-metrics\"\u003eY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003eY(tiles)\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n      \u003ctd\u003eY(tiles)\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/federation/#section-metrics\"\u003echart\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eY(alert)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eNetwork\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#section-network\"\u003eY(pips)\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eY(outages)\u003c/td\u003e\n      \u003ctd\u003eY(tiles)\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n      \u003ctd\u003eN\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/federation/#section-network\"\u003einterleave\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eY(alert)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eSpeedtest\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#section-speedtest\"\u003eY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003eN\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/federation/#section-speedtest\"\u003echart\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eServices\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#section-services\"\u003eY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eY(cards)\u003c/td\u003e\n      \u003ctd\u003eN\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/federation/#section-services\"\u003einterleave\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eReminders\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#section-reminders\"\u003eY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/federation/#section-reminders\"\u003einterleave\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eWiki\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"https://monitorat.brege.org/#about\"\u003eY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003eY\u003c/td\u003e\n      \u003ctd\u003econtinuous\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003e [!NOTE] Key \n\u003e Y = supported | N = planned / potential feature | \\- = not applicable\n\n## General Features\n\n### Editing\n\n- built-in Markdown editor and previewer\n- configure new reminders and services directly through the web interface\n- Web UI configuration seamlessly updates the YAML config file or downstream snippets\n\n### Notifications\n\nThe notifications system uses [Apprise](https://github.com/caronc/apprise) to notify through practically any service via apprise URLs.\n\n```yaml\nnotifications:\n  apprise_urls:\n    - \"pover://abscdefghijklmnopqrstuvwxyz1234@4321zyxwvutsrqponmlkjihgfedcba\"\n    - \"mailto://1234 5678 9a1b 0c1d@sent.com?user=main@fastmail.com\u0026to=alias@sent.com\"\n    - # more apprise urls if needed...\n```\n\n### Federation\n\nYes, you can even federate multiple instances of monitorat:\n- compare and plot metrics data across multiple machines\n- see service statuses for your entire homelab/network from a central node\n- especially useful for filtering and sorting events network-wide\n\n\u003e [!NOTE]\n\u003e To simultaneously use federation of remotes AND local monitoring, you must setup a client monitorat instance and a separate monitorat server to federate locals and remotes in the same pane.\n\n### Privacy\n\nThe privacy mask helps share your setup online without exposing personal information.\n```yaml\nprivacy:\n  replacements:\n    my-site.org: example.com\n    replace-me: with-this\n    ...\n  mask_ips: true\n```\nRunning `monitorat config` will print the runtime config with these masks applied as well.\n\n---\n\n## Development\n\n- [**contributing**](./docs/contributing.md)\n- [**changelog**](./docs/changelog.md)\n- [**roadmap**](./docs/roadmap.md)\n\n## License\n\n[GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrege%2Fmonitorat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrege%2Fmonitorat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrege%2Fmonitorat/lists"}