<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tarek Kharsa</title>
  <link href="https://tarekkharsa.github.io/"/>
  <link rel="self" href="https://tarekkharsa.github.io/feed.xml"/>
  <id>https://tarekkharsa.github.io/</id>
  <updated>2026-10-09T00:00:00Z</updated>
  <author>
    <name>Tarek Kharsa</name>
    <uri>https://tarekkharsa.github.io/</uri>
  </author>
  <entry>
    <title>Lessons from great codebases</title>
    <link href="https://tarekkharsa.github.io/posts/guess-the-codebase"/>
    <id>https://tarekkharsa.github.io/posts/guess-the-codebase.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Eight engineering lessons per open-source codebase, each verified in the source and linked to it.</summary>
  </entry>
  <entry>
    <title>OpenCode #1: Admit the prompt first, run it later</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-01-admit-then-run"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-01-admit-then-run.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>A durable inbox between “you pressed Enter” and “the model sees it.”</summary>
  </entry>
  <entry>
    <title>OpenCode #2: Never rewrite the system prompt</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-02-never-rewrite-the-system-prompt"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-02-never-rewrite-the-system-prompt.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Freeze the baseline, append what changed, and keep the provider cache warm.</summary>
  </entry>
  <entry>
    <title>OpenCode #3: Record real HTTP once, replay it forever</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-03-record-once-replay-forever"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-03-record-once-replay-forever.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Cassettes instead of mocks, and a CI that refuses to record.</summary>
  </entry>
  <entry>
    <title>OpenCode #4: Bound what the model sees</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-04-bound-what-the-model-sees"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-04-bound-what-the-model-sees.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>One size limit per tool result: keep the head and the tail, save the rest to a file.</summary>
  </entry>
  <entry>
    <title>OpenCode #5: One API, even in-process</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-05-one-api-even-in-process"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-05-one-api-even-in-process.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>The embedded SDK sends real requests to the real router, without a network.</summary>
  </entry>
  <entry>
    <title>OpenCode #6: Rebuild on the main branch</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-06-rebuild-on-the-main-branch"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-06-rebuild-on-the-main-branch.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>A new major version grown next to the old one, with a dated log of every contract change.</summary>
  </entry>
  <entry>
    <title>OpenCode #7: Configured is not allowed</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-07-configured-is-not-allowed"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-07-configured-is-not-allowed.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Policy is its own layer, and the last matching rule wins.</summary>
  </entry>
  <entry>
    <title>OpenCode #8: Compact before you overflow</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-08-compact-before-you-overflow"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-08-compact-before-you-overflow.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Summarize old turns before the request stops fitting, keep recent ones word for word.</summary>
  </entry>
  <entry>
    <title>OpenCode: 20 power-user tips</title>
    <link href="https://tarekkharsa.github.io/posts/gtc3-reveal-power-user-tips"/>
    <id>https://tarekkharsa.github.io/posts/gtc3-reveal-power-user-tips.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>20 power-user tips for OpenCode as it ships today, plus a recap of the eight engineering lessons from its upcoming v2.</summary>
  </entry>
  <entry>
    <title>Pi #1: Ship a small core, and make your own features replaceable</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-01-small-replaceable-core"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-01-small-replaceable-core.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Its MCP support is a plugin, and a third-party plugin can replace it. That's the point.</summary>
  </entry>
  <entry>
    <title>Pi #2: Entry points are cost contracts</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-02-entry-points-are-cost-contracts"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-02-entry-points-are-cost-contracts.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Importing one 6 KB function loaded 106 files. Now a commit check counts them.</summary>
  </entry>
  <entry>
    <title>Pi #3: A fake model and an empty environment</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-03-fake-model-empty-environment"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-03-fake-model-empty-environment.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Agent tests with no real models, no real keys, and nothing from your machine.</summary>
  </entry>
  <entry>
    <title>Pi #4: Never mutate history</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-04-never-mutate-history"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-04-never-mutate-history.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Sessions as an append-only tree: branches, summaries and even edits are new entries.</summary>
  </entry>
  <entry>
    <title>Pi #5: Treat the lockfile as code</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-05-lockfile-is-code"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-05-lockfile-is-code.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Three packages may run install scripts. Every other dependency change has to ask.</summary>
  </entry>
  <entry>
    <title>Pi #6: Design a tool a model can't misuse</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-06-tool-a-model-cant-misuse"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-06-tool-a-model-cant-misuse.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Exact match first, fuzzy match second, loud errors, and one queue per file.</summary>
  </entry>
  <entry>
    <title>Pi #7: Decide who owns the scrollback</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-07-who-owns-the-scrollback"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-07-who-owns-the-scrollback.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Two terminal renderers, one interface, and a test that counts full redraws.</summary>
  </entry>
  <entry>
    <title>Pi #8: Measure whether your docs help</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-08-measure-your-docs"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-08-measure-your-docs.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Run the agent with and without the docs, and keep what moves the number.</summary>
  </entry>
  <entry>
    <title>Pi: 20 power-user tips</title>
    <link href="https://tarekkharsa.github.io/posts/gtc2-reveal-power-user-tips"/>
    <id>https://tarekkharsa.github.io/posts/gtc2-reveal-power-user-tips.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>20 power-user tips for Pi, the minimal, extensible coding agent harness, plus a recap of the eight engineering lessons from its source.</summary>
  </entry>
  <entry>
    <title>T3 Code #1: Decide, commit, then act</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-01-decide-commit-then-act"/>
    <id>https://tarekkharsa.github.io/posts/gtc-01-decide-commit-then-act.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>The three-step server pattern that keeps AI agents from leaving your app in a weird state.</summary>
  </entry>
  <entry>
    <title>T3 Code #2: Performance budgets belong in unit tests</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-02-performance-budgets-as-tests"/>
    <id>https://tarekkharsa.github.io/posts/gtc-02-performance-budgets-as-tests.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Seven performance patterns from one repo's commit log, and why their budgets fail the build.</summary>
  </entry>
  <entry>
    <title>T3 Code #3: Mock the boundary, not the logic</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-03-mock-the-boundary"/>
    <id>https://tarekkharsa.github.io/posts/gtc-03-mock-the-boundary.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>“A test that needs a timeout to pass is wrong.” Testing rules from a repo that bans sleeps.</summary>
  </entry>
  <entry>
    <title>T3 Code #4: A PR process for the AI era</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-04-pr-process-for-the-ai-era"/>
    <id>https://tarekkharsa.github.io/posts/gtc-04-pr-process-for-the-ai-era.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>When anyone can generate a 2,000-line PR in ten minutes, review time is what you protect.</summary>
  </entry>
  <entry>
    <title>T3 Code #5: Turn taste into lint rules</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-05-taste-as-lint-rules"/>
    <id>https://tarekkharsa.github.io/posts/gtc-05-taste-as-lint-rules.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Review comments don't scale. A repo with 14 custom lint rules shows what does.</summary>
  </entry>
  <entry>
    <title>T3 Code #6: A dev setup built for ten agents on one laptop</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-06-dev-setup-for-parallel-agents"/>
    <id>https://tarekkharsa.github.io/posts/gtc-06-dev-setup-for-parallel-agents.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Ports, databases, processes and URLs: everything shared becomes a collision once agents run in parallel.</summary>
  </entry>
  <entry>
    <title>T3 Code #7: Lying spinners, stale labels, one-way doors</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-07-honest-ui"/>
    <id>https://tarekkharsa.github.io/posts/gtc-07-honest-ui.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>UX rules from a repo whose users stare at it all day and notice every lie the UI tells.</summary>
  </entry>
  <entry>
    <title>T3 Code #8: Write docs for your most frequent contributor</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-08-write-docs-for-agents"/>
    <id>https://tarekkharsa.github.io/posts/gtc-08-write-docs-for-agents.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>In this repo, the most frequent contributor is an AI agent running inside the app itself.</summary>
  </entry>
  <entry>
    <title>T3 Code: 30 power-user tips</title>
    <link href="https://tarekkharsa.github.io/posts/gtc-reveal-t3-code-power-user-tips"/>
    <id>https://tarekkharsa.github.io/posts/gtc-reveal-t3-code-power-user-tips.html</id>
    <published>2026-10-09T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>30 power-user tips for T3 Code, the open-source GUI for coding agents, plus a recap of the eight engineering lessons from its source.</summary>
  </entry>
  <entry>
    <title>Turning my Linux PC into a T3 Code server</title>
    <link href="https://tarekkharsa.github.io/posts/t3-code-tailscale-home-server"/>
    <id>https://tarekkharsa.github.io/posts/t3-code-tailscale-home-server.html</id>
    <published>2026-09-28T00:00:00Z</published>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Run T3 Code on a Linux PC and reach it privately from your laptop and phone with Tailscale. A short, step-by-step guide.</summary>
  </entry>
</feed>
