<?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>Posts on Amir Hadifar</title>
    <link>https://hadifar.net/posts/</link>
    <description>Recent content in Posts on Amir Hadifar</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 21 Aug 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://hadifar.net/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OpenAI, Hugging Face, and reward hacking as a security incident</title>
      <link>https://hadifar.net/posts/reward-hacking-security-incident/</link>
      <pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/reward-hacking-security-incident/</guid>
      <description>&lt;p&gt;OpenAI was evaluating a frontier model on cyber-security tasks inside &lt;strong&gt;ExploitGym&lt;/strong&gt;,
a sandboxed benchmark — informally, a &amp;ldquo;cyber gym.&amp;rdquo; The tasks are capture-the-flag style:
a deliberately vulnerable system hides a secret string, the &lt;em&gt;flag&lt;/em&gt;, and retrieving it
proves you found the hole. The intended loop:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Find a vulnerability
&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;   Exploit it
&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;  Read the flag
&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; Return the flag
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Returning the flag is what earns the reward. That framing is the whole story: the agent
was rewarded for &lt;em&gt;producing the flag&lt;/em&gt;, not for &lt;em&gt;solving the challenge&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Organize your skills</title>
      <link>https://hadifar.net/posts/organize-your-skills/</link>
      <pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/organize-your-skills/</guid>
      <description>&lt;p&gt;A single &lt;code&gt;SKILL.md&lt;/code&gt; file is enough for personal use, but it doesn&amp;rsquo;t scale once you want to
version it, bundle it with agents and hooks, or share it with teammates. This post covers how
to package skills into a plugin and distribute that plugin through a marketplace.&lt;/p&gt;
&lt;p&gt;You probably don&amp;rsquo;t need plugins for a personal project or a quick one-off customization. You
do need them once you want to share with teammates, distribute to a community, cut versioned
releases, or reuse the same setup across projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>superset.sh: IDE to run parallel coding agents</title>
      <link>https://hadifar.net/posts/superset-sh-agentic-ide/</link>
      <pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/superset-sh-agentic-ide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.superset.sh/&#34;&gt;superset.sh&lt;/a&gt; is a desktop app for running several AI coding
agents at once, each in its own isolated workspace. It covers the same ground as
&lt;a href=&#34;https://hadifar.net/posts/conductor-ide-for-parallel-agent/&#34;&gt;Conductor&lt;/a&gt;, but
also runs on Linux (Conductor is Mac-only as of August 2026).&lt;/p&gt;
&lt;h2 id=&#34;what-it-does&#34;&gt;What it does&lt;/h2&gt;
&lt;p&gt;Like other agentic IDEs, superset.sh is built around a few features specifically for
modern agentic coding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run multiple agents simultaneously&lt;/li&gt;
&lt;li&gt;Isolate each task in its own git worktree so agents don&amp;rsquo;t interfere with each other&lt;/li&gt;
&lt;li&gt;Monitor all agents from one place and get notified when they need attention&lt;/li&gt;
&lt;li&gt;Switch between LLM providers (Claude, Codex, and others) per task&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-worktrees-not-branches&#34;&gt;Why worktrees, not branches&lt;/h2&gt;
&lt;p&gt;The core concept behind superset.sh — and tools like it — is the git
&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#34;&gt;worktree&lt;/a&gt;: a separate directory with its own
files and branch, sharing the same repository history and remote as your main checkout.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TDD for agents</title>
      <link>https://hadifar.net/posts/tdd-for-agents/</link>
      <pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/tdd-for-agents/</guid>
      <description>&lt;p&gt;Many agentic workflows converge on the same shape: write a Markdown file at the root of your
repo, point your agent at it, and let it loop until it meets a stated goal. Test-driven
development is a natural fit for that shape — the tests &lt;em&gt;are&lt;/em&gt; the goal, and &amp;ldquo;all tests green&amp;rdquo;
is an unambiguous exit condition the agent can check without you.&lt;/p&gt;
&lt;h2 id=&#34;the-basic-loop&#34;&gt;The basic loop&lt;/h2&gt;
&lt;p&gt;In this paradigm you ask the agent to write tests first. You review them (or have another
agent review them), then ask the agent to implement the feature until every test passes.
You revise the tests a little, the agent revises the code a little, and when everything is
green you move to the next feature — with a fully testable one behind you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>goose: open-source AI agent harness</title>
      <link>https://hadifar.net/posts/what-is-goose/</link>
      <pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/what-is-goose/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://goose-docs.ai/&#34;&gt;goose&lt;/a&gt; is an open-source AI agent that wraps an LLM in a loop of
tool calls, so the model can actually do things rather than only describe them. Its own
docs put it this way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;goose, an open source AI Agent, builds upon the basic interaction framework of Large
Language Models (LLMs), which primarily functions as a text-based conversational
interface. It processes text input and generates text output. This &amp;ldquo;text in, text out&amp;rdquo;
approach is enhanced with tool integrations, which allows the AI agent to complete tasks,
creating goose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Autonomous Kaggling</title>
      <link>https://hadifar.net/posts/autonomous-kaggling/</link>
      <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/autonomous-kaggling/</guid>
      <description>&lt;p&gt;I recently started a Kaggle competition and decided to apply
&lt;a href=&#34;https://github.com/karpathy/autoresearch/&#34;&gt;autoresearch&lt;/a&gt; to it: an agent that loops forever
to ace the leaderboard.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.kaggle.com/competitions/playground-series-s6e7&#34;&gt;Kaggle problem&lt;/a&gt; is
student health risk prediction: categorize records into three classes (unhealthy, at-risk,
fit) from categorical features like &lt;code&gt;sleep_duration&lt;/code&gt;, &lt;code&gt;gender&lt;/code&gt;, and &lt;code&gt;water_intake&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I based my &lt;code&gt;problem.md&lt;/code&gt; on autoresearch&amp;rsquo;s description with small modifications; it&amp;rsquo;s in
&lt;a href=&#34;https://github.com/hadifar/autonomous-kaggling&#34;&gt;hadifar/autonomous-kaggling&lt;/a&gt;, along with
the full run. The commit history on the &lt;code&gt;shr-v1&lt;/code&gt; branch shows what ideas the agent applied
and where each one landed, and &lt;code&gt;results.csv&lt;/code&gt; in the root tracks the scores.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gstack: AI engineering workflow</title>
      <link>https://hadifar.net/posts/gstack-ai-engineering-workflow/</link>
      <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/gstack-ai-engineering-workflow/</guid>
      <description>&lt;p&gt;This post explains the AI coding workflow of Y Combinator&amp;rsquo;s CEO — how he uses &lt;a href=&#34;https://github.com/garrytan/gstack.git&#34;&gt;GStack&lt;/a&gt; for ideation, building, and deployment.&lt;/p&gt;
&lt;h2 id=&#34;what-is-gstack&#34;&gt;What is gstack&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;gstack&lt;/strong&gt; is a collection of &lt;code&gt;SKILL.md&lt;/code&gt; files that give your AI agents personas for different stages of the
software/product development life cycle.&lt;/p&gt;
&lt;p&gt;A normal software sprint runs through roughly these stages:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;think → plan → design → build → review → test → ship
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In gstack, there is a &lt;code&gt;SKILL.md&lt;/code&gt; file (often several) for each of these stages. You invoke
them to guide your agents toward the goal (generating code, a specification, ideation, etc.).&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is a Skill?</title>
      <link>https://hadifar.net/posts/what-is-a-skill/</link>
      <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/what-is-a-skill/</guid>
      <description>&lt;p&gt;A skill is a Markdown file an agent loads on demand to learn how to handle a particular
kind of request. It&amp;rsquo;s useful when you have a repetitive task and don&amp;rsquo;t want to re-prompt
your agent each time.&lt;/p&gt;
&lt;p&gt;Think of it as the utility function of prompting: instead of duplicating the same
instructions in every conversation, you write them once and reuse them. Skills are more
general than that, of course — their behaviour adapts to the request in a way a single
utility function doesn&amp;rsquo;t.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Modern Software Developer course</title>
      <link>https://hadifar.net/posts/modern-software-developer-course/</link>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/modern-software-developer-course/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://themodernsoftware.dev/&#34;&gt;The Modern Software Developer&lt;/a&gt; is a Stanford course
(CS146S) that covers most of what you need to know about agentic coding — prompting
techniques, AI IDEs, patterns, and more.&lt;/p&gt;
&lt;h2 id=&#34;why-its-worth-it&#34;&gt;Why it&amp;rsquo;s worth it&lt;/h2&gt;
&lt;p&gt;I highly recommend this course: it covers the foundations you need, from the ground up.&lt;/p&gt;
&lt;p&gt;It starts by introducing LLMs and different prompting strategies — K-shot, chain-of-thought,
self-critique, and others — before moving on to the tooling and patterns of agentic
coding.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is MCP (Model Context Protocol)?</title>
      <link>https://hadifar.net/posts/what-is-mcp/</link>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/what-is-mcp/</guid>
      <description>&lt;p&gt;This section briefly explains what MCP is and why it&amp;rsquo;s useful. Before describing MCP, it
helps to understand &lt;strong&gt;tool-calling&lt;/strong&gt; first — MCP is built on top of it.&lt;/p&gt;
&lt;h2 id=&#34;tool-calling&#34;&gt;Tool-calling&lt;/h2&gt;
&lt;p&gt;Tool-calling is a capability that lets an AI model (like an LLM) interact with the outside
world by invoking external functions or APIs.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a simple example of tool-calling in Python with two tools, &lt;code&gt;bash_tool&lt;/code&gt; and
&lt;code&gt;web_search&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# mock tools&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;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;bash_tool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&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;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run a shell command and return its output.&amp;#34;&amp;#34;&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;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;index.html  main.py  styles.css  README.md&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ls&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Done&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;web_search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&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;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Search the web and return the results.&amp;#34;&amp;#34;&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;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Search results for &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;: Found documentation.&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bash_tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bash_tool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;web_search&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&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;# Simulates the AI picking a tool based on keywords&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;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mock_llm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;query&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;query&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;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bash_tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;arguments&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;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;ls&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;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;arguments&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;query&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;query&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&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;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&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;n&#34;&gt;user_query&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;User: &amp;gt; &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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user_query&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;quit&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;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Goodbye!&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;k&#34;&gt;break&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;# Step 1: Get tool choice from LLM&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;n&#34;&gt;decision&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mock_llm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user_query&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;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decision&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decision&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;arguments&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;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AI wants to call: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;)&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&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;# Step 2 &amp;amp; 3: execute the tool and print the output&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;n&#34;&gt;tool_output&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&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;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Tool Output: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_output&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s tool-calling in a nutshell: the model picks a tool (e.g. &lt;code&gt;web_search&lt;/code&gt; or
&lt;code&gt;bash_tool&lt;/code&gt;) and supplies the right arguments (e.g. &lt;code&gt;query: &amp;quot;who won the 2022 World Cup&amp;quot;&lt;/code&gt;), the tool or API is executed — locally or remotely — and the model reads back the
result.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Conductor: IDE to run parallel coding agents</title>
      <link>https://hadifar.net/posts/conductor-ide-for-parallel-agent/</link>
      <pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/conductor-ide-for-parallel-agent/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.conductor.build/&#34;&gt;Conductor&lt;/a&gt; is a desktop app for running several AI coding
agents in parallel on the same project. Instead of driving one agent at a time, you spin up
multiple agents that each work independently and hand you the results to review.&lt;/p&gt;
&lt;h2 id=&#34;what-it-does&#34;&gt;What it does&lt;/h2&gt;
&lt;p&gt;Conductor connects to your AI provider — Claude, Codex, and others — and lets you launch
multiple agents to work on your project at once. Each agent runs in its own &lt;strong&gt;git
worktree&lt;/strong&gt;, so their changes stay isolated from one another. When an agent finishes, its
worktree makes it easy to review the diff, integrate the work, and push it to git.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tools landscape</title>
      <link>https://hadifar.net/posts/tools-landscape/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/tools-landscape/</guid>
      <description>&lt;p&gt;A quick comparison of tools people use for vibe-coding and agentic coding. Fill in your own experience/notes as you try each one.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tool&lt;/th&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Runs where&lt;/th&gt;
          &lt;th&gt;Notes&lt;/th&gt;
          &lt;th&gt;Official site&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;CLI / IDE agent&lt;/td&gt;
          &lt;td&gt;Terminal, VS Code, JetBrains&lt;/td&gt;
          &lt;td&gt;Deep agentic loop, tool use, subagents, hooks, MCP support&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.claude.com/product/claude-code&#34;&gt;claude.com/claude-code&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;IDE (fork of VS Code)&lt;/td&gt;
          &lt;td&gt;Desktop&lt;/td&gt;
          &lt;td&gt;Agent mode, inline edits, codebase-aware chat&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://cursor.com&#34;&gt;cursor.com&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;GitHub Copilot / Copilot Workspace&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;IDE extension&lt;/td&gt;
          &lt;td&gt;VS Code, JetBrains, GitHub.com&lt;/td&gt;
          &lt;td&gt;Autocomplete + chat + task-level &amp;ldquo;workspace&amp;rdquo; planning&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/features/copilot&#34;&gt;github.com/features/copilot&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Aider&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;CLI&lt;/td&gt;
          &lt;td&gt;Terminal&lt;/td&gt;
          &lt;td&gt;Open-source, git-native, works with many model backends&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://aider.chat&#34;&gt;aider.chat&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Windsurf&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;IDE&lt;/td&gt;
          &lt;td&gt;Desktop&lt;/td&gt;
          &lt;td&gt;&amp;ldquo;Cascade&amp;rdquo; agent flow, multi-file edits&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://windsurf.com&#34;&gt;windsurf.com&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Devin&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Autonomous agent&lt;/td&gt;
          &lt;td&gt;Cloud sandbox&lt;/td&gt;
          &lt;td&gt;Longer-running autonomous tasks, less interactive&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://devin.ai&#34;&gt;devin.ai&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Conductor&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;IDE&lt;/td&gt;
          &lt;td&gt;Desktop (macOS)&lt;/td&gt;
          &lt;td&gt;Runs multiple agents in parallel, each in its own git worktree&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.conductor.build/&#34;&gt;conductor.build&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;superset.sh&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;IDE&lt;/td&gt;
          &lt;td&gt;Desktop (macOS, Linux)&lt;/td&gt;
          &lt;td&gt;Conductor alternative with Linux support; parallel agents in isolated worktrees, notifications, skills/hooks&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.superset.sh/&#34;&gt;docs.superset.sh&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;goose&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;CLI / desktop agent&lt;/td&gt;
          &lt;td&gt;Terminal, Desktop&lt;/td&gt;
          &lt;td&gt;Open-source, MCP-based extensions, subagents, recipes, scheduled runs&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://goose-docs.ai/&#34;&gt;goose-docs.ai&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</description>
    </item>
    <item>
      <title>YC guide to vibe coding</title>
      <link>https://hadifar.net/posts/yc-guide-to-vibe-coding/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/yc-guide-to-vibe-coding/</guid>
      <description>&lt;p&gt;These are the notes from talks at &lt;em&gt;Y Combinator&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;general-rule-of-thumb&#34;&gt;General rule of thumb&lt;/h2&gt;
&lt;p&gt;The best technique is to do what a professional software engineer already does. &lt;strong&gt;Small code&lt;/strong&gt;, &lt;strong&gt;modularity&lt;/strong&gt;, and
&lt;strong&gt;abstraction&lt;/strong&gt; are your friends — they help both you and the LLM reason about the project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: this advice will likely shift over the next few months. As models
get more capable, some of these guardrails will loosen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;plan-before-you-build&#34;&gt;Plan before you build&lt;/h2&gt;
&lt;p&gt;Don&amp;rsquo;t ask the model to one-shot the whole project. Instead, create a planning file (a
&lt;code&gt;CLAUDE.md&lt;/code&gt; or a plain markdown file) that lays out step by step what you want to build.
Iterate on it over time and revise it whenever your understanding changes. You can even
use a Planner agent to help revise it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elastic as a Vector Search Engine</title>
      <link>https://hadifar.net/posts/elastic-as-a-vector-search-engine/</link>
      <pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/elastic-as-a-vector-search-engine/</guid>
      <description>&lt;p&gt;There are many vector databases available today, such as Chroma, Pinecone, Qdrant, Milvus,
pgvector, and Elastic. Each offers unique capabilities and is useful in different situations.
For developers integrating vector search into their applications for the first time, Chroma
and Milvus tend to provide excellent documentation and straightforward implementations.&lt;/p&gt;
&lt;p&gt;However, many production systems still rely on traditional sparse or boolean retrieval
engines like Elasticsearch. In those contexts, Elasticsearch remains extremely efficient and
is arguably one of the best solutions available. That said, Elasticsearch joined the
vector-search space relatively late (basic dense-vector support was introduced around version
8.x), and historically you needed custom scripts for many advanced features.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Token-Oriented Object Notation: An Alternative to JSON?</title>
      <link>https://hadifar.net/posts/toon-token-oriented-object-notation/</link>
      <pubDate>Thu, 27 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://hadifar.net/posts/toon-token-oriented-object-notation/</guid>
      <description>&lt;p&gt;I first came across &lt;strong&gt;TOON (Token-Oriented Object Notation)&lt;/strong&gt; on LinkedIn, where developers
were discussing its promise: &lt;strong&gt;lossless compression of JSON and YAML&lt;/strong&gt;, specifically
optimized for large language models (LLMs). The core idea? Reduce token count without
sacrificing information, which directly translates to &lt;strong&gt;lower costs&lt;/strong&gt; and potentially
&lt;strong&gt;faster processing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Comparison between TOON and JSON for nested objects&#34; loading=&#34;lazy&#34; src=&#34;https://hadifar.net/images/toon-token-oriented-object-notation/nested-comparison.png&#34;&gt;
&lt;em&gt;Comparison between TOON and JSON for nested objects&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At first glance, TOON looks familiar yet distinct. For instance, a TOON object always begins
with the number of items (e.g., &lt;code&gt;[2]&lt;/code&gt; in the figure above), and unlike JSON it drops
quotation marks (&lt;code&gt;&amp;quot;&lt;/code&gt;) around keys. This minimalism becomes especially powerful with flat
data structures. In those cases, TOON starts to resemble CSV format: a header row followed
by values. The result? Significant token savings (I used their Python version for my
experiments).&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
