What is a Skill?

A skill is a Markdown file an agent loads on demand to learn how to handle a particular kind of request. It’s useful when you have a repetitive task and don’t want to re-prompt your agent each time. 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’t. ...

July 31, 2026 · 5 min · Amir Hadifar

What is MCP (Model Context Protocol)?

This section briefly explains what MCP is and why it’s useful. Before describing MCP, it helps to understand tool-calling first — MCP is built on top of it. Tool-calling Tool-calling is a capability that lets an AI model (like an LLM) interact with the outside world by invoking external functions or APIs. Here’s a simple example of tool-calling in Python with two tools, bash_tool and web_search: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # mock tools def bash_tool(command: str) -> str: """Run a shell command and return its output.""" return "index.html main.py styles.css README.md" if command == "ls" else "Done" def web_search(query: str) -> str: """Search the web and return the results.""" return f"Search results for '{query}': Found documentation." tools = {"bash_tool": bash_tool, "web_search": web_search} # Simulates the AI picking a tool based on keywords def mock_llm(query): if "file" in query or "list" in query: return {"tool": "bash_tool", "arguments": {"command": "ls"}} return {"tool": "web_search", "arguments": {"query": query}} while True: user_query = input("User: > ") if user_query.lower() in ["exit", "quit"]: print("Goodbye!") break # Step 1: Get tool choice from LLM decision = mock_llm(user_query) tool_name, args = decision["tool"], decision["arguments"] print(f"AI wants to call: {tool_name}({args})") # Step 2 & 3: execute the tool and print the output tool_output = tools[tool_name](**args) print(f"Tool Output: {tool_output}\n") That’s tool-calling in a nutshell: the model picks a tool (e.g. web_search or bash_tool) and supplies the right arguments (e.g. query: "who won the 2022 World Cup"), the tool or API is executed — locally or remotely — and the model reads back the result. ...

July 20, 2026 · 7 min · Amir Hadifar

Conductor: IDE to run parallel coding agents

Conductor 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. What it does 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 git worktree, 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. ...

July 17, 2026 · 1 min · Amir Hadifar

Tools landscape

Tool Type Official site Claude Code CLI / IDE agent 🔗 Codex IDE / desktop agent 🔗 Cursor IDE (fork of VS Code) 🔗 GitHub Copilot / Copilot Workspace IDE extension 🔗 Aider CLI 🔗 Windsurf IDE 🔗 Devin Autonomous agent 🔗 Conductor IDE 🔗 superset.sh IDE 🔗 goose CLI / desktop agent 🔗

July 16, 2026 · 1 min · Amir Hadifar

YC guide to vibe coding

These are the notes from talks at Y Combinator. General rule of thumb The best technique is to do what a professional software engineer already does. Small code, modularity, and abstraction are your friends — they help both you and the LLM reason about the project. Note: this advice will likely shift over the next few months. As models get more capable, some of these guardrails will loosen. Plan before you build Don’t ask the model to one-shot the whole project. Instead, create a planning file (a CLAUDE.md 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. ...

July 16, 2026 · 3 min · Amir Hadifar

Elastic as a Vector Search Engine

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. 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. ...

December 2, 2025 · 3 min · Amir Hadifar

Token-Oriented Object Notation: An Alternative to JSON?

I first came across TOON (Token-Oriented Object Notation) on LinkedIn, where developers were discussing its promise: lossless compression of JSON and YAML, specifically optimized for large language models (LLMs). The core idea? Reduce token count without sacrificing information, which directly translates to lower costs and potentially faster processing. Comparison between TOON and JSON for nested objects At first glance, TOON looks familiar yet distinct. For instance, a TOON object always begins with the number of items (e.g., [2] in the figure above), and unlike JSON it drops quotation marks (") 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). ...

November 27, 2025 · 2 min · Amir Hadifar

Feedforward Neural Networks

1) A brain-inspired analogy As the term “neural network” suggests, these networks are inspired by the computational mechanism of the human brain, where each computational unit is called a neuron. While there’s very little actual resemblance between artificial neural networks and the human brain, the analogy is often used for simplicity’s sake. A biological neuron (top) vs. a neuron in an artificial neural network (bottom) ...

December 9, 2018 · 13 min · Amir Hadifar

Recurrent Neural Networks

When we work with textual data, we’re often dealing with a sequence of characters, words, or sentences, and in most cases the order of that sequence matters to us. Recurrent networks in theory let us represent a sequence of unknown length as a fixed-size vector, while still preserving many of the syntactic and structural properties of the input sequence. Simply, a Recurrent Neural Network (RNN) can be seen as a function that takes an input of length $n$ (e.g., assume a sequence of words) and returns an output vector $y$ of dimension $d_{out}$: ...

September 2, 2018 · 6 min · Amir Hadifar