<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on AiSlackin</title><link>https://aislackin.com/posts/</link><description>Recent content in Posts on AiSlackin</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 27 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://aislackin.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>hed: the tiny C++ editor that replaces heredocs and makes agents happy</title><link>https://aislackin.com/posts/2026-09-27-hed-text-editor/</link><pubDate>Sun, 27 Sep 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-09-27-hed-text-editor/</guid><description>&lt;p&gt;Ask a shell script to write a file and you get heredocs — which bash and zsh handle fine but fish doesn&amp;rsquo;t. Ask an agent to edit a config and you get a tangle of &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;cat &amp;gt;&lt;/code&gt;, and hope. &lt;strong&gt;hed&lt;/strong&gt; is the answer to both problems: a single C++17 binary that replaces heredocs, gives agents a machine-readable file editing API, and doubles as a nano-style interactive editor.&lt;/p&gt;&#10;&lt;h2 id="three-tools-one-binary"&gt;Three tools, one binary&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;hed&lt;/strong&gt; (Heredoc Replacement · Agent File Tool · Nano-Style Editor) is a single static executable with zero runtime dependencies — no ncurses, no hunspell, no data files. Three modes:&lt;/p&gt;</description></item><item><title>MoACubed: teaching Hermes which profiles actually work</title><link>https://aislackin.com/posts/2026-09-06-moacubed/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-09-06-moacubed/</guid><description>&lt;p&gt;I have been running Hermes with multiple profiles for a while. That gives me useful specialization, but it also creates an uncomfortable question:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Which profile should handle a given kind of task?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;It is easy to answer that question with vibes. One profile feels sharper. Another writes cleaner code. A third catches edge cases the others miss. Then one impressive run becomes a permanent routing rule.&lt;/p&gt;&#10;&lt;p&gt;That is not evaluation. That is anecdote with a config file.&lt;/p&gt;</description></item><item><title>Argus: the intel agent sheds its cron plumbing</title><link>https://aislackin.com/posts/2026-08-27-personal-intel-agent-upgrade/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-27-personal-intel-agent-upgrade/</guid><description>&lt;p&gt;When I built &lt;code&gt;personal-intel-agent&lt;/code&gt;, it did one thing: watch a topic, fold duplicate coverage into a single sourced card, and ping only when something materially moved. I later added a second engine for typed metric and price monitoring.&lt;/p&gt;&#10;&lt;p&gt;It now has a better name—&lt;strong&gt;Argus&lt;/strong&gt;—and a cleaner boundary with Hermes Agent 0.21.&lt;/p&gt;&#10;&lt;p&gt;The original version had to carry some of its own scheduler plumbing because cron jobs were effectively stateless. Hermes 0.21 changed that. Cron jobs can now use persistent agent memory, carry the previous run&amp;rsquo;s output forward, skip the LLM when a deterministic source has not changed, keep a bounded per-job notepad, select reasoning effort per job, and deliver directly into a bot&amp;rsquo;s canonical chat.&lt;/p&gt;</description></item><item><title>npu-monitor: a system tray that knows what hardware each box actually has</title><link>https://aislackin.com/posts/2026-08-21-npu-monitor-gpu-tray/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-21-npu-monitor-gpu-tray/</guid><description>&lt;p&gt;Every multi-host monitoring tool I tried assumed homogeneous hardware: one GPU, maybe two, same on every machine. My LAN doesn&amp;rsquo;t work like that — one box has an AMD APU iGPU plus a Ryzen AI NPU, another has an AMD R9700 &lt;em&gt;and&lt;/em&gt; an NVIDIA RTX 5060 Ti. So &lt;code&gt;npu-monitor&lt;/code&gt; treats the device list as dynamic: each host reports its own real silicon and the tray renders whatever arrives.&lt;/p&gt;&#10;&lt;p&gt;The numbers come from the actual kernel interfaces, not screen-scraping: ROCm sysfs (&lt;code&gt;gpu_busy_percent&lt;/code&gt;) for AMD cards, &lt;code&gt;nvidia-smi&lt;/code&gt; for CUDA, &lt;code&gt;/proc/stat&lt;/code&gt; deltas for CPU, and a raw &lt;code&gt;DRM_IOCTL_AMDXDNA_GET_INFO&lt;/code&gt; ioctl against &lt;code&gt;/dev/accel/accel0&lt;/code&gt; — using the real 168-byte sensor struct from the kernel UAPI — for the NPU&amp;rsquo;s utilization columns.&lt;/p&gt;</description></item><item><title>hermes-shortcut-cheat-sheet: the shortcut list from source, not docs</title><link>https://aislackin.com/posts/2026-08-19-hermes-desktop-shortcuts/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-19-hermes-desktop-shortcuts/</guid><description>&lt;p&gt;The published Hermes Desktop docs list about twelve keyboard shortcuts. The real list lives in the app&amp;rsquo;s keybind registry — rebindable actions, fixed keys, and generated profile/session slot bindings — and nobody had transcribed it. This repo is that transcription, generated from source rather than written by hand, so it&amp;rsquo;s complete and it&amp;rsquo;s correct.&lt;/p&gt;&#10;&lt;p&gt;The output ships three ways: an interactive dark-themed HTML with per-OS columns (Mac / Windows-Linux), a light single-page 3-column print layout for hanging on a wall, and PNG renders of both. A &lt;code&gt;PROMPT.md&lt;/code&gt; contains the exact prompt to regenerate everything from a newer version of the source — paste it into any coding agent session and the sheet stays correct across app releases.&lt;/p&gt;</description></item><item><title>hermes-skills: a catalog for skills that survive machine rebuilds</title><link>https://aislackin.com/posts/2026-08-19-hermes-skills-catalog/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-19-hermes-skills-catalog/</guid><description>&lt;p&gt;Hermes Agent skills are just folders with a &lt;code&gt;SKILL.md&lt;/code&gt;, which is exactly why they rot: they end up scattered across profiles and machines, unversioned, unrecorded. This repo is the fix I built for myself — a single maintained collection where every skill is registered in a catalog, installable with one command, and documented well enough that future-me (or anyone) can tell what it does without reverse-engineering the prompt.&lt;/p&gt;&#10;&lt;p&gt;The structure is deliberately boring: a &lt;code&gt;_template&lt;/code&gt; scaffold you copy, a &lt;code&gt;skills/README.md&lt;/code&gt; catalog you register into, and an installer script. Stateful skills keep tracker archives and metric snapshots on the host (under &lt;code&gt;~/.intel/&lt;/code&gt; for Argus), never in the repo; durable user preferences now use Hermes&amp;rsquo;s native persistent memory.&lt;/p&gt;</description></item><item><title>firefoxPrintAll: full-page captures of pages that refuse to scroll</title><link>https://aislackin.com/posts/2026-08-12-firefoxprintall/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-12-firefoxprintall/</guid><description>&lt;p&gt;Firefox&amp;rsquo;s built-in screenshot handles pages whose &lt;em&gt;body&lt;/em&gt; scrolls. It falls over completely on modern app layouts — chat UIs, dashboards, playgrounds — where the body never scrolls but a panel inside does. &lt;code&gt;captureTab()&lt;/code&gt; hands you the visible viewport and that&amp;rsquo;s it. This extension was built for exactly one such case: an LLM playground whose right-hand response panel scrolls inside a fixed frame.&lt;/p&gt;&#10;&lt;p&gt;The mechanism is honest scroll-and-stitch: scroll, capture each position, crop each tile to the target region, composite on a canvas. All geometry is computed in device pixels (&lt;code&gt;css px × devicePixelRatio&lt;/code&gt;) and tiles are placed by their actual scroll offset, so seams don&amp;rsquo;t appear even with fractional device pixel ratios and a clamped final tile.&lt;/p&gt;</description></item><item><title>slug-tts-stt: giving a mini-PC ears and a mouth, on two different chips</title><link>https://aislackin.com/posts/2026-08-06-slug-tts-stt-voice-service/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-06-slug-tts-stt-voice-service/</guid><description>&lt;p&gt;A voice assistant needs two things from its hardware: it must hear you and it must answer you. On a single-box setup those workloads fight for the same chip — unless you deliberately split them. That&amp;rsquo;s the whole idea here: STT runs on the &lt;strong&gt;XDNA2 NPU&lt;/strong&gt; (Whisper large-v3-turbo via FastFlowLM), TTS runs on the &lt;strong&gt;Radeon 840M iGPU&lt;/strong&gt; (Qwen3-TTS 1.7B via qwentts.cpp/Vulkan). Both exposed as OpenAI-compatible HTTP endpoints on your LAN. The reasoning brain lives elsewhere; this box is only ever the audio edge.&lt;/p&gt;</description></item><item><title>hmem: benchmarking the memory providers fighting for your agent's long-term recall</title><link>https://aislackin.com/posts/2026-08-04-agent-memory-providers/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-08-04-agent-memory-providers/</guid><description>&lt;p&gt;Every agent framework eventually hits the same wall: the context window ends and the conversation forgets. The memory-provider ecosystem that sprang up to fix this is large, fast-moving, and mostly &lt;em&gt;unmeasured&lt;/em&gt; — a lot of READMEs, few numbers. &lt;code&gt;hmem&lt;/code&gt; is my attempt to bring order: a living comparison of fifteen providers compatible with Hermes Agent, from 62K-star mem0 down to single-file SQLite curiosities.&lt;/p&gt;&#10;&lt;p&gt;The part that separates it from a link list is the benchmark discipline. Providers only get scores when a &lt;strong&gt;real measured adapter&lt;/strong&gt; exists — Hindsight and Mnemosyne are listed as &amp;ldquo;not measured&amp;rdquo; precisely because their simulated stubs were excluded. The current controlled run compares BM25 lexical baseline (0.367 correctness) against Hermes built-in memory (0.333) over 30 reviewed scenarios in 10 categories across three isolated runs: 180 result documents, zero failures, machine-readable JSON published alongside the writeup.&lt;/p&gt;</description></item><item><title>hermes-sendme-file-transfer: teaching an AI agent to move files peer-to-peer</title><link>https://aislackin.com/posts/2026-07-30-sendme-file-transfer-skill/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-07-30-sendme-file-transfer-skill/</guid><description>&lt;p&gt;Cloud file transfer means accounts, size caps, and someone else&amp;rsquo;s server reading your bytes. &lt;a href="https://github.com/n0-computer/sendme"&gt;SendMe&lt;/a&gt; — built on iroh — does direct peer-to-peer transfer with a ticket you hand to the receiver, falling back to a relay only when NAT punching fails. This skill teaches Hermes Agent to drive all of it correctly.&lt;/p&gt;&#10;&lt;p&gt;The skill covers the parts that actually bite in practice: the long-running sender lifecycle (the process must stay alive while transfers complete), safe handling of bearer-like tickets (whoever holds the ticket can fetch — treat it like a credential), completion verification rather than trusting exit codes, and the Android/Termux quirks when the receiving end is a phone.&lt;/p&gt;</description></item><item><title>quill-of-hermes: LAN OCR that eats PDFs and multi-page TIFFs</title><link>https://aislackin.com/posts/2026-07-30-quill-of-hermes-lan-ocr/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-07-30-quill-of-hermes-lan-ocr/</guid><description>&lt;p&gt;OCR as a service usually means cloud APIs, per-page billing, and your documents on someone else&amp;rsquo;s disk. This is the local counterargument: a FastAPI wrapper around &lt;a href="https://github.com/01-ai"&gt;OvisOCR2&lt;/a&gt; running GGUF via llama.cpp&amp;rsquo;s &lt;code&gt;llama-mtmd-cli&lt;/code&gt;, serving your LAN. POST an image, a PDF, or a multi-page TIFF; get back clean Markdown.&lt;/p&gt;&#10;&lt;p&gt;The design decisions worth noting: each page is sent to the model independently and results are joined with a horizontal rule, so a 50-page PDF degrades gracefully instead of failing whole. Jobs are serialized to keep the GPU sane, there&amp;rsquo;s a five-minute timeout per page so one bad scan can&amp;rsquo;t wedge the queue, and temp files are cleaned unconditionally. The service deliberately stays separate from llama-swap because multimodal &lt;code&gt;llama-server&lt;/code&gt; support for this model wasn&amp;rsquo;t proven — &lt;code&gt;llama-mtmd-cli&lt;/code&gt; was.&lt;/p&gt;</description></item><item><title>karen_strikes_back: a five-persona review pod that tears your repo apart</title><link>https://aislackin.com/posts/2026-07-20-karen-strikes-back-review-pod/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-07-20-karen-strikes-back-review-pod/</guid><description>&lt;p&gt;Code review by one model is one opinion. Code review by five models with &lt;em&gt;different personalities, priorities, and axes to grind&lt;/em&gt; finds things no single pass catches. That&amp;rsquo;s the premise of &lt;code&gt;karen_strikes_back&lt;/code&gt;: a fleet of five Hermes Agent profiles — the name is the joke, Karen is the orchestrator and her workers are the ones who actually strike.&lt;/p&gt;&#10;&lt;p&gt;Each worker is a distinct lens with its own &lt;code&gt;SOUL.md&lt;/code&gt; persona and pinned model config. &lt;strong&gt;critic&lt;/strong&gt; is blunt and evidence-led, citing &lt;code&gt;file:line&lt;/code&gt; for every defect — SQLi, missing authz, broken idempotency. &lt;strong&gt;bsneng&lt;/strong&gt; reviews like a fresh Masters grad who&amp;rsquo;s read every Nielsen heuristic and will tell you which one you violated. &lt;strong&gt;poweruser&lt;/strong&gt; is the insufferable PC enthusiast who checks whether every knob is exposed and will block shipping over telemetry-on-by-default. &lt;strong&gt;struggler&lt;/strong&gt; is the self-deprecating advocate for users who bounce off jargon, hidden steps, and &amp;ldquo;just know&amp;rdquo; flows. Karen fans the repo out to all four in parallel via &lt;code&gt;delegate_task&lt;/code&gt;, runs her own heuristic eval, then dedupes and severity-ranks everything into one combined report.&lt;/p&gt;</description></item><item><title>hermes-proxmox-multihost: one skill, N standalone Proxmox servers</title><link>https://aislackin.com/posts/2026-07-17-proxmox-multihost-control/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-07-17-proxmox-multihost-control/</guid><description>&lt;p&gt;Most home-lab Proxmox tooling assumes one cluster. Reality for a lot of us is several &lt;em&gt;standalone&lt;/em&gt; servers, accumulated over the years, each with its own login, its own quirks, and no interest in joining anybody&amp;rsquo;s cluster. This skill — built on danielbitpro/hermes-proxmox-control, extended with a host registry and a multi-host helper — lets one Hermes Agent session manage all of them.&lt;/p&gt;&#10;&lt;p&gt;The part I&amp;rsquo;m proudest of is the failure model: &lt;code&gt;get_all()&lt;/code&gt; wraps each connection in its own try/except, so when pve3 is down for maintenance, listing VMs across the fleet returns results from pve1 and pve2 plus a clean error line for pve3 — not a crash. Secrets resolve through Bitwarden Secrets Manager by UUID at call time; the registry on disk maps hostnames to secret IDs and never stores a credential itself.&lt;/p&gt;</description></item><item><title>Don’t be a tool fool</title><link>https://aislackin.com/posts/2026-07-03-dont-be-a-tool-fool/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-07-03-dont-be-a-tool-fool/</guid><description>&lt;p&gt;I don’t trust anything labeled free.&lt;/p&gt;&#10;&lt;p&gt;Free-to-play. Free trial. Free, with in-app purchases. Ninety-nine cents to skip the timer. A dollar-ninety-nine for the good sword. Four bucks a month, cancel anytime, that you will absolutely forget to cancel. None of it feels like money in the moment. That’s the whole design. A single microtransaction is engineered to sit just beneath your notice — small enough that stopping to check the total would feel petty. So you don’t check. You get microtransactioned to death by a thousand painless little cuts, and the bleeding only shows up on the statement at the end of the month, by which point you’ve mentally filed it under huh, weird.&lt;/p&gt;</description></item><item><title>wimpy-setup: a dual-GPU inference box you can rebuild from scripts</title><link>https://aislackin.com/posts/2026-06-28-wimpy-dual-gpu-inference/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-06-28-wimpy-dual-gpu-inference/</guid><description>&lt;p&gt;This is not a guide. It&amp;rsquo;s the actual, ordered, idempotent script set that builds my inference server — shared because rebuilding from memory is how homelabs die. Wimpy is a Ryzen 7 7700 with two GPUs serving LLM inference &lt;em&gt;at the same time&lt;/em&gt;: an AMD Radeon AI PRO R9700 (32GB, ROCm) and an NVIDIA RTX 5060 Ti (16GB, CUDA), behind one llama-swap endpoint.&lt;/p&gt;&#10;&lt;p&gt;The dual-GPU part is the reason this repo exists. HIP and CUDA backends of llama.cpp share library filenames, so they can&amp;rsquo;t coexist in one prefix — there are two isolated builds (&lt;code&gt;/usr/local&lt;/code&gt; for ROCm, &lt;code&gt;/opt/llama-cuda&lt;/code&gt; for CUDA) and one llama-swap config with two non-exclusive groups. A &lt;code&gt;-cuda&lt;/code&gt; model entry is the same GGUF as its AMD twin with a different binary and device pin, so either card can serve it. GPUs are pinned by UUID (the Ryzen iGPU also enumerates as a ROCm device and will happily steal your workloads if you let it).&lt;/p&gt;</description></item><item><title>Giving Hermes an Efficient Soul</title><link>https://aislackin.com/posts/2026-06-25-giving-hermes-an-efficient-soul/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-06-25-giving-hermes-an-efficient-soul/</guid><description>&lt;p&gt;I have been spending a lot of time with Hermes Agent lately. If you do not know what that is, short version: it is an agentic AI framework that runs locally, connects to whatever LLM backend you point it at, and operates autonomously on tasks you define. Think of it as the connective tissue between you, your local models, your cloud providers, and everything else you want an AI to touch.&lt;/p&gt;</description></item><item><title>csv2pg: CSV → PostgreSQL without the shell dance</title><link>https://aislackin.com/posts/2026-06-16-csv2pg/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-06-16-csv2pg/</guid><description>&lt;p&gt;Most &amp;ldquo;import this CSV&amp;rdquo; advice ends with &lt;code&gt;psql&lt;/code&gt; invocations, &lt;code&gt;\copy&lt;/code&gt; meta-commands, and a schema you hand-write after eyeballing the data in a spreadsheet. I got tired of that ritual, so &lt;code&gt;csv2pg&lt;/code&gt; does the whole path in-process through psycopg3: analyze the file, infer the schema, create the table, stream the rows, verify the count, commit. No &lt;code&gt;psql&lt;/code&gt; binary involved anywhere.&lt;/p&gt;&#10;&lt;p&gt;The interesting part is the type inference. It samples up to 100 random rows per column to guess a candidate PostgreSQL type, then validates that guess against &lt;em&gt;every&lt;/em&gt; row in the file. If validation fails, the column widens to the next compatible type — up to five attempts — before falling back to &lt;code&gt;text&lt;/code&gt;. You get a tabulated summary plus a generated &lt;code&gt;.sql&lt;/code&gt; file before anything touches the database.&lt;/p&gt;</description></item><item><title>curl | bash and the Slow Death of “Did You Read It?”</title><link>https://aislackin.com/posts/2026-06-14-curl-bash/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://aislackin.com/posts/2026-06-14-curl-bash/</guid><description>&lt;p&gt;&lt;img src="https://aislackin.com/images/review.png" alt="Want clean code, better do the review…" loading="lazy"&gt;&#10;&#10;&lt;em&gt;Want clean code, better do the review…&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Been chewing on this one for a while. Every time I see another “just run this to install” one-liner I get the same itch I got the day AT&amp;amp;T handed me a “did you mean” page off my own DNS queries. That feeling of, wait, when did I agree to this?&lt;/p&gt;&#10;&lt;p&gt;So let me say the quiet parts out loud.&lt;/p&gt;</description></item></channel></rss>