<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: r</title>
    <description>The latest articles on DEV Community by r (@cyb3rkn1ght).</description>
    <link>https://dev.to/cyb3rkn1ght</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4070144%2F59a9fd8b-dfca-429e-aedf-6fdafc4dc641.jpg</url>
      <title>DEV Community: r</title>
      <link>https://dev.to/cyb3rkn1ght</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cyb3rkn1ght"/>
    <language>en</language>
    <item>
      <title>nereida — a local multi-cluster Kubernetes client I built because on-call kept beating me</title>
      <dc:creator>r</dc:creator>
      <pubDate>Sun, 09 Aug 2026 18:21:08 +0000</pubDate>
      <link>https://dev.to/cyb3rkn1ght/nereida-a-local-multi-cluster-kubernetes-client-i-built-because-on-call-kept-beating-me-22l3</link>
      <guid>https://dev.to/cyb3rkn1ght/nereida-a-local-multi-cluster-kubernetes-client-i-built-because-on-call-kept-beating-me-22l3</guid>
      <description>&lt;p&gt;It's 2am, an alert fires, and I'm three &lt;code&gt;kubectl config use-context&lt;/code&gt; commands deep trying to remember which cluster the broken pod is actually in. My AWS session from an hour ago has expired, so first I have to re-run &lt;code&gt;saml2aws&lt;/code&gt;, wait for the browser SSO round-trip, and &lt;em&gt;then&lt;/em&gt; start looking for the pod. By the time I've found it, tailed its logs, and confirmed it's not the same one that OOMKilled twenty minutes ago, I've burned five minutes on tooling instead of the incident.&lt;/p&gt;

&lt;p&gt;I'm a backend dev who does on-call, not a platform engineer, and I got tired of this specific flavor of friction. I'd used k9s before and liked the idea — one place for everything — but mid-incident I don't want to be recalling which keybinding does what on top of the actual incident. I wanted something just as simple, minus the command-memorizing, that also logged me into AWS/EKS without a separate &lt;code&gt;saml2aws&lt;/code&gt; dance, and let me point an LLM at the mess in &lt;strong&gt;read-only&lt;/strong&gt; mode so it could help me reason through what's broken without any risk of it accidentally deleting, scaling, or draining something. So I built &lt;strong&gt;nereida&lt;/strong&gt;: all of that, in one window, with tables and buttons instead of a command palette to memorize.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcyb3rKn1ght%2Fnereida%2Fv0.1.0%2Fdocs%2Fdemo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcyb3rKn1ght%2Fnereida%2Fv0.1.0%2Fdocs%2Fdemo.gif" alt="nereida demo" width="560" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No commands to memorize.&lt;/strong&gt; Everything's a table, a click, or a confirmation dialog — cluster switching, log tailing, exec, restarts, all of it. If you've used k9s and liked the "one place for everything" idea but never quite internalized its keybindings, this is the same idea as a GUI instead of a TUI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One view across clusters.&lt;/strong&gt; Pick any set of kubeconfig contexts and see Pods, Deployments, StatefulSets, DaemonSets, Jobs, CronJobs, Services, Ingresses, ConfigMaps, PVCs, HPAs, Events, Nodes, and Secrets in unified tables — every row tagged by cluster, so you're not tabbing between windows to figure out where something lives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8z5elp7i3eq37e6mtud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8z5elp7i3eq37e6mtud.png" alt="Pods across two clusters in one table" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One log stream for a workload.&lt;/strong&gt; Merge logs from every pod behind a Deployment, StatefulSet/DaemonSet, or label selector — with follow, tail/since, timestamps, and previous/init/ephemeral container support. No more opening five terminal tabs to watch five replicas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femv895ij4mrfl9wlf977.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femv895ij4mrfl9wlf977.png" alt="Events merged across clusters" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crash context where you need it.&lt;/strong&gt; Recovered pods show their previous termination right beside the restart count — &lt;code&gt;3 · OOMKilled (5m ago)&lt;/code&gt; — instead of making you dig for it. Nodes surface active memory, disk, and PID pressure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS/EKS SSO without the CLI dance.&lt;/strong&gt; Native Keycloak SAML SSO login discovers every AWS role your SAML assertion grants and the clusters reachable from each, then writes credentials and kubeconfig entries directly — connect clusters under different roles side by side without one role switch affecting clusters already connected under another. No &lt;code&gt;saml2aws&lt;/code&gt;, no AWS CLI. I could have just fixed my &lt;code&gt;saml2aws&lt;/code&gt; config instead, but that still leaves you re-running a separate CLI step before you can even open the tool you actually need — this way logging in &lt;em&gt;is&lt;/em&gt; opening the tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fev6u87rgdo3lfucbu3dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fev6u87rgdo3lfucbu3dz.png" alt="Connect AWS dialog" width="799" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rest of the toolbox:&lt;/strong&gt; exec into a container with a real terminal, port-forward with a panel of open tunnels, lifecycle actions (scale, rollout restart/pause/resume, rollback, delete, CronJob trigger/suspend/resume, node cordon/uncordon/drain — each with a confirmation and pinned to the resource UID so a stale name can't hit the wrong object), per-resource YAML editing behind a diff confirmation, and view/context/namespace selections that survive restarts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zt6adfj6uwgrh51ymay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zt6adfj6uwgrh51ymay.png" alt="Pod detail view" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back to that 2am page: this is what it looks like now. One table shows which of the two clusters the pod is actually in, its previous termination already reads &lt;code&gt;OOMKilled&lt;/code&gt; instead of me digging for it, and the AWS session is already valid because logging in happened inside the app, not as a prerequisite CLI step before I could even start looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other hook: a read-only AI assistant and MCP server
&lt;/h2&gt;

&lt;p&gt;Separate from the core client, nereida ships an optional AI assistant for diagnosing clusters, plus a standalone &lt;a href="https://github.com/cyb3rKn1ght/nereida/blob/main/cmd/nereida-mcp/README.md" rel="noopener noreferrer"&gt;read-only MCP server&lt;/a&gt; you can point any MCP client at. Bring your own engine — Anthropic API key, your existing Claude Code or Codex CLI login, or any OpenAI-compatible endpoint, including local models via Ollama/vLLM/LM Studio.&lt;/p&gt;

&lt;p&gt;The important part: both are &lt;strong&gt;read-only by construction&lt;/strong&gt;. They only register fetch/list/log-streaming tools — there's no scale, delete, drain, edit, or exec tool for a model to call, so there's no path for an AI assistant to change cluster state, however it's prompted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0yv7whsfdcckg3lqluj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0yv7whsfdcckg3lqluj.png" alt="AI assistant panel" width="799" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  No accounts, no telemetry, no hosted backend
&lt;/h2&gt;

&lt;p&gt;nereida runs entirely on your machine using &lt;a href="https://github.com/kubernetes/client-go" rel="noopener noreferrer"&gt;client-go&lt;/a&gt; — the same library &lt;code&gt;kubectl&lt;/code&gt; uses — against your existing kubeconfig, credentials, and RBAC. There's no nereida server in between, no telemetry, no account to create. Secret values stay redacted in the YAML view until you explicitly hit Reveal, and AI tools only ever see redacted values.&lt;/p&gt;

&lt;p&gt;The one exception: if you turn on the AI assistant, that turn's prompt and whatever its read-only tools fetch (resource lists, redacted YAML, events, log excerpts) go to whichever model endpoint you configured. Point it at a local model and nothing leaves your machine. Nothing is sent unless you use the AI features — full details in &lt;a href="https://github.com/cyb3rKn1ght/nereida/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's rough
&lt;/h2&gt;

&lt;p&gt;I'd rather undersell this than oversell it: nereida is early-stage. It's macOS-first (Apple Silicon and Intel, built and used daily there) — Linux x86-64 is best-effort and hasn't had real-world mileage from anyone but me yet, and Windows currently compiles but isn't packaged. The macOS builds are also unsigned for now (no Apple Developer Program cert yet), so first launch needs one workaround — see below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing it
&lt;/h2&gt;

&lt;p&gt;Prebuilt macOS and Linux builds are attached to each &lt;a href="https://github.com/cyb3rKn1ght/nereida/releases" rel="noopener noreferrer"&gt;release&lt;/a&gt;. Since the macOS build is unsigned, first launch needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xattr &lt;span class="nt"&gt;-cr&lt;/span&gt; /path/to/nereida.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Right-click → Open no longer bypasses this on macOS Sequoia+. If you'd rather skip Terminal: open the app once to trigger the block, then go to &lt;strong&gt;System Settings → Privacy &amp;amp; Security&lt;/strong&gt;, find where it says &lt;code&gt;"nereida" was blocked...&lt;/code&gt;, and click &lt;strong&gt;Open Anyway&lt;/strong&gt;.)&lt;/p&gt;

&lt;p&gt;To build from source (needed for Windows, or the standalone MCP server): Go 1.26+, Node 20.19+/22.12+, and the &lt;a href="https://wails.io/docs/gettingstarted/installation" rel="noopener noreferrer"&gt;Wails CLI&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/wailsapp/wails/v2/cmd/wails@v2.12.0
wails build   &lt;span class="c"&gt;# app bundle ends up in build/bin/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why "nereida"?
&lt;/h2&gt;

&lt;p&gt;Nereids are sea nymphs from Greek mythology who protected sailors and calmed storms. Kubernetes means "helmsman" in Greek — the name felt fitting for something meant to make incidents calmer.&lt;/p&gt;




&lt;p&gt;It's &lt;a href="https://github.com/cyb3rKn1ght/nereida/blob/main/LICENSE.md" rel="noopener noreferrer"&gt;Apache-2.0&lt;/a&gt; and on &lt;a href="https://github.com/cyb3rKn1ght/nereida" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. I built it to solve my own on-call friction, but if it saves you a few minutes mid-incident too, I'd love to hear about it — and if it's useful, a star helps other people find it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
