<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tools on Christian Roy</title>
    <link>https://christianroy.dev/tags/tools/</link>
    <description>Recent content in Tools on Christian Roy</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 07 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://christianroy.dev/tags/tools/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The RAID Array That Kept Losing a Disk on Every Reboot</title>
      <link>https://christianroy.dev/til/raid-array-losing-disk-every-reboot/</link>
      <pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/raid-array-losing-disk-every-reboot/</guid>
      <description>&lt;p&gt;&lt;em&gt;A NAS owner&amp;rsquo;s account of a firmware bug that dropped a healthy disk on every boot, and how I used Claude Code to reverse-engineer the fix out of the closed-source firmware.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A quick note on this post before we start: the NAS is mine, the problem was mine, and the tests (and the swearing) were mine. The deep reverse-engineering, disassembling the firmware&amp;rsquo;s own binaries and tracing data flow instruction by instruction, was done by Claude Code, which I drove and second-guessed throughout. So when you read &amp;ldquo;Claude found,&amp;rdquo; that is literally what happened. When you read &amp;ldquo;I rebooted and it was still broken,&amp;rdquo; that is me being the reality check. It was a genuine back-and-forth, and it is worth being honest about who did which part.&lt;/p&gt;</description>
    </item>
    <item>
      <title>opencode with a local Qwen3.6-35B-A3B backend iterated to a working color-physics web toy</title>
      <link>https://christianroy.dev/til/opencode-local-qwen36-35b-a3b-color-physics-web-toy/</link>
      <pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/opencode-local-qwen36-35b-a3b-color-physics-web-toy/</guid>
      <description>&lt;p&gt;I gave &lt;a href=&#34;https://opencode.ai&#34;&gt;opencode&lt;/a&gt; a single-paragraph spec for &amp;ldquo;an HTML
canvas where colored circles attract similar hues and repel opposites,&amp;rdquo; and
pointed it at unsloth&amp;rsquo;s quant of Qwen3.6-35B-A3B (UD-Q8_K_XL, ~3B active
params) running locally. About a dozen steering turns later, fixing bugs and
nudging the behavior, I had a working single-file demo.&lt;/p&gt;
&lt;p&gt;That is the part worth noting. Not one-shot, not magic: a small MoE that
fits on one GPU, driven through an agentic loop, can converge on a real
interactive artifact in a reasonable session. Local coding agents are
becoming a usable workflow, not just a demo.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini 3.1 Flash Live: Low-latency voice AI with native audio output</title>
      <link>https://christianroy.dev/til/gemini-3-1-flash-live-low-latency-voice-ai/</link>
      <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/gemini-3-1-flash-live-low-latency-voice-ai/</guid>
      <description>&lt;p&gt;Google launched Gemini 3.1 Flash Live via the Live API for building real-time voice and vision agents. The model processes continuous audio, video, and text streams to deliver immediate spoken responses with acoustic nuance detection and 90+ language support.&lt;/p&gt;
&lt;p&gt;Key improvements over Gemini 2.5 Flash Native Audio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better noise filtering in real-world environments&lt;/li&gt;
&lt;li&gt;Stronger adherence to complex system instructions&lt;/li&gt;
&lt;li&gt;More natural dialogue with improved latency&lt;/li&gt;
&lt;li&gt;Thinking capability via &lt;code&gt;thinkingLevel&lt;/code&gt; (minimal/low/medium/high) instead of &lt;code&gt;thinkingBudget&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The model outputs native audio (no STT+TTS pipeline) with a 128k context window. It supports synchronous function calling, Google Search grounding, and video input alongside audio.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitAgent defines AI agents as git repos, exportable to any framework with one CLI command</title>
      <link>https://christianroy.dev/til/gitagent-ai-agents-as-git-repos/</link>
      <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/gitagent-ai-agents-as-git-repos/</guid>
      <description>&lt;p&gt;GitAgent proposes that your git repository &lt;em&gt;is&lt;/em&gt; your agent. Two required files -
&lt;code&gt;agent.yaml&lt;/code&gt; (manifest) and &lt;code&gt;SOUL.md&lt;/code&gt; (identity) - define the agent. Everything
else - skills, tools, memory, compliance artifacts - is optional structure layered
on top.&lt;/p&gt;
&lt;p&gt;The interesting part is the supervision model: when an agent updates its memory or
acquires a new skill, the change becomes a git commit or PR. Human reviewers can
diff the agent&amp;rsquo;s personality changes like any code review. If behavior drifts,
&lt;code&gt;git revert&lt;/code&gt; brings it back.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google&#39;s Colab MCP server lets any AI agent create and run notebooks in the cloud</title>
      <link>https://christianroy.dev/til/colab-mcp-server-ai-agents-notebooks/</link>
      <pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/colab-mcp-server-ai-agents-notebooks/</guid>
      <description>&lt;p&gt;Google released an open-source MCP server for Google Colab. Any MCP-compatible
agent - Claude Code, Gemini CLI, or a custom agent - can now programmatically
control a Colab notebook: create cells, write and execute code, install
dependencies, rearrange content.&lt;/p&gt;
&lt;p&gt;The setup is one config block:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;colab-mcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;git+https://github.com/googlecolab/colab-mcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;30000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The motivation is concrete: developers were copying code from their terminals
into Colab cells to run or visualize things. That context switch kills flow.
With this server, the agent writes directly into an open notebook - you get a
reproducible, executable artifact in the cloud instead of a code snippet in
your terminal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NVIDIA&#39;s OpenShell enforces AI agent guardrails outside the agent process so a compromised agent can&#39;t override them</title>
      <link>https://christianroy.dev/til/nvidia-openshell-out-of-process-agent-guardrails/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/nvidia-openshell-out-of-process-agent-guardrails/</guid>
      <description>&lt;p&gt;The problem with agent guardrails that live inside the agent: a compromised agent
can override them. Claude Code and Cursor ship with internal safety prompts, but
those protections are inside the same process they&amp;rsquo;re supposed to guard. A prompt
injection or a bad third-party skill has access to the same runtime.&lt;/p&gt;
&lt;p&gt;NVIDIA OpenShell moves the enforcement point outside. It wraps any agent in an
isolated container with YAML-defined policies the agent cannot read or modify.
Network access is deny-by-default and hot-reloadable; filesystem and process
constraints are locked at creation. The agent can&amp;rsquo;t escalate privileges because
the kernel won&amp;rsquo;t allow it - not because the agent was told not to.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unsloth Studio is an open-source no-code UI for training and running local LLMs</title>
      <link>https://christianroy.dev/til/unsloth-studio-no-code-local-llm-training/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/unsloth-studio-no-code-local-llm-training/</guid>
      <description>&lt;p&gt;Unsloth Studio bundles local inference, fine-tuning, and model export into a single
no-code web UI. One curl command installs it; then you can run GGUF or safetensor
models on Mac, Windows, or Linux without writing any code.&lt;/p&gt;
&lt;p&gt;The training side is the main draw: 2x faster fine-tuning with 70% less VRAM across
500+ model families (text, vision, TTS, embeddings). LoRA, FP8, and full fine-tuning
all work on NVIDIA hardware, with multi-GPU support already in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenViking: A context database using filesystem paradigm for AI agents</title>
      <link>https://christianroy.dev/til/openviking-context-database-ai-agents/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/openviking-context-database-ai-agents/</guid>
      <description>&lt;p&gt;OpenViking abandons traditional RAG vector storage and uses a filesystem paradigm instead. It organizes agent context (memories, resources, skills) under &lt;code&gt;viking://&lt;/code&gt; URIs with a three-tier structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L0 (Abstract)&lt;/strong&gt;: One-sentence summary for quick retrieval&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L1 (Overview)&lt;/strong&gt;: Core information and usage scenarios&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 (Details)&lt;/strong&gt;: Full original data, loaded on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enables directory recursive retrieval that locks high-score directories first, then refines content exploration. The retrieval trajectory is fully observable, letting users see exactly how context is being accessed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pipe Mastra agent responses through jq to colorize reasoning and tool calls in the terminal</title>
      <link>https://christianroy.dev/til/mastra-jq-ansi-agent-responses/</link>
      <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/mastra-jq-ansi-agent-responses/</guid>
      <description>&lt;p&gt;Mastra&amp;rsquo;s agent HTTP API returns a JSON structure with &lt;code&gt;steps&lt;/code&gt;, each containing &lt;code&gt;content&lt;/code&gt;
items typed as &lt;code&gt;reasoning&lt;/code&gt;, &lt;code&gt;tool-call&lt;/code&gt;, &lt;code&gt;tool-result&lt;/code&gt;, and &lt;code&gt;text&lt;/code&gt;. The raw output is
dense. Start by exploring it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Hit the API and see raw structure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Get just the final answer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.text&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Explore what&amp;#39;s inside steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.steps[].content[] | .type&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;reasoning&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;tool-call&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;tool-result&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;reasoning&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;#34;text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# See what fields each type has&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http localhost:4111/api/agents/weather-agent/generate &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  messages&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;what&amp;#39;s the weather in montreal?&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.steps[].content[] | select(.type == &amp;#34;tool-call&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the structure is clear, pipe through &lt;code&gt;jq -r&lt;/code&gt; with inline ANSI escape sequences to
colorize each piece:&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenClaw custom skills silently disappear without quoted YAML descriptions and openclaw metadata</title>
      <link>https://christianroy.dev/til/openclaw-skill-frontmatter-metadata/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/openclaw-skill-frontmatter-metadata/</guid>
      <description>&lt;p&gt;If a custom OpenClaw skill doesn&amp;rsquo;t show up in &lt;code&gt;openclaw skills list&lt;/code&gt; and the agent can&amp;rsquo;t
see it either, the SKILL.md frontmatter is likely the culprit. OpenClaw fails silently,
so the debugging feedback is minimal.&lt;/p&gt;
&lt;p&gt;Two things must be right. First, any &lt;code&gt;name&lt;/code&gt; or &lt;code&gt;description&lt;/code&gt; containing a colon must be
wrapped in double quotes, otherwise YAML interprets the colon as a key-value separator
and the parse fails. Second, the frontmatter must include an &lt;code&gt;openclaw&lt;/code&gt; metadata block
declaring the emoji icon and any required binaries or environment variables. Without it,
OpenClaw won&amp;rsquo;t register the skill at all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A website can serve a full ANSI terminal UI when curled instead of HTML</title>
      <link>https://christianroy.dev/til/curl-ansi-terminal-website/</link>
      <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/curl-ansi-terminal-website/</guid>
      <description>&lt;p&gt;Curling &lt;code&gt;ysap.sh&lt;/code&gt; does not return HTML. It returns a fully rendered terminal UI: pixel-art
header, bordered panels, a two-column layout, colored links. The kind of thing you&amp;rsquo;d
expect from a TUI app, delivered over plain HTTP.&lt;/p&gt;
&lt;p&gt;The trick: check the &lt;code&gt;User-Agent&lt;/code&gt; header. When it starts with &lt;code&gt;curl/&lt;/code&gt;, respond with
ANSI escape codes and box-drawing characters. When it&amp;rsquo;s a browser, respond with HTML.
Same URL, two completely different experiences.&lt;/p&gt;
&lt;p&gt;The source is on GitHub and shows a clean Node.js implementation. What&amp;rsquo;s worth stealing:
the layout approach (panels, columns, a legend of available curl endpoints) and the
idea that your API docs or personal site can have a zero-install CLI interface for free.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTPie needs --ignore-stdin in non-TTY environments like Claude Code</title>
      <link>https://christianroy.dev/til/httpie-ignore-stdin-claude-code/</link>
      <pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/httpie-ignore-stdin-claude-code/</guid>
      <description>&lt;p&gt;HTTPie detects whether it&amp;rsquo;s running in a TTY. When there&amp;rsquo;s no TTY, like when Claude
Code invokes it as a subprocess, HTTPie assumes stdin might have data coming and
interprets the request as a POST, even if you meant a GET.&lt;/p&gt;
&lt;p&gt;The fix is &lt;code&gt;--ignore-stdin&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http --ignore-stdin GET localhost:3000/things
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The catch: once you tell Claude Code to always use &lt;code&gt;--ignore-stdin&lt;/code&gt;, it will also use
it when piping data, which breaks that use case entirely:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTPie interprets numeric keys as array indexes, breaks Asana custom field updates</title>
      <link>https://christianroy.dev/til/httpie-asana-custom-fields-oom/</link>
      <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/httpie-asana-custom-fields-oom/</guid>
      <description>&lt;p&gt;Asana custom field GIDs are long numeric strings. When you pass them as nested keys
in HTTPie&amp;rsquo;s bracket syntax, HTTPie sees a numeric key and assumes you&amp;rsquo;re building an
array, then tries to allocate memory up to that index. With a 16-digit GID, that&amp;rsquo;s
enough to OOM the process.&lt;/p&gt;
&lt;p&gt;This breaks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https --session pat PUT https://app.asana.com/api/1.0/tasks/1208765432100001 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  data&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;custom_fields&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;1205432109876543&lt;span class=&#34;o&#34;&gt;]=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1205432109876544&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPie reads &lt;code&gt;1205432109876543&lt;/code&gt; as an array index and tries to build a sparse array
of that size. It never gets to make the request.&lt;/p&gt;</description>
    </item>
    <item>
      <title>glow strips color when called from a subprocess: force it with env vars</title>
      <link>https://christianroy.dev/til/glow-ansi-subprocess/</link>
      <pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/glow-ansi-subprocess/</guid>
      <description>&lt;p&gt;&lt;code&gt;glow&lt;/code&gt; detects whether it&amp;rsquo;s writing to a real terminal. When called from a script or subprocess (like Python&amp;rsquo;s &lt;code&gt;subprocess.run&lt;/code&gt;), it sees no TTY and strips all ANSI color codes, you get plain text.&lt;/p&gt;
&lt;p&gt;Fix it with two env vars:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CLICOLOR_FORCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;COLORTERM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;truecolor glow --style dark file.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CLICOLOR_FORCE=1&lt;/code&gt; tells color-aware CLI tools to emit color regardless of TTY detection. &lt;code&gt;COLORTERM=truecolor&lt;/code&gt; tells glow to use 24-bit color instead of falling back to 8-color mode.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zvec is an embedded vector database aiming to be the SQLite of vector search</title>
      <link>https://christianroy.dev/til/zvec-embedded-vector-database/</link>
      <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://christianroy.dev/til/zvec-embedded-vector-database/</guid>
      <description>&lt;p&gt;Zvec is an open-source embedded vector database from Alibaba, built on their Proxima
engine. The pitch is simple: vector search that runs in-process, no server required,
with the same frictionless setup as SQLite.&lt;/p&gt;
&lt;p&gt;The gap it fills is real. Faiss gives you indexes but no CRUD or crash recovery.
DuckDB-VSS has limited vector features. Milvus needs its own process and network hop.
Zvec aims to be the option that just works when you&amp;rsquo;re building a local RAG pipeline,
a CLI tool, or anything on-device where you need semantic search without infrastructure.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
