Hi, I’m Ashish Jaiswal

CTO at Obmondo — Monitor your server with 29 Euro a month. I write about software development, system design, critical thinking, AI, and things I’m building.

Obmondo Code: An AI-Powered SRE Alert Diagnosis CLI

A walkthrough of Obmondo Code, an SRE co-pilot CLI built in Go that connects an AI agent to 290+ diagnostic runbooks, SSH command execution, Gitea issue parsing, and time registration — with a strict safety model baked into every layer.

April 8, 2026 · 8 min · Ashish Jaiswal

Building a PR Review Bot Under 32K Context: Go AST Diffing, YAML Key Diffing, and Smart Truncation

Artoo, Obmondo’s Mattermost bot, got a PR review engine that runs on a self-hosted Qwen3-14B with a ~32K context window. The key problem: a single Kubernetes PR can have 10,000+ lines of diff. The solution: Go pre-processing that compresses diffs to ~2KB before the LLM ever sees them — using go/ast for Go files, YAML key-level diffing for Helm/K8s configs, and priority-based file truncation. This post covers why each decision was made and what the LLM still cannot do.

April 8, 2026 · 10 min · Ashish Jaiswal

Cilium on Bare Metal: How UFW Silently Breaks CoreDNS and kube-apiserver Connectivity

The Symptom After standing up a Kubernetes cluster on a bare-metal node with Cilium as the CNI, CoreDNS pods were running but completely unable to reach the kube-apiserver service IP (10.96.0.1). DNS resolution inside the cluster was broken, and any pod trying to talk to the API server via the service IP timed out. The apiserver itself was healthy — direct connections to the node’s IP worked fine. The problem was specifically with the virtual service IP routed through Cilium’s BPF dataplane. ...

March 19, 2026 · 3 min · Ashish Jaiswal

Two Go stdlib traps when watching and scanning JSON files on Linux

Two bugs surfaced during a CEO-plan audit of the vuls-exporter codebase that are easy to introduce and silent enough to survive code review. Both involve standard-library primitives that look correct but fail quietly on Linux. The bugs at a glance filepath.Glob("**/*.json") does not recurse on Linux — it matches nothing in subdirectories and returns nil, nil. Raw unix.InotifyAddWatch does not automatically watch new subdirectories — any directory created after the watch is set up is silently ignored. Bug 1: filepath.Glob does not support ** The code looked like this: ...

March 16, 2026 · 3 min · Ashish Jaiswal

Why Your RPM Host Showed 0 CVEs: Fixing Vuls Package Parsing in security-exporter

security-exporter returned 0 CVEs on every CentOS and RHEL host. The root cause was a silent data drop: ParsePackages silently skips any line that does not match its exact tab-separated format, and our rpm collector was producing the wrong format. This post covers the full diagnosis, the fix using the vuls-recommended 6-field rpm query, source package extraction using the NVR last-two-hyphens algorithm, and the Helm chart simplification that removed the entire legacy go-cve-dictionary + PostgreSQL pipeline.

March 13, 2026 · 7 min · Ashish Jaiswal

Upgrading vLLM to v0.17.0 with Qwen on RTX 4000 Ada: Every Breaking Change You Will Hit

A hands-on record of every error encountered upgrading from vLLM v0.9.2 to v0.17.0 with Qwen models on an RTX 4000 Ada (20GB VRAM): deprecated CLI flags, CUDA runtime changes, entrypoint conflicts, tool-call parser requirements, unsupported transformers, and how to pick the right quantized model for 20GB VRAM.

March 10, 2026 · 8 min · Ashish Jaiswal

Taming octocatalog-diff in CI: Exit Codes and Noise-Free Error Output

octocatalog-diff is a great tool for surfacing Puppet catalog changes in pull requests, but its default CI behaviour has two sharp edges: it exits with code 2 when diffs are found (which most CI systems treat as failure), and its stderr is full of Ruby thread noise and stack traces that obscure the actual compilation errors you care about. Here is how we fixed both. The Exit Code Problem octocatalog-diff uses three exit codes: ...

March 6, 2026 · 2 min · Ashish Jaiswal

vLLM + Qwen2.5-14B on Hetzner RTX 4000 Ada: Making Tool Calling Work

A complete journey of getting vLLM + Qwen2.5-14B-AWQ running on an RTX 4000 Ada with working tool calls for OpenCode: CUDA driver setup, throughput debugging, AWQ Marlin kernels for sm_89, writing a custom Qwen tool parser plugin, and debugging model refusals caused by a reasoning:true misconfiguration.

February 27, 2026 · 10 min · Ashish Jaiswal

DeepCoder-14B vs Qwen3-Coder: Which Coding Model Should You Run Locally?

Since we committed to Qwen2.5-Coder-14B on our Hetzner GEX44, two serious challengers appeared: DeepCoder-14B from Agentica/Together AI, and Qwen3-Coder from Alibaba. Here’s an honest comparison for teams running local LLMs on real, budget hardware.

February 26, 2026 · 9 min · Ashish Jaiswal

Setting Up a Local LLM at Obmondo: From Zero to Qwen2.5-Coder

How we decided to run a local LLM at Obmondo — hardware selection on a budget, understanding quantization and model parameters, comparing Ollama vs vLLM, and landing on Qwen2.5-Coder for coding assistance.

February 24, 2026 · 13 min · Ashish Jaiswal