[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74651":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":14,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":46,"readmeContent":47,"aiSummary":48,"trendingCount":16,"starSnapshotCount":16,"syncStatus":49,"lastSyncTime":50,"discoverSource":51},74651,"kula","c0m4r\u002Fkula","c0m4r","Lightweight, self-contained Linux® server monitoring tool","https:\u002F\u002Fkula.ovh",null,"Go",1202,58,8,1,0,4,89,12,74.21,"GNU Affero General Public License v3.0",false,"main",true,[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"go","golang","linux","linux-monitoring","linux-server","linux-server-monitoring","linux-servers","linux-tools","monitoring","monitoring-tool","monitoring-tools","network-monitoring","real-time-analytics","real-time-monitoring","self-contained","server-monitoring","server-monitoring-tools","tui","vps-monitor","webui","2026-06-12 04:01:15","\u003Cdiv align=\"center\">\n\n\u003Cimg width=\"128\" height=\"128\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F77d5850a-c3a4-47fe-b33e-dcaeeb3c8e4d\" \u002F>\n\n# K U L A\n\n**Lightweight, self-contained Linux® server monitoring tool.**\n\n![Linux](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fmade%20for-linux-yellow?logo=linux&logoColor=ffffff)\n![Go](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fgo%20go-power%20rangers-blue?logo=go&logoColor=ffffff)\n![JS](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fsome%20-js-orange?logo=javascript&logoColor=ffffff)\n![Bash](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fand%20a%20pinch%20of-bash-green?logo=linux&logoColor=ffffff)\n[![License: GPL v3](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-AGPLv3-red.svg)](https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fagpl-3.0)\n\n[🌏 Website](https:\u002F\u002Fkula.ovh) | [👀 Demo](https:\u002F\u002Fdemo.kula.ovh\u002F) | [🐋 Docker Hub](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fc0m4r\u002Fkula)\n\nZero dependencies. No external databases. Single binary. Just deploy and go.\n\n\u003Cimg width=\"1011\" height=\"834\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F771b3e95-8713-44d2-8309-cd9e1f722a7e\" \u002F>\n\n\u003C\u002Fdiv>\n\n---\n\n## 📦 What It Does\n\nKula collects system metrics every second by reading directly from `\u002Fproc` and `\u002Fsys`, \nstores them in a built-in tiered ring-buffer storage engine, and serves them through a real-time Web UI dashboard and a terminal TUI.\n\n| Metric | What's Collected |\n|--------|-----------------|\n| **CPU** | Total usage (user, system, iowait, irq, softirq, steal) + core count |\n| **GPU** | Load, Power consumption, VRAM |\n| **Load** | 1 \u002F 5 \u002F 15 min averages, running & total tasks |\n| **Memory** | Total, free, available, used, buffers, cached, shmem |\n| **Swap** | Total, free, used |\n| **Network** | Per-interface throughput (Mbps), packets\u002Fs, errors, drops; TCP errors\u002Fs, resets\u002Fs, retrans, established; sockets |\n| **Disks** | Per-device I\u002FO (read\u002Fwrite bytes\u002Fs, reads\u002Fs, writes\u002Fs IOPS); filesystem usage |\n| **System** | Uptime, entropy, clock sync, hostname, logged-in user count |\n| **Processes** | Running, sleeping, blocked, zombie counts |\n| **Self** | Kula's own CPU%, RSS memory, open file descriptors |\n| **Thermal** | CPU, GPU and Disk temperatures |\n| **Battery** | \u002Fsys\u002Fclass\u002Fpower_supply - power supply \u002F battery status |\n| **Containers** | Docker, podman, raw cgroups |\n| **Applications** | PostgreSQL, nginx |\n| **Custom** | Monitor anything with custom metrics |\n\nNote: Monitoring NVIDIA GPUs might require additional setup. Check [GPU monitoring](https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Fwiki\u002FGPU-monitoring).\n\n---\n\n## 🪩 How It Works\n\n```\n    ╭──────────────────────────────────────────────╮\n    │                  Linux Kernel                │\n    │      \u002Fproc\u002Fstat  \u002Fproc\u002Fmeminfo  \u002Fsys\u002F...     │\n    ╰───────────────────────┬──────────────────────╯\n                            │ Read every 1s\n                            ▼\n    ╭──────────────────────────────────────────────╮\n    │                   Collectors                 │\n    │        (CPU, Mem, Net, Disk, System)         │\n    ╰───────────────────────┬──────────────────────╯\n                            │ Live Data\n         ╭──────────────────┼─────────────────────╮\n         ▼                  ▼                     ▼\n╭─────────────────╮  ╭────────────────╮  ╭─────────────────╮\n│ Storage Engine  │  │   Web Server   │  │   TUI Terminal  │\n╰───┬─────────┬───╯  ╰──────┬─────────╯  ╰─────────────────╯\n    │         │             │\n    │         ╰──(History)──┤              ╭───────────────╮\n    │                       ╰──(HTTP\u002FWS)─► |   Dashboard   |\n    ▼                                      ╰───────────────╯\n╭──────────┬──────────┬──────────╮\n│  Tier 1  │  Tier 2  │  Tier 3  │\n│    1s    │    1m    │    5m    │\n│  250 MB  │  150 MB  │  50 MB   │\n╰──────────┴──────────┴──────────╯\n Ring-buffer binary files\n with circular overwrites\n```\n\n### Storage Engine\n\nKula is powered by a custom-built, high-performance **ring-buffer** storage system that writes metrics directly into fixed-size binary files. Because the files have a strict maximum capacity, new data seamlessly wraps around to overwrite the oldest entries. On startup, Kula restores the latest-sample cache and reconstructs any pending aggregation buffers so it can resume serving recent data and continue tier rollups after a restart.\n\nTo maximize efficiency, Kula employs a multi-tiered architecture that intelligently downsamples older data:\n\n- **Tier 1** — Raw 1-second samples (default 250 MB)\n- **Tier 2** — 1-minute metrics aggregation (Avg\u002FMin\u002FMax) (default 150 MB)\n- **Tier 3** — 5-minute metrics aggregation (Avg\u002FMin\u002FMax) (default 50 MB)\n\n### HTTP server\n\nThe HTTP server on backend exposes a REST API and a WebSocket endpoint for live streaming. \nAuthentication is optional. When enabled, Kula uses Argon2id password hashing, secure session cookies, token-only session validation with sliding expiration, and hashed-at-rest session persistence. Authenticated API access can also use a bearer session token via the `Authorization` header.\n\n### Dashboard\n\nThe frontend is a single-page application embedded in the binary. Built on Chart.js with custom SVG gauges, \nit connects via WebSocket for live updates and falls back to history API for longer time ranges. Features include:\n\n- Interactive zoom with drag-select (auto-pauses live stream)\n- Focus mode to display only specific charts of interest\n- Configurable Y-axis bounds (Manual limits or Auto-detect)\n- Per-device selectors for Network, Disk I\u002FO, and Thermal monitoring\n- Grid \u002F stacked list layout toggle\n- Alert system for clock sync, low entropy, and system overload\n- Modern aesthetics with light\u002Fdark theme support\n- Optional AI assistant powered by a local Ollama model (see below)\n\n### AI Assistant\n\nKula features an AI assistant via [Ollama](https:\u002F\u002Fgithub.com\u002Follama\u002Follama).\n\nWhen Ollama is enabled in `config.yaml`, a 🤖 button appears in the dashboard header. The panel supports:\n\n- **Multi-session conversations** — open independent threads and switch between them\n- **Per-chart analysis** — click the 🤖 icon on any chart card to open a session pre-loaded with that chart's recent data as CSV\n- **Agentic tool calling** — the model can call `get_metrics` to pull metrics on demand (up to 5 rounds per turn)\n- **Model selector** — switch between any locally available Ollama model mid-session\n- **Draggable & resizable panel** — drag by the header, resize from the bottom-right grip\n- **Streaming responses** with markdown rendering\n\nAll AI inference runs locally through Ollama API.\n\n---\n\n## 💾 Installation\n\nKula was built to have everything in one binary file. You can just upload it to your server \nand not worry about installing anything else because Kula has no dependencies. It just works out of the box! \nIt is a great tool when you need to quickly start real-time monitoring.\n\nExample installation methods for **amd64 (x86_64)** GNU\u002FLinux.\n\nCheck [Releases](https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Freleases) for **ARM** and **RISC-V** packages.\n\nNote: Never thoughtlessly paste commands into the terminal. Even checking the checksum is no substitute for reviewing the code.\n\n### Guided\n\n```bash\nbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fc0m4r\u002Fkula\u002Frefs\u002Fheads\u002Fmain\u002Faddons\u002Finstall.sh)\"\n```\n\n### Guided (verify installer)\n\n```bash\nKULA_INSTALL=$(mktemp)\ncurl -o ${KULA_INSTALL} -fsSL https:\u002F\u002Fkula.ovh\u002Finstall\necho \"c70f6f070a1f93e278f07f7efb7d662a48bc16f43909df7889d8778430dde1b6 ${KULA_INSTALL}\" | sha256sum -c || rm -f ${KULA_INSTALL}\nbash ${KULA_INSTALL}\nrm -f ${KULA_INSTALL}\n```\n\n### Standalone\n\n```bash\nwget https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Freleases\u002Fdownload\u002F0.15.0\u002Fkula-0.15.0-amd64.tar.gz\necho \"92a189984672566cc3f31deee22926c25fbbf6370ba361f9b326fe43010b5d60 kula-0.15.0-amd64.tar.gz\" | sha256sum -c || rm -f kula-0.15.0-amd64.tar.gz\ntar -xvf kula-0.15.0-amd64.tar.gz\ncd kula\n.\u002Fkula\n```\n\n### Docker\n\nTemporary, no persistent storage:\n\n```bash\ndocker run --rm -it --name kula --pid host --network host -v \u002Fproc:\u002Fproc:ro c0m4r\u002Fkula:latest\n```\n\nWith persistent storage:\n\n```bash\ndocker run -d --name kula --pid host --network host -v \u002Fproc:\u002Fproc:ro -v kula_data:\u002Fapp\u002Fdata c0m4r\u002Fkula:latest\ndocker logs -f kula\n```\n\n### Debian \u002F Ubuntu (.deb)\n\n```bash\nwget https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Freleases\u002Fdownload\u002F0.15.0\u002Fkula-0.15.0-amd64.deb\necho \"de193f1561375c6e55089f3b5af22d63205f42d6118608e5093344cc6b119e60 kula-0.15.0-amd64.deb\" | sha256sum -c || rm -f kula-0.15.0-amd64.deb\nsudo dpkg -i kula-0.15.0-amd64.deb\njournalctl -f -t kula\n```\n\n### RHEL \u002F Fedora \u002F CentOS \u002F Rocky \u002F Alma (.rpm)\n\n```bash\nwget https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Freleases\u002Fdownload\u002F0.15.0\u002Fkula-0.15.0-x86_64.rpm\necho \"36f1c968e7cbd7643a2d611221128d80596f27ff756bbee4dd5a33238a33cbb6 kula-0.15.0-x86_64.rpm\" | sha256sum -c || rm -f kula-0.15.0-x86_64.rpm\nsudo rpm -i kula-0.15.0-x86_64.rpm\njournalctl -f -t kula\n```\n\n### Arch Linux \u002F Manjaro (AUR)\n\nhttps:\u002F\u002Faur.archlinux.org\u002Fpackages\u002Fkula\n\n```bash\ngit clone https:\u002F\u002Faur.archlinux.org\u002Fkula.git\ncd kula\nmakepkg -si\n```\n\n### Build from Source\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula.git\ncd kula\n.\u002Faddons\u002Fbuild.sh\n```\n\n---\n\n## 💻 Usage\n\n### Quick Start\n\nStarting Kula is as simple as running:\n\n```bash\n.\u002Fkula\n```\n\nDashboard will be available at: http:\u002F\u002Flocalhost:27960 (or :8080 if you're using earlier versions)\n\nYou can change default port and listen address in [`config.yaml`](config.example.yaml) or using environment variables:\n\n```bash\nexport KULA_LISTEN=\"127.0.0.1\"\nexport KULA_PORT=\"27960\"\n.\u002Fkula\n```\n\n### TUI\n\n```bash\n.\u002Fkula tui\n```\n\n### Inspect storage\n\n```bash\n.\u002Fkula inspect\n```\n\n### Prometheus metrics\n\nSee: [Prometheus metrics](https:\u002F\u002Fgithub.com\u002Fc0m4r\u002Fkula\u002Fwiki\u002FPrometheus-metrics) for more info.\n\n### Health endpoints\n\nKula exposes lightweight liveness endpoints at:\n\n```\nhttp:\u002F\u002Flocalhost:27960\u002Fhealth\nhttp:\u002F\u002Flocalhost:27960\u002Fstatus\n```\n\nBoth return:\n\n```\n200 OK\nkula is healthy\n```\n\n### Authentication (Optional)\n\n```bash\n# Generate password hash\n.\u002Fkula hash-password\n\n# Add the output to config.yaml under web.auth\n```\n\nWhen authentication is enabled, Kula issues a random session token after login, stores only its hash on disk, and validates requests by token expiry\u002Fvalidity rather than binding sessions to client IP or User-Agent.\n\n### Service Management\n\nInit system files are provided in `addons\u002Finit\u002F`:\n\n```bash\n# systemd\nsudo cp addons\u002Finit\u002Fsystemd\u002Fkula.service \u002Fetc\u002Fsystemd\u002Fsystem\u002F\nsudo systemctl enable --now kula\n\n# OpenRC\nsudo cp addons\u002Finit\u002Fopenrc\u002Fkula \u002Fetc\u002Finit.d\u002F\nsudo rc-update add kula default\n\n# runit\nsudo cp -r addons\u002Finit\u002Frunit\u002Fkula \u002Fetc\u002Fsv\u002F\nsudo ln -s \u002Fetc\u002Fsv\u002Fkula \u002Fvar\u002Fservice\u002F\n```\n\n---\n\n## ⚙️ Configuration\n\nAll settings live in `config.yaml`. See [`config.example.yaml`](config.example.yaml) for defaults.\n\n---\n\n## 🧰 Development\n\n```bash\n# Lint + test suite\n.\u002Faddons\u002Fcheck.sh\n\n# Build\n.\u002Faddonsh.build.sh\n\n# Build dev (Binary size: ~17MB)\nCGO_ENABLED=0 go build -o kula .\u002Fcmd\u002Fkula\u002F\n\n# Build prod (Binary size: ~12MB, xz: ~4MB)\nCGO_ENABLED=0 go build -trimpath -ldflags=\"-s -w\" -buildvcs=false -o kula .\u002Fcmd\u002Fkula\u002F\n```\n\n### Updating Dependencies\n\nTo safely update only the Go modules used by Kula to their latest minor\u002Fpatch versions, and prune any unused dependencies:\n\n```bash\n.\u002Faddons\u002Fgo_modules_updates.py\ngo get -u .\u002F...\ngo mod tidy\n```\n\n### Testing & Benchmarks\n\n```bash\n# Run unit tests with race detector\ngo test -race .\u002F...\n\n# Run the full storage benchmark suite (default: 3s per bench)\n.\u002Faddons\u002Fbenchmark.sh\n\n# Python scripts formatter and linters\nblack addons\u002F*.py\npylint addons\u002F*.py\nmypy --strict addons\u002F*.py\n```\n\n### Cross-Compile\n\n```bash\n.\u002Faddons\u002Fbuild.sh cross    # builds amd64, arm64, riscv64\n```\n\n### Debian \u002F Ubuntu (.deb)\n\n```bash\n.\u002Faddons\u002Fbuild_deb.sh\nls -1 dist\u002Fkula-*.deb\n```\n\n### Arch Linux \u002F Manjaro (AUR)\n\n```bash\n.\u002Faddons\u002Fbuild_aur.sh\ncd dist\u002Faur && makepkg -si\n```\n\n### RHEL \u002F Fedora \u002F CentOS \u002F Rocky \u002F Alma (.rpm)\n\n```bash\n.\u002Faddons\u002Fbuild_rpm.sh\nls -1 dist\u002Fkula-*.rpm\n```\n\n### Docker\n\n```bash\n.\u002Faddons\u002Fdocker\u002Fbuild.sh\ndocker compose -f addons\u002Fdocker\u002Fdocker-compose.yml up -d\n```\n\n---\n\n## 🔒 Privacy\n\nPrivacy is a core pillar, not an afterthought.\n\nKula is built for privacy-conscious infrastructure. It is a completely self-contained binary that requires no cloud connection and no third-party APIs. Designed to function perfectly in air-gapped networks, Kula never sends metadata to external servers, never serves advertisements, and requires no user registration. Your monitoring starts and ends on your infrastructure, exactly where it should be.\n\n---\n\n## 📖 License\n\n[GNU Affero General Public License v3.0](LICENSE)\n\n---\n\n## 🫶 Attributions\n\n- [Linux®](https:\u002F\u002Fgithub.com\u002Ftorvalds\u002Flinux) is the registered trademark of Linus Torvalds in the U.S. and other countries.\n- [Chart.js](https:\u002F\u002Fwww.chartjs.org\u002F) library licensed under MIT\n- [Inter](https:\u002F\u002Fgithub.com\u002Frsms\u002Finter) font by Rasmus Andersson licensed under [OFL-1.1](https:\u002F\u002Fopenfontlicense.org\u002F)\n- [Press Start 2P](https:\u002F\u002Ffonts.google.com\u002Fspecimen\u002FPress+Start+2P?query=CodeMan38) font by CodeMan38 licensed under [OFL-1.1](https:\u002F\u002Fopenfontlicense.org\u002F)\n","Kula 是一个轻量级、自包含的 Linux 服务器监控工具。它通过直接读取 `\u002Fproc` 和 `\u002Fsys` 文件系统来收集系统指标，每秒更新一次，并将数据存储在一个内置的分层环形缓冲区存储引擎中。Kula 提供了一个实时 Web UI 仪表板和终端 TUI 来展示这些数据。其核心功能包括 CPU、内存、网络、磁盘 I\u002FO、系统状态以及进程等多方面的监控。此外，Kula 还支持 GPU、容器（如 Docker 和 Podman）及特定应用程序（如 PostgreSQL 和 Nginx）的监控，并允许用户定义自定义指标。由于 Kula 不依赖外部数据库且为单个二进制文件，因此非常适合需要快速部署和低维护成本的 VPS 或私有服务器监控场景。",2,"2026-06-11 03:50:18","high_star"]