<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>The Kitaso blog</title>
  <subtitle>Field notes on server monitoring, SSH, and building a native Mac app for watching Linux VPS instances.</subtitle>
  <link href="https://kitaso.app/blog/feed.xml" rel="self" />
  <link href="https://kitaso.app/blog/" />
  <id>https://kitaso.app/blog/</id>
  <updated>2026-07-15T08:00:00Z</updated>
  <author><name>Achilleas Buisman</name></author>
  <entry>
    <title>A server to monitor a server is crazy</title>
    <link href="https://kitaso.app/blog/a-server-to-monitor-a-server-is-crazy" />
    <id>https://kitaso.app/blog/a-server-to-monitor-a-server-is-crazy</id>
    <published>2026-07-15T08:00:00Z</published>
    <updated>2026-07-15T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>A server to monitor a server is crazy. Modern infrastructure design is about complicating so much that we&#39;ve forgotten that our own laptop is the interface to it all. So why not monitor from there instead?</summary>
    <content type="html">&lt;p&gt;Modern infrastructure design is about complicating so much that we&amp;#39;ve forgotten that our own laptop is the interface to it all. So why not monitor from there instead?&lt;/p&gt;

&lt;h2 id=&quot;what-are-you-on-about&quot;&gt;What are you on about?&lt;/h2&gt;

&lt;p&gt;Over the years I&amp;#39;ve managed many servers, from small &lt;a href=&quot;https://bookmarkify.it&quot; target=&quot;_blank&quot;&gt;side projects&lt;/a&gt; to professionally for the companies that I&amp;#39;ve worked for.&lt;/p&gt;

&lt;p&gt;The company servers were all managed and monitored through the infrastructure platforms that we used, but my side project servers were just there and usually it took an e-mail by a sporadic user to let me know that they were down to begin with.&lt;/p&gt;

&lt;p&gt;Enter my own startup, &lt;a href=&quot;https://elmtrail.com&quot; target=&quot;_blank&quot;&gt;Elmtrail&lt;/a&gt;. We run lots of servers for our AI automation platform that are all critical to stay up and running.&lt;/p&gt;

&lt;p&gt;Our philosophy of infrastructure design is to keep it simple and easy to manage. We use &lt;a href=&#39;https://kamal-deploy.org/&#39;&gt;Kamal&lt;/a&gt; to manage our services and run deploys and run everything on Hetzner that way.&lt;/p&gt;

&lt;p&gt;For monitoring those servers, we could&amp;#39;ve setup Grafana with various datasources and whatever else. But then, who was going to monitor the Grafana server? Would I have to setup another server? Why is this such a pain? I just want to look at CPU, memory and disk usage of my servers.&lt;/p&gt;

&lt;h2 id=&quot;enter-kitaso&quot;&gt;Enter Kitaso&lt;/h2&gt;

&lt;p&gt;What if, I thought, I&amp;#39;d just SSH into my servers and get the metrics I need? What if, I thought further, I would store these collected metrics locally and display them in a simple dashboard?&lt;/p&gt;

&lt;p&gt;That is how Kitaso was born. The first version would ping the server and display and store the metrics it fetched every minute.&lt;/p&gt;

&lt;p&gt;Obviously, I needed a way to monitor the server when my laptop wasn&amp;#39;t on to collect the metrics. This was easily fixed by creating a small bash script that would collect the same metrics on each server and store them in a SQLite database. My client would then fetch these metrics and display them in the dashboard.&lt;/p&gt;

&lt;p&gt;A child can do the washing, as we say in the Netherlands.&lt;/p&gt;

&lt;p&gt;It turns out, it is a bit more complicated than adding the word &amp;#39;just&amp;#39; in every sentence. However, the basic premise is correct.&lt;/p&gt;

&lt;h2 id=&quot;the-result&quot;&gt;The result&lt;/h2&gt;

&lt;p&gt;&lt;figure class=&quot;post-figure&quot;&gt;&lt;img src=&quot;/images/posts/2026-06-14-00-08-54.png&quot; alt=&quot;Kitaso dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;Kitaso fits the way we run infrastructure at Elmtrail: keep it simple enough that it stays out of the way, and spend the attention on the product instead.&lt;/p&gt;

&lt;p&gt;It has alerted us early of a few issues, and it lets me look back at what a server was doing when something went wrong. I open it every day.&lt;/p&gt;

&lt;p&gt;It does not page me at night. Notifications fire from my Mac, so a closed lid means the alert waits. The collector keeps the history, so the incident is on the chart in the morning.&lt;/p&gt;

&lt;p&gt;Two servers are free, with no account and no time limit: &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Kitaso vs Prometheus and Grafana: a stack to run, or an app to open</title>
    <link href="https://kitaso.app/vs/prometheus-grafana" />
    <id>https://kitaso.app/vs/prometheus-grafana</id>
    <published>2026-06-23T08:00:00Z</published>
    <updated>2026-06-23T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Prometheus and Grafana are four or five processes you assemble, configure and host yourself. Kitaso is one app on your Mac. Here is what each side costs and what it gives back.</summary>
    <content type="html">&lt;p&gt;Prometheus and Grafana are the default open-source answer to monitoring, and above a certain scale they are the right one. The question is whether you are at that scale. Most people with a handful of boxes are not.&lt;/p&gt;

&lt;h2 id=&quot;what-prometheus-and-grafana-means&quot;&gt;What &lt;q&gt;Prometheus and Grafana&lt;/q&gt; means&lt;/h2&gt;

&lt;p&gt;It is shorthand for four or five separate processes you assemble yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; scrapes metrics on a schedule, stores them in its own time-series database, and answers queries in its own query language, PromQL. It also evaluates alert rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;node_exporter&lt;/strong&gt; runs on each host and exposes that host&amp;#39;s metrics on a port for Prometheus to scrape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana&lt;/strong&gt; reads from Prometheus and draws the dashboards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt; takes the alerts Prometheus fires and routes, groups and silences them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cAdvisor&lt;/strong&gt;, optionally, for per-container metrics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All free, all open source, all industrial grade. Nothing below is a knock on the quality.&lt;/p&gt;

&lt;div class=&quot;compare-wrap&quot;&gt;
&lt;table class=&quot;compare&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th class=&quot;is-kitaso&quot;&gt;Kitaso&lt;/th&gt;&lt;th&gt;Prometheus + Grafana stack&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;You run&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;One Mac app&lt;/td&gt;&lt;td&gt;Prometheus, node_exporter, Grafana, Alertmanager, often cAdvisor&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;On each server&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;An optional scheduled collector, no open port&lt;/td&gt;&lt;td&gt;node_exporter on a port, plus exporters per service&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Setup&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Add a host, see a chart&lt;/td&gt;&lt;td&gt;Scrape configs, storage, dashboards, PromQL rules, alert routing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Querying&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Pick a metric and a time range&lt;/td&gt;&lt;td&gt;PromQL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Central host&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;None, the app is your Mac&lt;/td&gt;&lt;td&gt;Its own always-on box&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Price&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;$39 once (1 year of updates included), 2 servers free forever&lt;/td&gt;&lt;td&gt;Free, self-hosted&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;h2 id=&quot;what-the-stack-costs-when-the-software-is-free&quot;&gt;What the stack costs when the software is free&lt;/h2&gt;

&lt;p&gt;Configuration and upkeep. You write scrape configs. You plan retention and storage. You build dashboards, or import someone else&amp;#39;s and adjust them. You write alert rules in PromQL and routing in YAML. The components support TLS and basic auth, but not by default, so in practice every exporter and port stays off the public internet behind firewall rules or a private network. There are thirty-minute docker-compose demos for all of this; a thirty-minute production setup is not a thing.&lt;/p&gt;

&lt;p&gt;Grafana is the one piece of this I have run myself, and not for long. Getting a chart on screen was quick. Knowing it well enough to change it confidently was not: the query editor, the datasource settings, template variables, panel options, and the gap between what a dashboard asks for and what Prometheus actually stores. It is a skill you keep up, and it decays if you touch it twice a year.&lt;/p&gt;

&lt;p&gt;The stack also wants a home: an always-on box of its own. Watching a few small servers means standing up another server, and on small boxes that stack can use more memory than the applications it is watching.&lt;/p&gt;

&lt;h2 id=&quot;what-you-get-in-exchange&quot;&gt;What you get in exchange&lt;/h2&gt;

&lt;p&gt;Real things. A shared Grafana that is always up and readable by a whole team from any browser. PromQL, which answers questions Kitaso cannot: rates of change, percentiles across hosts, arbitrary math over any series. An exporter for nearly everything. Alertmanager routing for actual on-call schedules, firing around the clock from a machine that is always on. Retention and resolution entirely under your control.&lt;/p&gt;

&lt;p&gt;If you need any of that, use the stack and don&amp;#39;t look back.&lt;/p&gt;

&lt;h2 id=&quot;the-other-trade&quot;&gt;The other trade&lt;/h2&gt;

&lt;p&gt;Kitaso is the opposite deal. You add a host and you see a chart. On each server there is at most a small scheduled collector writing metrics to a local SQLite file — no port, nothing new to secure. The Mac pulls everything over the SSH access that already exists. Alerts are thresholds set in a sheet, and they fire from the Mac while it is awake; the collector keeps the history overnight but does not page you. There is no PromQL, no shared web dashboard, no federation.&lt;/p&gt;

&lt;p&gt;The stack is the right answer to a problem you may not have yet. Until you do, the first two servers are free at &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Kitaso vs Netdata: a resident agent, or SSH polling</title>
    <link href="https://kitaso.app/vs/netdata" />
    <id>https://kitaso.app/vs/netdata</id>
    <published>2026-06-20T08:00:00Z</published>
    <updated>2026-06-20T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Netdata runs an always-on agent collecting hundreds of metrics per second on every box. Kitaso polls over SSH from a Mac. The difference is what runs on the server being watched.</summary>
    <content type="html">&lt;p&gt;Netdata puts a resident agent on every server and serves a real-time dashboard from the box itself. Kitaso puts a Mac app in front of the SSH access you already have. The difference that matters is what runs on the machine being watched.&lt;/p&gt;

&lt;p&gt;Everything below about Netdata comes from its documentation and pricing page, checked on 4 September 2026.&lt;/p&gt;

&lt;h2 id=&quot;two-shapes&quot;&gt;Two shapes&lt;/h2&gt;

&lt;p&gt;Netdata&amp;#39;s agent runs continuously on each host. It collects at one-second granularity by default, ships over 800 collectors that auto-discover things like Postgres, NGINX and Redis, serves a web dashboard from the box on port 19999, and runs machine-learning anomaly detection locally. The agent is GPLv3 and much of it works fully offline. Netdata Cloud adds a single view across machines.&lt;/p&gt;

&lt;p&gt;Kitaso runs on the Mac. It opens an SSH connection per server, runs one batched command, parses the output and charts it. The optional collector on each server is a scheduled job that runs and exits — no resident process, no open port.&lt;/p&gt;

&lt;div class=&quot;compare-wrap&quot;&gt;
&lt;table class=&quot;compare&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th class=&quot;is-kitaso&quot;&gt;Kitaso&lt;/th&gt;&lt;th&gt;Netdata&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;On each server&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;A scheduled job that runs and exits&lt;/td&gt;&lt;td&gt;A resident agent, always running&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Open ports&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;None&lt;/td&gt;&lt;td&gt;A local dashboard on port 19999&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Granularity&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Per server, down to every second&lt;/td&gt;&lt;td&gt;Every second, everywhere, by default&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Metrics&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;CPU, RAM, disk, load, Docker&lt;/td&gt;&lt;td&gt;800+ collectors, app dashboards, ML anomaly detection&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Dashboard&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Native Mac app&lt;/td&gt;&lt;td&gt;Web UI per node, or their Cloud for a fleet view&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Price&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;$39 once (1 year of updates included), 2 servers free forever&lt;/td&gt;&lt;td&gt;Agent free; Cloud free to 5 nodes, then Homelab $90/yr or $4.50/node/month, from netdata.cloud/pricing on 4 September 2026&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Two rows in that table are easy to misread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Granularity.&lt;/strong&gt; Kitaso&amp;#39;s polling interval is set per server and goes down to one second, so a short spike does not slip past a box you are actively watching. But a local agent samples every metric every second continuously and cheaply, while SSH polling at one second costs far more per sample. Netdata holds that resolution everywhere, all the time. Kitaso reaches it where you ask for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price.&lt;/strong&gt; Netdata&amp;#39;s agent is genuinely free and unlimited. The five-node limit applies to Netdata Cloud, the layer that gives one view across machines. Past five nodes you pay for Cloud or self-host a parent node to aggregate. The per-node dashboards stay free either way.&lt;/p&gt;

&lt;h2 id=&quot;what-the-agent-costs-on-the-box&quot;&gt;What the agent costs on the box&lt;/h2&gt;

&lt;p&gt;An agent collecting hundreds of metrics every second, keeping its own retention and training anomaly models locally, uses real CPU, memory and disk on the machine it is watching. That is not a flaw; it is what the capability costs. On a large application server it disappears into the noise. On a 2 GB VPS running one Rails app it is a visible share of the box.&lt;/p&gt;

&lt;p&gt;Kitaso&amp;#39;s footprint on the server is one SSH command per poll — or, with the collector installed, a scheduled shell script writing to a local SQLite file. Nothing runs between polls and nothing listens on a port.&lt;/p&gt;

&lt;h2 id=&quot;which-one&quot;&gt;Which one&lt;/h2&gt;

&lt;p&gt;For deep, always-on, per-application visibility with per-second history and anomaly detection on every box, Netdata does considerably more than Kitaso and the agent costs nothing. For real-time troubleshooting it is hard to beat.&lt;/p&gt;

&lt;p&gt;For a handful of servers seen at a glance from a Mac, with almost nothing running on the servers themselves and the history on your own machine, that is what Kitaso is for. Two servers free at &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Kitaso vs Beszel: a self-hosted hub, or an app on your Mac</title>
    <link href="https://kitaso.app/vs/beszel" />
    <id>https://kitaso.app/vs/beszel</id>
    <published>2026-06-18T08:00:00Z</published>
    <updated>2026-06-18T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Beszel is a self-hosted web hub with an agent on each server. Kitaso is a Mac app that polls over SSH with no hub at all. Same job, opposite architecture.</summary>
    <content type="html">&lt;p&gt;Beszel and Kitaso answer the same question — how do you watch a handful of Linux servers without standing up an observability platform — and they put the dashboard in opposite places. Beszel puts it on a server you host. Kitaso puts it in an app on your Mac.&lt;/p&gt;

&lt;p&gt;Everything below about Beszel comes from its documentation and GitHub repository, checked on 4 September 2026. It is free, MIT licensed, and had over 25,000 stars at that point.&lt;/p&gt;

&lt;h2 id=&quot;two-shapes&quot;&gt;Two shapes&lt;/h2&gt;

&lt;p&gt;Beszel is a hub and agents. The hub is a single Go binary with an embedded SQLite database; you run it somewhere central and it serves a web dashboard with user accounts. On each monitored machine runs a small agent. Hub and agent authenticate with an SSH key, and depending on the setup the hub connects to the agent or the agent opens a WebSocket to the hub. Both parts are light.&lt;/p&gt;

&lt;p&gt;Kitaso has no hub. The Mac app opens an SSH connection to each server, runs one batched command, parses the output and draws it. History goes into SQLite on the Mac. A scheduled collector on each server is optional; installed, it writes metrics to a SQLite file on that box, and Kitaso pulls the rows when it next connects, so history keeps accumulating while the Mac is closed.&lt;/p&gt;

&lt;div class=&quot;compare-wrap&quot;&gt;
&lt;table class=&quot;compare&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th class=&quot;is-kitaso&quot;&gt;Kitaso&lt;/th&gt;&lt;th&gt;Beszel&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Front end&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Native Mac app&lt;/td&gt;&lt;td&gt;Self-hosted web hub&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;On each server&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Optional scheduled collector (shell + SQLite)&lt;/td&gt;&lt;td&gt;A small agent binary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Also required&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Nothing else&lt;/td&gt;&lt;td&gt;The hub: a server, TLS, an admin account&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Where history lives&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;SQLite on your Mac&lt;/td&gt;&lt;td&gt;SQLite in the hub you host&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Access&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Your Mac&lt;/td&gt;&lt;td&gt;Any browser, multiple user accounts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Alerting&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;From the Mac, while it is awake&lt;/td&gt;&lt;td&gt;From the hub, around the clock&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Platforms watched&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Linux&lt;/td&gt;&lt;td&gt;Linux, FreeBSD, macOS, Windows&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Price&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;$39 once (1 year of updates included), 2 servers free forever&lt;/td&gt;&lt;td&gt;Free, MIT&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;h2 id=&quot;what-beszel-does-that-kitaso-does-not&quot;&gt;What Beszel does that Kitaso does not&lt;/h2&gt;

&lt;p&gt;The dashboard exists without your laptop. It runs on an always-on box, reachable from any browser and any phone, with real user accounts. A colleague can open it; an on-call rotation can share it. Kitaso is single-operator — there is no URL to send anyone.&lt;/p&gt;

&lt;p&gt;Because the hub is always on, its alerts are too. Kitaso&amp;#39;s alerts fire from the Mac and only while the Mac is awake. The collector keeps filling the history overnight, but it does not page you.&lt;/p&gt;

&lt;p&gt;Beszel is also free and open source, and it watches more than Linux: FreeBSD, macOS and Windows, plus GPUs and disk health. Kitaso reads Linux boxes over SSH and nothing else, and costs $39.&lt;/p&gt;

&lt;p&gt;If more than one person looks at the dashboard, or the fleet is a mix of machines rather than a row of Linux VPSes, Beszel covers ground Kitaso does not.&lt;/p&gt;

&lt;h2 id=&quot;what-running-no-hub-buys&quot;&gt;What running no hub buys&lt;/h2&gt;

&lt;p&gt;The hub is a server. In practice it lives on a small VPS, in Docker, behind a reverse proxy with TLS if it is reachable from the internet, with an admin login. It has a disk that can fill, updates to apply, and a failure mode of its own: while the hub is down, nothing is being recorded.&lt;/p&gt;

&lt;p&gt;Kitaso has no equivalent piece. The servers report to nothing except the Mac that connects to them, over SSH access that already exists. No account, no open port, no certificate to renew.&lt;/p&gt;

&lt;h2 id=&quot;which-one&quot;&gt;Which one&lt;/h2&gt;

&lt;p&gt;One question decides it: does the dashboard need to exist without your laptop?&lt;/p&gt;

&lt;p&gt;If yes — a team, a rotation, a phone, or alerts that must fire at 3am — run Beszel. It is free and built for exactly that.&lt;/p&gt;

&lt;p&gt;If one person with a Mac watches a handful of Linux boxes, and another server to host, secure and patch is the thing being avoided, that is the gap Kitaso fills. The first two servers are free at &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Kitaso vs Datadog: the arithmetic for five servers</title>
    <link href="https://kitaso.app/vs/datadog" />
    <id>https://kitaso.app/vs/datadog</id>
    <published>2026-06-16T08:00:00Z</published>
    <updated>2026-06-16T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Datadog is priced per host per month for teams running hundreds of them. Kitaso is $39 once. Here is what the difference buys, and what it does not.</summary>
    <content type="html">&lt;p&gt;Datadog is an observability platform for teams running hundreds of hosts who need metrics, traces and logs correlated in one place. Kitaso is a Mac app that charts CPU, memory, disk, load and Docker stats for the Linux boxes you own. They are not competitors at Datadog&amp;#39;s scale. They overlap at the small end, where both can do the job and the price difference is three orders of magnitude.&lt;/p&gt;

&lt;h2 id=&quot;the-pricing&quot;&gt;The pricing&lt;/h2&gt;

&lt;p&gt;Every Datadog figure here comes from datadoghq.com/pricing, checked on 4 September 2026. Vendor pricing moves, so check it again before acting on the arithmetic.&lt;/p&gt;

&lt;div class=&quot;compare-wrap&quot;&gt;
&lt;table class=&quot;compare&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th class=&quot;is-kitaso&quot;&gt;Kitaso&lt;/th&gt;&lt;th&gt;Datadog&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Model&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;One-time purchase&lt;/td&gt;&lt;td&gt;Per-host, per-month subscription&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Infrastructure&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;$39 once (1 year of updates included), unlimited servers&lt;/td&gt;&lt;td&gt;$15/host/month (annual), $18 on-demand&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;APM&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Not offered&lt;/td&gt;&lt;td&gt;+$31/host/month (annual)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;On each server&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;An optional scheduled collector writing to SQLite&lt;/td&gt;&lt;td&gt;A resident agent reporting to the cloud&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Free tier&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;2 servers, forever, no account&lt;/td&gt;&lt;td&gt;Up to 5 hosts, 1 day of retention&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Where your data lives&lt;/th&gt;&lt;td class=&quot;is-kitaso&quot;&gt;Your Mac&lt;/td&gt;&lt;td&gt;Datadog&#39;s cloud&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Five servers on the annual Infrastructure plan is 5 × $15: $75 a month, $900 a year. Add APM and it is around $230 a month, roughly $2,760 a year, every year. Infrastructure billing is high-water mark — hosts are metered hourly and the 99th percentile is billed, so a brief spike is forgiven while a sustained busy week sets the bill for the whole month.&lt;/p&gt;

&lt;p&gt;Kitaso is $39 once, with a year of updates included. Two servers are free with no account, so it can be tried on real boxes before anything is paid.&lt;/p&gt;

&lt;h2 id=&quot;what-the-difference-buys&quot;&gt;What the difference buys&lt;/h2&gt;

&lt;p&gt;Datadog: distributed tracing, log aggregation, hundreds of integrations, anomaly detection, retention measured in months, and dashboards a whole on-call rotation reads from any device.&lt;/p&gt;

&lt;p&gt;Kitaso: CPU, memory, disk, load and Docker stats, per server, charted on your Mac, with threshold alerts. That is the complete list. No tracing, no log aggregation, no shared dashboard, no cloud.&lt;/p&gt;

&lt;p&gt;At a few hundred hosts, Datadog earns its price and Kitaso cannot do the job at all. At five, most of what the bill covers is capability that never gets opened.&lt;/p&gt;

&lt;h2 id=&quot;what-five-servers-actually-need&quot;&gt;What five servers actually need&lt;/h2&gt;

&lt;p&gt;Is CPU pegged, is memory running out, is a disk filling up, are the containers running, was this happening yesterday too, and will you hear about it before a user emails.&lt;/p&gt;

&lt;p&gt;Kitaso answers those six questions and stops there. The optional collector on each box keeps gathering while the Mac sleeps, so an overnight incident is on the chart in the morning. That is history rather than paging: live alerts fire from the Mac, while it is awake.&lt;/p&gt;

&lt;p&gt;If a Datadog quote is sitting in an inbox and the fleet is five servers, the small thing is worth trying first. Two servers free at &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A server&#39;s vitals in one SSH round-trip</title>
    <link href="https://kitaso.app/blog/one-ssh-round-trip" />
    <id>https://kitaso.app/blog/one-ssh-round-trip</id>
    <published>2026-06-09T08:00:00Z</published>
    <updated>2026-06-09T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Kitaso reads CPU, memory, disk, load and Docker stats from a Linux box in a single batched SSH command. No agent, no open port. Here is how that works.</summary>
    <content type="html">&lt;p&gt;Kitaso needs to answer one question, over and over, for every server: how are you doing? Most monitoring tools answer it by installing an agent on the box. I didn&amp;#39;t want to install anything. My Mac can already SSH into all of my servers, so why not use that?&lt;/p&gt;

&lt;p&gt;The naive version is one SSH call per metric. One for CPU, one for memory, one for disk, one for &lt;code&gt;docker stats&lt;/code&gt;. With four servers on a short polling interval you are suddenly opening a lot of connections, latency stacks up, and the charts start to stutter.&lt;/p&gt;

&lt;p&gt;So Kitaso sends one batched command per poll and parses the combined output on the Mac. Roughly this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;{
  echo &amp;quot;===CPU===&amp;quot;    ; cat /proc/stat | grep &amp;#39;^cpu &amp;#39;
  echo &amp;quot;===MEM===&amp;quot;    ; cat /proc/meminfo
  echo &amp;quot;===LOAD===&amp;quot;   ; cat /proc/loadavg
  echo &amp;quot;===DISK===&amp;quot;   ; df -PB1 -x tmpfs -x devtmpfs -x overlay
  echo &amp;quot;===DOCKER===&amp;quot; ; docker stats --no-stream --format &amp;#39;{{json .}}&amp;#39; 2&amp;gt;/dev/null
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One connection, one block of text. The server does almost nothing. Reading &lt;code&gt;/proc&lt;/code&gt; is a memory copy, not a measurement. The kernel already counted everything for you; the only cost is shipping the text over SSH.&lt;/p&gt;

&lt;h2 id=&quot;cpu-is-a-delta-not-a-number&quot;&gt;CPU is a delta, not a number&lt;/h2&gt;

&lt;p&gt;Fun detail: &lt;code&gt;/proc/stat&lt;/code&gt; does not tell you &lt;q&gt;CPU is at 40%&lt;/q&gt;. It gives you cumulative counters since boot. A single reading is meaningless. You need two readings and the percentage is the ratio of busy time to total time between them:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;busy  = (total₂ − idle₂) − (total₁ − idle₁)
cpu%  = busy / (total₂ − total₁) × 100
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is also why the CPU line is empty right after you add a server. There is no previous sample to diff against yet. One interval later, it starts moving.&lt;/p&gt;

&lt;p&gt;&lt;figure class=&quot;post-figure&quot;&gt;&lt;img src=&quot;/images/posts/2026-06-09-14-46-08.png&quot; alt=&quot;A CPU usage chart over a seven-day range with day-aligned axis labels and event markers along the bottom.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;figcaption&gt;CPU over 7 days. The line breaks where collection actually stopped, instead of guessing.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;h2 id=&quot;docker-without-exposing-the-socket&quot;&gt;Docker without exposing the socket&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;docker stats&lt;/code&gt; line makes people squint. Doesn&amp;#39;t that need the Docker socket? It does, but on the server, where the socket already lives and already belongs to the user you SSH in as. Nothing gets exposed over TCP and no port opens. Kitaso just runs &lt;code&gt;docker stats&lt;/code&gt; in the shell it is already in and gets every container&amp;#39;s CPU and memory, plus the image tags. When an image tag changes, that shows up as a deploy marker on the charts, so a CPU spike has a story attached.&lt;/p&gt;

&lt;p&gt;To be fair, this is also the one line in the batch that costs the server real work. Reading &lt;code&gt;/proc&lt;/code&gt; is free; asking the Docker daemon about every container is not. It is still one command in one connection, but &lt;q&gt;the server does almost nothing&lt;/q&gt; is most true on boxes without Docker.&lt;/p&gt;

&lt;h2 id=&quot;your-keys-stay-yours&quot;&gt;Your keys stay yours&lt;/h2&gt;

&lt;p&gt;Kitaso does not implement SSH. It shells out to the system &lt;code&gt;ssh&lt;/code&gt; binary, the same one you use in a terminal. That means your &lt;code&gt;~/.ssh/config&lt;/code&gt;, your keys, and your ssh-agent all work exactly as they already do, and servers behind a bastion work through jump hosts. The app never copies or uploads your keys; there is nothing new to trust with your credentials.&lt;/p&gt;

&lt;h2 id=&quot;why-i-care-about-round-trips&quot;&gt;Why I care about round-trips&lt;/h2&gt;

&lt;p&gt;I monitor from a laptop, not from a box in the same datacenter. Every connection crosses the open internet, sometimes on hotel Wi-Fi. Batching means one connection per server per poll instead of five. That is the difference between charts that feel live and charts that feel like they are buffering.&lt;/p&gt;

&lt;p&gt;It also keeps the server boring. No listener to patch, no agent to update, no new attack surface. Just &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;df&lt;/code&gt;. The tools that were already there.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;Want history while your Mac is off? That is the one thing Kitaso can install
on a server: &lt;a href=&quot;/blog/the-tiny-daemon&quot;&gt;a tiny shell + SQLite collector on a timer&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The tiny daemon that watches while your Mac sleeps</title>
    <link href="https://kitaso.app/blog/the-tiny-daemon" />
    <id>https://kitaso.app/blog/the-tiny-daemon</id>
    <published>2026-06-04T08:00:00Z</published>
    <updated>2026-06-04T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Kitaso polls servers live over SSH, but laptops sleep. So the one thing Kitaso can install on a server is a collector made of a small shell script, a scheduled job and SQLite. Here is exactly what it does.</summary>
    <content type="html">&lt;p&gt;A Mac app that polls servers over SSH has one obvious hole: laptops sleep. Close the lid and nothing is collecting. Kitaso is honest about it and draws a gap in the chart instead of a made-up line, but a gap is still a gap.&lt;/p&gt;

&lt;p&gt;I wanted the history to keep rolling while my Mac is off, without turning the whole thing into an agent platform. So I wrote the smallest collector I could get away with: a shell script, a scheduled job, and a SQLite file. It is the only thing Kitaso ever installs on a server, and it is optional.&lt;/p&gt;

&lt;h2 id=&quot;what-actually-gets-on-the-box&quot;&gt;What actually gets on the box&lt;/h2&gt;

&lt;p&gt;Three things, and you can read all of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;collect.sh&lt;/code&gt;&lt;/strong&gt;, a plain POSIX shell script that does the same &lt;code&gt;/proc&lt;/code&gt; + &lt;code&gt;df&lt;/code&gt; + &lt;code&gt;docker stats&lt;/code&gt; reads the live poller does, and writes them to a local SQLite database instead of shipping them over the wire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A scheduled job&lt;/strong&gt; that runs it every minute. On a systemd host that is a small timer unit; on boxes without systemd it is one cron line:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;cron&quot;&gt;* * * * * /opt/kitaso/collect.sh &amp;gt;&amp;gt; /opt/kitaso/collect.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A SQLite database&lt;/strong&gt; that grows by one small row per minute, with retention pruning to keep it bounded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No resident process, no listener, no open port. The scheduler wakes the script, the script writes a row, the script exits. The scripts together are about 35 KB of plain shell you can open in a text editor, and the whole install directory is about 50 KB before the database starts filling.&lt;/p&gt;

&lt;h2 id=&quot;the-schema-is-nothing-special&quot;&gt;The schema is nothing special&lt;/h2&gt;

&lt;p&gt;A trimmed version of the table it writes:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;CREATE TABLE snapshots (
  ts         INTEGER NOT NULL,   -- unix seconds
  cpu        REAL,
  mem_used   INTEGER,
  mem_total  INTEGER,
  load1      REAL,
  containers TEXT,               -- JSON
  PRIMARY KEY (ts)
) WITHOUT ROWID;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;SQLite handles a once-a-minute writer without breaking a sweat. That&amp;#39;s it. No time-series database, no query language.&lt;/p&gt;

&lt;h2 id=&quot;installing-is-one-click-so-is-removing&quot;&gt;Installing is one click, so is removing&lt;/h2&gt;

&lt;p&gt;There is no provisioning step. Kitaso pushes the script over the SSH connection it already has, sets up the timer or cron line, and runs the first collection. One click in the app.&lt;/p&gt;

&lt;p&gt;From then on, Kitaso pulls the collected rows whenever it connects and merges them with its own live polling. When both sources have a reading for the same moment, the live one wins, so the charts never double up.&lt;/p&gt;

&lt;p&gt;One thing the collector does not do is page you. It keeps the history; alerts still fire from your Mac, while it is awake. The 3am incident is on the chart in the morning, not on your phone at 3am.&lt;/p&gt;

&lt;p&gt;Removing it is the same click in reverse. Or do it by hand: it is one directory and one scheduled job.&lt;/p&gt;

&lt;p&gt;That removability is the point. A monitoring tool you can fully delete with &lt;code&gt;rm&lt;/code&gt; and one scheduler entry is a monitoring tool you can trust to be small. The collector only ever reads what the kernel already knows, and your data never leaves the server until your own Mac pulls it back.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;The live side of this, reading a whole server in a single connection, is in
&lt;a href=&quot;/blog/one-ssh-round-trip&quot;&gt;A server&amp;#39;s vitals in one SSH round-trip&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Who monitors the monitor?</title>
    <link href="https://kitaso.app/blog/who-monitors-the-monitor" />
    <id>https://kitaso.app/blog/who-monitors-the-monitor</id>
    <published>2026-05-28T08:00:00Z</published>
    <updated>2026-05-28T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>Every monitoring tool I looked at wanted me to run another server, create an account, or pay per host. For a handful of servers that never made sense to me. So I put the dashboard on my Mac instead.</summary>
    <content type="html">&lt;p&gt;When I went looking for something to watch my servers, every option came down to the same thing: run a server to monitor your servers.&lt;/p&gt;

&lt;p&gt;Either a hub that I would have to install, secure and keep patched. Or an account on someone&amp;#39;s cloud with a bill per host. Both mean adding a moving part just so I can watch my other moving parts. And when that part breaks, who monitors the monitor?&lt;/p&gt;

&lt;p&gt;I should say up front that I am no expert on the monitoring landscape. Big teams have good reasons for their observability stacks and I am not going to pretend otherwise. But I don&amp;#39;t have a big team. I have a Mac, an SSH config, and a bunch of Linux boxes on Hetzner that mostly behave.&lt;/p&gt;

&lt;p&gt;What do I actually want to know about those boxes? Is the CPU pegged. Is memory running out. Is a disk filling up. Are my Docker containers still running. And please tell me before my users do.&lt;/p&gt;

&lt;p&gt;None of that needs infrastructure. My Mac can already SSH into every one of those servers. Reading &lt;code&gt;/proc&lt;/code&gt; and running &lt;code&gt;df&lt;/code&gt; costs a server basically nothing. So that is what Kitaso does: it is a Mac app that polls my servers over SSH and draws charts. No hub, no account, no subscription. The history is a SQLite file on my own disk.&lt;/p&gt;

&lt;h2 id=&quot;but-your-mac-sleeps&quot;&gt;But your Mac sleeps&lt;/h2&gt;

&lt;p&gt;True. When my laptop is closed, nothing is polling. Kitaso is honest about it: the chart shows a gap instead of making up a line.&lt;/p&gt;

&lt;p&gt;If the gap bothers you, there is exactly one thing Kitaso will ever install on a server: a small collector. A shell script, a scheduled job, and a SQLite database. It writes the same metrics locally every minute, and Kitaso pulls the history back in the next time it connects. No open port, no resident process. Removing it is deleting one directory and one scheduled job.&lt;/p&gt;

&lt;h2 id=&quot;the-trade&quot;&gt;The trade&lt;/h2&gt;

&lt;p&gt;A hosted dashboard gives you 24/7 eyes and someone else&amp;#39;s uptime. In exchange you get an account, a subscription, and one more system in your critical path.&lt;/p&gt;

&lt;p&gt;A Mac app gives you no accounts, no bills, and data on your own disk. In exchange, live alerts only fire while your Mac is awake, and the history gap is covered by one tiny scheduled collector. The collector fills the chart, not the pager.&lt;/p&gt;

&lt;p&gt;For me the second trade wins easily. It just didn&amp;#39;t exist as a polished native app, so I built it. The first two servers are free: &lt;a href=&quot;https://kitaso.app&quot;&gt;kitaso.app&lt;/a&gt;.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;Curious how it reads a whole server in a single connection? I wrote that up in
&lt;a href=&quot;/blog/one-ssh-round-trip&quot;&gt;A server&amp;#39;s vitals in one SSH round-trip&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Alerts that don&#39;t cry wolf</title>
    <link href="https://kitaso.app/blog/alerts-that-dont-cry-wolf" />
    <id>https://kitaso.app/blog/alerts-that-dont-cry-wolf</id>
    <published>2026-05-21T08:00:00Z</published>
    <updated>2026-05-21T08:00:00Z</updated>
    <author><name>Achilleas</name></author>
    <summary>An alert that fires on every passing spike is noise you learn to ignore. So in Kitaso, crossing a threshold doesn&#39;t fire an alert. It starts a timer.</summary>
    <content type="html">&lt;p&gt;The fastest way to make me ignore alerts is to send too many. If CPU brushing 90% for four seconds during a deploy pages me, I will mute the whole thing within a week. And then the real outage arrives in silence.&lt;/p&gt;

&lt;p&gt;So when I built alerting into Kitaso, the rule was simple: &lt;q&gt;crossed a threshold&lt;/q&gt; and &lt;q&gt;is in trouble&lt;/q&gt; are two different questions. Kitaso only bothers me about the second one.&lt;/p&gt;

&lt;h2 id=&quot;a-spike-has-to-last&quot;&gt;A spike has to last&lt;/h2&gt;

&lt;p&gt;Crossing a threshold does not fire an alert. It starts a timer.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;normal  ──(value &amp;gt; threshold)──▶  warming  ──(held for the warm-up window)──▶  alerting
   ▲                                  │
   └──────(value dips below)──────────┘   timer cancelled, nothing sent
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If the value drops back under the line before the warm-up window is over, the timer is cancelled and nothing happens. The deploy spike comes and goes and you never hear about it. Only a crossing that stays crossed for the whole window becomes an alert.&lt;/p&gt;

&lt;h2 id=&quot;recovery-has-to-last-too&quot;&gt;Recovery has to last too&lt;/h2&gt;

&lt;p&gt;The same logic runs on the way down. One sample under the threshold doesn&amp;#39;t mean &lt;q&gt;recovered&lt;/q&gt;. It might bounce right back. So Kitaso waits out a recovery window before it declares the all-clear, and a rise back above the line cancels that timer just like on the way up.&lt;/p&gt;

&lt;p&gt;Flapping is what destroys trust in an alerting system. An alert that fires, recovers, fires, recovers, teaches you to stop reading.&lt;/p&gt;

&lt;h2 id=&quot;except-when-things-get-worse&quot;&gt;Except when things get worse&lt;/h2&gt;

&lt;p&gt;There is one exception. If a metric is already alerting at the warning level and then crosses the critical threshold, that fires immediately. No new warm-up. You already waited once to confirm the problem is real. Making you wait again to learn it got worse would be silly.&lt;/p&gt;

&lt;h2 id=&quot;it-looks-closer-when-something-is-up&quot;&gt;It looks closer when something is up&lt;/h2&gt;

&lt;p&gt;While a metric is warming, alerting or recovering, Kitaso polls that server faster, up to your configured interval. So you get fine-grained samples through the interesting part of an incident. After ten minutes of sustained alerting it relaxes back to the normal cadence, so a long outage doesn&amp;#39;t hammer the box.&lt;/p&gt;

&lt;h2 id=&quot;one-full-disk-is-one-alert&quot;&gt;One full disk is one alert&lt;/h2&gt;

&lt;p&gt;A server running Docker can have a dozen overlay mounts all backed by the same physical disk. A naive monitor sees twelve filesystems crossing 90% and sends twelve alerts. Kitaso deduplicates disk alerts by the underlying device. One full disk, one alert. And you can exclude specific mounts per server when you genuinely don&amp;#39;t care about them.&lt;/p&gt;

&lt;h2 id=&quot;and-when-you-already-know&quot;&gt;And when you already know&lt;/h2&gt;

&lt;p&gt;Doing maintenance and expecting things to get loud? Snooze the server, from five minutes to &lt;q&gt;until tomorrow&lt;/q&gt;.&lt;/p&gt;

&lt;h2 id=&quot;one-honest-limitation&quot;&gt;One honest limitation&lt;/h2&gt;

&lt;p&gt;Notifications fire from your Mac. If the lid is closed at 3am, nothing pages you; the server-side collector keeps the history, so the incident is on the chart in the morning, but that is a post-mortem, not an alarm. If you need something that wakes you regardless, pair Kitaso with a simple uptime pinger for the is-it-down case. Kitaso is the everything-else.&lt;/p&gt;

&lt;p&gt;All of this is configurable per metric and per server: the thresholds, the warm-up and the recovery windows. The defaults are conservative on purpose. When Kitaso notifies me, I act on it. That is the whole point.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;Curious how the readings behind these thresholds are collected? See
&lt;a href=&quot;/blog/one-ssh-round-trip&quot;&gt;A server&amp;#39;s vitals in one SSH round-trip&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
