<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Mehdio's Tech (Data) Corner]]></title><description><![CDATA[data, AI, tech career and coding ‍💻]]></description><link>https://blog.mehdio.com</link><image><url>https://substackcdn.com/image/fetch/$s_!IKMe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6204d08-39c3-45d5-8b65-5ca8e807c29e_169x169.png</url><title>Mehdio&apos;s Tech (Data) Corner</title><link>https://blog.mehdio.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 24 Apr 2026 04:51:33 GMT</lastBuildDate><atom:link href="https://blog.mehdio.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[mehdio]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[mehdi@mehd.io]]></webMaster><itunes:owner><itunes:email><![CDATA[mehdi@mehd.io]]></itunes:email><itunes:name><![CDATA[mehdio]]></itunes:name></itunes:owner><itunes:author><![CDATA[mehdio]]></itunes:author><googleplay:owner><![CDATA[mehdi@mehd.io]]></googleplay:owner><googleplay:email><![CDATA[mehdi@mehd.io]]></googleplay:email><googleplay:author><![CDATA[mehdio]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Running an AI workshop ? Build a LLM key minter first]]></title><description><![CDATA[While prepping my PyCon DE & PyData 2026 talk (slides), I wanted 150+ people to run an analytics agent against DuckDB.]]></description><link>https://blog.mehdio.com/p/running-an-ai-workshop-build-a-llm</link><guid isPermaLink="false">https://blog.mehdio.com/p/running-an-ai-workshop-build-a-llm</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Thu, 23 Apr 2026 15:28:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!P-tE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>While prepping my <a href="https://pretalx.com/pyconde-pydata-2026/talk/AF9DNH/">PyCon DE &amp; PyData 2026 talk</a> (<a href="https://motherduckdb.github.io/analytics-agent-duckdb-workshop/">slides</a>), I wanted 150+ people to run an analytics agent against DuckDB. First plan was local inference, but even the smallest reasonable smart model is a 7GB download at minimum. No way that works on conference wifi.</p><p>Plan B: cloud API keys. Simpler, works, costs less than $2 per attendee. Now I need to hand out 150+ keys without triggering a new class of problems. </p><p>So I built a custom minter through a simple web app in Typescript.</p><h2>The key-distribution problem</h2><p>3 options, all bad:</p><ol><li><p><strong>One shared key.</strong> Anyone leaks it, burns the budget, no per-attendee accounting.</p></li><li><p><strong>Attendees create their own account on the day.</strong> 5-15 minutes gone to credit card entry, verification emails, and &#8220;my phone number doesn&#8217;t work&#8221;. Some drop out because they won&#8217;t hand a card to OpenAI or Anthropic. Conference time is precious.</p></li><li><p><strong>Pre-create keys and hand them out on cards...</strong> Maybe as swag, but can you really see attendees copying a long hash off a card?</p></li></ol><p>What I actually want:</p><ul><li><p>Per-attendee key, minted on demand through sign-up</p></li><li><p>Hard budget cap per key (e.g. $2 each)</p></li><li><p>Hard budget cap for the whole workshop (in case one fun person spins up 20 emails), with a clear &#8220;first come, first served&#8221; signal</p></li><li><p>Model allowlist (no burning the workshop pool on GPT-5 for fun)</p></li><li><p>Open claims at a given time and auto-expiry after the workshop</p></li><li><p>Whole flow should take less than a minute for the attendee</p></li></ul><h2>OpenRouter</h2><p><a href="https://openrouter.ai/">OpenRouter</a> is a single OpenAI-compatible API in front of every major provider.</p><p>You fund your account once, pick models by their slug (<code>anthropic/claude-sonnet-4.6</code>, <code>openai/gpt-5-nano</code>, ...), and they handle the billing split behind the scenes.</p><p>The feature that makes this work is the <strong>Management API</strong> (formerly called provisioning keys). With a management key, you can programmatically:</p><ul><li><p>Mint sub-keys, each with their own <code>limit</code> (USD) and <code>expires_at</code></p></li><li><p>Disable a key individually</p></li><li><p>Read per-key usage</p></li></ul><p>That covers bullets 1, 2, and 4 from the wishlist. Bullet 3, the model allowlist, is where I got tripped up.</p><p><em>Note : Hugging Face has an analogous routing layer called <a href="https://huggingface.co/docs/inference-providers/en/index">Inference Providers</a>. It&#8217;s OpenAI-compatible (</em><code>router.huggingface.co/v1</code><em>), fronts 20+ providers (Together, Fireworks, Groq, Cerebras, Replicate, SambaNova, OpenAI, etc.), and supports provider-selection policies: </em><code>:cheapest</code><em>, </em><code>:fastest</code><em> (default), </em><code>:preferred</code><em> (<a href="https://huggingface.co/changelog/inference-providers-openai-compatible">changelog</a>). For a workshop though, the minter story is weaker: you work with <a href="https://huggingface.co/docs/inference-providers/pricing">fine-grained user tokens</a> and a monthly credit bucket.</em></p><h2>allowlists aren&#8217;t a key-level setting</h2><p>I assumed per-key settings would cover everything. They don&#8217;t. A key carries a budget and an expiry. The model allowlist lives on a separate object called a <strong>Guardrail</strong>.</p><p>To OpenRouter folks reading this: worth adding a callout about Guardrails on the API-key creation flow. I struggled to understand the model at first.</p><p>One Guardrail per workshop:</p><pre><code><code>{
  "name": "workshop-pyconde-2026-darmstadt-sql-agents",
  "limit_usd": 800,
  "reset_interval": "monthly",
  "allowed_models": [
    "anthropic/claude-sonnet-4.6",
    "openai/gpt-5-nano",
    "qwen/qwen3.5-flash-02-23"
  ]
}</code></code></pre><p>Keys get bulk-attached to the Guardrail after mint. OpenRouter then enforces the allowlist and the aggregate cap on every request.</p><p><strong>Gotcha that cost me another 10min:</strong> the Management API treats guardrail attachment as a separate resource from key creation. The <code>POST /keys</code> payload will happily accept a <code>guardrail_ids</code> field and return a 200, but the key lands unbound. You have to make a second call, <code>POST /guardrails/{id}/assignments/keys</code>, with the key hashes. Nothing in the docs warned me; I only noticed because attendees were hitting models I hadn&#8217;t allowed.</p><p>The server-side mint flow ends up as three API calls:</p><pre><code><code>const g = await ensureGuardrail({
  name: `workshop-${slug}`,
  limit_usd: workshop.openrouter.guardrail.cap_usd,
  allowed_models: workshop.openrouter.models.map((m) =&gt; m.id),
});
const key = await createKey({ name, limit, expires_at });
await assignKeysToGuardrail(g.id, [key.data.hash]);  // the one that matters</code></code></pre><p>If the third call fails, the attendee still gets a working key (just unenforced) and the admin dashboard flags the row as &#8220;unbound&#8221; with a retry button. Best-effort on a non-idempotent API call.</p><h2>YAML as workshop config</h2><p>One file per workshop in <code>workshops/&lt;slug&gt;.yaml</code>. PR + merge + redeploy = new workshop live (when claims open) to be minted.</p><p>The Darmstadt one, trimmed:</p><pre><code><code>slug: pyconde-2026-darmstadt-sql-agents
name: "SQL is Dead, Long Live SQL: Engineering reliable analytics agents from scratch"
event: PyConDE &amp; PyData Darmstadt 2026
location: Dynamicum [Ground Floor]
starts_at: 2026-04-14T11:45:00+02:00
ends_at:   2026-04-14T14:45:00+02:00
claims_open_at:  2026-04-13T18:00:00+02:00
claims_close_at: 2026-04-14T15:00:00+02:00
is_active: true

welcome_message: |
  ## SQL is Dead, Long Live SQL &#129414;
  Workshop by **mehdio** &amp; **dumky** at PyConDE &amp; PyData Darmstadt 2026.
  You'll get a personal workshop API key loaded with $2 of credit.

openrouter:
  budget_usd: 2.0
  key_label_prefix: pyconde-2026-darmstadt
  expires_buffer_minutes: 30
  models:
    - id: anthropic/claude-sonnet-4.6
      label: Claude Sonnet 4.6
      note: Best for the agent loop &#8212; pricier but smarter
      price_in_per_mtok: 3.00
      price_out_per_mtok: 15.00
    - id: openai/gpt-5-nano
      label: GPT-5 nano
      note: Cheapest, fast iterations
      price_in_per_mtok: 0.05
      price_out_per_mtok: 0.40
  guardrail:
    cap_usd: 800
    reset_interval: monthly

max_keys: 300</code></code></pre><p>The <code>models</code> list is the single source of truth. It renders the pricing table on the workshop page, seeds the code-snippet tabs on the &#8220;your key&#8221; view, and drives the Guardrail&#8217;s <code>allowed_models</code>. One place to edit when you swap models.</p><p><code>claims_open_at</code> and <code>claims_close_at</code> mean nobody mints a key the day before the workshop, and once the session ends + 30-minute buffer. No cron to disable the minter.</p><h2>The data model</h2><p>Some data was worth storing in a dedicated Postgres, emails first (yup, it&#8217;s a lead-capture asset too, fair trade right? &#128520;).</p><p>Two tables. That&#8217;s it.</p><pre><code><code>create table attendees (
  user_id          text primary key,   -- Auth0 sub, e.g. 'google-oauth2|abc123'
  email            text not null,
  email_normalized text not null,      -- +tag stripped, Gmail dots removed
  display_name     text,
  auth_provider    text not null,      -- 'google' | 'github' | ...
  marketing_opted_in            boolean not null default false,
  marketing_opted_in_at         timestamptz,
  marketing_opted_in_workshop   text,  -- slug where consent was given
  first_seen_at    timestamptz not null default now(),
  last_seen_at     timestamptz not null default now()
);

create table workshop_attendance (
  user_id               text not null,
  workshop_slug         text not null,
  or_key_hash           text not null,
  or_key                text not null,  -- plaintext, on purpose (see below)
  key_label             text not null,
  limit_usd             numeric not null,
  expires_at            timestamptz not null,
  or_guardrail_id       text,
  guardrail_attached_at timestamptz,
  usage_usd             numeric not null default 0,
  usage_synced_at       timestamptz,
  attended_at           timestamptz not null default now(),
  primary key (user_id, workshop_slug)
);</code></code></pre><p>Two choices worth calling out:</p><p><strong>The key is stored plaintext.</strong> OpenRouter shows the key exactly once at mint time. If I hash it, the attendee who refreshes their browser is locked out. Blast radius of a DB leaking is bounded: every key is capped at $2, expires 30 minutes after the workshop, and only works against the Guardrail&#8217;s allowed models. Rather take that trade than deal with 30 &#8220;I lost my key&#8221; DMs during the session.</p><p>Other gotcha: I was pulling API key usage live, but the UI and the API expose it through different endpoints. Better to save usage to the DB, then you can easily show how much each project consumed.</p><h2>Demo</h2><p>Home page when an active workshop is on. The user clicks to sign in and claim a key.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P-tE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P-tE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 424w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 848w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P-tE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png" width="1456" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:898579,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/194532515?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P-tE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 424w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 848w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!P-tE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc80fc9ab-cd71-484f-b83a-554acf6fcb30_2274x1374.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The workshop page:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y93V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y93V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 424w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 848w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 1272w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y93V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png" width="1456" height="1096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1096,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:406116,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/194532515?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y93V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 424w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 848w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 1272w, https://substackcdn.com/image/fetch/$s_!Y93V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0b7e432-a658-416f-934f-57ffe512e099_2226x1676.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once logged in, the user sees the authorized models, their prices, and code snippets to get started.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3832073a-7040-4c03-8b3d-11f849ac74e2&quot;,&quot;duration&quot;:null}"></div><p>And the admin view of the Guardrail on OpenRouter: allowed models and monthly cap in one place.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e6JD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e6JD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 424w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 848w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 1272w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e6JD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:677214,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/194532515?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e6JD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 424w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 848w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 1272w, https://substackcdn.com/image/fetch/$s_!e6JD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac785f8b-c18c-4644-84f6-c1e373f8c6d3_2336x1410.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Build your own!</h2><p>It&#8217;s a small project with some MotherDuck-specific bits (brand, auth provider, etc).<br>But with the info in this post, any AI coding agent can scaffold a version from the prompt <a href="https://gist.github.com/mehd-io/a82a37ba5b90c3541430ee617e39f708">here</a>.</p><p>Key design takeaways:</p><ol><li><p><strong>YAML per workshop</strong> in the repo, bundled at build time. Pull requests are the admin UI.</p></li><li><p><strong>OpenRouter Management API</strong> for key minting. One funded account, programmatic sub-keys.</p></li><li><p><strong>Guardrails for the allowlist</strong>, not per-key settings. And remember the separate <code>assignments/keys</code> call: <code>POST /keys</code> silently ignores <code>guardrail_ids</code>.</p></li><li><p><strong>Sign-in</strong> (any OIDC provider). The email confirmation step doubles as a consent moment for a marketing opt-in.</p></li><li><p><strong>Store the key plaintext.</strong> Blast radius is bounded by budget + expiry + guardrail. Hashing creates a support problem, not a security win.</p></li></ol><h2>Conclusion</h2><p>Another company running a workshop at the same PyCon, tower.dev, hit exactly this challenge and built a near-identical solution in parallel. Two data points is a pattern: a branded page with real auth, per-attendee bounded keys, and admin visibility is now table stakes for any AI or agent workshop. &#8220;Print 100 keys and hand them out&#8221; doesn&#8217;t cut it past about 10 attendees.</p><p>If you&#8217;re prepping an agent workshop for 2026: build the minter first. Budget one afternoon with an AI coding agent and this post. </p><p>The code is (now) the boring part.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[ctrl+r #13 : Agents don't sleep, but your infra (and brain) might need to]]></title><description><![CDATA[&#129504; The compute crunch is real]]></description><link>https://blog.mehdio.com/p/ctrlr-13-agents-dont-sleep-but-your</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-13-agents-dont-sleep-but-your</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sat, 18 Apr 2026 13:12:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G-Hc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129504; The compute crunch is real</h2><p>Been watching GitHub struggle lately. Michael Driscoll <a href="https://www.linkedin.com/posts/medriscoll_githubs-service-has-been-getting-shredded-share-7446264719713239041-mAsU">posted about their service getting shredded</a> by automated agents running 24/7. Cloud services weren&#8217;t built for this kind of constant hammering.</p><p>Tomasz Tunguz at Theory Ventures <a href="https://tomtunguz.com/ai-compute-crisis-2026/">wrote about the coming AI compute crisis</a>: real scarcity by 2026, with only the big players able to afford the best models while startups get stuck with slow service and high prices.</p><p>Makes you rethink the whole &#8220;democratized AI&#8221; story.</p><h2>&#128736;&#65039; VibePod + Caveman: two agent tools worth a look</h2><p><strong><a href="https://github.com/VibePod/vibepod-cli">VibePod CLI</a></strong>: Simple way to run AI coding agents in isolated Docker containers. No setup, just <code>vp run &lt;agent&gt;</code>. Built-in analytics to compare agents side by side. The isolation model is smart: keeps your system clean while you experiment. Been wanting exactly this.</p><p><strong><a href="https://github.com/JuliusBrussee/caveman">Caveman skill for Claude</a></strong>: Why use many token when few token do trick? Cuts 75% of tokens by making Claude talk like caveman. Removes all the pleasantries and filler, keeps technical accuracy. Brilliant for API costs when running agents at volume. (Yes, the irony of an AI talking like a caveman to save resources is not lost on me.)</p><h2>&#129504; Software engineer burnout because of AI</h2><p>There&#8217;s a real paradox happening. Software engineers are scared of their jobs being taken, and at the same time excited to build things they would never have been able to build before.</p><p>But there&#8217;s another part to the story: craving the coding skills you&#8217;ve been honing for years.</p><p>I was at PyCon last week and heard the same thing from AI power users: they&#8217;re burnt out. Our brains aren&#8217;t designed to juggle 4+ agents in parallel. You&#8217;re incredibly productive, but exhausted. And you miss the joy of writing code yourself, failing for hours on a syntax issue, then getting the lightbulb moment. Some engineers (e.g. Simon) are &#8220;downgrading&#8221; on purpose: learning a new language without autocomplete, writing on paper or e-ink, cutting screen time.</p><p>This resonates with some well-known figures in software engineering:</p><blockquote><p>DHH on the <a href="https://www.youtube.com/watch?v=9xOaqIkaBZQ">My First Million podcast</a>:<br>&#8220;the last 3 months I&#8217;d say has been the most churn in my mental approach to computers in the entire time I&#8217;ve been using them.&#8221;</p></blockquote><blockquote><p>Simon Willison on <a href="https://www.youtube.com/watch?v=wc8FBhQtdsA">Lenny&#8217;s podcast</a> :<br>&#8220;Using coding agents well is taking every inch of my 25 years of experience as a software engineer, and it is mentally exhausting.&#8221;</p></blockquote><p>Agentic coding can be a real addiction, and with any real addiction come some negative side effects.</p><h1>&#128736;&#65039; claude status in terminal</h1><p>I&#8217;ve been IDE-free for ~2 months, living in Claude Code / opencode + tmux (deserves its own post). Recently I wanted better status handling to see when Claude is busy vs. waiting on my input.</p><p>I landed on two projects: <a href="https://github.com/ataraxy-labs/opensessions">opensessions</a> (heavier, TypeScript extension) and <a href="https://github.com/samleeney/tmux-agent-status">tmux-agent-status</a> (pure bash). Tried both, but ended up &#8220;stealing&#8221; the best ideas and adapting them to my own setup, simpler and works better.</p><p>Here&#8217;s what it looks like, and my <a href="https://github.com/mehd-io/dotfiles/tree/main/tmux">dotfiles</a> are here if you want to get inspired for your own setup!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lZHo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lZHo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 424w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 848w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 1272w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lZHo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png" width="1456" height="111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b56661e-2967-4547-9933-8210fcb09699_1758x134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:111,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28713,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/194607418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lZHo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 424w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 848w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 1272w, https://substackcdn.com/image/fetch/$s_!lZHo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b56661e-2967-4547-9933-8210fcb09699_1758x134.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>&#128218; What I read/watched</h2><ul><li><p><a href="https://www.dumky.net/posts/youre-right-to-be-anxious-about-ai-this-is-how-much-we-are-building/">&#8220;You&#8217;re right to be anxious about AI, this is how much we are building&#8221;</a> by Dumky de Wilde: the GitHub/package/paper growth charts since early 2025 are absurd. Your anxiety is rational.</p></li><li><p><a href="https://www.youtube.com/watch?v=wc8FBhQtdsA">&#8220;Using coding agents well is taking every inch of my 25 years of experience&#8221;</a> via Lenny Rachitsky: agent orchestration is its own skill and nobody is good at it yet.</p></li><li><p><a href="https://arxiv.org/abs/2601.15494">&#8220;Vibe Coding Kills Open Source&#8221;</a>: as AI gets better at generating code, contributions back to the libraries drop. Who maintains the stack when everyone&#8217;s just prompting?</p></li><li><p><a href="https://www.linkedin.com/posts/alecwilcock_this-guy-built-a-18b-company-with-2-employees-share-7445560410499416064-lBb6">&#8220;This guy built a $1.8B company with 2 employees&#8221;</a>: telehealth shop running marketing, support, and creative through AI. The per-employee economics are getting weird.</p></li><li><p><a href="https://www.youtube.com/watch?v=9xOaqIkaBZQ">$100M+ Advice That&#8217;ll Piss Off Every Business Guru (ft. DHH)</a>DHH on one of my favorite business podcasts!</p></li><li><p><a href="https://github.com/luongnv89/claude-howto">Claude HowTo</a>: visual, example-driven Claude guide with copy-paste templates. Good starting point if you&#8217;re finally getting serious with it.</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p><em>PyconDE last week! Above the talks, what&#8217;s always nice is to connect randomly with folks and share knowledge and experience.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G-Hc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G-Hc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G-Hc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1180736,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/194607418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G-Hc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G-Hc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2a7e24-b852-4a1c-abb2-ab1af0716c8d_2648x1986.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[ctrl+r #12: AI learning cost, workflow moats, skills security, and the CLI disappointment]]></title><description><![CDATA[AI makes you faster but dumber, your workflows are your real moat, and your skills might already be a backdoor]]></description><link>https://blog.mehdio.com/p/ctrlr-12-ai-learning-cost-workflow</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-12-ai-learning-cost-workflow</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Fri, 03 Apr 2026 14:44:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/68785c3d-d496-4a2b-a5d0-4a87fcabfc61_2560x1696.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Wait Mehdi, almost <strong>2 months</strong> since the last ctrl+r?!</em><br><em>Travel, sickness, and (not to mention) a newborn got me deep into survival mode. Bear with me while I find my rhythm again. The good news: I&#8217;ve been experimenting non-stop, so this is a triple edition : 3 &#129504; thoughts on AI and 3 &#128736;&#65039; tools I tried. Deep dives coming next week!</em></p><h2>&#129504; AI hurts learning without helping productivity (for new skills)</h2><p>Anthropic researchers released an interesting paper last February: <a href="https://arxiv.org/pdf/2601.20245">&#8220;How AI Impacts Skill Formation&#8221;</a>.</p><p>They ran an experiment on 52 Python developers learning a new async library (Trio). The AI-assisted group scored <strong>17% lower on the post-task quiz</strong> while completing the task in roughly the <strong>same time</strong> as the no-AI group. No speed gain but a real learning cost.</p><p>You can probably guess why if you&#8217;ve been in this situation: you spend too much time prompting the AI trying to figure out what you actually want, especially when you can&#8217;t assess what&#8217;s being produced because you don&#8217;t have the foundations.</p><p>This is cognitive delegation. If you&#8217;re learning something new on the job and using AI to do it for you, you&#8217;re becoming a weaker engineer over time.</p><p>As a DevRel, these findings matter a lot. I&#8217;m teaching people how to use AI and <em>how</em> you use it shapes not just productivity but long-term learning. That&#8217;s the part most people are missing.</p><h2>&#128736;&#65039; Obsidian CLI &amp; headless client</h2><p>Obsidian recently released two tools:</p><ul><li><p>A CLI</p></li><li><p>A <a href="https://help.obsidian.md/headless">headless client</a></p></li></ul><p>The headless client is interesting. It means you can now let agents write to your vault separately from your laptop, like in CI. Combined with sync, you could run auto-tagging in a pipeline and have it pulled to your laptop or mobile the next time you open the vault.</p><p>The CLI is more pragmatic. I&#8217;ve been using Claude Code alongside Obsidian thanks to the <a href="https://github.com/polyipseity/obsidian-terminal">community terminal extension</a>, and the CLI makes common vault operations faster and cheaper on tokens because it&#8217;s built around specific patterns you&#8217;d otherwise rewrite from scratch every time with bash.</p><p>Someone did a benchmark and the speed gain isn&#8217;t massive even on a large vault, but it adds up:<br></p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/drrobcincotta/status/2022210753575760293&quot;,&quot;full_text&quot;:&quot;I have been testing the new Obsidian CLI with Claude Code on my research vault (4,663 files, 16 GB)... I know too many notes!!\n\nEarly results are significant.  Its going to change the way in which Claude Code can interact with Obsidian\n\nThe way I see it, there are three ways&quot;,&quot;username&quot;:&quot;drrobcincotta&quot;,&quot;name&quot;:&quot;Robert Cincotta&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1995026798464376832/F-mXu11N_normal.jpg&quot;,&quot;date&quot;:&quot;2026-02-13T07:26:29.000Z&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/HBBTnwqbsAYltgO.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/7jCEHwNKuz&quot;}],&quot;quoted_tweet&quot;:{&quot;full_text&quot;:&quot;Anything you can do in Obsidian you can do from the command line.\n\nObsidian CLI is now available in 1.12 (early access).&quot;,&quot;username&quot;:&quot;obsdmd&quot;,&quot;name&quot;:&quot;Obsidian&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1664288689147777030/zFbL2mvj_normal.jpg&quot;},&quot;reply_count&quot;:50,&quot;retweet_count&quot;:84,&quot;like_count&quot;:1090,&quot;impression_count&quot;:222660,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>There are also <a href="https://obsidian.md/help/cli#For+developers">many other commands available</a> like <code>plugins</code>. I&#8217;ve been using Claude Code to fix things around my setup: finding the right plugins, tweaking their config. Works great.</p><h2>&#129504; Your IP is not the code, it&#8217;s your workflows</h2><p>I&#8217;ve been spending a LOT of time improving my workflows with AI.</p><p>Whether it&#8217;s figuring out which MCPs are actually useful, turning repetitive tasks into skills, or automating pipelines that would&#8217;ve taken too long to do manually and this is where I&#8217;ve been putting my energy. One big piece: all my content is now a hub on <a href="http://mehdio.com">mehdio.com</a>  with stats updated daily.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KL_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KL_0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 424w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 848w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KL_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png" width="537" height="556.5473901098901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1509,&quot;width&quot;:1456,&quot;resizeWidth&quot;:537,&quot;bytes&quot;:1221407,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/193076508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KL_0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 424w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 848w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!KL_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa64728-4ac3-4d4c-9e39-c9703073cb3d_1552x1608.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I think this is what &#8220;finding your craft&#8221; looks like in the AI era : taking every workflow and shaping it to your taste, your needs, and your creativity.</p><p>One great blog in these lines that resonate with me is one from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kaxil&quot;,&quot;id&quot;:1501012,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab319124-ecf7-43dc-82de-441f0a8f0f5e_1484x1484.jpeg&quot;,&quot;uuid&quot;:&quot;9236c0b9-af2e-479e-b3eb-3f641fb8b1fb&quot;}" data-component-name="MentionToDOM"></span> , <a href="https://kaxil.substack.com/p/i-havent-written-a-line-of-code-in">I Haven&#8217;t Written a Line of Code in 4 Months (But I Ship More Than Ever)</a>. Kaxil is a committer and PMC member of the <a href="https://github.com/apache/airflow">Apache Airflow</a> project and he&#8217;s sharing the shift that has happened for him in terms of development and workflows specifically with a lot of insightful tips : a must read!</p><p><em>&#8220;Models haven&#8217;t improved much. Harnesses are what changed. If you&#8217;re investing in AI coding, invest in the harness.&#8221;</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>&#128736;&#65039; More metadata for Claude Code</h2><p><a href="https://cship.dev/">CShip</a> is a nice little plugin for <a href="https://starship.rs/">Starship</a> that shows more information about Claude Code. I was already a Starship user, so adding this was a no-brainer. At least now I can see when I&#8217;m burning too much <code>$$</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qgaa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qgaa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 424w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 848w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qgaa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png" width="633" height="400.4072802197802" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:921,&quot;width&quot;:1456,&quot;resizeWidth&quot;:633,&quot;bytes&quot;:456597,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/193076508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qgaa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 424w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 848w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!qgaa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61bdfed7-dd42-4ff7-9ad2-93dae75699fc_1688x1068.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#129504; AI security and skills</h2><p>We&#8217;ve heard wild stories with MCP servers, people going overboard on permissions and what they allow. But recent attacks on <em>skills</em> are also worth paying attention to.</p><p>Skills are just markdown, so they&#8217;re easy to inspect but many people use them without reading them, which hands over both security and control over their systems.</p><p>One example (among many): a supply chain attack on a Claude skills marketplace : a fake skill called &#8220;What Would Elon Do&#8221; was published by someone named Jameson. Separately, Vercel&#8217;s tooling was automatically finding and downloading skills based on what users asked, meaning a malicious skill only needs to be published once to get auto-executed across users&#8217; systems.</p><p>Skills have been growing fast:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XHo5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XHo5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 424w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 848w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 1272w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XHo5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp" width="1456" height="965" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:965,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59588,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/193076508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XHo5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 424w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 848w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 1272w, https://substackcdn.com/image/fetch/$s_!XHo5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28e43919-c3a0-4db0-a323-dbfbda145c8c_2560x1696.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Always review and understand skills before running them.</p><h2>&#128736;&#65039; Disappointing Google CLI</h2><p>Everyone&#8217;s shipping a CLI these days and for good reason. Agents love CLIs and bash execution. One promising recent addition was the <a href="https://github.com/googleworkspace/cli">Google Workspace CLI</a>. Could we finally get a smooth experience with Google Docs for collaborating with teammates and AI?</p><p>Short answer: not really.</p><p>Setup is rough. You need a Google developer project account (fine), but then you have to configure specific auth tokens AND authenticate through the usual GCP project maze.</p><p>And the Google Docs experience itself was underwhelming. The API sees documents mostly as one block of text so targeted edits, handling specific comments, anything contextual was a poor experience.</p><p>Then it hit me: <strong>CLIs are just another surface for existing APIs. Bad API, bad CLI.</strong></p><p>Good API for collaborative docs? Notion. I&#8217;m an Obsidian user at heart, but I&#8217;ve been leaning on Notion as a knowledge layer for work done with Claude and updating pages, responding to comments, all of it is smooth. And because it has structured components like databases, it&#8217;s great as a lightweight internal UI too.</p><p>Point to Notion.</p><h2>&#128218; What I read/watched</h2><p><strong>Articles</strong></p><ul><li><p><a href="https://www.a16z.news/p/your-data-agents-need-context">Your Data Agents Need Context</a> by a16z: context is the problem, not the model. been saying this for a while.</p></li><li><p><a href="https://jhellerstein.github.io/blog/ai-mixed-consistency/">AI and the Mixed-Consistency Future</a> by Joe Hellerstein: dense one. but if you&#8217;re building on top of AI in a distributed system, you need to read this.</p></li><li><p><a href="https://www.microsoft.com/en-us/security/blog/2026/02/10/ai-recommendation-poisoning/">Manipulating AI memory for profit: The rise of AI Recommendation Poisoning</a> by Microsoft Security: nobody&#8217;s talking about this yet and they should be.</p></li><li><p><a href="https://juhache.substack.com/p/sql-is-solved-heres-where-chat-bi">SQL Is Solved. Here&#8217;s Where Chat-BI Still Breaks.</a> by Julien Hurtevent: everyone&#8217;s excited about Chat-BI until they hit the edge cases. this is where it breaks.</p></li><li><p><a href="https://www.cjroth.com/blog/2026-02-11-moats-in-the-age-of-ai">Moats in the Age of AI</a> by CJ Roth: code is not your moat anymore. good articulation of where defensibility actually is now.</p></li><li><p><a href="https://dlthub.com/blog/dlt-ai-transform">The Last Mile is Solved by Slop</a> by dlt Hub: the ugly ETL nobody wanted to write? AI just does it now. slop that ships &gt; perfect code that doesn&#8217;t.</p></li><li><p><a href="https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals">AGENTS.md outperforms skills in our agent evals</a> by Vercel: worth reading if you&#8217;re building with agents, structured context in a file &gt; trying to prompt your way around it.</p></li><li><p><a href="https://preset.io/blog/semantic-layer-is-back/">The Semantic Layer Is Back. Here&#8217;s What We&#8217;re Doing About It.</a> by Preset: it comes back every few years. this time AI is the reason and it makes more sense now.</p></li></ul><p><strong>Videos</strong></p><ul><li><p><a href="https://www.youtube.com/watch?v=_mrMidIwCzk">I Let 30 AI Agents Loose in My Repo (Gas Town)</a>: watching 30 agents run loose on a real codebase is as messy as it sounds. you learn a lot from the chaos.</p></li><li><p><a href="https://www.youtube.com/watch?v=3wglqgskzjQ">Anthropic killed Tool calling</a>: don&#8217;t let the title fool you it&#8217;s actually a decent explainer on what changed with MCP.</p></li><li><p><a href="https://www.youtube.com/watch?v=EdZWPB1fIJc">Should You Learn Coding Now? Anthropic CEO Explains</a>: headlines butchered this one. watch the actual clip.</p></li><li><p><a href="https://www.youtube.com/watch?v=ZM2c33qy16U">An AI CEO finally said something honest...</a>: short. rare moment of honesty in a sea of hype.</p></li><li><p><a href="https://www.youtube.com/watch?v=B5VzL256te4">Is SaaS actually dead? (...no)</a>: SaaS is not dead. great reality check.</p></li><li><p><a href="https://www.youtube.com/watch?v=GDm_uH6VxPY">AI agent design patterns</a>: practical patterns, not theory. good reference.</p></li><li><p><a href="https://www.youtube.com/watch?v=Y2otN_NY75Y">Be Careful w/ Skills</a>: video version of what I covered in the security section above.</p></li></ul><div><hr></div><p>In reality, babies are a lot like Pok&#233;mon. Except they only take a week to evolve, and a few months before you can even narrow down what type they are...</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KyOY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KyOY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 424w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 848w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 1272w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KyOY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png" width="318" height="384.85227272727275" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:852,&quot;width&quot;:704,&quot;resizeWidth&quot;:318,&quot;bytes&quot;:1080426,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/193076508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KyOY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 424w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 848w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 1272w, https://substackcdn.com/image/fetch/$s_!KyOY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb7f72c-0393-4d82-a978-997811e7a22c_704x852.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OK I&#8217;ll leave you the smile on this one.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ctrl+r #11: IDEs are dead, Deep Fake is too easy]]></title><description><![CDATA[&#129504; IDEs as we know them are dead]]></description><link>https://blog.mehdio.com/p/ctrlr-11-ides-are-dead-deep-fake</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-11-ides-are-dead-deep-fake</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Wed, 04 Feb 2026 21:00:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1gbS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129504; IDEs as we know them are dead</h2><p>I&#8217;ve been using Cursor as my IDE, and I&#8217;ve realized that I barely use most of its features anymore&#8212;simply because I&#8217;m writing less code manually.</p><p>I think IDEs can afford to be much more lightweight when it comes to editing features. Instead, they should be designed around agents, workflows, and review. GitHub actually feels closer to this setup already. You have an Agent tab, you can orchestrate tasks through GitHub Actions, review through PRs, and spin up a Codespace that&#8217;s sandboxed to your repository.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1gbS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1gbS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 424w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 848w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 1272w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1gbS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png" width="644" height="394.14736842105265" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1330,&quot;resizeWidth&quot;:644,&quot;bytes&quot;:90957,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/186907686?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1gbS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 424w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 848w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 1272w, https://substackcdn.com/image/fetch/$s_!1gbS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb51afa-ef0a-410c-9dfa-7e2deb1ec6f7_1330x814.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I can even imagine &#8220;projects&#8221; becoming a way to launch agent tasks and track their progress.</p><p>So yeah, in the long run, I think <strong>GitHub is well positioned here</strong>. Editors built on VS Code are going to have a hard time&#8212;or will need some drastic changes.</p><h2>&#128736;&#65039; Deepfakes are too easy now</h2><p>Last week I had to get creative for some marketing content. If you haven&#8217;t seen it: </p><div id="youtube2-f0DDhKaZDDc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;f0DDhKaZDDc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/f0DDhKaZDDc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Beyond being a fun experiment, it gave me a firsthand look at the challenges involved. How good and easy is it to create a deepfake?</p><p>First, you have to realize that most platforms have security checks&#8212;so deepfaking a celebrity is harder if you&#8217;re not using open-source tools. At least, that&#8217;s what I thought.</p><p>Turns out, many of these tools have barriers when you use the AI directly, but far fewer when you use their API. &#128517;</p><p>Once you have a voice clone and a video, there are tools like sync.so that sync a given voice audio with video footage. It does a decent job.</p><p>But speaking of open source&#8212;cloning a voice is actually really easy now.</p><p>Jeff Geerling <a href="https://www.youtube.com/watch?v=dQ841Pd6YvQ">did a video</a> about how scary the new Qwen3-TTS (text-to-speech) model is. No long speech sample needed&#8212;just a small voice extract and you get really good results. Sure, intonation and emotion still need work. But if you want to change a few words in a given speech? Really easy.</p><p>Try it yourself on Hugging Face: <a href="https://huggingface.co/spaces/Qwen/Qwen3-TTS">https://huggingface.co/spaces/Qwen/Qwen3-TTS</a></p><p>All in all, just chaining a few tools with some open-source models can get you surprisingly far in a matter of minutes&#8212;at okayish quality. It&#8217;s only a matter of time before the results become unrecognizable from real footage. &#128556;</p><h2>&#128218;What I Read/Watched</h2><ul><li><p><a href="https://www.youtube.com/watch?v=dQ841Pd6YvQ">ElevenLabs just got nuked by open source</a> &#8212; Jeff Geerling shares his story about people faking his voice and the evolution of these open-source models</p></li><li><p><a href="https://openai.com/index/inside-our-in-house-data-agent/">Inside OpenAI&#8217;s in-house data agent</a> &#8212; this will be the playbook for companies building data agents to lower the technical barrier for internal analytics</p></li><li><p><a href="https://github.blog/news-insights/company-news/pick-your-agent-use-claude-and-codex-on-agent-hq/?utm_source=mario-twitter-blog-3p-agents-amp&amp;utm_medium=social&amp;utm_campaign=agent-3p-platform-feb-2026">GitHub just announced Claude &amp; Codex available as coding agents</a></p></li><li><p>Maxime Beauchemin (creator of Airflow) on <a href="https://preset.io/blog/semantic-layer-is-back/?utm_source=substack&amp;utm_medium=email">the semantic layer&#8217;s role in the context of AI</a></p></li><li><p><a href="https://www.youtube.com/watch?v=BFU1OCkhBwo">AI Expert: Here Is What The World Looks Like In 2 Years!</a> &#8212; ex-Google insider Tristan Harris shares some nuggets about the AI race and its consequences for our economy and possibly democracy</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><em>I was in Amsterdam last week and my hotel had an American waffle maker?! First time I&#8217;ve seen this in the EU!!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9j7v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9j7v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9j7v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg" width="316" height="421.3333333333333" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1728,&quot;width&quot;:1296,&quot;resizeWidth&quot;:316,&quot;bytes&quot;:319238,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/186907686?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9j7v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9j7v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea2e069-1d81-4017-9dc8-2049ac43439a_1296x1728.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[ctrl+r #10: AI & cognition, Obsidian+Claude Code ]]></title><description><![CDATA[Training brains in the age of shortcuts]]></description><link>https://blog.mehdio.com/p/ctrlr-10-ai-and-cognition-obsidianclaude</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-10-ai-and-cognition-obsidianclaude</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Thu, 29 Jan 2026 11:18:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Zw1F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129504; The paradox of getting &#8220;smarter with AI&#8221;</h2><p>With many people debating whether AGI is near&#8212;or even whether LLMs are truly intelligent&#8212;there&#8217;s an interesting paradox: will we stay intelligent while using them?</p><p>A French documentary (don&#8217;t worry, there&#8217;s auto-dub) called <a href="https://www.youtube.com/watch?v=4xq6bVbS-Pw">&#8220;La Fabrique &#224; Idiots&#8221;</a> (The Idiot Factory) explores the impact of AI in schools&#8212;how students use it for cheating and why it&#8217;s becoming nearly impossible to assign homework anymore.</p><p>My kid is 6, and it makes me think: how can I help him keep training his brain while still embracing the technology?</p><p>Someone online told me, &#8220;Well, LLMs are just compressed knowledge, like a book.&#8221; That feels like an understatement, as LLMs can go much further than simply delivering information.</p><p>And there&#8217;s science behind this. As mentioned in the documentary, learning requires three neural stages:</p><ul><li><p><strong>Encoding</strong>: the hippocampus creates new connections</p></li><li><p><strong>Retrieval practice</strong>: the basal ganglia strengthen pathways through repeated recall</p></li><li><p><strong>Error correction</strong>: dopaminergic neurons fire prediction error signals that tell the brain what to reinforce or prune</p></li></ul><p>When AI handles tasks for you, none of these mechanisms engage. We should watch out for ending up with an atrophied brain&#8212;and the choice is up to us.</p><h2>&#128736;&#65039; Obsidian and Claude Code</h2><p>I&#8217;ve been playing with the <a href="https://github.com/polyipseity/obsidian-terminal">Terminal community plugin for Obsidian</a> to leverage more AI within Obsidian. Not necessarily for writing, but rather for linting and searching. Yes, Obsidian has good search mechanisms and Dataview (so the query I show in the screenshot is actually pretty basic). But I&#8217;m looking more for skills like &#8220;add a summary of this large note&#8221; or &#8220;fill in the missing metadata from the source URL.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zw1F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zw1F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 424w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 848w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zw1F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png" width="1456" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:388791,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/186181555?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zw1F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 424w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 848w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!Zw1F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6e180b2-0154-4d42-8ee6-657e72dd3ffe_2912x1574.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>&#128218; What I read/watched</h2><ul><li><p><a href="https://www.dewanahmed.com/why-paying-devrel/">Why paying DevRel matters</a>: A reminder that DevRel is NOT an entry-level role. Yes, you can create marketing content as a junior, but true DevRel work requires deep technical knowledge and industry experience.</p></li><li><p><a href="https://open.spotify.com/episode/1dBVRilbq9TfXKhDLWXLS4?si=f9a6b95576ad4675">Creator economy&#8217;s abundance crisis</a>: Some good observations about how content abundance has surpassed demand (this applies to tech too) and how you can stay &#8220;authentic&#8221; when AI can generate so much content so easily.</p></li><li><p><a href="https://www.youtube.com/watch?v=LGrx9ueO3y0">OpenAI went ALL IN on this Rust framework</a>: Fun to see that TUI in Rust is so hot right now, given all the AI hype.</p></li><li><p><a href="https://www.youtube.com/watch?v=kSno1-xOjwI">Clawdbot is a security nightmare</a>: Clawdbot (now renamed &#8220;<a href="https://github.com/moltbot/moltbot">Moltbot</a>&#8220;), an open-source framework for running your personal AI assistant, gained more than 50k stars in just a few weeks. But as with many new open-source projects gaining quick traction, there are often security holes&#8212;so be careful!</p></li><li><p><a href="https://x.com/kaxil/status/2014433441497100346/?rw_tt_thread=True">MCP vs Agent Skills</a>: Kaxil (from Astronomer.io) explains the main differences between both in this thread. Will steal and reuse!</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><em>Most important AI note from one of my latest meetings. Yes, I&#8217;m lucky I can get decent sleep already.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K2dq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K2dq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K2dq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg" width="1456" height="106" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:106,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18021,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/186181555?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K2dq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K2dq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb745b6a-d36d-46b6-95b1-78791ba7cd64_1600x117.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[ctrl+r #09: The generalist comeback, Cursor's hidden gem]]></title><description><![CDATA[Why niching down might be yesterday's advice, plus plan mode changed how I build]]></description><link>https://blog.mehdio.com/p/ctrlr-09-the-generalist-comeback</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-09-the-generalist-comeback</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Mon, 19 Jan 2026 16:58:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jX_m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129504; Should I double down on being a generalist now that there&#8217;s AI?</h2><p>I recently received this question on socials:</p><p>&#8220;Given what&#8217;s possible with AI, do you think it&#8217;s important for data engineers to branch into software engineering too?&#8221;</p><p>Honestly, if you&#8217;d asked me this two years ago, I would&#8217;ve said no. A key thing in my career has been to niche down (data engineer &#8594; devrel in data engineering). But I&#8217;ve been building way more stuff outside of data engineering these past months.</p><p>So what&#8217;s the model can&#8217;t replicate? I think deep niche understanding about the business and domain expertise still matters&#8212;but the execution layer is getting commoditized. The question isn&#8217;t &#8220;should I learn React?&#8221; anymore. It&#8217;s &#8220;do I understand the problem well enough to direct an AI to build the right thing?&#8221;</p><h2>&#128736;&#65039; Cursor&#8217;s plan mode</h2><p>I don&#8217;t know how I missed it, but back in October 2025, Cursor released <a href="https://cursor.com/blog/plan-mode">its plan mode</a>.</p><p>It enables the model to research your codebase to find relevant files, review docs, and ask clarifying questions before writing any code.</p><p>This is basically what I used to do manually (and it still works if you aren&#8217;t using Cursor&#8217;s plan mode). Whenever I&#8217;d start a new project where I wasn&#8217;t sure about the architecture, UX, or technical implementation, I&#8217;d use a prompt like this while pinning relevant docs I&#8217;d previously indexed within Cursor settings:</p><pre><code><code>Don't start any coding implementation yet. I'm thinking about X&#8212;ask clarifying questions and use @docs to verify what's possible.</code></code></pre><p>Now plan mode does roughly that, and the UX within Cursor is nice since I can easily edit the plan and give the green light to build.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jX_m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jX_m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 424w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 848w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jX_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:600158,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/185083406?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jX_m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 424w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 848w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!jX_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c1be43-2a6b-445b-9678-f847b6638a91_1739x1124.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#128218; What I read/watched</h2><ul><li><p><a href="https://foundationcapital.com/context-graphs-ais-trillion-dollar-opportunity/">AI&#8217;s trillion-dollar opportunity: Context graphs</a>: Foundation Capital (VC firm from the Bay Area) discusses how the advantage in industry at the macro level is shifting from &#8220;systems of record&#8221; to where decisions are actually being made. Agents won&#8217;t replace systems of record, but the key missing piece is decision traces&#8212;recorded exceptions, approvals, and precedents&#8212;so agents can show <em>why</em> decisions were made.</p></li><li><p><a href="https://www.youtube.com/watch?v=HUX-LRNrsv4">Can a VFX Artist Beat AI?</a>: Zach King, the &#8220;magician of the internet,&#8221; made a fun video that reminded me you can still be really creative <em>with</em> AI rather than letting it beat you.</p></li><li><p><a href="https://youtu.be/d95J8yzvjbQ?si=KZX_od19pvVuGfxK">The Thinking Game</a>: A nice documentary about DeepMind (acquired by Google) and the breakthrough that would eventually win a Nobel Prize.</p></li><li><p><a href="https://thiagoghisi.substack.com/p/the-big-constraint-flip">The Big Constraint Flip</a>: I know I talked about this in my last issue, but here&#8217;s another signal that resonates with me: we just passed a flipping point.</p></li></ul><div><hr></div><p><em>OK, I don&#8217;t know how I missed that UFO, but Raye&#8217;s live performance of &#8220;Where Is My Husband&#8221; is absolutely INSANE. EVERY live version. Such musicians, such a performance.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3iCH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3iCH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 424w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 848w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3iCH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png" width="1214" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1214,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:898920,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/185083406?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3iCH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 424w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 848w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!3iCH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831a8751-3bcf-4cea-a200-44b7eb5a103c_1214x1086.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ctrl+r #08: 2026's AI wake-up call, voice-first workflows, and the data engineer identity crisis]]></title><description><![CDATA[From Karpathy's grief cycle to Hyprnote workflows, plus why companies are locking down their APIs]]></description><link>https://blog.mehdio.com/p/ctrlr-08-2026s-ai-wake-up-call-voice</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctrlr-08-2026s-ai-wake-up-call-voice</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Tue, 13 Jan 2026 21:02:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a5e5b058-47d8-4eb7-b620-806c57e5abea_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129504; 2026 is when you can&#8217;t ignore AI in your work</h2><p>I&#8217;ve been playing with AI since 2024. I remember trying out Cursor for the first time and being mind-blown by how good it was... but it was actually BAD in absolute terms. It could only edit one file, and code quality was meh.</p><p>In 2026, we reached a tipping point where AI is so good&#8212;especially at coding&#8212;that you can&#8217;t ignore it in your work anymore.</p><p>I&#8217;ve always experimented with AI and different workflows, mostly around prompts and some limited MCP services. In 2026, I need to master more of these workflows.</p><p>Specifically, I&#8217;m interested in diving deeper into:</p><ul><li><p><a href="https://github.com/github/spec-kit">GitHub spec kit</a></p></li><li><p><a href="https://code.claude.com/docs/en/skills">Claude skills</a></p></li><li><p>Building various MCPs for my daily work</p></li><li><p>Working with multiple sub-agents and pushing work async as a reviewer</p></li><li><p>How to manage memory for AI</p></li></ul><blockquote><p><em>Some powerful alien tool was handed around except it comes with no manual and everyone has to figure out how to hold it and operate it, while the resulting magnitude 9 earthquake is rocking the profession. Roll up your sleeves to not fall behind. -  Andrej Karpathy</em> </p></blockquote><h2>&#128736;&#65039; More voice, less typing</h2><p>I&#8217;ve been experimenting with voice recording tools, specifically for:</p><ul><li><p>Meetings where I&#8217;m not in control of recording notes</p></li><li><p>Meetings where I don&#8217;t want to send the AI summary</p></li><li><p>For myself&#8212;spending more time speaking than writing</p></li><li><p>Not having a big red button &#8220;Recording in progress&#8221;</p></li></ul><p>I think the exercise of writing is still important, of course, but there&#8217;s something nice about speaking freely and getting a summary or reordering of your thoughts.</p><p>I stumbled on two nice open-source products: <a href="https://www.getmeetly.ai/">meetly</a> and <a href="https://hyprnote.com/">hyprnote</a>.</p><p>I went with Hyprnote because it&#8217;s just markdown (yeah!) and I love their philosophy on not wanting to compete with tools like Obsidian, as described in their latest blog post <a href="https://hyprnote.com/blog/filesystem-is-coretex">&#8220;Filesystem is the cortex&#8221;</a>.</p><p>I&#8217;m still figuring out my workflows, but all in all, it&#8217;s working pretty nicely!</p><h2><strong>&#128218; What I read/watched</strong></h2><ul><li><p><a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Welcome to Gas Town</a>: A rather crazy take on how to run multiple agents with tmux. Note that I&#8217;ve seen more people managing agents through tmux lately.</p></li><li><p><a href="https://www.youtube.com/watch?v=VXdrfvqiH-0&amp;feature=youtu.be">Full Course: The AI Stack We Actually Use for Prototyping, Strategy, and Personal OS (2026)</a>: Another example that there&#8217;s no manual for the best workflows&#8212;you need to figure it out. Good examples here using text files and markdown.</p></li><li><p><a href="https://www.linkedin.com/pulse/defense-comes-software-tomasz-tunguz-quabc?utm_source=share&amp;utm_medium=member_android&amp;utm_campaign=share_via">Defense comes to software</a>: Tomasz mentions that a lot of companies are restricting their APIs to own the full stack due to the rise of AI.</p></li><li><p><a href="https://sungwc.substack.com/p/data-engineers-are-going-to-be-whatever">Data Engineers are going to be whatever they want to be</a> : Good take from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Sung&#8217;s Substack&quot;,&quot;id&quot;:1454168,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/sungwc&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3954e45e-512c-4d8b-84d3-d92835446da3_1280x1280.png&quot;,&quot;uuid&quot;:&quot;1fc0228d-a227-402d-9b7b-146e34739198&quot;}" data-component-name="MentionToDOM"></span> on how the role of data engineer is shifting into multiple subroles given the rise of AI.</p></li></ul><div><hr></div><p><em>Last saturday was my last day of skiing with full powder before going back to work after my parental leave!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eRZP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eRZP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eRZP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg" width="728" height="546" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:1340501,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/184479228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eRZP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eRZP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d40c7f-bde1-4c3d-9174-f91c3d54cdbe_2302x1726.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ctlr+r #07: TypeScript’s AI advantage, junior skill debt, and trusting AI with real money]]></title><description><![CDATA[TypeScript is booming, AI codes faster than ever, and fundamentals slip. Where AI helps, where it hurts, what matters plus tools & a health reminder.]]></description><link>https://blog.mehdio.com/p/ctlrr-07-typescripts-ai-advantage</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-07-typescripts-ai-advantage</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Mon, 05 Jan 2026 15:52:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/518a5b37-8ac2-413d-8fbd-d9edb9208c24_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This is a double edition, slightly longer than usual as I took a week off for the New Year.</em></p><h2>&#129504; Will AI kill Python?</h2><p>The GitHub Octoverse results are out, and <strong>TypeScript (TS) is now the most used language.</strong><br>For context, on GitHub Octoverse 2024, Python dethroned JavaScript as the most used language across all work. There is no doubt that today, Python is still the undisputed king of AI and Data. <br>But here&#8217;s the irony: I&#8217;m a Python guy, yet I&#8217;ve been writing more JS/TS than ever.<br>I&#8217;m vibecoding apps with background jobs, and most of them rely on APIs, so TS fits perfectly this use case.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>Why is TS gaining traction?</strong> TypeScript provides a much safer feedback loop for AI generation. Because LLMs can hallucinate APIs or import non-existent methods, TypeScript&#8217;s static typing acts as immediate &#8220;guardrails.&#8221; The AI (and the compiler) detects errors at the linting stage, not at runtime. It essentially allows the AI to self-correct before you even run the code.</p><p>Tools like <strong>Lovable</strong> and <strong>Replit</strong> that enable you to build apps with AI are targeting the web, so naturally, it&#8217;s all JS/TS. You can see why usage is exploding. That being said, <strong><a href="https://webassembly.org/">Wasm</a></strong> might eventually shift the balance, but today, if I want to write for the web, it&#8217;s TS/JS.</p><h2>&#128736;&#65039; Holiday laptop cleaning with <code>dua</code></h2><p>Here we go again. My laptop drive is full, I have urgent things to do, and I need to quickly delete large files I don&#8217;t need (or worse, hidden cache).</p><p>I&#8217;m a macOS user (though <code>dua</code> is multi-platform), and I used to rely on an OG app called Disk Space Utility. The downside? The indexing was slow. While it gave a good map, I missed the speed of the terminal. <br><code>dua</code> is an open-source fast terminal tool to view disk and manage disk space, written in Rust; you can navigate through big files in the terminal, mark them, and delete everything via keyboard commands.</p><p>I usually just go through the root <code>/</code> folder of my mac and launch <code>dua i</code></p><p><strong>Quick </strong><code>dua</code><strong> Cheat Sheet:</strong></p><ul><li><p><code>dua i</code>: Launch interactive mode.</p></li><li><p><code>j/k</code> : Up/down the current directory list</p></li><li><p><code>h/l</code>: Exit/enter a folder</p></li><li><p><code>Space</code>: Mark/Unmark the entry under the cursor.</p></li><li><p><code>Ctrl + r</code>: Remove all marked entries (careful!).</p></li><li><p><code>Ctrl + t</code>: Put the marked entries to the trash bin.</p></li><li><p><code>?</code>: Show all keyboard shortcuts.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1nC2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1nC2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 424w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 848w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 1272w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1nC2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:788945,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/183561047?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1nC2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 424w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 848w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 1272w, https://substackcdn.com/image/fetch/$s_!1nC2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea5a1af2-e7ff-44a1-b106-a3a1e4e79516_3006x1814.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>&#129504; Seniors are great with AI coding; Juniors are hurting themselves</h2><p>Because juniors can vibecode their way through problems with AI, they are skipping the basics. They skip the fundamentals. They get quick results now at the cost of long-term skills&#8212;specifically, the technical fundamentals required for critical thinking.</p><p>I watched a great video from <strong>Lee Robinson</strong> (DevRel at Cursor) about the future of AI coding, and one comment struck me:</p><blockquote><p>&#8220;To young engineers, don&#8217;t skip learning the basics.&#8221;</p></blockquote><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Joe Reis&quot;,&quot;id&quot;:3531217,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e4716b1-c223-41e3-b943-def0291bf217_1175x783.jpeg&quot;,&quot;uuid&quot;:&quot;cef83e6f-a450-41a3-8321-b359394c0a6e&quot;}" data-component-name="MentionToDOM"></span> raised a similar alarm in his recent blog:</p><blockquote><p>&#8220;I fear we&#8217;re building a competency debt bubble. Just as we accrue technical debt by cutting corners in code and systems, we are now accruing human debt.&#8221;</p></blockquote><h2>&#128736;&#65039; AI did my personal finance for 2026</h2><p>OK, so I went wild. I know I could use local open models with Ollama for privacy reasons, but I was lazy and decided to give Gemini/Claude a go with some static CSV exports of my bank transactions.</p><p>My biggest challenge is always figuring out categories and getting the &#8220;bigger picture&#8221; view. There are tons of tools to manage budgets, but I wondered how far I could get with just two CSVs and a good prompt.</p><p><strong>The two main challenges I faced:</strong></p><ol><li><p><strong>The devil is in the details:</strong> I had to set specific conditions and ask the AI to flag &#8220;unknown transactions&#8221; for me to comment on. It was a &#8220;human-in-the-loop&#8221; workflow, but with no UI&#8212;just Markdown. It gave me a list with a column where I can add comment on larger miscellaneous transactions</p></li><li><p><strong>Weird numbers:</strong> Of course, it initially hallucinated some recurring subscriptions, assuming I had them running for the full year when I didn&#8217;t. Also other stuff that didn&#8217;t add up. It looks at some transactions then quickly do some assumptions.</p><p>I asked it to back up all data with actual sums using <strong><a href="https://github.com/motherduckdb/mcp-server-motherduck">SQL and the DuckDB MCP server</a></strong>. It ran about ~30 queries locally to double-check its own math against the CSVs.</p></li></ol><p>Honestly, it&#8217;s crazy how far you can get with such a minimal local setup.</p><h2><strong>&#128218; What I read/watched</strong></h2><ul><li><p><strong><a href="https://youtube.com/watch?v=MQOaBXwRfYo&amp;si=G0vc6uSWCsSSRseS">The future of coding: Idan Gazit breaks down Octoverse 2025</a></strong> : A good breakdown of which language is being used for what, all in the context of AI. Great takes for the future.</p></li><li><p><strong><a href="https://joereis.substack.com/p/dawn-of-the-brain-rotted-zombies">Dawn of the Brain-Rotted Zombies</a></strong> : Joe Reis raising the alarm on how we should teach (and learn) in the age of AI.</p></li><li><p><strong><a href="https://www.youtube.com/watch?v=UrNLVip0hSA">AI codes better than me. Now what?</a></strong> : <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Lee Robinson&quot;,&quot;id&quot;:1866504,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/a5fd9634-0ffd-4fc3-8ebd-7c67dd792989_500x500.png&quot;,&quot;uuid&quot;:&quot;e612e00b-b6b6-4918-9c75-9dc2e94dfcfe&quot;}" data-component-name="MentionToDOM"></span> shared his experience coding with AI over the past year. He pushed a lot of projects he never would have been able to finish otherwise.</p></li><li><p><strong><a href="https://www.ssp.sh/brain/will-ai-replace-humans/">Will AI replace human thinking?</a></strong> : Another blog from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Simon Sp&#228;ti&quot;,&quot;id&quot;:27855874,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/6fc84efb-1b87-4fb3-bfb1-076664f32de4_2199x2199.jpeg&quot;,&quot;uuid&quot;:&quot;66a3d44a-b5e1-466b-a426-48484bbfc992&quot;}" data-component-name="MentionToDOM"></span> on the same theme as above, but with much more depth, evidence, and data.</p></li><li><p><strong><a href="https://thehackernews.com/2025/12/critical-n8n-flaw-cvss-99-enables.html">Critical n8n Flaw (CVSS 9.9)</a></strong> : Another week, another vulnerability exposed. This time, arbitrary code execution on n8n.</p></li><li><p><strong><a href="https://databasearchitects.blogspot.com/2024/02/ssds-have-become-ridiculously-fast.html">SSDs Have Become Ridiculously Fast, Except in the Cloud</a></strong> : An older blog (Feb 2024), but I think the take is still valid. Especially NVMe cards are crazy fast and are still lapping what is available in the cloud. It&#8217;s a good reminder to keep some hardware local.</p></li></ul><div><hr></div><p><em>My 6-year-old riding into 2026. Earlier this week, we went through a scary ER visit (not ski-related). First time for me&#8212;terrifying. But as you can see, he&#8217;s all good now and ready to take on 2026. </em></p><p><em>Honestly, the only thing I wish for you this year is <strong>health</strong>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ihVu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ihVu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 424w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 848w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 1272w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ihVu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png" width="558" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:558,&quot;bytes&quot;:2966287,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/183561047?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ihVu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 424w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 848w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 1272w, https://substackcdn.com/image/fetch/$s_!ihVu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F290d3f6c-61df-447a-9a7b-9d06f225a706_1489x1489.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ctlr+r #06: Auto-Dubbing the Web & "Serverless" RAG]]></title><description><![CDATA[Testing Gemini's File Search, the end of language barriers, and why RAM is getting expensive]]></description><link>https://blog.mehdio.com/p/ctlrr-06-auto-dubbing-the-web-and</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-06-auto-dubbing-the-web-and</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Mon, 22 Dec 2025 17:16:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f4f96fd5-5d3d-4596-926d-da0c548d7cb0_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Weekly updates from the command line of my brain: <strong>&#129504; Thoughts, &#128736; Tools, and &#128213; Takes</strong> on software engineering, data, AI, and tech.</p><h2>&#129504; Breaking down language barriers for education</h2><p>Translation features have been around for a while. It&#8217;s pretty standard to see them implemented across different social platforms, letting you translate a comment, a Reddit thread, or an entire web page. However, what has changed recently is that some of these websites are <strong>now translating automatically</strong>, making content <strong>searchable</strong> across languages.</p><p>For instance, Reddit has been rolling out<a href="https://redditinc.com/news/bringing-reddit-to-more-people-around-the-world-machine-learning-powered-localization-and-translation-launching-in-more-than-35-new-countries"> automatic translation features</a> causing quite a stir around mid-2024. This leads to users replying in their native language without realizing the original post was auto-translated, resulting in awkward interactions where people have to clarify, &#8220;Hey, we&#8217;re speaking English here.&#8221;</p><p>YouTube is also pushing heavily in this direction. They have been rolling out features to <strong>automatically translate video titles and descriptions</strong>, making them searchable in other languages. Furthermore, YouTube officially launched <strong>multi-language audio tracks</strong>, and in <strong>September 2025</strong> with an AI-powered dubbing service.</p><p>This trend likely kicked off with MrBeast, who <a href="https://mrbeast.fandom.com/wiki/International_channels">originally created multiple localized channels and dubbed them manually</a>. He realized that if he wanted to be the biggest YouTuber in the world, he had to capture the giant markets that don&#8217;t speak English.</p><p>While AI auto-dubbing can still sound a bit rough, I noticed a few people from Brazil following MotherDuck/DuckDB content using the Portuguese auto-dubbing. So, even for technical videos, it seems to be working!</p><p>Alec from ElevenLabs recently shared that creators got <a href="https://www.linkedin.com/posts/alecwilcock_dubbing-is-one-of-the-highest-roi-strategies-activity-7407732797311991808-4l-M?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAA0tl2QBJUocRMpCGqvWI8N_YbcsbmkLctY">significantly more views</a> when using their service to upload higher-quality dubs. The beauty of this is that you can easily clone your own voice with ElevenLabs. So it could be Auto dubbed with YOUR voice.</p><p>I think it&#8217;s great; we are tearing down barriers to amazing content that used to be language-specific. The only weird part is that we are evolving to view the world through an artificial layer that translates everything for us.</p><h2>&#128736;&#65039; &#8220;Serverless&#8221; RAG from Gemini</h2><p>A couple of weeks back, Google released their <a href="https://ai.google.dev/gemini-api/docs/file-search#chunking_configuration">&#8220;serverless RAG&#8221; through Gemini File Search</a>. In short, instead of having to chunk and embed data yourself and manage a vector database, they do most of the heavy lifting for you. You just upload a file and start querying it. Nice, right?</p><p>I&#8217;m a big fan of Gemini&#8217;s API (at the moment&#8212;meaning this past week, because god knows what AI model is going to be top-tier next week), so I gave it a go. There are basically 3 API calls: create a store, upload a file, and query it.</p><p>In Python, <a href="https://ai.google.dev/gemini-api/docs/file-search">per their documentation,</a> it looks like this:</p><pre><code><code>from google import genai
from google.genai import types
import time

# create client
client = genai.Client()

# File name will be visible in citations
file_search_store = client.file_search_stores.create(config={'display_name': 'your-fileSearchStore-name'})

operation = client.file_search_stores.upload_to_file_search_store(
  file='sample.txt',
  file_search_store_name=file_search_store.name,
  config={
      'display_name' : 'display-file-name',
  }
)

while not operation.done:
    time.sleep(5)
    operation = client.operations.get(operation)

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="""Can you tell me about [insert question]""",
    config=types.GenerateContentConfig(
        tools=[
            types.Tool(
                file_search=types.FileSearch(
                    file_search_store_names=[file_search_store.name]
                )
            )
        ]
    )
)</code></code></pre><p>I tried this on a couple of large PDFs, and one big issue is that you can&#8217;t easily update or delete existing documents/embeddings. If you have static information, that&#8217;s fine, but otherwise, it&#8217;s a major blocker.</p><p>Another thought is that because the context windows of the latest models are so large, I feel that a lot of use cases actually don&#8217;t need RAG anymore. Sometimes you want the whole corpus of a document in context, and it might not be smart to chunk it (e.g., &#8220;Give me the source blog of...&#8221;).</p><p>Other than that, it&#8217;s pretty cheap, so it&#8217;s worth trying!</p><h2><strong>&#128218; What I read/watched</strong></h2><ul><li><p><strong><a href="https://www.jeffgeerling.com/blog/2025/ram-shortage-comes-us-all">The RAM Shortage Comes for Us All</a>:</strong> RAM prices are going up. AI datacenters being built are the culprit, and it seems the consumer line is getting hit. Manufacturers have a choice, but isn&#8217;t this a consequence of so much hardware being bought but not yet deployed for the AI giga-centers?</p></li><li><p><strong><a href="https://sympathetic.ink/2025/12/11/Column-Storage-for-the-AI-era.html">Column Storage for the AI Era</a>:</strong> A really good overview on the state of Parquet (vs. other file formats) from the creator of Parquet. It discusses what&#8217;s missing in Parquet today for the AI era, noting that the hardest part isn&#8217;t the file format itself, but getting the community and ecosystem to agree on specifications.</p></li><li><p><strong><a href="https://motherduck.com/blog/analytics-agents/">Building an answering machine</a>:</strong> Of course I&#8217;m biased as I work at MotherDuck, but with LLMs getting better, it feels like we are finally getting somewhere with &#8220;chat with your database&#8221; for analytics. Check the blog above for some neat examples.</p></li><li><p><strong><a href="https://www.youtube.com/watch?v=TyNtEOcvER8">Project managers will be the new developers</a>:</strong> WebDev Cody demoed his new project, <a href="https://github.com/AutoMaker-Org/automaker">Automaker</a>. I should definitely experiment with tools where you just input a task, branch it out as an agent, and then review the PR.</p></li><li><p><strong><a href="https://www.reddit.com/r/devops/comments/1po8hj5/github_actions_introducing_a_perminute_fee_for/">GitHub Actions Pricing Update</a>:</strong> GitHub Actions is probably in my top 5 favorite cloud tools, so I&#8217;m really sad to see this nonsensical pricing: paying <strong>per minute</strong> on self-hosted GHA!? I don&#8217;t mind paying for the service, but that pricing model seems unfair.</p><p></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><em>I&#8217;m on parental leave. No, it&#8217;s not a playground. Yes, the MotherDuck AMS office has a swing AND a slide.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l3lF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l3lF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l3lF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg" width="548" height="393.31043956043953" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1045,&quot;width&quot;:1456,&quot;resizeWidth&quot;:548,&quot;bytes&quot;:774612,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/182223795?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l3lF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l3lF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55905ff7-4b57-4e31-bd69-46dded98527b_1806x1296.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[ctlr+r #05: Less UI, more chats, faster containers]]></title><description><![CDATA[Weekly updates from the command line of my brain: &#129504; Thoughts, &#128736; Tools, and &#128213; Takes on software engineering, data, AI, and tech.]]></description><link>https://blog.mehdio.com/p/ctlrr-05-less-ui-more-chats-faster</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-05-less-ui-more-chats-faster</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 14 Dec 2025 15:04:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fb1e2c61-4e45-4ba1-b4a1-62fed3b226fb_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Weekly updates from the command line of my brain: <strong>&#129504; Thoughts, &#128736; Tools, and &#128213; Takes</strong> on software engineering, data, AI, and tech.</p><h2>&#129504; Are chat interfaces replacing traditional UIs?</h2><p>What if we used less UI and more code going forward? What if, instead of clicking through interfaces, you had a simple chat that handled all the interactions for you?</p><p><a href="https://x.com/leerob">Lee Robinson</a> (DevRel at Cursor, previously at Vercel) shared his experience of <a href="https://leerob.com/agents">removing the entire CMS from the Cursor website</a>. A CMS is another layer of interface and complexity. In the age of AI-assisted development, it&#8217;s much easier to work with raw code so AI can easily modify things without navigating through additional layers.</p><p>So, chat everywhere?</p><p>Not quite. Lee&#8217;s example shows we could certainly remove some layers, but he also mentioned still wanting a basic GUI to manage assets, for instance. For website content management, you could definitely survive with minimalist features.</p><p>However, many workflows will still need specific, opinionated UIs. A chatbot won&#8217;t always cut it.</p><p>A good example is video editing. Sure, you could use a chatbot to remove all the &#8220;silence&#8221; from a video. But what the editor actually wants is the ability to easily adjust the silence threshold and&#8212;most importantly&#8212;preview changes so they can always roll back (or cut more). This requires tight integration with a classic video timeline and other controls.</p><p>A chatbot won&#8217;t provide an efficient workflow here.</p><h2>&#128736; OrbStack: A better container solution for macOS?</h2><p>It&#8217;s weird this project didn&#8217;t fall onto my radar earlier.</p><p><a href="https://orbstack.dev/">OrbStack</a>, per their definition, is &#8220;the fast, light, and simple way to run containers and Linux machines. OrbStack offers excellent performance and seamless integration with macOS.&#8221;</p><p>There are lots of alternatives to Docker Desktop. In the past, I&#8217;ve tried (in order of age/maturity) <a href="https://rancherdesktop.io/">Rancher Desktop</a>, <a href="https://podman.io/">Podman</a>, and recently <a href="https://blog.mehdio.com/p/apples-new-container-engine-bye-docker">Apple&#8217;s own container runtime</a>, simply called &#8220;Container&#8221; (yes, they missed the &#8220;iContainer&#8221; branding opportunity).</p><p>All of them were nice, but sometimes felt clunky and, most importantly, didn&#8217;t always have good support for <a href="https://containers.dev/">devcontainers</a>, which is how I use containers locally every day for all development purposes.</p><p>Docker Desktop may feel heavier and slower, but its support is generally solid.</p><p>I decided to give OrbStack a spin with a devcontainer (one container) running a Node.js app.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gT35!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gT35!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 424w, https://substackcdn.com/image/fetch/$s_!gT35!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 848w, https://substackcdn.com/image/fetch/$s_!gT35!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 1272w, https://substackcdn.com/image/fetch/$s_!gT35!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gT35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png" width="594" height="93.55045871559633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:206,&quot;width&quot;:1308,&quot;resizeWidth&quot;:594,&quot;bytes&quot;:46537,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/181525728?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gT35!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 424w, https://substackcdn.com/image/fetch/$s_!gT35!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 848w, https://substackcdn.com/image/fetch/$s_!gT35!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 1272w, https://substackcdn.com/image/fetch/$s_!gT35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f83a20d-d9cd-43c8-82a0-24d8d1a9723f_1308x206.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gnvC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gnvC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 424w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 848w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 1272w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gnvC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png" width="584" height="161.72307692307692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:324,&quot;width&quot;:1170,&quot;resizeWidth&quot;:584,&quot;bytes&quot;:69022,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/181525728?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gnvC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 424w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 848w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 1272w, https://substackcdn.com/image/fetch/$s_!gnvC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7405a065-95db-4357-9b5c-3a3381ade27a_1170x324.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So yes, OrbStack has a significantly smaller footprint and includes nice features around mounted volumes and SSH to containers that I haven&#8217;t explored much yet.</p><p>That said, it&#8217;s closed source (like Docker Desktop) and backed by a much younger company.</p><p>I&#8217;ll continue using it as my default for the coming months and will report back.</p><h2>&#128218; What I read/watched</h2><ul><li><p><a href="https://shopify.engineering/reducing-bigquery-costs">Reducing BigQuery Costs: How We Fixed A $1 Million Query</a> - Shopify&#8217;s experience with a single query that would have cost nearly $1M. Old blog post, but a good reminder that small optimizations at scale can yield massive savings.</p></li><li><p><a href="https://www.youtube.com/watch?v=s81dVUM-cQM">this is the worst case scenario</a> - Low Level shows pragmatically how bad the critical vulnerability affecting both React and Next.js is (<a href="https://cloud.google.com/blog/topics/threat-intelligence/threat-actors-exploit-react2shell-cve-2025-55182">CVE-2025-55182</a>). If you have any React or Next.js projects, patch them now!</p></li><li><p><a href="https://www.youtube.com/watch?v=c58bMmlelow">The End of Coding Tutorials for Tech Creators?</a> - Francesco Ciulla and <a href="https://www.youtube.com/channel/UCNxUdsuH8-kEGIwSD0r8RhQ">Maximilian Schwarzm&#252;ller</a>, two creators with solid experience making successful coding tutorials, discuss the trend toward &#8220;tech entertainment&#8221; over deep-dive coding tutorials. IMO we&#8217;ll need both in the future and there are too much of &#8220;tech entertainment&#8221; videos at the moment.</p></li><li><p><a href="https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation">Donating the Model Context Protocol and establishing the Agentic AI Foundation</a> - Anthropic announced they&#8217;re donating MCP to the Linux Foundation. This could be a double-edged sword&#8212;only time will tell. But it&#8217;s probably a win for AI consumers if it leads to broader adoption beyond just Anthropic.</p></li><li><p><a href="https://agor.live/blog/context-engineering">Context Engineering the </a><a href="https://github.com/mistercrunch">@mistercrunch</a> Way - Maxime Beauchemin (creator of Airflow) shares his insights on organizing rules for LLMs without bloating your <code>AGENTS.md</code> and <code>CLAUDE.md</code> files. Useful patterns similar to what I have right now.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Mehdio's Tech (Data) Corner is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>As I moved back to my hometown after 6 years, I opened some very old boxes and found my old consoles. After 20+ years, my save file was still there! The game is at 95% completion, and I have a sudden urge to finish it at 100% but I can&#8217;t remember anything from back then lol.</p><p>Can you guess which game it is, retro lovers?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Myio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Myio!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Myio!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Myio!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Myio!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Myio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg" width="336" height="246.79646017699116" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:996,&quot;width&quot;:1356,&quot;resizeWidth&quot;:336,&quot;bytes&quot;:502408,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/181525728?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Myio!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Myio!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Myio!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Myio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba66610a-ddb5-4a7d-be4c-b7df68fa8155_1356x996.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[ctlr+r #04: AI’s Energy Bill , Free Localhost Tunnels]]></title><description><![CDATA[A weekly recall from the terminal of my mind: Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.]]></description><link>https://blog.mehdio.com/p/ctlrr-04-ais-energy-bill-free-localhost</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-04-ais-energy-bill-free-localhost</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sat, 06 Dec 2025 16:09:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/23323e01-9fd7-4af3-a348-7b05fc6fdd56_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A weekly recall from the terminal of my mind: <strong>Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.</strong></p><h2>&#129504; Is AI resource usage killing the planet?</h2><p>I recently stumbled upon a good essay arguing from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Andy Masley&quot;,&quot;id&quot;:166280567,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96781da3-f773-46cb-b236-dd80350291a2_1002x1002.png&quot;,&quot;uuid&quot;:&quot;43eda841-f2e5-49f7-bc80-dcf1f19a56a9&quot;}" data-component-name="MentionToDOM"></span> that <a href="https://andymasley.substack.com/p/a-cheat-sheet-for-conversations-about">ChatGPT is not bad for the environment</a>. Then, I read a jarring counter-perspective from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Alistair Alexander&quot;,&quot;id&quot;:97835195,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5d367f-f5ac-4ce4-9415-fb92655fc9e0_1024x681.jpeg&quot;,&quot;uuid&quot;:&quot;f03d9414-59f7-45a6-9b6e-5a9c45eb4672&quot;}" data-component-name="MentionToDOM"></span> claiming that a single <a href="https://reclaimedsystems.substack.com/p/every-sora-ai-video-burns-1-kilowatt?utm_source=share&amp;utm_medium=android&amp;r=1g8h3p&amp;triedRedirect=true">Sora AI video burns 1 kWh</a>. Meanwhile, we see massive investments in new infrastructure, like <a href="https://www.anthropic.com/news/anthropic-invests-50-billion-in-american-ai-infrastructure">Anthropic&#8217;s $50 billion project</a>.</p><p>So, are we killing the planet or not? The truth lies in the details.</p><p>First, we need to distinguish what &#8220;AI cost&#8221; actually means. While data on this has historically been imprecise, <a href="https://cloud.google.com/blog/products/infrastructure/measuring-the-environmental-impact-of-ai-inference">Google&#8217;s August 2025 report</a> finally gives us solid numbers.</p><ul><li><p><strong>Text is cheap:</strong> A query costs about <strong>0.24 Wh</strong> : roughly equivalent to <strong>9 seconds of watching TV</strong>.</p></li><li><p><strong>Video is expensive:</strong> Generating video is exponentially more energy-intensive. While tools like Kling 2.6 offer utility for artists, the energy cost of flooding the internet with &#8220;fun&#8221; Sora-style clips is massive compared to text.</p></li></ul><p>Second, we must differentiate <strong>Training</strong> vs. <strong>Inference</strong>.</p><ul><li><p><strong>Training</strong> is like building a stadium. Massive energy goes into the construction, but that cost is &#8220;fixed&#8221; regardless of whether 1 person or 10,000 people sit in it. This is the scary part: we are currently making a massive energy bet : burning resources now to build these &#8220;stadiums&#8221; and hoping that AI will improve life enough to justify the cost.</p></li><li><p><strong>Inference</strong> is the daily usage (the ticket to the stadium).</p></li></ul><p>Finally, there is a surprising trade-off between <strong>Cloud vs. Local</strong> inference. Technically, the cloud is much better at &#8220;math-per-watt&#8221; due to specialized cooling and efficient hardware. </p><p>Your laptop is less efficient at the math, <em>but</em> it represents &#8220;sunk carbon&#8221;. The environmental cost to manufacture your phone or laptop has already been paid. Using the &#8220;idle compute&#8221; we already own locally might be the smarter move to avoid building endless new data centers. </p><p>The future will likely need to be a hybrid of both.</p><h2>&#128736; Tunnels: exposing localhost to the world</h2><p>I recently needed a quick tunneling service to test a few things locally. Specifically, I had a webhook I needed to register to verify that my app could receive it and trigger the correct actions.</p><p>To do this, you typically need to register a public URL. This is where tunneling comes in: it makes your local machine (aka <code>localhost:3000</code>) available to the internet via a secure public link.</p><p>I used to use <strong>ngrok</strong>, but it has become increasingly restrictive for free usage (bandwidth limits, no static domains without paying).</p><p>After checking <a href="https://github.com/anderspitman/awesome-tunneling">awesome-tunneling</a>, I found <a href="https://github.com/cloudflare/cloudflared">Cloudflare Tunnel</a> (<code>cloudflared</code>). It is incredibly simple to start and arguably the best free alternative right now.</p><p>In a setup with AI tools like <strong>Lovable</strong> or <strong>Replit</strong>, this is becoming less critical because they often provide their own cloud previews out of the box. However, if you want a true local development environment, a tunnel is still essential.</p><p><strong>I </strong>suspected Cursor might eventually host apps for development purpose too.</p><h2>&#128218; What I read / watched</h2><ul><li><p><strong><a href="https://www.youtube.com/watch?v=Mb6H7trzMfI">Driving Xiaomi&#8217;s Electric Car: Are we Cooked?</a></strong>: It&#8217;s great to see more competition in the EV space. Xiaomi (yes, the one that makes phones and tablets) seems to have really nailed it with this model.</p></li><li><p><strong><a href="https://www.anthropic.com/news/anthropic-acquires-bun-as-claude-code-reaches-usd1b-milestone?s=09">Anthropic acquires Bun</a></strong>: Anthropic acquiring an OSS JS runtime is... interesting. I&#8217;m curious to see the future of this, but to me, it proves that we still need good engineers. Generating code might be becoming a commodity, but <em>engineering</em>? That isn&#8217;t going anywhere. Otherwise, they would have just forked the project.</p></li><li><p><strong><a href="https://www.google.com/search?q=https://blog.cloudflare.com/why-replicate-joining-cloudflare/%23:~:text%3DThis%2520is%2520why%2520we%27re,lives%2520entirely%2520on%2520the%2520network.">Why Replicate is joining Cloudflare</a></strong>: Replicate (think Vercel, but for AI model hosting) has been acquired. Cloudflare continues to build a really neat catalog of products, but I feel the one thing they are missing is strong developer branding. I see AWS, GCP, and Vercel champions everywhere. Cloudflare? Not so much.</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>Two months ago, I challenged myself to make the best Sunday morning pancakes for my family. Given that my cooking skills hover around zero, this was ambitious, but I&#8217;m finally getting somewhere! &#129489;&#8205;&#127859;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L9Rl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L9Rl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L9Rl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg" width="496" height="514.4129930394431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1341,&quot;width&quot;:1293,&quot;resizeWidth&quot;:496,&quot;bytes&quot;:638337,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/180889837?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L9Rl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L9Rl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa594d476-f5bb-4061-9073-5d3297aac893_1293x1341.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[ctlr+r #03: OSS fatigue & Orchestrating LLMs]]></title><description><![CDATA[A weekly recall from the terminal of my mind: Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.]]></description><link>https://blog.mehdio.com/p/ctlrr-03-oss-fatigue-and-orchestrating</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-03-oss-fatigue-and-orchestrating</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 30 Nov 2025 14:12:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/98bc38eb-1299-4fa7-8a37-fa33e47683d7_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A weekly recall from the terminal of my mind: <strong>Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.</strong></p><h2>&#129504; Open Source projects are becoming less convincing</h2><p>The business models and sustainability of open source have always been challenging.</p><p>In the past, if you wanted to push something into the open for others to use and contribute to, the bar was incredibly high. You basically had to sacrifice your evenings and weekends just to write the code. That effort was a signal: it showed a genuine commitment to, at the very least, maintain and move the project forward.</p><p>Now, with AI, anyone can spin up an open source project in a few minutes, throwing together code they&#8217;ve likely never reviewed. As a result, the commitment to maintainability has plummeted.</p><p>So, I&#8217;m looking at new open source projects with much more skepticism now&#8212;unless they are actually backed by a company.</p><p>There are still great new OSS projects, like <a href="https://ghostty.org/">Ghostty</a> or <a href="https://omarchy.org/">Omarchy</a>, but these are exceptions led by people who <a href="https://x.com/dhh/status/1964776333965427110">don&#8217;t need the money.</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QY-J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QY-J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 424w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 848w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 1272w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QY-J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png" width="406" height="248.9121495327103" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:1070,&quot;resizeWidth&quot;:406,&quot;bytes&quot;:224695,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/180317027?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QY-J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 424w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 848w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 1272w, https://substackcdn.com/image/fetch/$s_!QY-J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8913530-ba5d-444a-9cc6-83b9ec9b55bf_1070x656.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#128736; Modern orchestration for LLM workflows</h2><p>As a data engineer, I&#8217;m familiar with orchestrators like Airflow, Dagster, and <a href="https://kestra.io/">Kestra</a>. These are designed for data dependencies and heavy batch compute. They are primarily declarative DAGs: &#8220;here&#8217;s the whole pipeline, go run it.&#8221;</p><p>Designing LLM workflows (or agents) requires a different approach. I need dynamic execution rather than raw compute power, as the system is mostly waiting for API responses. This is where event-driven, state-machine-style orchestrators shine.</p><p>I&#8217;ve been testing <a href="https://trigger.dev/">trigger.dev</a>, a lightweight serverless tool where you define tasks directly within your code. You define task within your API, and the service will call these endpoint following a specific workflow and given you clear observability. It&#8217;s nice because your orchestrations is &#8220;built-in&#8221; within your app. There&#8217;s just another service calling endpoints.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fuXc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fuXc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 424w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 848w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 1272w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fuXc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png" width="534" height="316.1456043956044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03295559-9422-48de-b6f0-2be86da83358_3420x2024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:862,&quot;width&quot;:1456,&quot;resizeWidth&quot;:534,&quot;bytes&quot;:876928,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/180317027?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fuXc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 424w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 848w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 1272w, https://substackcdn.com/image/fetch/$s_!fuXc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03295559-9422-48de-b6f0-2be86da83358_3420x2024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">panel of trigger.dev for monitoring workflows</figcaption></figure></div><p>An honorable mention goes to <a href="https://www.inngest.com/">Inngest</a>, while <a href="https://temporal.io/">Temporal</a> offers a heavier enterprise alternative.</p><p>I&#8217;ll share a deep dive soon on these once I&#8217;ve gathered more experience.</p><h2>&#128218; What I read / watched</h2><ul><li><p><strong><a href="https://dataengineeringcentral.substack.com/p/650gb-of-data-delta-lake-on-s3-polars">650GB of Data (Delta Lake on S3): Polars vs DuckDB vs Daft vs Spark</a>:</strong> <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Daniel Beach&quot;,&quot;id&quot;:21715962,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F81caaeec-9053-487c-a59c-ba5f8e4644ad_256x256.jpeg&quot;,&quot;uuid&quot;:&quot;a3353baf-36c8-4c06-a1a3-a00836b313ed&quot;}" data-component-name="MentionToDOM"></span> takes a &#8220;no tuning&#8221; approach, acknowledging that most devs don&#8217;t read the docs anyway. A pragmatic showdown of processing 650GB using different compute engines.</p></li><li><p><strong><a href="https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/">What if you don&#8217;t need MCP at all?</a>:</strong> An interesting take suggesting we don&#8217;t always need MCP. Often, simply letting LLMs run bash scripts is enough.</p></li><li><p><strong><a href="https://youtu.be/BOJFHMtyqNs?si=OVl0B_TK19clsS6j">Knowledge Management in the Digital Age</a>:</strong> A hands-on look at <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Simon Sp&#228;ti&quot;,&quot;id&quot;:27855874,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/6fc84efb-1b87-4fb3-bfb1-076664f32de4_2199x2199.jpeg&quot;,&quot;uuid&quot;:&quot;759c5903-751f-4995-afb9-0d8d8492e828&quot;}" data-component-name="MentionToDOM"></span> &#8216;s &#8220;second brain.&#8221; He&#8217;s used Obsidian for years, so despite the length, there are great nuggets here for your workflow.</p></li><li><p><strong><a href="https://www.youtube.com/watch?v=XTzoBHECfXY">My biggest programming regret</a>:</strong> A reminder to build what excites you, not just what pays. If you are passionate and get good at it, the career and money will follow naturally.</p></li></ul><div><hr></div><p>We are constantly bombarded with online success stories and &#8220;the grind.&#8221; Here&#8217;s a photo of my new daughter to remind you that success is worthless if you can&#8217;t share it with real people.</p><p>Take time with your family and friends. Life is short.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2UH2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2UH2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2UH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg" width="310" height="352.65438786565545" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1050,&quot;width&quot;:923,&quot;resizeWidth&quot;:310,&quot;bytes&quot;:121592,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/180317027?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2UH2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2UH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aa85c89-e33e-41c5-bf31-8db5a6361628_923x1050.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[ctlr+r #02: How to not get stupid & The Parquet Killer?]]></title><description><![CDATA[A weekly recall from the terminal of my mind: Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.]]></description><link>https://blog.mehdio.com/p/ctlrr-02-how-to-not-get-stupid-and</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-02-how-to-not-get-stupid-and</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Mon, 24 Nov 2025 17:22:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e09cbec3-2aad-44b8-b9a9-9050a030297b_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A weekly recall from the terminal of my mind: <strong>Thoughts &#129504;, &#128736; Tools, and &#128213; Takes.</strong></em></p><h2>&#129504; The LLM paradox: preserving critical thinking</h2><p>This has been on my mind for months. With LLMs at our fingertips, we risk becoming lazy thinkers. We ask a question, get the answer, and copy-paste...often without understanding the &#8220;how&#8221; or engaging our own brains first. It feels like our short and long-term memory is taking a hit.</p><p><strong>Do you actually remember most of the answers you get from LLMs?</strong></p><p>That said, AI is a powerful learning tool. <a href="https://www.youtube.com/watch?v=6rAWxGAG6EI">Harvard</a> has an internal AI chat for their CS50 students. It used to just &#8220;quack&#8221; (seriously, based on <a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging">rubber duck debugging technique</a>), but now it speaks English with what they call &#8220;pedagogical guardrails.&#8221;</p><p>Instead of just giving answers, i<strong>t nudges students to think critically, ask questions</strong>, and work their way toward the solution.</p><p>Anthropic also announced <a href="https://www.anthropic.com/news/introducing-claude-for-education">Claude for Education</a> back in April 2025 (aka &#8220;learning mode&#8221;). It&#8217;s not publicly available yet, but I suspect it follows the same Socratic approach.</p><p>I tried Gemini&#8217;s <a href="https://blog.google/outreach-initiatives/education/guided-learning/">&#8220;Guided learning&#8221;</a> announced in August 2025, but I was a bit disappointed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4D1_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4D1_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 424w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 848w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 1272w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4D1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png" width="228" height="223.9526627218935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:664,&quot;width&quot;:676,&quot;resizeWidth&quot;:228,&quot;bytes&quot;:57667,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/179837871?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4D1_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 424w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 848w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 1272w, https://substackcdn.com/image/fetch/$s_!4D1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a601a0e-8be2-425a-bfb0-c4bf3ca7200f_676x664.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">right in the chat under &#8220;tools&#8221;</figcaption></figure></div><p>I asked, &#8220;Can you explain to me what Apache Kafka is and how it works?&#8221; It jumped straight into a technical answer without assessing my background or the level of depth I wanted. While it did eventually ask a follow-up , eg : &#8220;What part of the Kafka system would you like to explore next?&#8221;.</p><p>I feel there is definitely space to improve how AI scaffolds learning rather than just retrieving facts.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.mehdio.com/subscribe?"><span>Subscribe now</span></a></p><h2>&#128736; Vortex: file format rethought for our era</h2><p>Parquet is legendary, but it was built for a different hardware era : spinning disks, HDFS, and large sequential scans. Today, we read data from fast NVMe and S3, mixing analytics with ML workloads that require quick, selective access.</p><p>Vortex rethinks the layout for this modern environment: it aligns directly with Arrow&#8217;s in-memory format, ditches Parquet&#8217;s heavy row-group structure, and uses flexible encodings. The result is <strong>10&#8211;20&#215; faster table scans and up to 100&#215; faster random access</strong>, without sacrificing compression. For data engineers building retrieval-heavy systems, Vortex reduces I/O and CPU overhead while keeping the familiar columnar model.</p><p>For any new standard, adoption is key. Vortex already supports: Arrow, DataFusion, DuckDB, Spark, Pandas, Polars, and Apache Iceberg is coming soon (!).</p><p>It was recently added as a <code>core</code><a href="https://duckdb.org/docs/stable/core_extensions/vortex"> extension</a> in DuckDB, so I gave it a spin against a ~1GB Parquet file. The results were mixed: Vortex was faster, but not <em>crazy</em> faster, and the file size was only 3% smaller. I need to do more rigorous testing, but it looks promising!</p><h2>&#128218; What I Read / Watched</h2><ul><li><p><strong><a href="https://www.youtube.com/watch?v=UAK6dQbnknE">Agent Design Is Still Hard</a>:</strong> Armin Ronacher (creator of <a href="https://flask.palletsprojects.com/en/stable/">Flask</a>) shares gems on building agents with pragmatic takeaways. A must-read if you are building an agent!</p></li><li><p><strong><a href="https://github.com/kavishdevar/librepods">Librepods</a>:</strong> Someone reverse-engineered Apple&#8217;s protocol to unlock all AirPod features on Android. Note: you need a rooted phone unless you are on Oppo/OnePlus.</p></li><li><p><strong><a href="https://blog.cloudflare.com/18-november-2025-outage/">Post-mortem of Cloudflare&#8217;s outage</a>:</strong> The &#8220;Internet was down&#8221; again thanks to Cloudflare. Hats off to them for the detailed post-mortem so quickly. The root cause was a change to ClickHouse permissions that made a metadata query return duplicates, generating a bad config file. Insane how small issues can escalate to the world&#8217;s eye.</p></li><li><p><strong><a href="https://www.youtube.com/@dreamsofcode">Fixing standup the only way I know how</a>:</strong> Dreams of Code tries to automate stand-ups using n8n. TBH, might be over-engineered, but definitely an interesting attempt to solve the &#8220;problem&#8221; of the standup. Comments are interesting too.</p></li></ul><div><hr></div><p>I was speaking at the <a href="https://forward-data-conference.com/">Forward Data conference</a> today in Paris and the vibe was great!<br>Here&#8217;s me spreading the Ducklife (made with <a href="https://duckify.ai/">duckify.ai</a>)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xql0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xql0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 424w, https://substackcdn.com/image/fetch/$s_!xql0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 848w, https://substackcdn.com/image/fetch/$s_!xql0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 1272w, https://substackcdn.com/image/fetch/$s_!xql0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xql0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png" width="1184" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2250695,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/179837871?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xql0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 424w, https://substackcdn.com/image/fetch/$s_!xql0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 848w, https://substackcdn.com/image/fetch/$s_!xql0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 1272w, https://substackcdn.com/image/fetch/$s_!xql0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75930ce-a61f-4568-b6ba-f86481ee7579_1184x864.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ctlr+r #01: Toon, LLM CLIs]]></title><description><![CDATA[Hey there, I&#8217;m starting a new habit that I hope to stick with and that will help you: ctrl+r : a weekly recall from the terminal of my mind.]]></description><link>https://blog.mehdio.com/p/ctlrr-01-toon-llm-clis</link><guid isPermaLink="false">https://blog.mehdio.com/p/ctlrr-01-toon-llm-clis</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 16 Nov 2025 14:49:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/73c53631-05ac-4e6a-a186-f5e1dbf4b42b_410x283.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j6fa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j6fa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 424w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 848w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 1272w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j6fa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png" width="410" height="283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b69bc21-1e50-42ed-bddd-913199088558_410x283.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:283,&quot;width&quot;:410,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:6018,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/179052608?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j6fa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 424w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 848w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 1272w, https://substackcdn.com/image/fetch/$s_!j6fa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b69bc21-1e50-42ed-bddd-913199088558_410x283.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hey there, I&#8217;m starting a new habit that I hope to stick with and that will help you: <strong>ctrl+r</strong> : a weekly recall from the terminal of my mind. <br>Each issue includes:</p><ul><li><p>&#129504; something I&#8217;ve been thinking about</p></li><li><p>&#128736; something I&#8217;ve built, tried, or found useful</p></li><li><p>&#128218; something I read or watched, with my take </p></li></ul><p>No fluff. Just highlights from my dev brain across data, AI, tools, and indie building.</p><h2>&#129504; Toon vs JSON</h2><p>Last week, the <a href="https://github.com/toon-format/toon">TypeScript SDK for TOON hit 1.0</a> : a compact, token-efficient alternative to JSON designed for LLM prompts.<br>In short, instead of passing data to your LLM API through JSON like this:</p><pre><code><code>{
&nbsp; &#8220;users&#8221;: [
&nbsp; &nbsp; { &#8220;id&#8221;: 1, &#8220;name&#8221;: &#8220;Alice&#8221;, &#8220;role&#8221;: &#8220;admin&#8221; },
&nbsp; &nbsp; { &#8220;id&#8221;: 2, &#8220;name&#8221;: &#8220;Bob&#8221;, &#8220;role&#8221;: &#8220;user&#8221; },
&nbsp; &nbsp; { &#8220;id&#8221;: 3, &#8220;name&#8221;: &#8220;Charlie&#8221;, &#8220;role&#8221;: &#8220;admin&#8221; }
&nbsp; ]
}</code></code></pre><p>You would use Toon encoding like this:</p><pre><code><code>users[3]{id,name,role}:
  1,Alice,admin
  2,Bob,user
  3,Charlie,admin</code></code></pre><p>As you can see:</p><ul><li><p>JSON repeats keys (&#8221;id&#8221;, &#8220;name&#8221;, &#8220;role&#8221;) <strong>every row</strong> &#8594; more tokens, more cost.</p></li><li><p>TOON declares keys <strong>once</strong>, then streams values row-by-row &#8594; significantly fewer tokens, especially for large arrays (10k+ rows).</p></li></ul><p>It&#8217;s interesting to see that while Toon <strong>has been around for a month,</strong> the trigger for the hype was the 1.0 release of the TypeScript SDK. Indeed, most LLM API calls today are made through TypeScript. Meanwhile, the Python SDK is still very early and under heavy development, so Python-heavy data pipelines aren&#8217;t adopting it yet.</p><h2>&#128736; Multi-LLM CLI</h2><p>Like many of us, I&#8217;ve been juggling between LLM tools (be it UIs or CLIs like Claude Code or Gemini CLI), and it always presents the same challenges: finding past chats and having a common repository for prompts instead of framework-specific ones.<br>I&#8217;ve looked at multiple projects, and <a href="https://github.com/sigoden/aichat">aichat</a> comes closest to what I need. It&#8217;s missing a built-in TUI (I opened an issue <a href="https://github.com/sigoden/aichat/issues/1438">here</a> and prototyped one) to easily search for past conversations, but it has a decent REPL, and I&#8217;m already using it for some workflows.</p><pre><code><code># proofreader is prompt+model definition, here fixing grammar and lightweight edit
aichat --role %proofreader% &#8220;here&#8217;s my sentence that could use some grammar edits&#8221;</code></code></pre><p>You can then, of course, wrap it up in a bash alias command or even a <a href="https://www.raycast.com/">Raycast</a> keybinding so you just write and get the result back.<br>Other projects worth mentioning I checked:</p><ul><li><p><a href="https://github.com/sst/opencode">Opencode</a></p></li><li><p><a href="https://github.com/simonw/llm">llm</a> by Simon Willison</p></li></ul><h2>&#128218; What I Read / Watched</h2><ul><li><p><strong><a href="https://www.youtube.com/watch?v=UAK6dQbnknE">TUIs Are Perfect for LLM Chat</a></strong> Code to the Moon built <a href="https://github.com/MoonKraken/shore">shore</a> for the same problem I faced and explained above. Aside from the project itself, he made really good points, and his channel consistently produces high-quality software videos (especially if you like Rust!).</p></li><li><p><strong><a href="https://lucumr.pocoo.org/2025/9/29/90-percent/?ref=dailydev">90-percent</a></strong> Armin Ronacher (creator of <a href="https://flask.palletsprojects.com/en/stable/">Flask</a> and popular developer in the OSS world) shares his experience with coding assistants, their strengths, and where they fail. Great insights from a <em>truly</em> experienced developer!</p></li><li><p><a href="https://valatka.dev/2025/10/11/on-python-3-14-parallelization.html">Python 3.14 will change the way you parallelise code</a> There&#8217;s a lot of noise about 3.14 and free threading that could significantly speed up Python for some tasks. However, as the author said: <em>&#8220;I don&#8217;t think <strong>data pipelines</strong> will benefit from no-GIL though. Most don&#8217;t have latency requirements (rather throughput), and we already offload the bulk of CPU work.&#8221;</em></p></li><li><p><a href="https://luminousmen.substack.com/p/how-not-to-partition-data-in-s3-and">How Not to Partition Data in S3 (And What to Do Instead)</a> Interesting points highlighting that it&#8217;s generally more efficient to use <code>datetime</code> for partitioning large datasets on S3 (e.g., <code>my_path/dt=2026-11-01=events.parquet</code>) versus the common knowledge around Hive partitioning (<code>my_path/year=2026/month=11/day=01</code>).</p></li><li><p><a href="https://blog.google/technology/developers/file-search-gemini-api/">Gemini released their fully managed RAG service</a> also known as the &#8220;File Search Tool.&#8221; This represents a next level of abstraction, making it interesting not to have to manage vector databases and other components. It will probably be useful for many use cases, as it&#8217;s often overkill to set up such infrastructure for the value it provides.</p></li></ul><div><hr></div><p>Hope you all had a great week. I&#8217;m still figuring out what to program for my new NuPhy Air75 V3 keyboard keycaps... any suggestions???</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QDdq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QDdq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 424w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 848w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 1272w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QDdq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png" width="1456" height="952" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:952,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1646573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/179052608?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QDdq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 424w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 848w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 1272w, https://substackcdn.com/image/fetch/$s_!QDdq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f987f52-aa08-4553-b8e1-3b81eb4cbef8_1520x994.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[An actually useful MCP for web development]]></title><description><![CDATA[Eliminates the copy-paste hell with browser-tools]]></description><link>https://blog.mehdio.com/p/an-actually-useful-mcp-for-web-development</link><guid isPermaLink="false">https://blog.mehdio.com/p/an-actually-useful-mcp-for-web-development</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sat, 19 Jul 2025 14:46:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cwhY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cwhY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cwhY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 424w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 848w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 1272w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cwhY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png" width="484" height="272.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:484,&quot;bytes&quot;:138042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/168714199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cwhY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 424w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 848w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 1272w, https://substackcdn.com/image/fetch/$s_!cwhY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48262b56-01b5-433d-b9a5-f9de3f16b5ee_1604x902.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The MCP ecosystem is exploding &#8212;there are far more MCPs than actual users. We're drowning in noise. How do you figure out which MCP deserves your attention?</p><p><a href="https://mcp.so/">mcp.so</a> lists 16,024 MCPs as of today &#128561;. Some are weekend hackathon projects, others are official implementations backed by companies pushing their product's MCP integration.</p><p>There are also countless duplicates cluttering the space.</p><p>Most of them are useless. Most of them will die.</p><blockquote><p>As a reminder, <a href="https://www.anthropic.com/news/model-context-protocol">MCP (Model Context Protocol)</a> is Anthropic's open standard that lets AI assistants securely connect to external data sources and tools. Think of it as a bridge between your AI chat and the real world&#8212;databases, APIs, file systems, and more. Instead of manually feeding information back and forth, MCPs let your AI assistant directly interact with these systems.</p></blockquote><p><em>What makes an MCP worth your time?</em></p><p>Here's a simple test: look at what you're copy-pasting into your AI chat. If the AI could make decisions automatically and eliminate that copy-paste step, you've probably found a use case worth building an MCP for.</p><h2>Web development's copy-paste problem</h2><p>Web development has two major pain points that create endless copy-paste cycles:</p><p><strong>Runtime debugging</strong>: Issues that only surface when you're running the local server. Your code compiles fine, but something breaks at runtime. You find yourself constantly copying error messages from the console, network request failures, and stack traces into your AI chat.</p><p><strong>UI iteration hell</strong>: Describing visual changes is inherently difficult. "Make this button there next to x" doesn't translate well to precise CSS modifications. You end up taking screenshots, uploading them to your AI assistant, describing what's wrong, getting code suggestions, implementing changes, taking another screenshot, and repeating the cycle.</p><p>I sometimes create quick mockups in Figma as reference points, but I still end up in the screenshot &#8594; feedback &#8594; code &#8594; screenshot loop. It can be exhausting.</p><p>In fact, the core problem is rather simple : it's the friction between your development environment and your AI assistant. They exist in separate worlds, connected only by your manual copy-paste bridge.</p><h2>Browser Tools MCP</h2><p><a href="https://github.com/AgentDeskAI/browser-tools-mcp">browser-tools-mcp</a> is one of the genuinely useful MCPs out there (5.8k stars and counting). It eliminates the copy-paste friction by giving your AI assistant direct access to your browser environment.</p><p>Here's what I've been using it for :</p><p><strong>Console and network debugging</strong>: read console logs, inspect network requests, and analyze runtime errors. It sees the same error messages you do, but faster.</p><p><strong>Visual debugging</strong>: It can take screenshots of your application and analyze the UI directly.</p><p><strong>SEO analysis</strong>: flag on-page SEO issues, check meta tags, analyze page structure, and suggest improvements without you having to audit everything manually.</p><h3>Setup</h3><p>The browser tools MCP works by establishing a bridge between your browser and the MCP server. Here's how the architecture works:</p><p>The browser extension acts as a client that exposes browser APIs to the MCP server. When your AI assistant needs to interact with your webpage, it sends commands through the MCP protocol to the server, which then communicates with the browser extension.</p><p>This architecture is nice because it maintains security boundaries&#8212;the AI can't directly execute arbitrary JavaScript in your browser. Instead, it goes through the controlled MCP interface, which exposes only specific, safe operations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bJzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bJzB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 424w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 848w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 1272w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bJzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png" width="1407" height="1422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1422,&quot;width&quot;:1407,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138982,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/168714199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bJzB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 424w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 848w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 1272w, https://substackcdn.com/image/fetch/$s_!bJzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6976970f-4c65-4f21-bf83-58797a7e0a44_1407x1422.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Overview of the process between AI assistant and your browser</figcaption></figure></div><p>Getting started requires a few components:</p><ol><li><p><strong>Browser extension</strong>: Install the browser tools extension and enable it. This creates the bridge between your browser and the MCP server.</p></li><li><p><strong>Active browser tab</strong>: You need a running application to inspect. The extension works with any webpage, but it's most useful with your local development server.</p></li><li><p><strong>MCP server</strong>: Install and run the server with <code>npx @agentdeskai/browser-tools-mcp@latest</code>. This handles the communication between Claude and your browser.</p></li><li><p><strong>Server service</strong>: Run <code>npx @agentdeskai/browser-tools-server@latest</code> to start the service that manages browser interactions.</p></li></ol><p>This setup process reveals something important about MCP adoption: it's still early days. The fact that you need to run multiple services and install browser extensions shows that MCPs aren't quite plug-and-play yet.</p><p>But for developers who deal with the copy-paste problem daily, the setup overhead is worth it.</p><p>After that, you can just prompt it to check whatever logs (or screenshots) are needed. More data and context means better code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G78e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G78e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 424w, https://substackcdn.com/image/fetch/$s_!G78e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 848w, https://substackcdn.com/image/fetch/$s_!G78e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 1272w, https://substackcdn.com/image/fetch/$s_!G78e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G78e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png" width="468" height="596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:468,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/168714199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G78e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 424w, https://substackcdn.com/image/fetch/$s_!G78e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 848w, https://substackcdn.com/image/fetch/$s_!G78e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 1272w, https://substackcdn.com/image/fetch/$s_!G78e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F535ba4eb-3b90-4351-81d4-1a853972065e_468x596.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">example of interactions with the MCP in Cursor</figcaption></figure></div><h2>The bigger picture</h2><p>Browser tools MCP represents what good MCP development looks like: solving a real, specific problem that developers face daily. It's not trying to be everything to everyone&#8212;it focuses on browser interaction.</p><p>The key is identifying those repetitive, mechanical tasks that create friction between you and your AI assistant. Every copy-paste operation is a potential MCP waiting to be built.</p><p>Yes, setup for MCP tools like this one is not easy, and there is plenty of room for improvement.</p><p>That being said, it saves me countless copy-paste cycles.</p><p>Here's to the next MCP that makes me less of a monkey worker &#129346;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Is Gemini CLI worth it for Cursors users ?]]></title><description><![CDATA[Yes.]]></description><link>https://blog.mehdio.com/p/is-gemini-cli-worth-it-for-cursors</link><guid isPermaLink="false">https://blog.mehdio.com/p/is-gemini-cli-worth-it-for-cursors</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Tue, 08 Jul 2025 20:54:18 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/167849791/766a0dd1924b893d50454ec1b40d9992.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p>]]></content:encoded></item><item><title><![CDATA[Apple’s new "Container" Engine (Bye Docker?)]]></title><description><![CDATA[Hands-on review of Apple's new container framework announced at WWDC 2]]></description><link>https://blog.mehdio.com/p/apples-new-container-engine-bye-docker</link><guid isPermaLink="false">https://blog.mehdio.com/p/apples-new-container-engine-bye-docker</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 15 Jun 2025 13:23:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JJSZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JJSZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JJSZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 424w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 848w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 1272w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JJSZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png" width="636" height="357.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:636,&quot;bytes&quot;:757068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/165997034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JJSZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 424w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 848w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 1272w, https://substackcdn.com/image/fetch/$s_!JJSZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eaf7195-1d04-4f73-b435-5672232a025a_1604x902.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Apple just dropped something no one expected at WWDC (their annual developer conference) with the announcement of their own containerization framework for macOS. <br>And yes, everyone's asking the same question: <strong>is this the end of <a href="https://www.docker.com/products/docker-desktop/">Docker Desktop</a> and <a href="https://podman-desktop.io/">Podman</a> on macOS?</strong> These are two popular alternatives that developers use to run local linux containers today.</p><p>Let's dive into what Apple has built, explore its features and current limitations, and get our hands dirty with some actual code examples.</p><p>If you prefer watching over reading :</p><div id="youtube2-s06VHrb_Fss" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;s06VHrb_Fss&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/s06VHrb_Fss?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>Meet "Container" (yes, that's really the name)</h2><p>I have to say, Apple's developers aren't quite as creative as their marketing team when it comes to naming. The project is simply called <strong>Container</strong>, though if you check their <a href="https://developer.apple.com/videos/play/wwdc2025/346/">official announcement page</a>, it's referred to as the "Containerization Framework."</p><p>The framework consists of two main repositories:</p><ul><li><p><strong>Containerization</strong>: The core virtualization engine</p></li><li><p><strong>Container</strong>: The CLI tool that developers will use to create and manage lightweight VMs</p></li></ul><p>One fun fact that caught my attention: I know for certain that Apple actually hand-wrote this code because a <a href="https://github.com/apple/container/pull/122/files">PR was submitted to fix typos </a>in variable names and comments - something an AI agent will never do &#128517;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eWsY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eWsY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 424w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 848w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 1272w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eWsY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png" width="1456" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1882856,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/165997034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eWsY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 424w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 848w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 1272w, https://substackcdn.com/image/fetch/$s_!eWsY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79750be3-fb9e-4b59-a8f8-85a271ca1b41_3326x1322.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Kudos to Apple for the handcrafted code &#128079;</p><h2>The new architecture: one Virtual Machine (VM) per container</h2><p>The framework is built as an <strong>open-source Swift</strong> framework, released under the <strong>Apache 2.0 license</strong>. This is particularly interesting, considering Docker Desktop has not been free for commercial use for some time. If you&#8217;re using Docker Desktop at work, you probably owe Docker some money.</p><blockquote><p>Docker Desktop is free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects.</p></blockquote><p>The new architecture: one Virtual Machine (VM) per container</p><p>Here's where things get really interesting. A traditional container engine like Docker Desktop runs one large Linux virtual machine in the background, even when no containers are running. All your containers share this single VM, which can introduce security risks since files must pass through the shared virtual machine before reaching your container.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SB2r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SB2r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 424w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 848w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 1272w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SB2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png" width="1456" height="831" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:831,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1223447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/165997034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SB2r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 424w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 848w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 1272w, https://substackcdn.com/image/fetch/$s_!SB2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b535d4c-725a-472a-83fa-abfd62a0219d_4466x2548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Traditional container engine like Docker Desktop</figcaption></figure></div><p>Apple's approach is fundamentally different: <strong>each container gets its own dedicated virtual machine</strong>. This provides:</p><ul><li><p><strong>Strong security isolation</strong></p></li><li><p><strong>Complete container separation</strong></p></li><li><p><strong>Individual IP addresses for each container</strong></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W_W4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W_W4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 424w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 848w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 1272w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png" width="1456" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:238570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/165997034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W_W4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 424w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 848w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 1272w, https://substackcdn.com/image/fetch/$s_!W_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa564ee76-2e89-4a53-8269-7413afbcdb42_1628x879.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Apple&#8217;s container framework </figcaption></figure></div><p>That last point is nice - no more port forwarding headaches! You can access your local web services directly via the container's IP address.</p><p>Apple claims startup times are within seconds, which is pretty impressive for full VM isolation.</p><p>But let's confirm this and run the thing.</p><h2>Installing Container on macOS</h2><p>To install it, you can simply install the package installer file (<code>.pkg</code>) on their <a href="https://github.com/apple/container/releases">release notes page</a></p><p>Once done, you will first have to launch the service by :</p><pre><code><code>container system start</code></code></pre><p>If you are familiar with Docker for Desktop or Podman, you'll feel right at home as commands are pretty similar. And yes, it does support building from <code>Dockerfile</code></p><pre><code><code>$ container --help
OVERVIEW: A container platform for macOS

USAGE: container [--debug] &lt;subcommand&gt;

OPTIONS:
  --debug                 Enable debug output [environment: CONTAINER_DEBUG]
  --version               Show the version.
  -h, --help              Show help information.

CONTAINER SUBCOMMANDS:
  create                  Create a new container
  delete, rm              Delete one or more containers
  exec                    Run a new command in a running container
  inspect                 Display information about one or more containers
  kill                    Kill one or more running containers
  list, ls                List containers
  logs                    Fetch container stdio or boot logs
  run                     Run a container
  start                   Start a container
  stop                    Stop one or more running containers

IMAGE SUBCOMMANDS:
  build                   Build an image from a Dockerfile
  images, image, i        Manage images
  registry, r             Manage registry configurations

SYSTEM SUBCOMMANDS:
  builder                 Manage an image builder instance
  system, s               Manage system components</code></code></pre><p>To pull an image, you would do :</p><pre><code><code>container image pull python:3.12</code></code></pre><p>And to run for instance a <code>python</code> shell within the above image :</p><pre><code><code>container run -it python:3.12 python</code></code></pre><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.mehdio.com/subscribe?"><span>Subscribe now</span></a></p><h2>Current limitations</h2><p>Before you get too excited, there are some important caveats. The framework is designed primarily for <strong>macOS 26</strong> (the upcoming 2025 fall release, still in beta as the time of this writing), though it works on macOS 15 with limitations.</p><blockquote><p>Yes, the version jump from <strong>macOS 15 to 26</strong> is definitely confusing. Apple decided to align macOS version numbers with the current year. The transition might sound even more confusing at first, but it will make more sense over time&#8212;you&#8217;ll be able to tell which year the OS is from just by its version name!</p></blockquote><p>Key limitations as of now on <a href="https://github.com/apple/container/blob/main/docs/technical-overview.md#macos-15-limitations">macOS 15</a> :</p><ul><li><p><strong>Container-to-container networking isn't fully supported yet</strong>. This is a major limitation if you're running multi-container setups like a web server with a database.</p></li><li><p><strong>Container IP Address Management</strong> : there are still some rough edges around how container IP addresses are handled and accessed.</p></li></ul><h2>Performance comparison: Container vs Docker Desktop</h2><p>I ran some quick tests comparing Container with Docker Desktop by running a simple Python shell through a <code>python:3.12</code> image, and the results were interesting:</p><p>Surprisingly, pulling images was noticeably faster with Docker for Desktop compared to Container. I'm not entirely sure why, but one reason was probably because I had some layers already cached on the Docker local registry.</p><p>Looking at Activity Monitor:</p><p><strong>     Docker Desktop:</strong></p><ul><li><p>Large shared VM consuming ~3.5GB RAM</p></li><li><p>Multiple background processes</p></li><li><p>Consistent CPU usage even when idle</p><p></p><p><strong>Apple Container:</strong></p></li><li><p>Smaller individual VM footprints ~ 200MB RAM per container</p></li><li><p>Lower baseline resource usage</p></li><li><p>More efficient per-container resource allocation</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PxJa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PxJa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 424w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 848w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PxJa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2549874,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/165997034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PxJa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 424w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 848w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!PxJa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9647934-4893-422d-ae27-e3fd34567c47_4174x1376.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>However, keep in mind that Docker&#8217;s shared VM model means the overhead is amortized across all containers. With Apple&#8217;s approach, each container incurs its own overhead&#8212;but in practice, <strong>this is usually still lower</strong> than the Docker Desktop engine, since most developers typically run only 2&#8211;3 containers at a time.</p><h2>Exciting but early</h2><p>Apple's containerization framework represents a great approach to linux container isolation on macOS. The performance benefits and security improvements are nice, especially the individual VM architecture and direct IP addressing.</p><p>However, it's still very early days. The missing multi-container networking, uncertain Docker Compose support, and <a href="https://code.visualstudio.com/docs/devcontainers/containers">devcontainer</a> integration (for VSCode/Cursor) questions make it hard to recommend for use today.</p><p>That being said, I expect these feature gaps to be filled by the time macOS 26 reaches general availability&#8212;so let&#8217;s take it for another test drive in a few months!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Slow Death of Medium-Sized Software Companies]]></title><description><![CDATA[What if scaling was no longer the goal? And what would that mean for software engineers?]]></description><link>https://blog.mehdio.com/p/the-slow-death-of-medium-sized-software</link><guid isPermaLink="false">https://blog.mehdio.com/p/the-slow-death-of-medium-sized-software</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 01 Jun 2025 16:00:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NCSI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NCSI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NCSI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NCSI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:332984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164941888?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NCSI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!NCSI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c63cf0-0f41-491e-b9e9-fb97c1f4e003_1280x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here's my prediction for the future : <strong>Medium-sized software companies are dying.</strong> And it won&#8217;t be because of market crashes, VC winter, or the next AI wave killing jobs (well, maybe a little).</p><p>They&#8217;ll die because, for the first time ever, <em>they may become unnecessary</em>.</p><p>When I say <em>&#8220;software companies,&#8221;</em> I mean exactly that: businesses built purely on software. No factories. No physical supply chain. No custom silicon or overseas production dependencies. You might still get an AWS bill that looks like a ransom note, but that&#8217;s about as &#8220;operational&#8221; as it gets.</p><p>Software is light. And in 2025, with all things serverless, cloud-native, and generous free tiers, it&#8217;s lighter than ever.</p><p>AI has dramatically reduced the cost of shipping features and building MVPs. But I think the really wild shift isn&#8217;t in cost &#8212; it&#8217;s in <strong>team size</strong>.<br><br>Medium-sized companies are in the worst spot. Startups are nimble. Giants have capital and reach. But the ones in the middle? Too big to stay scrappy, too small to compete on scale.</p><p>Let&#8217;s unpack that &#8212; and what it means for the future of software engineering if that prediction plays out.</p><h2>Small teams, big power</h2><p>Thanks to AI and improved automation, small teams are now playing in the big leagues. I actually know a few solo-preneurs and/or small teams landing enterprise clients.</p><p>Small teams aren&#8217;t just fast at building products. They&#8217;re close to their customers. They have ultra-tight feedback loops. They can tailor solutions with speed and precision &#8212; while larger orgs are still scheduling the kickoff meeting for the kickoff meeting.</p><p>Everyone who's worked at a fast-growing company knows that scaling is painful.</p><p>Hiring takes time. Onboarding takes longer. Context sharing gets messy. And suddenly, the scrappy startup that shipped a major feature every week is now bogged down in process, sync meetings, and permissions management.</p><p>If you've ever been frustrated at work just because of a missing permission or a ticket stuck in limbo&#8230; I feel you.</p><p>With fewer people, you ship faster. You stay closer to your users. You kill features (or even whole products) quickly without causing internal revolts. And you let AI fill in the gaps that used to require entire departments.</p><p>What if staying small is not only <em>possible</em>, but preferable?</p><h2>A Better world for customers &#8212; and Engineers?</h2><p>Now that we acknowledge the possibility of this shift, what happens when the market is full of these small-but-mighty teams?</p><p>From a customer&#8217;s perspective, it might feel like a golden age. More options. More competition. Faster updates. Closer support.</p><p>Yes, discovery could get overwhelming. But honestly, that's a solvable problem &#8212; and far better than the alternative of stale monopoly software. Think of how exciting the indie game scenes are compared to their corporate counterparts (if you are a gamer like me, you know). Software starts to feel alive again.</p><p>From a software engineer's perspective, it&#8217;s a little more nuanced.</p><p>If the trend holds, we&#8217;ll see <strong>more jobs &#8212; but in smaller companies</strong>. That means:</p><ul><li><p>You&#8217;ll probably wear more hats. And that&#8217;s not a bad thing.</p></li><li><p>Job security in any one company could be lower &#8212; but you&#8217;ll gain experience faster, with more chances to work on different products throughout your career.</p></li><li><p>You'll be closer to the business, with a tighter feedback loop.</p></li></ul><p>You&#8217;ll learn about infrastructure, product decisions, customer feedback loops, and maybe even business models. You&#8217;ll feel the impact of what you build for real users.</p><p>This feels like a great opportunity for continuous learning. Sure, it won't be your cozy corporate job, but the growth opportunity will be endless.</p><h2>Generalists first</h2><p>If small companies become the new default, <strong>software engineers will need to think more like product builders</strong> &#8212; or even founders.</p><p>As in any small startup, you won&#8217;t just be writing code. You&#8217;ll be choosing tools, managing infrastructure, talking to users, prioritizing features and yes, sometimes answering support emails.</p><p>That means <strong>generalist skills are going to matter more</strong>: full-stack engineering, rapid prototyping, even basic design and copywriting.</p><p>Playing devil's advocate &#8212; there will still be a need for deep specialists.</p><p>There are plenty of domains where depth still wins. If you&#8217;re working on database systems, fintech, or medical software, you&#8217;ll need real expertise. AI can help with boilerplate, but it can&#8217;t replace judgment or domain knowledge.</p><p>For example, if you&#8217;re building a new payment platform, knowing how settlements work, how fraud detection operates, or how different regulatory environments interact is <em>not</em> something ChatGPT can fully solve for you. Especially in R&amp;D, fundamentals matter.</p><p>The difference is that specialists may increasingly become <strong>contracted or embedded</strong>, rather than hired into an in-house team. Small companies will bring in that deep knowledge when they need it, not assume they need a full-time expert for every vertical.</p><h2>What should you do now?</h2><p>If you're a software engineer today, this shift opens up real opportunities &#8212; but also calls for a mindset change.</p><p>First, embrace AI tools to increase your productivity. My key takeaway with AI is that you shouldn&#8217;t delegate the entire process. Even &#8220;vibe coding&#8221; requires domain knowledge. Keep learning the fundamentals and stay curious about how things work. The boring implementation code? Sure, let AI handle that.</p><p>Second, don&#8217;t fear small companies. You&#8217;ll probably learn more in 6 months at a 5-person startup than you will in 2 years at a large corporation. Learn to wear multiple hats.</p><p>Finally, the good news is : you can prototype all of this by yourself, as a solo-preneur. The best way to learn is to get your hands dirty. My own side project right now is <a href="https://subtldr.com/">subtldr</a> (yes, a small plug &#8212; but hey, you're getting this content for free, so I figured it's fair).</p><p>Maybe I&#8217;m overly optimistic. Or maybe we&#8217;re finally entering a more sustainable, more human phase of software?</p><p>Who knows, but let&#8217;s talk again in 2030.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Making Cursor smarter (and up to date)]]></title><description><![CDATA[Context is king &#8212; and documentation context rules.]]></description><link>https://blog.mehdio.com/p/making-cursor-smarter-and-up-to-date</link><guid isPermaLink="false">https://blog.mehdio.com/p/making-cursor-smarter-and-up-to-date</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Thu, 29 May 2025 12:31:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47ac6be-cfae-49ea-a176-adcfb41ec795_1601x911.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VTPx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VTPx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 424w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 848w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 1272w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VTPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png" width="582" height="342.03435934144596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1397,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:153166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164625031?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VTPx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 424w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 848w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 1272w, https://substackcdn.com/image/fetch/$s_!VTPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5a59050-813e-45a8-b9e7-7a09bc83044d_1397x821.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A lot of software engineers use AI daily to write code, but how many are actually taking advantage of all the features available to them?</p><p>Sure, you can craft solid prompts and rely on your technical knowledge to navigate the output. But in today&#8217;s world of rapid innovation, some teams &#8212; like Cursor &#8212; are shipping features at lightning speed. Should you care about all of them? Probably not.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Could some of them drastically improve your workflow with AI? Definitely.</p><p>If your AI often writes outdated API code or you&#8217;re constantly living on the bleeding edge (because hey, things move fast), then this blog post is for you.</p><blockquote><p><strong>Why <a href="http://cursor.com">Cursor</a>?</strong></p><p>I&#8217;ve been using Cursor for almost a year now, after switching back and forth with VSCode. While VSCode is starting to adopt features from Cursor, such as <a href="https://code.visualstudio.com/updates/v1_99">agent mode</a>, the implementation still lags. With recent layoffs, even if the VSCode team isn&#8217;t directly affected, I bet Cursor will continue to innovate at a faster pace, making it my preferred editor.</p></blockquote><h2>Docs context is king</h2><p>Let&#8217;s look at what I believe are the two most underused Cursor features: documentation context and Cursor rules.</p><p>In Cursor, under <code>Settings &gt; Cursor Settings &gt; Features &gt; Docs</code>, you can add documentation sources to be used as context in your prompts.</p><p>These sources are crawled and indexed. They can be:</p><ul><li><p>Documentation websites</p></li><li><p>API docs</p></li><li><p>Raw GitHub code (if open-source)</p></li></ul><p>When you add a custom documentation URL, you give it a name (an alias for your prompts), and Cursor crawls and indexes it for you.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xf4I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xf4I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 424w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 848w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 1272w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xf4I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png" width="1456" height="251" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/570a7080-e14f-41cb-befe-7936602424c0_1822x314.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:251,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63964,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164625031?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xf4I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 424w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 848w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 1272w, https://substackcdn.com/image/fetch/$s_!Xf4I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570a7080-e14f-41cb-befe-7936602424c0_1822x314.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Once these are added, you can reference them in your prompt using <code>@docs &lt;my alias name&gt;</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zm0j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zm0j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 424w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 848w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 1272w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zm0j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png" width="1084" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:1084,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57919,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164625031?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zm0j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 424w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 848w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 1272w, https://substackcdn.com/image/fetch/$s_!zm0j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe2aa5-6742-4b8b-89ae-cea358322a95_1084x306.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, there&#8217;s actually something faster than just adding the plain root URL of the documentation website. </p><p>Something that will make Cursor easier to crawl and index the documentation.</p><h2>llms.txt</h2><p>While <code>robots.txt</code> and <code>sitemap.xml</code> are designed for search engines, <a href="https://llmstxt.org/">LLMstxt.org</a> is a new standard optimized for LLMs. It provides site information in a format LLMs can easily parse.</p><p>It's an evolving standard, and many developer tool docs have started adopting it this past year as LLMs usage grew drastically. It solves a real problem: when AI scrapes raw HTML, it gets a lot of noise &#8212; navigation bars, JavaScript, CSS &#129314;.</p><p>This is especially important now because we will soon (or already have) more LLMs reading the docs than humans. <a href="https://x.com/karpathy">Andrej Karpathy</a> highlighted this trend shift in his <a href="https://x.com/karpathy/status/1914494203696177444">post</a>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VLb1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VLb1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 424w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 848w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VLb1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png" width="608" height="543.1878172588832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1056,&quot;width&quot;:1182,&quot;resizeWidth&quot;:608,&quot;bytes&quot;:216579,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164625031?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VLb1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 424w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 848w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!VLb1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa873d76d-e048-4694-ae76-ee0818d18856_1182x1056.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><code>llms.txt</code> offers clean, structured information optimized for AI, making updates much faster than re-crawling entire websites.</p><p>The specification defines two files:</p><ol><li><p><code>/llms.txt</code>: A structured view of your documentation navigation (like a Markdown-based <code>sitemap.xml</code>)</p></li><li><p><code>/llms-full.txt</code>: A single file containing all your documentation in one place</p></li></ol><p><strong>Quick example with Supabase documentation</strong></p><p>A lot of documentation website may highlight the llms.txt link directly as a button, but in general, you can just try `awesometool.com/docs/llms.txt`,  `docs.awesometool.com/llms.txt` or `myawesometool.com/llms.txt`</p><p>Supabase, interestingly, has different <code>llms.txt</code> files at `supabse.com/llms.txt` depending on the client API. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WLbN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WLbN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 424w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 848w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 1272w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WLbN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png" width="1406" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1406,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158199,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/164625031?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WLbN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 424w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 848w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 1272w, https://substackcdn.com/image/fetch/$s_!WLbN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1fe6fa-9518-4bcb-9b00-79a2184426bd_1406x520.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This shows that while there&#8217;s some standardization around <code>llms.txt</code>, the framework is still flexible and evolving. </p><h2>In action with rules</h2><p>Cursor rules live in .cursor/rules, and you can scope them using path patterns. Each rule is written in a .mdc file &#8212; a kind of supercharged Markdown designed for Cursor.</p><p>Unfortunately, as of today, you can&#8217;t reference <code>@docs</code> in rules &#8212; only static files in your repo as per discussion in the forum <a href="https://forum.cursor.com/t/can-we-reference-docs-files-in-the-rules/23300">here</a>.</p><p>You can find more Cursor rules at: https://cursor.directory/</p><p>I use Cursor rules to explain high-level setup and tech stack. Without them, the LLM might suggest alternatives instead of using what&#8217;s already in place. Cursor rules prevent that.</p><p>Example Cursor rule for <a href="https://mehdio.com/">my personal website</a>:</p><pre><code><code>You are an expert full-stack web developer focused on producing clear, readable Next.js code.

You always use the latest stable versions of Next.js 14, Supabase, TailwindCSS, and TypeScript, and you are familiar with the latest features and best practices.

Prompt Generation Rules:

- Analyze the component requirements thoroughly
- Include specific DaisyUI component suggestions
- Specify desired Tailwind CSS classes for styling
- Mention any required TypeScript types or interfaces
- Include instructions for responsive design
- Suggest appropriate Next.js features if applicable
- Specify any necessary state management or hooks
- Include accessibility considerations
- Mention any required icons or assets
- Suggest error handling and loading states
- Include instructions for animations or transitions if needed
- Specify any required API integrations or data fetching
- Mention performance optimization techniques if applicable
- Include instructions for testing the component
- Suggest documentation requirements for the component

General Component Creation Guidelines:

- Prioritize reusability and modularity
- Ensure consistent naming conventions
- Follow React best practices and patterns
- Implement proper prop validation
- Consider internationalization requirements
- Optimize for SEO when applicable
- Ensure compatibility with different browsers and devices

General Rules:

- Enable strict TypeScript (strict: true in tsconfig.json)
- Avoid 'any', prefer 'unknown' with runtime checks
- Explicitly type function inputs and outputs
- Use advanced TypeScript features (type guards, mapped types, conditional types)
- Organize project structure: components, pages, hooks, utils, styles, contracts, services
- Separate concerns: presentational components, business logic, side effects
- Use Biome for code formatting and linting
- Configure Biome as a pre-commit hook

Next.js Rules:

- Use dynamic routes with bracket notation ([id].tsx)
- Validate and sanitize route parameters
- Prefer flat, descriptive routes
- Use getServerSideProps for dynamic data, getStaticProps/getStaticPaths for static
- Implement Incremental Static Regeneration (ISR) where appropriate
- Use next/image for optimized images
- Configure image layout, priority, sizes, and srcSet attributes

TypeScript Rules:

- Enable all strict mode options in tsconfig.json
- Explicitly type all variables, parameters, and return values
- Use utility types, mapped types, and conditional types
- Prefer 'interface' for extendable object shapes
- Use 'type' for unions, intersections, and primitive compositions
- Document complex types with JSDoc
- Avoid ambiguous union types, use discriminated unions when necessary

TailwindCSS and shadcn/ui Rules:

- Use TailwindCSS utility classes for styling
- Avoid custom CSS unless absolutely necessary
- Maintain consistent order of utility classes
- Use Tailwind&#8217;s responsive variants for adaptive designs
- Leverage shadcn/ui components for rapid development
- Customize shadcn/ui components only when necessary
- Define and use design tokens in tailwind.config.js</code></code></pre><p>You can go pretty far with multiple rules, but even a high-level overview of your tech stack will already help a lot. It stops the LLM from blindly guessing your stack or suggesting duplicate libraries.</p><p>With a combination of rules and <code>@docs</code>, your answers will improve significantly. Again: <strong>context is king</strong>.</p><p>LLMs are like pets &#8212; they need to be fed properly.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mehdio's Tech (Data) Corner! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[macOS: Essential Productivity Hacks for Developers — No AI Needed]]></title><description><![CDATA[A fast, distraction-free workflow powered by open-source tools and keyboard-driven automation.]]></description><link>https://blog.mehdio.com/p/macos-essential-productivity-hacks</link><guid isPermaLink="false">https://blog.mehdio.com/p/macos-essential-productivity-hacks</guid><dc:creator><![CDATA[mehdio]]></dc:creator><pubDate>Sun, 04 May 2025 17:45:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GtDY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GtDY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GtDY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 424w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 848w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 1272w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GtDY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:494839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/162830715?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GtDY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 424w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 848w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 1272w, https://substackcdn.com/image/fetch/$s_!GtDY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4786b187-99e4-417c-b86e-15657f5ae31e_1600x896.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Yes - this is a macOs setup.</figcaption></figure></div><p>I&#8217;ve never been this productive on my Mac in the past two years. Sure, AI tools have helped a lot &#8212; but one of the key changes I made had nothing to do with AI. It&#8217;s much simpler than that.</p><p>I'm saving a ton of time just managing my laptop: opening new apps, switching tabs, or finding things is blazingly fast. It almost feels like mind control &#8212; but in reality, it's just a focused keyboard workflow. That&#8217;s the real key.</p><p>To do this, I use three open-source tools. In this blog, I&#8217;ll break down my setup step by step, how I use it, and why:</p><ul><li><p><a href="https://github.com/nikitabobko/AeroSpace">Aerospace</a></p></li><li><p><a href="https://github.com/FelixKratz/SketchyBar">SketchyBar</a></p></li><li><p><a href="https://www.raycast.com/">Raycast</a> (bonus)</p></li></ul><p>If you want a complete reference, you&#8217;ll find my full configuration in my <a href="https://github.com/mehd-io/dotfiles">dotfiles repository</a>.</p><h2>Level 0: Keyboard First</h2><p>Let me repeat: I don&#8217;t think you can be truly productive as a developer (or any app-intensive user) if you rely too much on your mouse. The keyboard unlocks so many underrated possibilities.</p><p>We often underestimate how slow it is to click through UI elements.</p><blockquote><p>Fun fact: Some banks and insurance companies still use old mainframe software where operators <em>only</em> use keyboards. I&#8217;ve worked on projects revamping those systems, and surprisingly, many operators were frustrated at being forced to use a mouse &#8212; even if the UI looked more modern and intuitive.</p></blockquote><p>Here&#8217;s a simple test: if you&#8217;re right-handed, try using the mouse with your left hand for a few days. It&#8217;ll be so painful that you&#8217;ll naturally start figuring out faster ways to navigate &#8212; with the keyboard.</p><p>Once you get past the initial friction of memorizing keyboard shortcuts, you&#8217;ll never go back.</p><h2>Level 1: Free Up Your Screen</h2><p>So you&#8217;ve just booted up your Mac, and you see that ugly dock taking up precious screen space.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AUN5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AUN5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 424w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 848w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 1272w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AUN5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6322027,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/162830715?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AUN5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 424w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 848w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 1272w, https://substackcdn.com/image/fetch/$s_!AUN5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd11967ff-ad49-48fd-9adc-e8145e93d6b7_3018x1690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A lot of vertical space lost</figcaption></figure></div><p>As developers, we spend most of our time in editors and browsers &#8212; every extra vertical pixel counts.</p><p>The first smart move? Shift the dock to the left and set it to auto-hide. Yes, it feels weird and empty at first. You might wonder: <em>How do I switch apps now?</em></p><h2>Level 2: App Shortcuts</h2><p>There are multiple ways to handle app shortcuts &#8212; even built-in ones on macOS.</p><p><a href="https://github.com/nikitabobko/AeroSpace">Aerospace</a>, a tiling window manager, also supports assigning shortcuts to apps, all from a single config file.</p><p>To install Aerospace with <a href="https://brew.sh/">Homebrew</a>, you simply do :</p><pre><code><code>brew install --cask nikitabobko/tap/aerospace</code></code></pre><p>Once launched, you&#8217;ll find its icon in the menu bar.</p><p>The configuration file is located at: <code>~/.config/aerospace/aerospace.toml</code></p><p>To create an app shortcut, use exec-and-forget and map it to a keybinding:</p><pre><code><code>alt-b = 'exec-and-forget open -a /Applications/Brave\ Browser.app'</code></code></pre><p>I typically use the first letter of the app or context : <code>alt+b</code> (browser), <code>alt+c</code> (code) and <code>alt+t</code> (terminal)</p><p>Now you have a clean, keyboard-based app launcher &#8212; and more screen space. On to the next level: window management.</p><h2>Level 3: Window Management</h2><p>This is where a tiling window manager shines. It eliminates floating window chaos and allows for a structured, keyboard-driven layout.</p><blockquote><p>What about <a href="https://github.com/koekeishiya/yabai">Yabai</a> ? I used Yabai for more than a year, and honestly, it integrates more natively but since macOs 15.2, <a href="https://github.com/koekeishiya/yabai/wiki/Disabling-System-Integrity-Protection">SIP</a> need to be disabled for some key features and it was a sad goodbye. If disabling SIP is not a blocker for you, I would recommend watching <a href="https://www.youtube.com/watch?v=J4SXh8UhiCQ">my video on Yabai setup</a>. That being said, Aerospace now covers most of the same features.</p></blockquote><p>To improve visual focus, I also recommend <a href="https://github.com/FelixKratz/JankyBorders">JankyBorders</a> &#8212; a lightweight tool that highlights the currently focused window.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S3VE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S3VE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 424w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 848w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S3VE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png" width="1456" height="785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:785,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2341568,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/162830715?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S3VE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 424w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 848w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!S3VE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb4de41e-d2f3-4004-805a-c58f1e200f5b_3000x1618.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Border cue with JankyBorders</figcaption></figure></div><p>You can install it through Homebrew too, and the default configuration is already pretty fine.</p><pre><code><code>brew tap FelixKratz/formulae
brew install borders</code></code></pre><p>Now back to <code>aerospace.toml</code>. Here are some useful shortcuts for managing windows:</p><pre><code><code># toggle window zoom
alt-f = 'fullscreen'

# toggle window split type
alt-e = 'layout tiles horizontal vertical'

# focus window
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'</code></code></pre><p>For instance, whenever I open a new window on my browser - you'll see it going next nicely. <br>I can now easily switch focus on another window still using the keyboard. That's where having a visual cue, with janky boarders, of which window is being focused right now, helps.<br>You can also change the split or zoom temporarily on one window.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;eae843b2-dee8-41a3-a12e-9a8f724ee565&quot;,&quot;duration&quot;:null}"></div><p>It starts to feel&#8230; blazingly fast.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#129506; Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Level 4: Workspaces</h2><p>With smart workspace management, I barely need a second monitor. I use one 90% of the time.</p><p>macOS has a built-in <em>Spaces</em> feature, but there&#8217;s no clean API to control it. Yabai can hack into it, but again &#8212; SIP needs to be disabled. Instead, Aerospace introduces its own <em>virtual</em> workspaces.</p><p>Why use workspaces?</p><ol><li><p>Dedicated apps on dedicated workspaces</p></li><li><p>Minimize clutter &#8212; aim for 1&#8211;2 apps per workspace</p></li></ol><p>You can automate app-to-workspace assignment like so:</p><pre><code><code>on-window-detected
if.app-id ='com.brave.Browser'
run = ['move-node-to-workspace 1']</code></code></pre><p>Navigate or move windows between workspaces with:</p><pre><code><code>alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-4 = 'workspace 4'
alt-5 = 'workspace 5'
alt-6 = 'workspace 6'
alt-7 = 'workspace 7'

# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
alt-shift-1 = 'move-node-to-workspace 1'
alt-shift-2 = 'move-node-to-workspace 2'
alt-shift-3 = 'move-node-to-workspace 3'
alt-shift-4 = 'move-node-to-workspace 4'
alt-shift-5 = 'move-node-to-workspace 5'
alt-shift-6 = 'move-node-to-workspace 6'
alt-shift-7 = 'move-node-to-workspace 7'</code></code></pre><p>I usually assign 5 workspaces to my main screen and 2 to a secondary:</p><pre><code><code>[workspace-to-monitor-force-assignment]
1 = 'main'                         
2 = 'main'                      
3 = 'main'                  
4 = 'main'                  
5 = 'main'
6 = 'secondary'
7 = 'secondary'</code></code></pre><p>Now I can either go to a given workspace using <code>alt+&lt;number&gt;</code> or the app shortcut I put on initially if I want to join a specific app, so I don't have even to remember the space.</p><p>If I want to move an app to another screen, it&#8217;s as simple as moving it to a workspace assigned to that screen.</p><p>For example, to move an app from the main screen to the secondary screen:</p><ol><li><p>Focus the app using its shortcut &#8212; for instance, <code>alt+t</code> for the terminal.</p></li><li><p>Move it to workspace 6 or 7 (which are mapped to the secondary screen) using <code>alt+shift+6</code>.</p></li></ol><p>Now you might be wondering: <em>&#8220;But Mehdi, how do you keep track of which apps are running in which workspace &#8212; especially if you&#8217;re constantly moving them around? Do you just memorize everything?&#8221;</em></p><p>That&#8217;s exactly where a custom status bar comes in.</p><blockquote><p>If you want a deeper dive into Aerospace, check out my walkthrough video </p><div id="youtube2-gjR2eiomRwo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;gjR2eiomRwo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/gjR2eiomRwo?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></blockquote><h2>Level 5: Custom Status Bar</h2><p><a href="https://github.com/FelixKratz/SketchyBar">Sketchybar</a> replaces the default macOS menu bar with a customizable one &#8212; and frees up space.<br>Be honest: how often do you use the default menu bar? Once a week? That&#8217;s wasted space.</p><p>First, we'll autohide the macOs menu bar in <code>System Settings &gt; Control Center</code> :</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s50f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s50f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 424w, https://substackcdn.com/image/fetch/$s_!s50f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 848w, https://substackcdn.com/image/fetch/$s_!s50f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 1272w, https://substackcdn.com/image/fetch/$s_!s50f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s50f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png" width="930" height="86" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e73f3b11-6b50-4d73-aef5-318a91956293_930x86.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:86,&quot;width&quot;:930,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17781,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.mehdio.com/i/162830715?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s50f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 424w, https://substackcdn.com/image/fetch/$s_!s50f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 848w, https://substackcdn.com/image/fetch/$s_!s50f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 1272w, https://substackcdn.com/image/fetch/$s_!s50f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73f3b11-6b50-4d73-aef5-318a91956293_930x86.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">System Settings for autohide menu bar</figcaption></figure></div><p>That means this one is still available if needed.</p><p>We'll use Sketchybar to display :</p><ul><li><p>Workspaces and applications running</p></li><li><p>Focused windows</p></li><li><p>System info (battery, Wi-Fi, sound)</p></li></ul><p>Install SketchyBar:</p><pre><code><code>brew tap FelixKratz/formulae  
brew install sketchybar</code></code></pre><p>Start with someone else&#8217;s config &#8212; <a href="https://github.com/FelixKratz/SketchyBar/discussions/47?sort=top">there are plenty of examples</a>. My config is also available in my <a href="https://github.com/mehd-io/dotfiles">dotfiles</a>.</p><p>The setup consists of:</p><ul><li><p><code>sketchybarrc</code> (main config file)</p></li><li><p>Plugins (Bash/Lua scripts)</p></li></ul><p>Thanks to Sketchybar I know now which workspace my apps are, plus what is the current active app/workspace selected.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e34fa175-db70-4076-b136-353ffff9e45b&quot;,&quot;duration&quot;:null}"></div><h2>Level S: Special God Mode</h2><p>That covers the full window management workflow: app shortcuts, workspace assignments, tiling layout, and a smart status bar.</p><p>One last tool I rely on a lot is <a href="https://www.raycast.com/">Raycast</a>. Think of it as a command palette on steroids.</p><p>With Raycast, I:</p><ul><li><p>Search files</p></li><li><p>Insert emojis</p></li><li><p>Launch specific git projects</p></li><li><p>Pick colors from my palette</p></li><li><p>And much more</p></li></ul><p>Honestly, Raycast deserves its own blog post. If you&#8217;re a productivity nerd, let me know &#8212; I&#8217;d love to dive deeper.</p><p>In the meantime, take care of yourself &#8212; and your keyboard.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.mehdio.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#129506; Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>