<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>AI History on Crafty CTO</title>
    <link>https://craftycto.com/tags/ai-history/</link>
    <description>Recent content in AI History on Crafty CTO</description>
    <image>
      <url>https://craftycto.com/images/crafty-logo.webp</url>
      <link>https://craftycto.com/images/crafty-logo.webp</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 10 Jun 2025 15:36:00 -0400</lastBuildDate><atom:link href="https://craftycto.com/tags/ai-history/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Two Interviews with OpenAI President Greg Brockman</title>
      <link>https://craftycto.com/micro/two-from-greg-brockman/</link>
      <pubDate>Tue, 19 Aug 2025 06:01:48 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/two-from-greg-brockman/</guid>
      <description>Highlights from two recent interviews by the Latent Space team with Greg Brockman</description>
      <content:encoded><![CDATA[<p>I had the pleasure to see <a href="https://en.wikipedia.org/wiki/Greg_Brockman">Greg Brockman</a> speak in person at <a href="https://www.youtube.com/watch?v=avWhreBUYF0">AIEWF25</a>&mdash;interviewed by <a href="https://www.swyx.io">Swyx</a>, with assistance from Nvidia&rsquo;s <a href="https://en.wikipedia.org/wiki/Jensen_Huang">Jensen Huang</a> via prerecorded video. The title of that talk, appropriately, was &ldquo;Define AI Engineer.&rdquo;</p>
<p>Then just three days ago, <a href="https://www.swyx.io">Swyx</a> and his <a href="https://www.latent.space">Latent.Space</a> podcast partner <a href="https://x.com/fanahova">Alessio Fanelli</a> scored another interview with Brockman, this time themed &ldquo;OpenAI&rsquo;s Road to AGI&rdquo; with its focus on the huge OpenAI news over the past two weeks, <a href="https://openai.com/blog/gpt-oss">GPT-OSS</a> and then <a href="https://openai.com/blog/gpt-5">GPT-5</a>.</p>
<p>Here are a few highlights from each.</p>
<h2 id="aiewf25-june-3rd">AIEWF25 June 3rd</h2>
<p>On how we structure codebases in the emerging AI era:</p>
<blockquote>
<p>The direction is something that is like just so compelling and incredible to me. The thing that has been the most interesting to see has been when you realize that the way your structure your codebase determines how much you can get out of <a href="https://openai.com/blog/openai-codex">Codex</a>, right? Like all of our existing codebases are kind of matched to the strengths of humans. But if you match instead to the strength of models which are sort of very lopsided, right? Models are able to handle way more like diversity of stuff but are not able to sort of necessarily connect deep ideas as much as humans are right now. And so what you kind of want to do is make smaller modules that are well tested that have tests that can be run very quickly and then fill in the details. The model will just do that, right? And it&rsquo;ll run the test itself.</p>
<p>The connection between these different components, kind of the architecture diagram, that’s actually pretty easy to do, and then it’s like filling out all the details that is often very difficult. And if you actually do that, you know, what I described also sounds a lot like good software engineering practice. But it’s just like sometimes because humans are capable of holding more of this like conceptual abstraction in our head, we just don’t do it – it’s a lot of work to write these tests and to flesh them out and that the model’s going to run these tests like a hundred times or a thousand times more than you will and so it’s going to care way way more. So in some ways the direction we want to go is build our codebases for more junior developers in order to actually get the most out of these models.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/two-from-greg-brockman/swyx_brockman1.png"><picture>
    <source type="image/webp" srcset="/micro/two-from-greg-brockman/swyx_brockman1_hu291831256732508820.webp 320w, /micro/two-from-greg-brockman/swyx_brockman1_hu12700017921144289134.webp 640w, /micro/two-from-greg-brockman/swyx_brockman1_hu15826634113806187884.webp 768w, /micro/two-from-greg-brockman/swyx_brockman1_hu12341122789749918366.webp 1024w, /micro/two-from-greg-brockman/swyx_brockman1_hu15009076985177841372.webp 1280w, /micro/two-from-greg-brockman/swyx_brockman1_hu14586163663709625986.webp 1536w, /micro/two-from-greg-brockman/swyx_brockman1_hu11226055395767597071.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/two-from-greg-brockman/swyx_brockman1_hu13914711105151296117.jpg 320w, /micro/two-from-greg-brockman/swyx_brockman1_hu17489964317315336843.jpg 640w, /micro/two-from-greg-brockman/swyx_brockman1_hu1524029245040428891.jpg 768w, /micro/two-from-greg-brockman/swyx_brockman1_hu5230971042755626074.jpg 1024w, /micro/two-from-greg-brockman/swyx_brockman1_hu14056270962775717314.jpg 1280w, /micro/two-from-greg-brockman/swyx_brockman1_hu2706287924186261884.jpg 1536w, /micro/two-from-greg-brockman/swyx_brockman1_hu2501159964871979218.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/two-from-greg-brockman/swyx_brockman1_hu17489964317315336843.jpg" width="3446" height="1856" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>On domain specific agents, in some ways foreshadowing GPT-5 as router:</p>
<blockquote>
<p>I think my perspective is that first of all, it’s all on the table, right? Maybe we reach a world where it’s just like the AIs are so capable that we all just let them write all the code. Maybe there’s a world where you have like one Al in the sky. Maybe it’s that you actually have a bunch of domain specific agents that require a bunch of of specific work in order to make that happen. [&hellip;]</p>
<p>I think the evidence has really been shifting towards this menagerie of different models—I think that’s actually really exciting. There’s different inference costs, there’s different trade-offs like just distillation works so well, there’s actually a lot of power to be had by models that are actually able to use other models.</p>
</blockquote>
<h2 id="latentspace-august-16">Latent.Space August 16</h2>
<p>Here I&rsquo;m taking advantage of the amazing AI-driven podcast app <a href="https://www.snipd.com">Snipd</a> and its quotes feature. If you click the link, you&rsquo;ll be taken directly to that spot in the podcast.</p>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">routing between models in GPT-5</a>:</p>
<blockquote>
<p>You have a reasoning model that we know is good for applications that require this intelligence, but you&rsquo;re okay waiting a little bit longer. We have a non-reasoning model that is great for applications where you want the answer fast.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/two-from-greg-brockman/brockman_swyx_alessio.png"><picture>
    <source type="image/webp" srcset="/micro/two-from-greg-brockman/brockman_swyx_alessio_hu15654022621511898987.webp 320w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu1379994735321962778.webp 640w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu10759937099458376478.webp 768w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu15937992870362709301.webp 1024w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu1595387713013726673.webp 1280w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu597663678086172641.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/two-from-greg-brockman/brockman_swyx_alessio_hu17379942450681417405.jpg 320w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu2198943248024680688.jpg 640w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu15501007492366531594.jpg 768w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu12550203595191040011.jpg 1024w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu17017189952302382622.jpg 1280w, /micro/two-from-greg-brockman/brockman_swyx_alessio_hu4770974927620526187.jpg 1536w" sizes="100vw" />
    
      <img src="/micro/two-from-greg-brockman/brockman_swyx_alessio_hu2198943248024680688.jpg" width="1601" height="831" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">why online learning and RL amplify model value</a>:</p>
<blockquote>
<p>When the models are extremely capable, the value of a token they generate is extremely high.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">compute as the primary bottleneck for progress</a>:</p>
<blockquote>
<p>The bottleneck is always compute. If you give us a lot of compute, we will find ways to iterate that actually make the most of that compute.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">OpenAI&rsquo;s Dota RL scaling experience</a> (<a href="https://openai.com/research/openai-five">Dota</a>):</p>
<blockquote>
<p>You come back to the office every week, they doubled the number of cores. And suddenly the agent, the true skill was going up and to the right.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/two-from-greg-brockman/brockman_ls.png"><picture>
    <source type="image/webp" srcset="/micro/two-from-greg-brockman/brockman_ls_hu2494602966499780913.webp 320w, /micro/two-from-greg-brockman/brockman_ls_hu4237604431001230514.webp 640w, /micro/two-from-greg-brockman/brockman_ls_hu5112511399272289270.webp 768w, /micro/two-from-greg-brockman/brockman_ls_hu1888463789084091015.webp 1024w, /micro/two-from-greg-brockman/brockman_ls_hu8582253909604932835.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/two-from-greg-brockman/brockman_ls_hu6376619516223835127.jpg 320w, /micro/two-from-greg-brockman/brockman_ls_hu17053214576341234098.jpg 640w, /micro/two-from-greg-brockman/brockman_ls_hu16728727570043998028.jpg 768w, /micro/two-from-greg-brockman/brockman_ls_hu11881995452821857532.jpg 1024w, /micro/two-from-greg-brockman/brockman_ls_hu13289050655432285122.jpg 1280w" sizes="100vw" />
    
      <img src="/micro/two-from-greg-brockman/brockman_ls_hu17053214576341234098.jpg" width="1381" height="837" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">transferability of learned reasoning skills to new domains</a>:</p>
<blockquote>
<p>Learning to solve hard math problems and write proofs turns out to actually transfer to writing program and competition problems.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">the purpose and importance of publishing a model spec</a>:</p>
<blockquote>
<p>The model spec is an example of where we&rsquo;ve made it very legible to the outside world what our intention is for this model to do.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">pricing, cost curves, and demand elasticity</a>:</p>
<blockquote>
<p>If you just make it more accessible and available to people, they will use way more of it.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/two-from-greg-brockman/swyx_alessio.png"><picture>
    <source type="image/webp" srcset="/micro/two-from-greg-brockman/swyx_alessio_hu18154636800837545804.webp 320w, /micro/two-from-greg-brockman/swyx_alessio_hu17377911426580861090.webp 640w, /micro/two-from-greg-brockman/swyx_alessio_hu17276178742545984337.webp 768w, /micro/two-from-greg-brockman/swyx_alessio_hu5050674097482683636.webp 1024w, /micro/two-from-greg-brockman/swyx_alessio_hu17506292355019239236.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/two-from-greg-brockman/swyx_alessio_hu9152379199239788045.jpg 320w, /micro/two-from-greg-brockman/swyx_alessio_hu12321821519529986857.jpg 640w, /micro/two-from-greg-brockman/swyx_alessio_hu11359753525898438902.jpg 768w, /micro/two-from-greg-brockman/swyx_alessio_hu1771998690948066851.jpg 1024w, /micro/two-from-greg-brockman/swyx_alessio_hu14191506002122476391.jpg 1280w" sizes="100vw" />
    
      <img src="/micro/two-from-greg-brockman/swyx_alessio_hu12321821519529986857.jpg" width="1434" height="819" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">how to structure codebases for AI integration</a>:</p>
<blockquote>
<p>You really build codebases around the strengths and weaknesses of these models. More self-contained units have very good unit tests that run super quickly and that have good documentation.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">structuring workloads and using multiple model instances</a>:</p>
<blockquote>
<p>You want to be a manager of not an agent, but of agents. And so that you need to, first of all, think about how your code base is structured.</p>
</blockquote>
<p>On <a href="https://share.snipd.com/episode/8dd5816c-f788-446e-9a8b-679b141718ce">the desired form factor for coding agents</a>:</p>
<blockquote>
<p>You want the pair form factor. You also want the remote async form factor. And you want it to be one entity that has knowledge and memory across all of this.</p>
</blockquote>
<p>I hope Brockman is as wise about navigating the political and moral minefields we face today, as he clearly is about technology.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Use GPT-5 with Playwright MCP to Auto-link Posts</title>
      <link>https://craftycto.com/micro/auto-link-with-gpt-5-and-playwright-mcp/</link>
      <pubDate>Sun, 10 Aug 2025 19:54:00 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/auto-link-with-gpt-5-and-playwright-mcp/</guid>
      <description>Quick Cursor workflow using GPT-5 plus Playwright MCP to add named-entity links in blog posts.</description>
      <content:encoded><![CDATA[<p>About a month ago, <a href="https://www.linkedin.com/in/jxnlco/">Jason Liu</a> wrote on <a href="https://www.linkedin.com/posts/jxnlco_copywriting-with-cursor-activity-7341510257602347009-r7x8?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAABcNZsBSiPCgo2Gr9o5anU48UXl131Q-_M">LinkedIn</a>:</p>
<blockquote>
<p>the cursor for writing is just cursor,</p>
<p>my copy writer uses @cursor_ai for most of the writing now.</p>
</blockquote>
<p>I strongly identified&mdash;the key here is that <a href="https://daringfireball.net/projects/markdown/">Markdown</a> is an outstanding content authoring language, and <a href="https://www.cursor.com">Cursor</a>, as an AI-enabled editor, is quite smart about applying AI to Markdown. I leveraged Cursor&rsquo;s AI capabilities mostly for repetitive tasks like scaffolding social media directory structures, transforming my hand-written posts into smaller, social-friendly versions for LinkedIn and Mastodon, and creating tables such as those in my <a href="/tags/aiewf2025/">AI Engineer World&rsquo;s Fair writeups</a>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Over the past few days, I&rsquo;ve been exploring what OpenAI&rsquo;s <a href="https://openai.com/index/introducing-gpt-5/">GPT-5</a> model(s) are capable of in Cursor. I&rsquo;ve also been seeking real-life, high-value <a href="https://modelcontextprotocol.io/">MCP</a> use cases. I stumbled into an awesome little scenario that gave me a chance to apply both GPT-5 with MCP together and shave hours off my post-preparation time. Full disclosure: I haven&rsquo;t yet tried this workflow with other models like my go-to <a href="https://www.anthropic.com/claude/sonnet">Sonnet 4</a>, and it&rsquo;s possible the same workflow may work there as well. That said, I suspect GPT-5&rsquo;s way of approaching problems might have an edge in this case. See what you think&mdash;this post is an example, 90% of the links in this post were GPT-5 created and these were all correct.</p>
<h3 id="problem-auto-link-generation-for-named-entities">Problem: Auto Link Generation for &ldquo;Named Entities&rdquo;</h3>
<p>My posting workflow is: write the post, then polish it&mdash;often with images and links. Links are one of those tasks that just take time: first, select which items (the ML term <a href="https://en.wikipedia.org/wiki/Named-entity_recognition">&ldquo;named entities&rdquo;</a> is exactly right here) need links, then web searching to find the right authoritative source to link to, then inserting the Markdown link syntax. It&rsquo;s not too hard, but after the hard mental effort of writing the post itself, I&rsquo;m rarely in the mood for another 30 minutes of researching and link-crafting.</p>
<p>Before GPT-5 and tool use, I&rsquo;ve had the AI auto-generate links, but hallucination was often a serious problem. The links would get generated, but half of them would be wrong. Even this broken workflow saved time, but it seemed like the AI should be able to do better.</p>
<h3 id="solution-cursor--gpt-5--playwrighthttpsplaywrightdev-mcp--reusable-prompt">Solution: Cursor + GPT-5 + <a href="https://playwright.dev/">Playwright</a> MCP + Reusable Prompt</h3>
<p>As I started to understand how GPT-5 approached problems, I decided to ask it to auto-generate links. It did the best job of any model I had tried so far, but there were still problems with bad links, as on its own, GPT-5 could web search, but it couldn&rsquo;t examine the results to make sure they were good and appropriate. So I had a little side chat with GPT-5 via <a href="https://openai.com/chatgpt/overview/">ChatGPT</a> about these, where we quickly concluded that a tool like Playwright, made available to GPT-5 via MCP and Cursor&rsquo;s very solid MCP support, would enable GPT-5 to check its work. After much MCP plumbing work (early days for to me still) and many iterations of prompts to GPT-5, I got it working! Now 80-90% of my post links are AI-generated and accurate, and my posts end up fully resource-linked, as opposed to slightly or not at all.</p>
<p>This was a valuable prompt, worthy of being captured and made reusable. So I had GPT-5 craft that prompt based on the conversations we&rsquo;d been having, and propose a solution for saving it for reuse.</p>
<p>Here&rsquo;s the current iteration of that prompt&mdash;note that this definitely suboptimal and needs work:</p>
<pre tabindex="0"><code>## Named Entity Linking with Playwright

ToDos:
- link to other content in the blog is fine, look for self-references such as &#34;my AI Engineer World&#39;s Fair writeups&#34;
- people links: if linkedin, need to make sure this is the right person

**Task**: Use Playwright to add markdown links for all important non-obvious named entities in a blog post, avoiding obvious/common terms.

**Instructions**:

1. **Identify Named Entities**: Scan the post content for specific products, companies, technologies, platforms, and services that readers might want to learn more about. Important: only link the first appearance of a term.

2. **Avoid Obvious Terms**: Do NOT link common/obvious terms like:
   - Operating systems (macOS, Windows, Linux)
   - Generic platforms (GitHub, Twitter, YouTube)
   - Common file formats or protocols
   - Basic technical terms

3. **Link Strategy**: Link to **informational pages**, not direct tool access:
   - Product announcement pages
   - Overview/feature pages
   - Company about pages
   - Documentation pages
   - Avoid login/signup pages

4. **Playwright Testing Process**:
   - Navigate to each potential link URL
   - If you detect a Cloudflare interstitial (e.g., &#34;Just a moment...&#34;, element id `cf-please-wait`, `[data-translate=&#34;checking_browser&#34;]`, or iframe URL containing &#34;challenge&#34;):
     - Wait up to 30s, checking every 1-2s
     - If still present, reload once and wait again up to 15s
     - If still present, mark as &#34;UNRESOLVED (CF gate)&#34; and continue
   - Verify the page loads and contains relevant content
   - Only use links that are accessible

5. **Link Format**: Use standard markdown format: `[Entity Name](URL)`

6. **Content Preservation**: 
   - ONLY modify links
   - Do NOT change any other content
   - Ignore linter errors (they aren&#39;t accurate for markdown)

**Example Entities to Link**:
- AI models (GPT-5, Claude, Sonnet 4, Opus 4.1)
- AI platforms (ChatGPT, Cursor, Claude Artifacts)
- Specific technologies (MCP, Claude Artifacts, ChatGPT Canvas)
- Specialized services (Claude Team)
- Companies that aren&#39;t extremely well known (Dagger, MotherDuck, MongoDB)
- Product names that aren&#39;t extremely well known

**Example Entities to Avoid**:
- Extremely well known companies (Apple, Google, OpenAI, Anthropic, Microsoft)
- Extremely well known product names (macOS, GitHub, Windows, Linux, iPhone)
- Basic web platforms
- Common file formats
- Generic technical terms

**Output**: Update the markdown file with appropriate links while preserving all other content exactly as-is.
</code></pre><div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Check out the <a href="https://maven.com/p/11e973/copywriting-with-cursor">Maven video</a> Jason and his copywriter <a href="https://www.linkedin.com/in/taylor-bell-0644b131/">Taylor Bell</a> did on copywriting with AI&mdash;really advanced on both the tech and science-of-great-copywriting fronts.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Early GPT-5 Impressions</title>
      <link>https://craftycto.com/micro/early-gpt-5-impressions/</link>
      <pubDate>Sat, 09 Aug 2025 06:00:00 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/early-gpt-5-impressions/</guid>
      <description>My vibe assessment: different, powerful, bumpy launch</description>
      <content:encoded><![CDATA[<p>I had a chance to get early experience with the new <a href="https://openai.com/index/introducing-gpt-5/">GPT-5</a> model(s) yesterday and this morning:</p>
<ul>
<li>In two flavors of <a href="https://openai.com/chatgpt/overview/">ChatGPT</a>: browser interface and macOS native app, including code generation inside a ChatGPT <a href="https://openai.com/index/introducing-canvas/">canvas</a></li>
<li>In <a href="https://www.cursor.com">Cursor</a> as its coding model</li>
</ul>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/early-gpt-5-impressions/gpt5_macos.png"><picture>
    <source type="image/webp" srcset="/micro/early-gpt-5-impressions/gpt5_macos_hu6066577046527470273.webp 320w, /micro/early-gpt-5-impressions/gpt5_macos_hu15487300892219872600.webp 640w, /micro/early-gpt-5-impressions/gpt5_macos_hu16938528598757482080.webp 768w, /micro/early-gpt-5-impressions/gpt5_macos_hu6313930793548227663.webp 1024w, /micro/early-gpt-5-impressions/gpt5_macos_hu15101475725982181735.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/early-gpt-5-impressions/gpt5_macos_hu7709442907568880818.jpg 320w, /micro/early-gpt-5-impressions/gpt5_macos_hu8545030730759076498.jpg 640w, /micro/early-gpt-5-impressions/gpt5_macos_hu7846707855554626735.jpg 768w, /micro/early-gpt-5-impressions/gpt5_macos_hu17068652097357875328.jpg 1024w, /micro/early-gpt-5-impressions/gpt5_macos_hu14265789895823189748.jpg 1280w" sizes="100vw" />
    
      <img src="/micro/early-gpt-5-impressions/gpt5_macos_hu8545030730759076498.jpg" width="1412" height="1042" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I had a juicy challenge for ChatGPT with the GPT-5 model: at TSIP, we hit a problem with a mathematical formula used in our advanced soil sample design process, and had to rework the formula. I had been working in <a href="https://www.anthropic.com/claude">Claude</a>, using <a href="https://www.anthropic.com/claude/sonnet">Sonnet 4</a>, then upgrading to <a href="https://www.anthropic.com/">Anthropic</a>&rsquo;s smartest model, <a href="https://www.anthropic.com/claude/opus">Opus 4.1</a>, when the going got tough, creating interactive models as <a href="https://support.anthropic.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them">Claude Artifacts</a>. Then I ran out of tokens in my <a href="https://www.anthropic.com/team">Claude Team</a> account, and rather than waiting, picked up the work in process and jumped over to ChatGPT, where I was happy to see the GPT-5 model available, some of the time &hellip; Part of the bumpy launch was the GPT-5 rollout. My experience was that GPT-5 appeared in my <a href="https://openai.com/chatgpt/team/">Team accounts</a> first, and my personal <a href="https://openai.com/chatgpt/pricing/">Plus account</a> later.</p>
<p>Over in ChatGPT, GPT-5 was able to ingest Claude Opus&rsquo;s Artifact code, along with the chat transcript for context, and its first interactive canvas was already better than what Opus had produced in a couple of iterations&mdash;though GPT-5 had the benefit of Opus&rsquo;s work. We thought we had the formula figured out, but then ran into problems when we tested the full range of possible inputs. GPT-5 impressed with highly creative&mdash;and ultimately successful&mdash;suggested solutions.</p>
<p>The bumpy rollout was evident in other ways during this work&mdash;at several points, GPT-5 wiped its canvas code, which fortunately I had saved off, and also lost its ability to directly edit code in the canvas.</p>
<p>Once the formula was solved, I needed to document it and capture the proof of concept canvas code in our GitHub repo, so I jumped over to Cursor, apparently a GPT-5 launch partner as they had it integrated as soon as <a href="https://openai.com/about/">OpenAI</a> unleashed GPT-5 on the world. Here, GPT-5&rsquo;s &ldquo;different&rdquo; nature became apparent; chatting with GPT-5-as-coding-model, to me, has a clearly different tone and cadence than interacting with other models. GPT-5 is, among other things, a multi-model router, and you could see it considering: &ldquo;Hmmm &hellip; how tough a question is this? Pretty tough, it seems, let me engage my hard thinking mode (model)&rdquo; &hellip; this approach worked well on all of the tasks I&rsquo;ve sent its way so far, both in Cursor and in ChatGPT when creating the interactive canvas proof of concept.</p>
<p>All in all: OpenAI is definitely moving the state the art forward here with GPT-5, and also giving the competitive landscape a good kick in the ass with aggressively good pricing. Welcome, GPT-5!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Running OpenAI&#39;s gpt-oss on Mac Mini with MLX</title>
      <link>https://craftycto.com/micro/gpt-oss-mlx-mac-mini/</link>
      <pubDate>Wed, 06 Aug 2025 08:00:00 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/gpt-oss-mlx-mac-mini/</guid>
      <description>Thanks to LM Studio and the community, it&amp;#39;s insanely easy. And gpt-oss is insanely good.</description>
      <content:encoded><![CDATA[<p>OpenAI dropped their open source, <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-licensed</a> <a href="https://openai.com/open-models/">&ldquo;gpt-oss&rdquo; models</a> yesterday, which obviously is getting a lot of attention.</p>
<p>I&rsquo;ve experimented with local models over the years, mainly to assess &ldquo;how smart is it?&rdquo; and &ldquo;how badly does it eat up local resources?&rdquo; Generally they weren&rsquo;t really something I&rsquo;d use in anger when I had access to much more powerful OpenAI and <a href="https://www.anthropic.com/">Anthropic</a> models.</p>
<p>I hadn&rsquo;t done a local LLM install for quite a while though, not since I got my M4 Mac Mini with 64GB of unified CPU/GPU memory &hellip; and gpt-oss is a full reasoning model, like OpenAI&rsquo;s <a href="https://openai.com/index/openai-o3">o3</a>, so it seemed like the time was right to do another local model eval.</p>
<p>Several wows here:</p>
<ul>
<li>Wow&mdash;it is so easy to get local models running these days. <a href="https://lmstudio.ai/">LM Studio</a> is amazing.</li>
<li>Wow&mdash;the &ldquo;local models&rdquo; community is incredible. Within 24 hours, someone had a fully-optimized-for-Mac version of gpt-oss (using Apple&rsquo;s <a href="https://github.com/ml-explore/mlx">MLX</a> framework) was ready and waiting for download in LM Studio.</li>
<li>Wow&mdash;gpt-oss is a for-real powerful model, not a toy like I&rsquo;d experimented with a year or two back.</li>
</ul>
<p>I had a few research questions floating around that I hadn&rsquo;t had a chance to ask o3 about yet, so just for grins I decided to throw them at gpt-oss. I got a strong, useful, reasoning-grade responses, such as this complex topic relating to the <a href="https://gohugo.io/">Hugo</a> static site generator:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini.png"><picture>
    <source type="image/webp" srcset="/micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu12156512947336471446.webp 320w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu12723794839415305637.webp 640w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu14357153214874659406.webp 768w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu16608444733650435646.webp 1024w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu3569548239875095974.webp 1280w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu6127025594201602967.webp 1536w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu12259039851272362423.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu7183381615529189044.jpg 320w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu5070517471951157441.jpg 640w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu6589025825779226543.jpg 768w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu3169738475768924058.jpg 1024w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu18050262742012249519.jpg 1280w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu16050905115251314376.jpg 1536w, /micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu440557965021418502.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/gpt-oss-mlx-mac-mini/gpt_oss_mac_mini_hu5070517471951157441.jpg" width="2196" height="1693" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Verdict: good enough to actually use.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Orta Therox: 6 Weeks of Claude Code</title>
      <link>https://craftycto.com/elsewhere/orta-claude-code-six-weeks/</link>
      <pubDate>Sat, 02 Aug 2025 10:00:00 -0600</pubDate>
      
      <guid>https://craftycto.com/elsewhere/orta-claude-code-six-weeks/</guid>
      <description>Orta Therox reflects on six weeks using Claude Code for programming, describing it as transformative for maintenance tasks and side projects</description>
      <content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/ortatherox/">Orta Therox</a>&rsquo;s <a href="https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/">retrospective on six weeks with Claude Code</a> is one of the most compelling accounts I&rsquo;ve read of how AI coding assistants are transforming development workflows. His experience mirrors my own observations about the technology&rsquo;s impact on programming productivity.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>The most striking aspect is his description of how maintenance tasks that would traditionally require weeks of dedicated effort can now be accomplished as &ldquo;side projects&rdquo; while working on other things:</p>
<blockquote>
<p>Converting hundreds of React Native components to just React
Replaced 3 non-trivial RedwoodJS systems with home-grown or mature, supported replacements
Built complex REPLs for multiple internal and external projects
Switched almost every db model to have a consistent &lsquo;flags&rsquo; system for booleans
Converted from Jest to Vitest
Created our front-end testing strategies for React</p>
</blockquote>
<p>This list represents what would typically be years of technical debt backlog, completed in just over a month and a half. The key insight is that these tasks &ldquo;do not need to be treated as debt&rdquo; when you have the right tools&mdash;they become manageable background work.</p>
<p>Orta&rsquo;s comparison to the &ldquo;introduction of photography&rdquo; period is particularly apt. Just as photography didn&rsquo;t eliminate painting but changed its role and accessibility, AI coding assistants are fundamentally altering what it means to be a programmer. The ability to &ldquo;instantly create a whole scene instead of going line by line, word by word&rdquo; represents a new paradigm of expression.</p>
<p>His &ldquo;Write First, Decide Later&rdquo; approach is especially valuable&mdash;using Claude Code to explore ideas before fully committing to them, then deleting the experimental code if it doesn&rsquo;t work out. This lowers the barrier to experimentation dramatically.</p>
<p>The post also touches on the collaborative aspects, with his &ldquo;Two Clones lifestyle&rdquo; approach and how it&rsquo;s changing game design workflows at Puzzmo. The ability to rapidly prototype and iterate is transforming their development process from weeks of planning to hours of implementation.</p>
<p>I need to figure out Therox&rsquo;s trick for getting Claude conversations into Adium-themed expandables &hellip; might have to reach out!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I use Cursor to help me author pieces in this blog, Crafty&rsquo;s Illustrated. Cursor generally does the grunt work of creating content directories and markdown stubs. I almost never let the LLM write the actual content. This post is an exception&mdash;the LLM wrote and I did post-edits&mdash;and I think whatever model Cursor selected did a nice job on this.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI Engineer World&#39;s Fair 2025: My Day 2 Highlights</title>
      <link>https://craftycto.com/blog/aiewf2025-my-day-2-highlights/</link>
      <pubDate>Fri, 01 Aug 2025 16:36:00 -0400</pubDate>
      
      <guid>https://craftycto.com/blog/aiewf2025-my-day-2-highlights/</guid>
      <description>My observations on Day 2 of the AI Engineer World&amp;#39;s Fair 2025</description>
      <content:encoded><![CDATA[<p>In my opinion, the two core days of the AI Engineer World&rsquo;s Fair 2025 in San Francisco represent the ultimate condensation of the state of AI, delivered by many of the the brightest minds in the field. This post covers my Day 2 experience&mdash;in case you missed it, here&rsquo;s my <a href="/blog/aiewf2025-my-day-1-highlights/">Day 1 recap</a>.</p>
<p>I&rsquo;m slow publishing this, for which I feel badly, but re-watching thoughtfully 4-8 weeks after seeing the sessions in person has been a tremendous learning exercise for me, and will, I hope, add to the power of my observations.</p>
<p>Here&rsquo;s a quick table of contents; click to jump to the details.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Section</th>
          <th style="text-align: left">Session</th>
          <th style="text-align: left">Speaker</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">Morning Keynotes</td>
          <td style="text-align: left"><a href="#gemini-25-pro-06-05-launch---a-year-of-shipping-and-what-comes-next">Gemini 2.5 Pro 06-05 Launch - A Year of Shipping and What Comes Next</a></td>
          <td style="text-align: left">Logan Kilpatrick (Google DeepMind)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#thinking-deeper-in-gemini">Thinking Deeper in Gemini</a></td>
          <td style="text-align: left">Jack Rae (Google DeepMind)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#containing-agent-chaos-use-container-launch">Containing Agent Chaos (use-container launch)</a></td>
          <td style="text-align: left">Solomon Hykes (Dagger)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#infrastructure-for-the-singularity">Infrastructure for the Singularity</a></td>
          <td style="text-align: left">Jesse Han (Morph)</td>
      </tr>
      <tr>
          <td style="text-align: left">SWE Agent Track</td>
          <td style="text-align: left"><a href="#devin-20-and-the-future-of-swe">Devin 2.0 and the Future of SWE</a></td>
          <td style="text-align: left">Scott Wu (Cognition)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#your-coding-agent-just-got-cloned">Your Coding Agent Just Got Cloned</a></td>
          <td style="text-align: left">Rustin Banks (Google Labs)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#the-agent-awakens">The Agent Awakens</a></td>
          <td style="text-align: left">Christopher Harrison (GitHub)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#dont-get-one-shotted">Don&rsquo;t get one-shotted</a></td>
          <td style="text-align: left">Tomas Reimers (Graphite)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#claude-code--the-evolution-of-agentic-coding">Claude Code &amp; the evolution of Agentic Coding</a></td>
          <td style="text-align: left">Boris Cherny (Anthropic)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#software-dev-agents-what-works--what-doesnt">Software Dev Agents: What Works &amp; What Doesn&rsquo;t</a></td>
          <td style="text-align: left">Robert Brennan (All Hands AI)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#beyond-the-prototype">Beyond the Prototype</a></td>
          <td style="text-align: left">Josh Albrecht (Imbue)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#ship-production-software-in-minutes-not-months">Ship Production Software in Minutes, Not Months</a></td>
          <td style="text-align: left">Eno Reyes (Factory AI)</td>
      </tr>
      <tr>
          <td style="text-align: left">Afternoon Keynotes</td>
          <td style="text-align: left"><a href="#trends-across-the-ai-frontier">Trends across the AI Frontier</a></td>
          <td style="text-align: left">George Cameron (Artificial Analysis)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#state-of-ai-engineering-2025">State of AI Engineering 2025</a></td>
          <td style="text-align: left">Barr Yaron (Amplify Partners)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#fun-stories">Fun Stories from Building OpenRouter and Where All This is Going</a></td>
          <td style="text-align: left">Alex Atallah (OpenRouter)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#the-new-code">The New Code</a></td>
          <td style="text-align: left">Sean Grove (OpenAI)</td>
      </tr>
  </tbody>
</table>
<h2 id="gemini-25-pro-06-05-launch---a-year-of-shipping-and-what-comes-next">Gemini 2.5 Pro 06-05 Launch - A Year of Shipping and What Comes Next</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/logankilpatrick/">Logan Kilpatrick</a> (<a href="https://deepmind.google/">Google DeepMind</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=1217s">Session video</a></p>
<p>My level of respect for Google as a model lab has serioiusly lagged Anthropic and OpenAI, but I came away from Logan Kilpatrick&rsquo;s and Jack Rae&rsquo;s sessions recognizing how serious a player they are&mdash;very strong today with a great pipeline. Google DeepMind officially launched their most powerful model to date, Gemini 2.5 Pro, live at the event. &ldquo;I think [2.5 Pro] is setting the stage for the future of Gemini. I think 2.5 Pro for us internally and I think in the perception from the developer ecosystem was the turning point which was super exciting. It&rsquo;s awesome to see the momentum. We&rsquo;ve got a bunch of other great models coming as well.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu235753493892740691.webp 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu9863160239201677922.webp 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu3689574253826967671.webp 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu12602815528595852662.webp 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu13264853592760720527.webp 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu8387857104166789258.webp 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu15838536561055061796.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu6614260341149681212.jpg 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu4510199667256838201.jpg 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu8780613822994715869.jpg 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu15992618545704656192.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu8356425244984378885.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu12503377231444408877.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu1345791408324004729.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_25_pro_hu4510199667256838201.jpg" width="2942" height="1254" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Kilpatrick highlighted a year of Gemini Progress: &ldquo;It feels like 10 years of of Gemini stuff packed into the last 12 months, which has been awesome&rdquo;&mdash;and talked about how so much Google research is coming together in the new Gemini models: &ldquo;All of these different research bets across Deep Mind [are] coming together to build this incredible mainline Gemini model.  What is the DeepMind strategy? What&rsquo;s the advantage for us building models? &hellip; the interesting thing to me is this breadth of research happening across science and Gemini and robotics and things like that &hellip; all that actually ends up upstreaming into the mainline models which is super exciting.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu6785846834219634744.webp 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu151645066056797986.webp 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu14451543937877676049.webp 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu7137934718971165996.webp 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu9714588492920517500.webp 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu12873236981254952646.webp 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu14795010011455640048.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu9132122688286908369.jpg 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu10604924036240023538.jpg 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu13682268260154968980.jpg 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu14111888209104885988.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu6116545622566308193.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu2090057695900429168.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu17492058990413483856.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_year_hu10604924036240023538.jpg" width="2756" height="1458" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>He emphasized it&rsquo;s &ldquo;not just the pace of innovation but the pace of adoption &hellip; a 50x increase in the amount of AI inference that&rsquo;s being processed uh through Google servers from one year ago to um last month &hellip;&rdquo; and highlighted the reception to VEO: &ldquo;It&rsquo;s burning all the TPUs down.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu1567764956410496581.webp 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu15667546438216144955.webp 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu17640338321390757822.webp 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu2146847691385076353.webp 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu15941830614007726456.webp 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu10419764396905813679.webp 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu7453917897507858597.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu15157361214432604202.jpg 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu17885094172626143661.jpg 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu1269473117212817538.jpg 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu6023134506848705052.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu3644545262543952924.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu14310013253867795808.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu17307908612667145864.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_adoption_hu17885094172626143661.jpg" width="2850" height="1138" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Among a number of future themes, he says Google models will be increasingly &ldquo;agentic by default.&rdquo; All in all, an impressive story from Google DeepMind.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu15698381519887106776.webp 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu11282121895036461354.webp 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu159383636396882571.webp 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu17178664807607502220.webp 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu14302445819406693400.webp 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu11356315695219727208.webp 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu17201626215540028757.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu586540946577893791.jpg 320w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu13867238255254251190.jpg 640w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu17353203301491908590.jpg 768w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu17664155090373757466.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu102852268381403632.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu9339859516734319135.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu9492978631837471753.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/kilpatrick_gemini_future_hu13867238255254251190.jpg" width="2834" height="1250" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="thinking-deeper-in-gemini">Thinking Deeper in Gemini</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/jackrae/">Jack Rae</a> (<a href="https://deepmind.google/">Google DeepMind</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=1943s">Session video</a></p>
<p>Google DeepMind&rsquo;s Jack Rae did a great job taking us back in time to the first language models up to the present day, with emphasis on test-time compute. (Late-breaking news: Rae has left Google to join Meta, likely as part of their new Superintelligence Labs organization.)</p>
<p>Traditional language models are trained to respond immediately to requests, meaning there is a constant, very limited amount of compute applied at test-time. It&rsquo;s possible to increase TTC by using a larger model, but then all requests are forced to this fixed, larger amount of compute. Not a good scaling approach&mdash;much better is to train models that are designed to loop. Loop iteration scale is dynamic, so we can get orders of magnitude more TTC, with control over how hard the model &ldquo;thinks.&rdquo; (Later Rae mentions that &ldquo;thinking budgets&rdquo; are now part of the API in the Gemini Flash 2.5 and Pro 2.5 models. Developers get fine-grained control over how much TTC gets applied.)</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu5871868557804433363.webp 320w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu1067057150180813475.webp 640w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu14577951656087632386.webp 768w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu16765990453118125085.webp 1024w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu82160810396726936.webp 1280w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu7934042332483353177.webp 1536w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu15776666686732562906.jpg 320w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu7377454333344124290.jpg 640w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu17610370170970033042.jpg 768w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu3614657495037545780.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu8905873071489371500.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu9865538562970873926.jpg 1536w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/rae-ttc-bottleneck_hu7377454333344124290.jpg" width="1689" height="766" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu7729846747267456456.webp 320w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu15589322939265239763.webp 640w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu2400880224069697285.webp 768w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu14954592890931987044.webp 1024w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu9202349564489692035.webp 1280w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu6033569055815997283.webp 1536w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu5201758167572210904.jpg 320w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu11796855562890795506.jpg 640w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu7929231655859372256.jpg 768w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu2714112570648162046.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu10591501750378778920.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu9094549528552377448.jpg 1536w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/rae-loop-scale-ttc_hu11796855562890795506.jpg" width="1616" height="749" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Scaling test-time compute delivers benefits across all model paradigms&mdash;there&rsquo;s a feedback loop effect. If you wonder &ldquo;how can model (AI) progress keep accelerating?&rdquo; this is a great example: scaled TTC feeds back to accelerate develeopment of more powerful base models.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu12981540905030175546.webp 320w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu15804332698758871668.webp 640w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu65287006101171298.webp 768w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu5470534139735033648.webp 1024w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu6331334747021886346.webp 1280w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu18028849852928482313.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu17223651784230490756.jpg 320w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu14796981150731004067.jpg 640w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu6350004005559682435.jpg 768w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu10432932961883426796.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu733856579153138076.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu14674901555017521598.jpg 1536w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/rae-ttc-scaling-accel_hu14796981150731004067.jpg" width="1625" height="746" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Rae describes the emergent behavior that&rsquo;s appearing through scaled TTC&mdash;effectively, the model learns new thinking strategies.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu3453642066389632663.webp 320w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu15715762794683441712.webp 640w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu8937124685969114410.webp 768w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu7000470700088475589.webp 1024w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu5594174084942218722.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu10299445441487750269.jpg 320w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu5969966950533059006.jpg 640w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu7171545353020771407.jpg 768w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu5578499750119145816.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu4404111560801841488.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/rae-emergent-thinking_hu5969966950533059006.jpg" width="1516" height="746" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>To close his keynote, Rae looks at what&rsquo;s next&mdash;Deep Think, a high budget thinking mode for 2.5 Pro, which applies parallel, deeper chains of thought, yielding insane improvements on the toughest thinking challenges. Case in point: the 2025 Math Olympiad problem set, where OpenAI&rsquo;s very good o3 reasoning model scored at the 35th percentile, 2.5 Pro reached 50th, and 2.5 Pro Deep Think all the way up to 65th percentile.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/rae-deep-think.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu10297546489300014032.webp 320w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu10608042900177549873.webp 640w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu6511317006063067394.webp 768w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu6882780824355705766.webp 1024w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu17638035724342371878.webp 1280w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu4062728365577566419.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu1073131871261266854.jpg 320w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu13530782811251774397.jpg 640w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu6881231878791444412.jpg 768w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu17272665354968001411.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu16281428287616633985.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu158162573546134580.jpg 1536w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/rae-deep-think_hu13530782811251774397.jpg" width="1645" height="739" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="containing-agent-chaos-use-container-launch">Containing Agent Chaos (use-container launch)</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/solomonhykes/">Solomon Hykes</a> (<a href="https://dagger.io/">Dagger</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=3425s">Session video</a></p>
<p>Solomon Hykes has serious credentials to be the co-founder of an open-source agent containerization framework&mdash;the dude created Docker!</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_live.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_live_hu2806196045165141654.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu10443677405917390476.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu6960899048182382275.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu1781962730992191382.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu4088304491820310175.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu3840658917763334085.webp 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu5606003792224945536.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_live_hu17454026676706839218.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu1279318615889834465.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu12259523691885637051.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu6698261587569594647.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu7265378053001720361.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu4522240522727770542.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_live_hu4196756467592624304.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_live_hu1279318615889834465.jpg" width="2550" height="1349" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Hykes kicked things off with an adjustment to an Anthropic slide: An agent is an LLM <strong>wrecking its environment</strong> in a loop:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu1659025939065268660.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu8332524647339900321.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu18250909729502293880.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu8107524514314543824.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu12306074060738850993.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu2908370597630886540.webp 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu5465675646976287706.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu14412511731218814431.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu10402258883955484853.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu12350398765293989021.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu9649685250581683355.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu6504525694020218042.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu13563523895524190610.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu5953321796711741143.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_agent_wrecking_hu10402258883955484853.jpg" width="2808" height="1204" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>If we&rsquo;re just running one agent&mdash;things aren&rsquo;t so bad.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_1_agent.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu11662896675397221497.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu5023020874688426488.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu17917041638285066683.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu7695368237184690250.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu317393214783818729.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu10063688323619065257.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu3091929518062677693.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu7875387488909557197.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu11004384817773999689.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu8465426187864216590.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu3444401302282947776.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu17190999965089644397.jpg 1536w" sizes="75vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_1_agent_hu7875387488909557197.jpg" width="1640" height="1112" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>But hey, we want to scale it, we want to run 10 agents at once! Neither of today&rsquo;s options are very appealing:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu10313340424055533769.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu7079201585896829193.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu15939855275892851616.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu361349571116958392.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu13649275086745907491.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu16024124310754739083.webp 1536w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu1385897989944855674.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu12348911159077138805.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu17637877263450581389.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu6498722285800860462.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu12005102495974471814.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu2663491861992135453.jpg 1536w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_yolo_hu12348911159077138805.jpg" width="1796" height="1094" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu16817261726296152551.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu6674427074263319491.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu208863571403311310.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu12577658859811132516.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu13885252707663446012.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu18006061087761029418.webp 1536w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu7903391966175659921.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu9964673628214338956.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu11656749198273207532.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu22441095371162724.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu13118521383603487938.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu2293897452866192160.jpg 1536w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_10_agents_cloud_hu9964673628214338956.jpg" width="1790" height="1130" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Hykes then talks about what we really want in order to safely operate and maintain control of 10 agents, and what the ideal environment looks like to make this work:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_want_ideal.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu7949243708299262756.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu5730628903785456446.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu7002486065823452581.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu8186395683060049952.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu8355596321092172094.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu7655711110187910979.webp 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu7241650841683048355.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu2496296595614285951.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu4841181006331775782.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu15400395086627332405.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu7595599440981339115.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu767188842387715824.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu13801954016526444330.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu1675461361316638243.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_want_ideal_hu4841181006331775782.jpg" width="2550" height="1299" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>He points out that we already have the technology we need to deliver this: Containers + Git + Models, and mentions in passing that both containers and Git have a ton of capabilities that aren&rsquo;t widely used by humans, but are perfect for agents. All we&rsquo;re lacking is a native integration &hellip;</p>
<p>Hykes and Dagger suggest a solution: &ldquo;container use for agents&rdquo;&mdash;meant in same the sense as &ldquo;computer use for agents&rdquo; and &ldquo;browser use for agents.&rdquo; This is not sandboxing, which is about <em>executing the output of agents</em>. Rather, this is about creating complete, isolated development environments that agents <em>do their development entirely inside of</em>.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu2937922602453084219.webp 320w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu3810564251492018091.webp 640w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu13873297883931656553.webp 768w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu12648879263505863816.webp 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu12350275900288295788.webp 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu10169217017634546944.webp 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu17822004315980142976.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu12681073192411566448.jpg 320w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu548211987550767244.jpg 640w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu5866168551249698788.jpg 768w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu13310645121540184838.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu13310121382282130835.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu11678428861726146434.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu7673572133019233585.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/hykes_we_have_the_tech_hu548211987550767244.jpg" width="2860" height="1138" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Against the advice of his team, Hykes launches into a wild and crazy live demo of (unfinished) Dagger, where he spawns about six Claude Code instances&mdash;and one Goose instance, just for fun&mdash;all iterating on a basic website project. Each instance&ndash;agent is iterating on the starting apps in complete isolation, with the orchestrating developer having the ability to merge any instance&rsquo;s output if we like it. At the end, while the agents are madly spinning away, he open sources the Dagger project, live in front of the audience. I like Hykes, and I like Dagger&mdash;great stuff.</p>

<video controls width="100%" preload="metadata" loop class="html-video">
  <source src="hykes_demo.mp4" type="video/mp4">
  Your browser does not support the video tag.
</video>

<h2 id="infrastructure-for-the-singularity">Infrastructure for the Singularity</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/jesse-michael-han/">Jesse Han</a> (<a href="https://morph.ai/">Morph</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=4845s">Session video</a></p>
<p>I didn&rsquo;t resonate with Jesse Han&rsquo;s presentation style and didn&rsquo;t absorb much from the live presentation. Ah, the benefits of re-watching: I learned a lot more this time around.</p>
<p>I see a lot of overlap in Han&rsquo;s and Hykes&rsquo;s keynotes and products. Both have a lot to do with enabling environments that support the safe and effective spin-up and operation of clusters of agents.  Both leverage containers, the power of Git and Git branches, and of course, agents. Morph&rsquo;s Infinibranch: &ldquo;All mistakes become reversible.&rdquo; &ldquo;All paths forward become possible.&rdquo; Take action, backtrack, take every possible action.</p>
<p>Han&rsquo;s chess demo was interesting; he contrasted a single AI working to pick the optimal chess move, with a swarm of agents on the Morph platform tackling the same problem using what he calls &ldquo;reasoning time branching.&rdquo; Han was fairly arrogant on suggesting that Morph&rsquo;s closed platform would own the agentic execution environment space&mdash;a big contrast to Hykes, who open sourced their product on stage. Morph may go on to success, but I&rsquo;d put money on Dagger winning market share.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/han_chess_1_agent.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu11185951227112581302.webp 320w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu17662480722714540209.webp 640w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu6211393695170461937.webp 768w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu13559462215838048491.webp 1024w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu5079685074478905266.webp 1280w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu8080650796816629988.webp 1536w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu1213647257405699773.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu11891041861735727164.jpg 320w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu5923310219496969302.jpg 640w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu8390439579352318421.jpg 768w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu13118640625861616175.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu4604985098334588462.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu16332647646177655316.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu18113546984421326527.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/han_chess_1_agent_hu5923310219496969302.jpg" width="2212" height="672" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu3737257953105992882.webp 320w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu13958732178471699960.webp 640w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu2314360120847909414.webp 768w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu1926445668268426966.webp 1024w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu3305590587556604640.webp 1280w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu15584012249047174000.webp 1536w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu4836674120665968171.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu15317279170575332581.jpg 320w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu7555923287547770551.jpg 640w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu6846238394097356310.jpg 768w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu9207790356390053623.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu1080092523241201716.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu10912708294894075516.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu4096067211528222907.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/han_chess_agent_swarm_hu7555923287547770551.jpg" width="2878" height="1508" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="devin-20-and-the-future-of-swe">Devin 2.0 and the Future of SWE</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/scott-wu-8b94ab96/">Scott Wu</a> (<a href="https://cognition.ai//">Cognition</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=8940s">Session video</a></p>
<p>Scott Wu, Co-founder and CEO of Cognition, presented on Devin 2.0 and the evolution of AI-powered software engineering. I missed this session, so will withhold comment until I have a chance to view and absorb Wu&rsquo;s talk.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/wu_devin.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/wu_devin_hu16645996540863774596.webp 320w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu11395314972905502262.webp 640w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu18206687145491187009.webp 768w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu2679993939011111496.webp 1024w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu16554876524853956133.webp 1280w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu12342954502575035259.webp 1536w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu7800626130619100523.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/wu_devin_hu957896744779515124.jpg 320w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu10050997293976891393.jpg 640w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu18247910930363172293.jpg 768w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu6233264510475913500.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu17051062496392847582.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu7928651235983552059.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/wu_devin_hu6856534089491605982.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/wu_devin_hu10050997293976891393.jpg" width="2862" height="1406" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="your-coding-agent-just-got-cloned">Your Coding Agent Just Got Cloned</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/rustinbanks/">Rustin Banks</a> (<a href="https://labs.google/">Google Labs</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=9930s">Session video</a></p>
<p>Rustin Banks from Google Labs talks about his work on <a href="https://jules.google.com/">Jules</a> and asynchronous coding agents. Another missed session, I&rsquo;ll comment later once I have a chance to view and absorb.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/banks_jules.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/banks_jules_hu16727407626292941301.webp 320w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu7780793613821565958.webp 640w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu703120587896540036.webp 768w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu7664048543749224428.webp 1024w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu12748261257716189483.webp 1280w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu12413032630049259136.webp 1536w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu13305261722847379667.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/banks_jules_hu14803371538605101940.jpg 320w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu3255415060986074388.jpg 640w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu8588163158995159152.jpg 768w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu17512258195226049770.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu17411668744209192101.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu15341467919098102466.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/banks_jules_hu5583933662879440176.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/banks_jules_hu3255415060986074388.jpg" width="2872" height="1414" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="the-agent-awakens">The Agent Awakens</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/geektrainer/">Christopher Harrison</a> (<a href="https://github.com/features/copilot">GitHub</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=10812s">Session video</a></p>
<p>Christopher Harrison from GitHub on the evolution of AI agents. I missed this session, so I&rsquo;ll write later once I have a chance to review.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu5019492507443702744.webp 320w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu10621285874904376525.webp 640w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu3454549933282154643.webp 768w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu1424265530132681054.webp 1024w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu2271226444001442544.webp 1280w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu5766459946725083950.webp 1536w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu18413688438151313543.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu14841306588732196690.jpg 320w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu12155865482148467438.jpg 640w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu4430948601904753598.jpg 768w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu2348746105948681414.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu9273684180838389595.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu9755395843675918459.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu7996866639923315567.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/harrison_copilot_agents_hu12155865482148467438.jpg" width="2858" height="1428" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="dont-get-one-shotted">Don&rsquo;t get one-shotted</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/tomasreimers/">Tomas Reimers</a> (<a href="https://graphite.dev/">Graphite</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=11977s">Session video</a></p>
<p>Tomas Reimers, founder of Graphite, described how to leverage Al to test, review, merge, and deploy code. I missed this talk, but it looks good and I&rsquo;ll write on it once I&rsquo;ve watched.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/reimers_resilience.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu7021526572057588470.webp 320w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu6509088728123345578.webp 640w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu17600966584720359969.webp 768w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu13049148160603986182.webp 1024w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu16219711719654644808.webp 1280w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu17117782160488433599.webp 1536w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu10081519248962212147.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu3850264394765797179.jpg 320w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu2872971255360368530.jpg 640w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu8318306675058116977.jpg 768w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu17951204923740102637.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu8800247782763569441.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu1178167722572855978.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu18390420804787402013.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/reimers_resilience_hu2872971255360368530.jpg" width="3390" height="1882" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="claude-code--the-evolution-of-agentic-coding">Claude Code &amp; the evolution of Agentic Coding</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/bcherny">Boris Cherny</a> (<a href="https://www.anthropic.com/">Anthropic</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=18825s">Session video</a></p>
<p>Claude Code wasn&rsquo;t the first terminal-centric AI coding tool&mdash;among players with significant followings, those bragging rights probably go to Aider&mdash;but Boris Cherny provides a fascinating perspective on why model-maker Anthropic went the terminal route with Claude Code. I have observed first-hand how Anthropic&rsquo;s Claude models have dominated the coding model space, with their lead seeming to accelerate with Sonnet 3.5, 3.7, and 4. Says Cherny,</p>
<blockquote>
<p>The model is moving really fast. It&rsquo;s on exponential. It&rsquo;s getting better at coding very, very quickly, as everyone that uses the model knows. And the product is kind of struggling to keep up. We&rsquo;re trying to figure out what product to build that&rsquo;s good enough for a model like this.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-[65%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r1.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu13344865026266305022.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu14582294179777634401.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu932265363768405848.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu15052282798681225304.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu8225482505825561260.webp 1280w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu12615490488806881244.webp 1536w" sizes="70vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu9687969030119940933.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu138106457278273267.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu10960220541818841948.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu11851455925982475394.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu605050330737227099.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu1184344070380289997.jpg 1536w" sizes="70vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r1_hu138106457278273267.jpg" width="1832" height="200" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<blockquote>
<p>I feel like programming languages have sort of leveled out but the model is on an exponential and the UX of programming is also on an exponential &hellip; ide devx has evolved quickly, and will continue to change even more quickly &hellip; that. And so with all this in mind, Claude Code&rsquo;s approach is a little different.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-[65%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu3739234257281166963.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu14790154569019101935.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu8724403160928501643.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu14810952514566907089.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu14514685307199186080.webp 1280w" sizes="70vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu16658928318846187977.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu11502488323037845847.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu8352723377999692102.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu15948376992129622626.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu10999749278502196203.jpg 1280w" sizes="70vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_appr_sm_hu11502488323037845847.jpg" width="1446" height="426" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<blockquote>
<p>We want to be unopinionated and we want to get out of the way. So we don&rsquo;t give you a bunch of flashy UI. We don&rsquo;t try to put a bunch of scaffolding in the way. Some of this is, we&rsquo;re a model company at Anthropic, we make models and we want people to experience those models. But I think another part is we actually just don&rsquo;t know, we don&rsquo;t know what the right UX is. So we&rsquo;re starting simple. So Claude Code is intentionally simple. It&rsquo;s intentionally general. It shows off the model in the ways that matter to us, which is they can use all your tools and they can fit into all your workflows. So you can figure out how to use the model in this world where the UX of using code and using models is changing so fast.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-[55%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu17707404622559132765.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu10058095943976824488.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu6953133100594540503.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu2398128666034549593.webp 1024w" sizes="65vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu6916592839708015920.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu16888585249849318957.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu3880581281282723052.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu13951100283693439363.jpg 1024w" sizes="65vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_unopin_sm_hu16888585249849318957.jpg" width="1082" height="388" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<div class="flex justify-evenly"><div class="w-[65%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r2.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu17262253981540577332.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu6634345737524570561.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu5858523153728186878.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu4406191252120771897.webp 1024w" sizes="70vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu6373254804270041372.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu13083872658926344866.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu3417982658690620451.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu16704745345004622860.jpg 1024w" sizes="70vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r2_hu13083872658926344866.jpg" width="1208" height="122" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<blockquote>
<p>This is the bitter lesson. I have this like framed and taped to the side of my wall, because the more general model always wins and the model increases in capabilities exponentially and there are many corollaries to this. Everything around the model is also increasing exponentially and the more general thing even around the model usually wins.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu13665497169354852908.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu2053590538688795863.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu8822123294562476354.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu2897263098742006696.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu7059425451135008713.webp 1280w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu10976741058798615313.webp 1536w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu17682443650471814807.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu1650456022010404998.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu14886160960841015100.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu13710988689537409350.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu11933322682322459250.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu14165094241139857897.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu17585882627352459710.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu3653791338774530600.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_bitter_hu14886160960841015100.jpg" width="1974" height="716" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<div class="flex justify-evenly"><div class="w-[55%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r3.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu1471653833465079476.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu5070342334223897572.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu10605679116897598547.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu3888666594923430869.webp 1024w" sizes="65vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu8931878296610523203.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu12496794555550916506.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu5036992339799197506.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu9283809145667339666.jpg 1024w" sizes="65vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r3_hu12496794555550916506.jpg" width="1112" height="124" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Cherny describes four different modes of using Claude Code:</p>
<ul>
<li>From the terminal</li>
<li>From the IDE (as an extension)</li>
<li>As a GitHub app so you can @claude right in a GitHub issue comment</li>
<li>Via the SDK, using Claude as a Unix utility</li>
</ul>
<div class="flex justify-evenly"><div class="w-[55%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r4.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu8115276571511872017.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu9211901203474555685.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu94856855454141382.webp 768w" sizes="65vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu2455863286498076845.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu9177525555364781751.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu2907051397133755739.jpg 768w" sizes="65vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r4_hu9177525555364781751.jpg" width="810" height="156" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<ol>
<li>Ask Claude Code about your code</li>
<li>Teach Claude to use your tools</li>
<li>Fit the workflow to the task, e.g. (explore › plan › confirm › code › commit) vs (tests › commit › code › iterate › commit) vs (code › screenshot › iterate)</li>
<li>Plan mode (toggle via Shift-Tab)</li>
</ol>
<div class="flex justify-evenly"><div class="w-[40%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r5.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r5_hu4255872115529245421.webp 320w" sizes="60vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r5_hu10313951335885951483.jpg 320w" sizes="60vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_r5_hu10587614452227538059.jpg" width="604" height="132" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<ul>
<li>Create claude.md files: variants such as CLAUDE.md, CLAUDE.local.md, a/b/CLAUDE.md, ~/.claude/CLAUDE.md</li>
<li>Context can also be made available as a slash command by putting markdown files under .claude/commands/</li>
<li>Add to Claude&rsquo;s memory by prepending # to something you want Claude Code to remember; CC will ask which memory location to remember into (project, user, etc.)</li>
</ul>
<div class="flex justify-evenly"><div class="w-[65%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu6248388429382956846.webp 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu6644620911594894541.webp 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu5169178568298638244.webp 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu13119826896333584682.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu12853658565801592657.webp 1280w" sizes="70vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu17647697545857585943.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu7979071759413493603.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu12228325447112680696.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu15877055361297212351.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu7701148679022047881.jpg 1280w" sizes="70vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cherny_cc_tldr_sm_hu7979071759413493603.jpg" width="1300" height="384" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="software-dev-agents-what-works--what-doesnt">Software Dev Agents: What Works &amp; What Doesn&rsquo;t</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/robert-a-brennan">Robert Brennan</a> (<a href="https://www.all-hands.dev/">All Hands AI</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=19945s">Session video</a></p>
<p>Robert Brennan, CEO of All Hands AI, is involved in one of those &ldquo;AI name confusion&rdquo; situations. His product (open sourced under an MIT license) used to be known as OpenDevin. And Devin is, of course, one of the pioneers of agentic coding. So what gives? I went to ChatGPT o3 to get the scoop:</p>
<blockquote>
<p><strong>The scoop from o3:</strong> OpenDevin launched in March 2024 as an MIT-licensed community effort to recreate <a href="https://cognition.ai/blog/introducing-devin">Devin, the first AI software engineer</a>. By August 2024 the project re-branded as <strong>OpenHands</strong> under the new startup <strong>All Hands AI</strong>, shedding its “clone” baggage while keeping Devin only as historical inspiration — see the <a href="https://x.com/gneubig/status/1828097484599759349">rename announcement</a> and the <a href="https://github.com/All-Hands-AI/OpenHands">current OpenHands repo</a>.</p>
</blockquote>
<p>Brennan kicks off with this message:</p>
<blockquote>
<p>Coding is going away &hellip; but that doesn&rsquo;t mean that software engineering is going away. We&rsquo;re paid not to to type on our keyboard but to actually think critically about the problems that are in front of us.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/brennan_think_not_type.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu15353053167914724052.webp 320w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu5581246779563638300.webp 640w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu4601310883873572902.webp 768w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu5370191753987102727.webp 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu6345244356975333859.webp 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu7685416367311988350.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu8237888204498960407.jpg 320w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu13170301891318041275.jpg 640w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu11874835014311428425.jpg 768w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu9970291790703397370.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu10616548939813681393.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu15237245358350586219.jpg 1536w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/brennan_think_not_type_hu13170301891318041275.jpg" width="1697" height="997" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Brennan shared a great chart of the codegen landscape, with Tactical &lt;=&gt; Agentic on the X axis, and Consumer &lt;=&gt; Developer on the Y.</p>
<blockquote>
<p>Now you&rsquo;ve got these tools like Devin and OpenHands where you&rsquo;re really giving an agent one or two sentences describing what you want it to do. It goes off and works for 5, 10, 15 minutes on its own and then comes back to you with a solution. This is a much more powerful way of working.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu1959208273827203516.webp 320w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu17160243826604859092.webp 640w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu8998396045171979950.webp 768w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu16272233046215785124.webp 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu9879320702880580301.webp 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu10256933584545186271.webp 1536w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu10378525082076264122.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu2349948091614888108.jpg 320w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu7134858217176173369.jpg 640w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu17769136586383502684.jpg 768w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu1365911255605595922.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu10323260378442151314.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu9613102270648268680.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu1065506949440127218.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/brennan_codegen_landscape_hu7134858217176173369.jpg" width="1994" height="971" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Brennan does a nice walkthrough of how coding agents actually work, and then shares tips on how to be most effective working with agentic coding. One point he makes, which I can affirm based on my own experience, is that you shouldn&rsquo;t be afraid to throw code away.</p>
<blockquote>
<p>I also like to remind folks that in an AI-driven development world, code is cheap. You can throw code away. You can you can experiment and prototype. I love, if I have an idea, like on my walk to work, I&rsquo;ll just tell OpenHands with my voice, &ldquo;do X, Y, and Z,&rdquo; and then when I get to work, I&rsquo;ll have a PR waiting for me. 50% of the time, I&rsquo;ll just throw it away. It didn&rsquo;t really work. 50% of the time it looks great, and I just merge it, and it&rsquo;s awesome.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu10619239909750224261.webp 320w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu4308298521883184635.webp 640w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu18261069460704834688.webp 768w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu7963549081264327403.webp 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu441184755945372817.webp 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu2884451776165741523.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu5896399524740898401.jpg 320w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu5388109284173323033.jpg 640w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu15544417474349161426.jpg 768w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu6467106012952372428.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu4510719432307639899.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu13490843190588245887.jpg 1536w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/brennan_throw_code_away_hu5388109284173323033.jpg" width="1675" height="973" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Definitely worth watching.</p>
<h2 id="beyond-the-prototype">Beyond the Prototype</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/joshalbrecht">Josh Albrecht</a> (<a href="https://imbue.com/">Imbue</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=21090s">Session video</a></p>
<p>Josh Albrecht, CTO of Imbue, whose main focus is Sculptor, an AI tool that&rsquo;s still in the early research preview. What does it do?</p>
<blockquote>
<p>Sculptor is a coding agent environment that applies engineering discipline to catch issues, write tests, and improve your code—all while you work in your favorite editor. Sculptor is the first coding agent environment that helps you embed software engineering best practices. Sculptor runs your code in a sandbox, letting you test code safely, solve issues in parallel, and assign tasks to agents, working alongside any editor. Use Sculptor to resolve bugs, write tests, add new features, improve docs, fix style issues, and make your code better—whether it was written by a human or an LLM.</p>
</blockquote>
<p>Albrecht&rsquo;s session tagline is <strong>Using Al to Write High-Quality Code</strong> and clearly his work on Sculptor gives him the background to speak intelligently on the subject.</p>
<p>Vibe coding output versus production-shippable code.</p>
<blockquote>
<p>&lsquo;What is wrong with this diff?&rsquo; Allowing another Al system to come and take a look at this and understand like hey are there any race conditions? Did you leave your API key in there etc. We want to think about how do we help leverage Al tools not just to generate the code but to help us build trust in that code.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu14044918251102236212.webp 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu560156877493941603.webp 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu5123316043067299663.webp 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu8456975197179520585.webp 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu1358487539591425092.webp 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu11421452325812523996.webp 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu14422802681620408074.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu18218822753486915147.jpg 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu15305362903680015537.jpg 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu12085691281172943343.jpg 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu8121665868975373455.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu10545034070968161179.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu17431932534638704055.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu8073753455475331234.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/albrecht_high_quality_code_hu15305362903680015537.jpg" width="2003" height="1001" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Four tips for preventing problems in AI-generated code:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu13597379173361572906.webp 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu11220241898392450201.webp 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu12633160076215590445.webp 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu3645574702345284983.webp 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu2410817688229447442.webp 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu9935913419706285942.webp 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu15970299663594183973.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu1442225480848158854.jpg 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu3871664081850590169.jpg 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu17993326358667337556.jpg 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu18131043571241598662.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu12599377735586785403.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu12825859878163567036.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu4805402744411335572.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/albrecht_preventing_problems_hu3871664081850590169.jpg" width="2880" height="1434" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Regarding writing specs:</p>
<blockquote>
<p>In Sculptor, one of the ways that we try to make this easier is by helping detect if the code and the docs have become outdated. So it reduces the barrier to writing and maintaining documentation and dock strings because now you have a way of more automatically fixing the inconsistencies. It can also highlight inconsistencies or parts the specifications that conflict with each other, making it easier to make sure that your system makes sense from the very beginning.</p>
</blockquote>
<p>Three tips for detecting problems in AI-generated code:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu12189231919135938691.webp 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu2503339146776857181.webp 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu5550605780647363864.webp 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu14874255754307592011.webp 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu16520041569842693764.webp 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu4312818061949172891.webp 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu12554197416996728968.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu13413537480961953854.jpg 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu16238832365607580711.jpg 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu13146177602725021859.jpg 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu915363016586034759.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu14072037994708554322.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu9158682293352758956.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu3293193388033166361.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/albrecht_detecting_problems_hu16238832365607580711.jpg" width="2826" height="1386" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Things you can ask an LLM:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu17974167306950199601.webp 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu3071602395473476129.webp 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu10581286878228150299.webp 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu3967506784787678492.webp 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu3686418327764355687.webp 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu6634654309223129921.webp 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu17408513667173750844.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu3596381739389586641.jpg 320w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu8440601501592870659.jpg 640w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu15132939224781726704.jpg 768w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu18252837905983522391.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu13365283026762306090.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu9115906675731501209.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu16260340572892535248.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/albrecht_ask_llm_hu8440601501592870659.jpg" width="3392" height="1848" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Solid, practical advice all the way through.</p>
<h2 id="ship-production-software-in-minutes-not-months">Ship Production Software in Minutes, Not Months</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/enoreyes">Eno Reyes</a> (<a href="https://factory.ai/">Factory AI</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=22250s">Session video</a></p>
<p>I was blown away when I first heard Eno Reyes and Matan Grinberg on the Latent Space podcast, and I was excited to hear Reyes talk in person. To me, Factory stands out as the most serious AI tool for engineering at Fortune 500 scale, addressing Fortune 500 level problems. Factory also stands out as pioneering in the exploration of AI UX that isn&rsquo;t bolted on to the 20-year-old IDE paradigm. As Reyes says:</p>
<blockquote>
<p>It seems like right now we&rsquo;re still trying to find what that interaction pattern, what that future looks like. And a lot of what&rsquo;s publicly available is more or less an incremental improvement. The current zeitgeist is to take tools that were developed 20 years ago for humans to write every individual line of code&mdash;tools that were designed first and foremost for human beings. And you sprinkle AI on top and then you keep adding layers of AI and then at some point maybe there&rsquo;s some step function change that happens. But there&rsquo;s not a lot of clarity there in exactly what that means.</p>
</blockquote>
<p>Reyes shares Andrej Karpathy&rsquo;s quote about English-as-programming-language:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/eno_english.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/eno_english_hu16577908453004359769.webp 320w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu6806813822076479053.webp 640w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu4980942308801265278.webp 768w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu18188180888064472356.webp 1024w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu5199313682008950816.webp 1280w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu17418952332888733721.webp 1536w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu10337860054322705005.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/eno_english_hu13005668623418208553.jpg 320w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu9181237232059881958.jpg 640w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu16848155813119597344.jpg 768w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu7977947374211456716.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu13016169928153770600.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu17084975205263653614.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/eno_english_hu6150295097055210326.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/eno_english_hu9181237232059881958.jpg" width="2456" height="1206" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>But he goes on to confront the idea that this means vibe coding. He speaks to the importance of context, and working with the kind clientele they do, Factory certainly has good data behind this:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/eno_context.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/eno_context_hu12810601722850321294.webp 320w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu15808468022136709514.webp 640w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu11046871573144205166.webp 768w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu17510992807892016109.webp 1024w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu8392546856794699131.webp 1280w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu14510900001031009804.webp 1536w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu5241440047647573031.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/eno_context_hu13034260770944109870.jpg 320w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu12661600135697044437.jpg 640w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu586141159589606337.jpg 768w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu12850929941673152247.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu3965629414885336863.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu6786380823946598011.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/eno_context_hu17520145809960531060.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/eno_context_hu12661600135697044437.jpg" width="2438" height="1202" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>And it&rsquo;s very clear when Reyes talks about Planning with AI that the F500 problem space Factory works in isn&rsquo;t Tiny Teams territory:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/eno_planning_1.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu8955436088829060329.webp 320w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu6193850051158181257.webp 640w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu12709740620634390731.webp 768w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu15725866180395137960.webp 1024w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu10411789259607800422.webp 1280w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu12782493989349305144.webp 1536w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu16493444698334531216.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu4755965754698174981.jpg 320w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu4595195685603748333.jpg 640w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu9819230947672408100.jpg 768w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu17904072577692414561.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu9095130990666943579.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu4172845194851593441.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu10657512544205335307.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/eno_planning_1_hu4595195685603748333.jpg" width="2428" height="1212" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/eno_planning_2.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu13917060199953810454.webp 320w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu15156246515516379760.webp 640w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu17173178029107508863.webp 768w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu18297917015623321766.webp 1024w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu10576167322988148111.webp 1280w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu12115852256600519159.webp 1536w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu11982536500212535311.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu8126472067826698683.jpg 320w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu2299249872308306991.jpg 640w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu8087102305608163340.jpg 768w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu12018507967199399330.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu2186331317225940123.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu11233868198097677662.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu14674818253453046575.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/eno_planning_2_hu2299249872308306991.jpg" width="2450" height="1222" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>In the agile, human coding world that preceded AI coding, I have tended to streamline if not completely avoid what I saw as bloated processes based around heavyweight artifacts like Product Requirements Documents (PRDs). But in the new world, especially at F500 scale, it makes sense that we are coming full circle. Reyes moves on to a Site Reliability Engineering (SRE) example, show context and documents coming together in a loop where the system gets smarter and smarter, moving from helping to diagnose incidents to suggesting &ldquo;I&rsquo;m seeing a pattern here&mdash;why don&rsquo;t we fix this.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/eno_sre.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/eno_sre_hu2182961888471950736.webp 320w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu7160548990527427372.webp 640w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu6511670221650491048.webp 768w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu15140823285159091937.webp 1024w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu7173828876307172815.webp 1280w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu2986237376853135431.webp 1536w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu6951432498630901088.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/eno_sre_hu4039711305919670600.jpg 320w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu3574531203841322503.jpg 640w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu12792404301228401798.jpg 768w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu8698868659288090892.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu5974708777507193632.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu15947446022991902824.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/eno_sre_hu4983135944045623731.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/eno_sre_hu3574531203841322503.jpg" width="2174" height="1228" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Reyes closes by addressing the subject of AIs replacing engineers:</p>
<blockquote>
<p>AI agents are not replacing software engineers. They&rsquo;re significantly amplifying their individual capabilities. The best developers l know are spending far less time in the IDE writing lines of code. It&rsquo;s just not high leverage. They&rsquo;re managing agents that can do multiple things at once that are capable of organizing the systems and they&rsquo;re building out patterns that supersede the inner loop of software development and they&rsquo;re moving to the outer loop of software development. They aren&rsquo;t worried about agents taking their jobs. They&rsquo;re too busy using the agents to become even better at what they do. The future belongs to developers who understand how to work with agents, not those who hope that Al will just do the work for them. And in that future, the skill that matters most is not technical knowledge or your ability to optimize a specific system, but your ability to think clearly and communicate effectively with both humans and AI.</p>
</blockquote>
<p>Mixed in with his slides, Reyes includes several video demos of Factory &ldquo;Droids&rdquo; in action&mdash;their name for independent agents. Very much worth watching in full.</p>
<h2 id="trends-across-the-ai-frontier">Trends across the AI Frontier</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/georgecameron">George Cameron</a> (<a href="https://artificialanalysis.ai/">Artificial Analysis</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=26131s">Session video</a></p>
<p>Artificial Analysis maintains a multidimensional and deeply impressive treasure trove of data about LLMs. George Cameron starts by confirming <a href="/blog/aiewf2025-my-day-1-highlights/#2025-in-llms-so-far">Simon Willison&rsquo;s declaration</a> that it&rsquo;s been an insane period of LLM development. Cameron starts with the past 12 months in frontier models: OpenAI still in the lead, but the frontier more competitive than ever:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu8698643600489591759.webp 320w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu8093774869700842848.webp 640w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu7757475498829850436.webp 768w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu12998584344120195646.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu15417044069400637622.webp 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu13444476138301951282.webp 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu4078708239894656626.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu13339267229102635857.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu3724074769178447414.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu6372398666523092098.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu13292842630062376201.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu17787970175429438892.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu11559557091896115740.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu1148660658714361058.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_intelligence_hu3724074769178447414.jpg" width="2860" height="1280" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Note: less than 2 months after Cameron&rsquo;s presentation, there&rsquo;ve been significant changes in the frontier intelligence rankings:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu17299048637899223064.webp 320w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu13593784699799946849.webp 640w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu14629411415074598215.webp 768w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu2942955125607775351.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu11279479999677272059.webp 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu12667654833798400334.webp 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu14927885013459673290.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu11440564770837129952.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu15961348132527715902.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu2730351791765417089.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu8604095563657564620.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu7683279264388376597.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu2053930695847586988.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu3939668029269930181.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cameron_frontier_models_250731_hu15961348132527715902.jpg" width="3916" height="1792" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Cameron next points out that there are actually more than one frontier in AI:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu6559048678935465240.webp 320w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu12604886776963077788.webp 640w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu9622918531560296603.webp 768w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu17372838176811742503.webp 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu3648521035467713276.webp 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu4528273825815162717.webp 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu2960429224230957062.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu4462413329223111611.jpg 320w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu16917415535110180589.jpg 640w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu148658157398009268.jpg 768w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu15907203229844564373.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu10470357867400098249.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu10838302376116689127.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu4703237803974641410.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/cameron_four_frontiers_hu16917415535110180589.jpg" width="2904" height="1370" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>He goes on to explore each category. Super-sharp analysis; AA is a new go-to for me when I need this type of comparative. The one domain where I&rsquo;m skeptical of AA&rsquo;s ratings: coding. Either my (and the world-at-large&rsquo;s) experience is mistaken, or AA&rsquo;s coding benchmarks are borked. Otherwise, though, I stick by my pronouncement: a multidimensional and deeply impressive treasure trove. Check <a href="https://artificialanalysis.ai/">them</a> out.</p>
<h2 id="state-of-ai-engineering-2025">State of AI Engineering 2025</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/barryaron">Barr Yaron</a> (<a href="https://amplifypartners.com/">Amplify Partners</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=27510s">Session video</a></p>
<p>Amplify Partners recently completed their 2025 State of AI Engineering Survey, and partner Barr Yaron presented a number of early findings. Money slide for me: top newsletters and podcasts:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu12880793597212472060.webp 320w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu14469950514419132796.webp 640w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu14465282614347219801.webp 768w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu17420374296938970793.webp 1024w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu9225192169581426911.webp 1280w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu15257322031029092942.webp 1536w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu6748158779509762403.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu10417819195970996583.jpg 320w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu6527532373083607902.jpg 640w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu3084054879149240692.jpg 768w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu9386001613117288089.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu9681392903030829298.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu15691239184326258500.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu8039181240263028909.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/yaron_newsletters_podcasts_hu6527532373083607902.jpg" width="2866" height="1304" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="fun-stories-from-building-openrouter-and-where-all-this-is-going">Fun Stories from Building OpenRouter and Where All This is Going</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/alexatallah">Alex Atallah</a> (<a href="https://openrouter.ai/">OpenRouter</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=28298s">Session video</a></p>
<p>I had quite a few knowledge gaps filled in at the World&rsquo;s Fair; one big one was near-total ignorance of OpenRouter. In reality, it has taken me World&rsquo;s Fair plus two months for the OpenRouter concept to really sink in, and for me to understand the use cases where it makes a ton of sense. I&rsquo;m just about to set up an OpenRouter account for use on a proof of concept project where I want to avoid setting up many individual direct accounts with model makers. I send my thanks to Alex Atallah, founder of OpenRouter, for helping reduce my ignorance through this talk.</p>
<p>So what are the fundamentals of OpenRouter? API to access all language models; and also, because they are a marketplace, an unparalleled source of data about who is using what models. Pay in one place, with near zero switching cost. &gt;400 models, &gt;60 access providers, many payment methods including crypto.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/atallah_or_basics.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu2067378697402544235.webp 320w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu9919418180787249849.webp 640w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu4781826903669285485.webp 768w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu7902097465953552227.webp 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu9322094636200419336.webp 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu8077128621641836955.webp 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu3630738745575597917.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu11572505599012077908.jpg 320w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu3199232133058047672.jpg 640w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu12719491797224874386.jpg 768w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu11530895604033469892.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu14328892667623663451.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu3964819041355454339.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu5186817961709727225.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/atallah_or_basics_hu3199232133058047672.jpg" width="2484" height="1590" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The founding story and evolution of OpenRouter is fascinating: a journey from experiment to marketplace. Major labs started banning uses. The open source race and &ldquo;Llama storm.&rdquo; First successful model distillation: Alpaca, trained for $600. OpenRouter was initially a place to collect all these. Window.ai chrome extension allowing users to choose their own models. OpenRouter&rsquo;s official launch in May &lsquo;23. OpenRouter wasn&rsquo;t a marketplace originally &ndash; started out with just one primary and one fallback provider for any given model. Then a great proliferation of providers emerged, where a single model being might be available from many providers with different price points and supported feature sets (e.g. with or without structured output). This pushed OpenRouter to become a marketplace.</p>
<p>Then it emerged that closed models couldn&rsquo;t keep up with inference demand on their own platforms. OpenRouter helped developers boost uptime by allowing routing to different sources for closed models e.g. Claude models on Amazon Bedrock. Check out this uptime chart to get a feel for the benefits:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu475873704187750477.webp 320w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu17855237322118201283.webp 640w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu8070247728781806119.webp 768w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu16062528338439389136.webp 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu11058163319182925452.webp 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu7501767125250187241.webp 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu6979221759308679062.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu16802188555882490901.jpg 320w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu2763585760713110676.jpg 640w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu12166563921222639563.jpg 768w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu1791508101980854103.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu13158105761638914393.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu12740479541385601728.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu5766647984244209330.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/atallah_uptime_boosting_hu2763585760713110676.jpg" width="3406" height="1632" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>With all the fantastic data OpenRouter has at its disposal, what do they believe the future looks like?</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/atallah_believe.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_believe_hu9496375538836463242.webp 320w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu8096822473360030043.webp 640w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu950258753244860127.webp 768w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu4557912532376162287.webp 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu17931958103999236972.webp 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu17839527102552720219.webp 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu13768155874839545994.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/atallah_believe_hu2691295285451534918.jpg 320w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu11426504413529366342.jpg 640w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu4930176167270731118.jpg 768w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu4300760942669472789.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu3799106008995927041.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu3690540873735501564.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/atallah_believe_hu6310773293784643597.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/atallah_believe_hu11426504413529366342.jpg" width="2520" height="1214" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I love the direction OpenRouter is taking with their API, adding a plugin-like system that augments, transparently and in real time, the capabilities of *<em>all</em> models. Atallah mentions two examples: web search and PDF data extraction.</p>
<p>All told, OpenRouter is a major addition to my toolbox, and <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=27510s">this session</a> is a must-watch.</p>
<h2 id="the-new-code">The New Code</h2>
<p><strong>Speaker:</strong> <a href="https://x.com/sgrove">Sean Grove</a> (<a href="https://openai.com/">OpenAI</a>) &ndash; <a href="https://www.youtube.com/watch?v=U-fMsbY-kHY&amp;t=29425s">Session video</a></p>
<p>Earlier in the day, <a href="#ship-production-software-in-minutes-not-months">Eno Reyes</a> quoted Andrej Karpathy, &ldquo;The hottest new programming language is English,&rdquo; and emphasized structured documents like PRDs as an essential way to communicate with AI agents. Picking up where Reyes left off, OpenAI&rsquo;s Sean Grove talked on &ldquo;The New Code&mdash;Specs.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/sean_grove_intro.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu5545760182863944826.webp 320w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu17080920215123502075.webp 640w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu6068321239005583118.webp 768w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu3174444680091937241.webp 1024w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu9517512495212118810.webp 1280w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu4262526907961997266.webp 1536w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu7315654350982590038.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu1758805980961327904.jpg 320w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu13003222657677331182.jpg 640w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu8058650562334991549.jpg 768w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu148826659742455851.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu21016302020555019.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu13908227765362119706.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu18369301991796629304.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/sean_grove_intro_hu13003222657677331182.jpg" width="4032" height="3024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Grove did a quick audience survey, asking how many people &ldquo;coded&rdquo; and how many of them felt that code was their primary output:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_code.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_code_hu17196566538115619807.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu10758376970885327186.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu8276409705591940812.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu14769692516452697801.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu7216027047298605326.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu12796563561342713477.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu2456302212458462004.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_code_hu5321012527687862791.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu13145991285493880106.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu11257611196412075305.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu12215210548846824638.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu2341260396723275003.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu11843078145020581785.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_code_hu14948405124995715528.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_code_hu13145991285493880106.jpg" width="3430" height="1526" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>He then confronted this belief, suggesting that code is more like 10-20% of the output.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu16253066227873857607.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu270895111340663081.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu12797794424625738881.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu9674659010213512409.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu11092868011399643065.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu9819195181809893876.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu8746639040354432704.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu15013204683644328676.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu15156847340136596462.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu9844497663242409323.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu1044790431212852920.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu1283352658658626704.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu3447707967272884216.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu6481999487555785010.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_hu15156847340136596462.jpg" width="2870" height="1290" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>What&rsquo;s the far larger slice of impact? What he calls &ldquo;structured communication.&rdquo; Here&rsquo;s what it looks like:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu12152134638551789614.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu3219153769424162025.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu14575811192789949145.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu2624163284583722604.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu6480618899422600449.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu16535681605463897945.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu6161768738440804415.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu13314194898807011919.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu5901299140593582490.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu8052970461977306086.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu801534157413130992.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu7731394015850696264.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu9452193385093036645.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu10194672227340371024.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_details_hu5901299140593582490.jpg" width="2866" height="1278" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>He sees structured communication as the key bottleneck in software engineering, and predicts that it will only get more painful as models get better.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu5515114707627826518.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu251410312087724441.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu142948092458636249.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu2087655435916584643.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu10581999720083267421.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu16230680521066302871.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu9967597785968858484.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu5614344362095251254.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu11450703627869869082.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu13059610969269897017.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu7515097777802063381.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu16173731376459791136.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu5715222460291485945.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu14832532590728595326.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_structured_communication_bottleneck_hu11450703627869869082.jpg" width="2876" height="1260" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<blockquote>
<p>In the near future, the person who communicates most effectively is the most valuable programmer. And literally, if you can communicate effectively, you can program.</p>
</blockquote>
<p>Vibe coding &ndash; why it feels great &ndash; fundamentally about communication first, coding second. But the weird thing: we communicate via prompts to express our intentions, our values. We then produce an artifact, code, and <strong>throw away</strong> the valuable stuff, the prompts! That&rsquo;s like throwing away the source code and just keeping the binary compiled output. This leads Grove to emphasize that written specs are critical, and why:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_humans.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu17545045531647667820.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu12671024437650054782.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu12126741353679131340.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu13668224356798459993.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu7826006972508756895.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu12042563556434226630.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu197054804016521353.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu4398184817442762824.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu16275112006000805998.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu7355409371077439246.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu1240288566245079233.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu2719051334085265928.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu5999701928313227676.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu16555659573091374976.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_written_spec_aligns_hu16275112006000805998.jpg" width="2866" height="1288" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Grove uses another analogy: specs are like a lossless format, while code is lossy. Specs contain more information, code is a lossy representation that has lost some of that information.</p>
<p>He walked us through an example relating to OpenAI&rsquo;s model specs (intentions and values) which are now published; and a recent sycophancy regression identified in an updated version of their GPT-4o model. The model spec contained very specific anti-sycophancy language, but the behavior GPT-4o update was clearly not aligning with those specs. As a result, the team was able to confirm &ldquo;bug, not intentional,&rdquo; roll back the update, and fix the problem. The written specs acted as a &ldquo;trust anchor&rdquo; here, a trustworthy source on how the model should behave.</p>
<p>One more corollary: whoever writes the specs is the programmer.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu15789235288466472805.webp 320w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu7292721484498214855.webp 640w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu8735235940244070572.webp 768w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu5249792832624347339.webp 1024w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu18118174459974558393.webp 1280w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu1763147936612293811.webp 1536w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu14557920710154259132.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu16844589159660488167.jpg 320w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu5928927991489699029.jpg 640w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu18392938156246356930.jpg 768w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu15457643716316576896.jpg 1024w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu3870373971391500208.jpg 1280w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu3223063038923614890.jpg 1536w, /blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu5623347303357978059.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-2-highlights/grove_whoever_writes_specs_hu5928927991489699029.jpg" width="2854" height="1276" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Grove&rsquo;s talk, paired with <a href="#ship-production-software-in-minutes-not-months">Reyes&rsquo; talk earlier in the day</a>, form an <strong>AI Spec Sandwich</strong>. Welcome to the new programming.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Better Way to Give Claude Code Context</title>
      <link>https://craftycto.com/micro/giving-claude-code-context/</link>
      <pubDate>Wed, 30 Jul 2025 20:53:47 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/giving-claude-code-context/</guid>
      <description>I like Scott Werner&amp;#39;s more structured approach</description>
      <content:encoded><![CDATA[<p>I just finished my first deep dive with <a href="https://www.anthropic.com/claude-code">Claude Code</a>, a Vision proof of concept that extracts handwritten data off clear plastic bags&mdash;<strong>filled</strong> plastic bags, that is &hellip;. Claude Code and I started Friday, and by Monday we had a robust proof of concept, implemented in Python CLI form, including parallelized LLM calls and detailed documentation. My working time was maybe an hour per day, and the <a href="https://docs.anthropic.com/en/api/overview">Anthropic API</a> bill for Claude&rsquo;s model usage was about $80. I&rsquo;d rate the ROI on that $80 investment extremely high &hellip;.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/giving-claude-code-context/code_stats.png"><picture>
    <source type="image/webp" srcset="/micro/giving-claude-code-context/code_stats_hu1630127590437830223.webp 320w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/giving-claude-code-context/code_stats_hu8080298436677932108.jpg 320w" sizes="75vw" />
    
      <img src="/micro/giving-claude-code-context/code_stats_hu8127801284307008584.jpg" width="400" height="358" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I knew enough to spend time giving Claude plenty of context. I was at the <a href="https://www.ai.engineer/">AI Engineer World&rsquo;s Fair</a> in June, had seen Anthropic&rsquo;s <a href="https://www.linkedin.com/in/bcherny/">Boris Cherny</a> speak. So I had Cherny&rsquo;s context tips, and created a number of markdown files, including <code>CLAUDE.md</code> at the project root, along with a well-populated <code>/docs</code> folder.</p>
<p>I had noted <a href="https://worksonmymachine.ai/">Scott Werner</a>&rsquo;s post <a href="https://worksonmymachine.ai/p/nobody-knows-how-to-build-with-ai">Nobody Knows How To Build With AI Yet</a> when it first came out a week or two back, and finally got around to reading it this morning. Werner levels us up on how to give Claude Code context, adding some well-thought-out separation and structure:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/giving-claude-code-context/werner_context.png"><picture>
    <source type="image/webp" srcset="/micro/giving-claude-code-context/werner_context_hu5113788279574523381.webp 320w, /micro/giving-claude-code-context/werner_context_hu1009929958452455553.webp 640w, /micro/giving-claude-code-context/werner_context_hu1050261210059112068.webp 768w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/giving-claude-code-context/werner_context_hu1541858090721641090.jpg 320w, /micro/giving-claude-code-context/werner_context_hu17948880492423928226.jpg 640w, /micro/giving-claude-code-context/werner_context_hu7075126454738054215.jpg 768w" sizes="100vw" />
    
      <img src="/micro/giving-claude-code-context/werner_context_hu17948880492423928226.jpg" width="1012" height="1157" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>His full GitHub Gist <a href="https://gist.github.com/swerner/b7fd285ec3f2edbcc55ebccdaffc950a">here</a>. As Werner caveats, though:</p>
<blockquote>
<p>I have no idea what I&rsquo;ll build next week. What process I&rsquo;ll use. What documents I&rsquo;ll create or abandon. Whether any of this will still make sense &hellip; My four-document system isn&rsquo;t a recommendation. It&rsquo;s just one data point in the collective experiment we&rsquo;re all running. A fossil from last week&rsquo;s development process. Already outdated. Already nostalgic.</p>
</blockquote>
<p>Things move fast in AI time, but for now, I&rsquo;ll apply Werner&rsquo;s approach on my next Claude Code project.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>ChatGPT Images Pictorial</title>
      <link>https://craftycto.com/micro/chatgpt-images-pictorial/</link>
      <pubDate>Tue, 29 Jul 2025 21:21:00 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/chatgpt-images-pictorial/</guid>
      <description>Cthulhu chimes in on the environment</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<p>Photo I shot on my walk:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/chatgpt-images-pictorial/orig_photo_sm.png"><picture>
    <source type="image/webp" srcset="/micro/chatgpt-images-pictorial/orig_photo_sm_hu17288352010782899013.webp 320w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu197495819939647415.webp 640w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu17357429573995448345.webp 768w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu11982123372176551873.webp 1024w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu5384155599092350413.webp 1280w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu13812438601040680455.webp 1536w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu14222604459341984279.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/chatgpt-images-pictorial/orig_photo_sm_hu5829963859599545118.jpg 320w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu3969267820072622987.jpg 640w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu4946324218824897175.jpg 768w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu11146536817843787703.jpg 1024w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu15589608089219126564.jpg 1280w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu5378485029802292233.jpg 1536w, /micro/chatgpt-images-pictorial/orig_photo_sm_hu7119552646811582102.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/chatgpt-images-pictorial/orig_photo_sm_hu3969267820072622987.jpg" width="2048" height="2731" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Found a more complete photo on the web:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/chatgpt-images-pictorial/web_photo.png"><picture>
    <source type="image/webp" srcset="/micro/chatgpt-images-pictorial/web_photo_hu3933134321812512196.webp 320w, /micro/chatgpt-images-pictorial/web_photo_hu13775632590487479024.webp 640w, /micro/chatgpt-images-pictorial/web_photo_hu1619633224706417714.webp 768w, /micro/chatgpt-images-pictorial/web_photo_hu667158656653362675.webp 1024w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/chatgpt-images-pictorial/web_photo_hu7591391821711003200.jpg 320w, /micro/chatgpt-images-pictorial/web_photo_hu18417009778726186520.jpg 640w, /micro/chatgpt-images-pictorial/web_photo_hu7774717502134204902.jpg 768w, /micro/chatgpt-images-pictorial/web_photo_hu16047638248727311487.jpg 1024w" sizes="100vw" />
    
      <img src="/micro/chatgpt-images-pictorial/web_photo_hu18417009778726186520.jpg" width="1024" height="768" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>ChatGPT Images prompt:</p>
<blockquote>
<p>Modify this:</p>
<p>EAST JORDAN becomes CTHULHU</p>
<p>DUMP NO WASTE! becomes TOO LATE F[expletive]S!</p>
<p>DRAINS TO WATERWAYS becomes I OWN THE WATERWAYS</p>
</blockquote>
<p>First ChatGPT Images version (after ChatGPT-enforced rewording of the expletive):</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/chatgpt-images-pictorial/images_take_1.png"><picture>
    <source type="image/webp" srcset="/micro/chatgpt-images-pictorial/images_take_1_hu4268899774013348361.webp 320w, /micro/chatgpt-images-pictorial/images_take_1_hu5227163691693538238.webp 640w, /micro/chatgpt-images-pictorial/images_take_1_hu14083044698109483030.webp 768w, /micro/chatgpt-images-pictorial/images_take_1_hu12310962254923494320.webp 1024w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/chatgpt-images-pictorial/images_take_1_hu7793689175809537201.jpg 320w, /micro/chatgpt-images-pictorial/images_take_1_hu83229200215476257.jpg 640w, /micro/chatgpt-images-pictorial/images_take_1_hu15933004593219798181.jpg 768w, /micro/chatgpt-images-pictorial/images_take_1_hu928051819667442088.jpg 1024w" sizes="100vw" />
    
      <img src="/micro/chatgpt-images-pictorial/images_take_1_hu83229200215476257.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Refinement prompt:</p>
<blockquote>
<p>Instead of cutting the Cthulhu images into the manhole metal, let’s make them embossed/raised like the fish were</p>
</blockquote>
<p>Final ChatGPT Images version:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/chatgpt-images-pictorial/images_take_2b.png"><picture>
    <source type="image/webp" srcset="/micro/chatgpt-images-pictorial/images_take_2b_hu7617873203404727328.webp 320w, /micro/chatgpt-images-pictorial/images_take_2b_hu3397290371908614187.webp 640w, /micro/chatgpt-images-pictorial/images_take_2b_hu17324878179103734460.webp 768w, /micro/chatgpt-images-pictorial/images_take_2b_hu12672667128174878854.webp 1024w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/chatgpt-images-pictorial/images_take_2b_hu14328004490771204935.jpg 320w, /micro/chatgpt-images-pictorial/images_take_2b_hu13710580540796700228.jpg 640w, /micro/chatgpt-images-pictorial/images_take_2b_hu8965279421527956290.jpg 768w, /micro/chatgpt-images-pictorial/images_take_2b_hu4970776708386982384.jpg 1024w" sizes="100vw" />
    
      <img src="/micro/chatgpt-images-pictorial/images_take_2b_hu13710580540796700228.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Crazy good.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Speak&#39;s Andrew Hsu on the CTO&#39;s Role in AI Tooling Adoption</title>
      <link>https://craftycto.com/micro/speak-cto-ai-adoption/</link>
      <pubDate>Sun, 27 Jul 2025 17:58:05 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/speak-cto-ai-adoption/</guid>
      <description>I resonated absolutely: this is my life today as a fractional CTO ...</description>
      <content:encoded><![CDATA[<p>The <a href="https://www.youtube.com/watch?v=tIVKgztDaYQ&amp;list=PLWEAb1SXhjlfkEF_PxzYHonU_v5LPMI8L&amp;index=7">Latent Space podcast</a> had an excellent interview with <a href="https://www.linkedin.com/in/adhsu/">Andrew Hsu</a>, cofounder and CTO at AI-generation language learning platform <a href="https://www.speak.com/">Speak</a>. While the main conversation centered around Speak&rsquo;s story and AI&rsquo;s role in that story, I was most struck by a side exchange where Hsu explained what he sees his role to be, as CTO, around promoting the use of AI tooling within Speak&rsquo;s engineering team:</p>
<blockquote>
<p>So I think as the CTO, I view it as part of my responsibility to really set expectations, push everyone on the team, show them what&rsquo;s possible. We&rsquo;ve been trying everything. And I think we tried to basically set the expectation that the frontier is moving so fast, it&rsquo;s deeply non-intuitive.</p>
<p>If you&rsquo;ve tried coding tools six months ago and they weren&rsquo;t that great, especially if it&rsquo;s not TypeScript or Python, right? It&rsquo;s a mode collapse to the most popular languages. That&rsquo;s all it is. We try to set a culture in the engineering team where usage of these tools as much as possible and as a default path is the expectation.</p>
<p>And in hiring, we are now explicitly asking about this a lot, thinking about what are the types of people that are going to be better, higher agency at trying these types of tools. It&rsquo;s so important.</p>
</blockquote>
<p>This! This is what my life is evolving towards these days as a fractional CTO. More accurately&mdash;applying AI in engineering is maybe 50% of my focus. The other is with the CEO and the leadership team, setting the same expectations and approach for non-Engineering application of AI. It&rsquo;s a fun time to be a CTO &hellip;</p>
<p>Here&rsquo;s the video snip from the interview via the <a href="https://www.snipd.com/">Snipd</a> AI podcast player:</p>

<iframe src="https://share.snipd.com/snip/792390a7-bb60-4033-b088-aa22507bf53e" width="100%" height="400" style="border: 0;"></iframe>

]]></content:encoded>
    </item>
    
    <item>
      <title>OpenAI Windsurf Deal: Off</title>
      <link>https://craftycto.com/micro/openai-windsurf-deal-off/</link>
      <pubDate>Sat, 12 Jul 2025 08:23:09 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/openai-windsurf-deal-off/</guid>
      <description>TL;DR: the fat lady did not sing for Windsurf</description>
      <content:encoded><![CDATA[<p>Ouch! The <a href="https://www.theverge.com/openai/705999/google-windsurf-ceo-openai">OpenAI Windsurf deal is off</a>, according to reporting from <a href="https://www.theverge.com/">The Verge</a>. This was the rumored acquisition of <a href="https://windsurf.ai/">Windsurf</a>, a company building an AI codegen IDE with agentic features. Not only that, Windsurf&rsquo;s CEO has left to join Google. Double ouch. 😬</p>
<p>This halts what seemed like a foolish acquisition by OpenAI, who has been making moves to build its own developer tools with Codex. Furthermore, Windsurf is not, in my opinion, the best tool in the &ldquo;Agentic IDE&rdquo; space.</p>
<p>As I noted in my <a href="/blog/aiewf2025-my-day-1-highlights/#windsurf-everywhere-doing-everything-all-at-once">AIEWF2025 Day 1 recap</a>, I haven&rsquo;t been particularly impressed with Windsurf, and their presentation at the conference didn&rsquo;t change that opinion:</p>
<blockquote>
<p>In the AI Coding space, IDE-tool subspace, my most-admired product, and also the one I have the most experience with, is Cursor. In my experience, which combines a lot of paying attention to what others think and a moderate degree of hands-on use, Cursor leads this sub-niche. The AIEWF2025 audience seemed to agree, when someone asked for raised hands for who uses Windsurf, and who uses Cursor. My estimate was about 5:1 Cursor:Windsurf.</p>
</blockquote>
<blockquote>
<p>It&rsquo;s possible, no doubt, that I&rsquo;m missing something important. I strive to remain open-minded. I will give Windsurf major credit for capitalizing on OpenAI&rsquo;s need to beef up their AI Coding story. If Windsurf can close that $3B deal&mdash;that fat lady hasn&rsquo;t sung quite yet&mdash;being part of OpenAI may give Windsurf the unique advantage that its current product capabilities do not.</p>
</blockquote>
<p>In the end, the fat lady did not sing for Windsurf.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>ChatGPT Tip via OpenAI&#39;s Noam Brown: Use o3!</title>
      <link>https://craftycto.com/micro/o3/</link>
      <pubDate>Tue, 01 Jul 2025 08:23:09 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/o3/</guid>
      <description>I never liked o1 much, but Brown is right, o3 is amazing ...</description>
      <content:encoded><![CDATA[<p>I listened to the recent <a href="https://www.latent.space/">Latent Space podcast</a> episode with <a href="https://openai.com/">OpenAI</a>&rsquo;s <a href="https://www.linkedin.com/in/noam-brown-8b785b62">Noam Brown</a>. It was, as usual for <a href="https://www.swyx.io/">Shawn &ldquo;swyx&rdquo; Wang</a> and <a href="https://www.linkedin.com/in/fanahova/">Alessio Fanelli</a>, a great conversation, among its topics the power of reasoning models such as OpenAI&rsquo;s <a href="https://openai.com/o1/">o1</a> and <a href="https://openai.com/index/introducing-o3-and-o4-mini/">o3</a>. I was struck by this comment from Brown:</p>
<blockquote>
<p>One thing I&rsquo;m surprised by is how many people don&rsquo;t even know that o3 exists. Like, I&rsquo;ve been using it day to day. It&rsquo;s basically replaced Google search for me. Like, I just use it all the time.</p>
</blockquote>
<p>I had experimented a bit with  o1 when it came out, but found it slow and not appreciably better for day to day tasks as <a href="https://en.wikipedia.org/wiki/GPT-4o">GPT-4o</a>. That experience led me to largely ignore o3 when it came out, given that GPT-4o and <a href="https://www.anthropic.com/claude/sonnet">Claude Sonnet 4</a> are so solid and keep getting better.</p>
<p>I took Brown&rsquo;s advice, though, and used o3 to tackle two household challenges: buying a roof rack crossbar for my Subaru Forester Hybrid, and diagnosing an issue with a <a href="https://www.thermacell.com/products/category/rechargeable">Thermacell Radius</a> mosquito repeller, both tricky little problems. Finding the right crossbar for the Forester&rsquo;s low-profile rails would have been a nightmare in Google, and even likely to trip up a smart one-shot model LLM GPT-4o. But o3 thought hard, using every bit of context I gave it, such as photos of the low-profile rails, and recommended solutions that checked out as accurate. When the Thule crossbar I had in mind was out of stock, it helped me find the Yakima equivalent, and proved to be a good shopping assistant, providing street prices and where-to-buy links. Big win.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/o3/o3_rack.png"><picture>
    <source type="image/webp" srcset="/micro/o3/o3_rack_hu10982261145836476597.webp 320w, /micro/o3/o3_rack_hu2298946242145260626.webp 640w, /micro/o3/o3_rack_hu12854000331885195653.webp 768w, /micro/o3/o3_rack_hu16905388183869292423.webp 1024w, /micro/o3/o3_rack_hu34073143855721762.webp 1280w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/o3/o3_rack_hu9372459126125717878.jpg 320w, /micro/o3/o3_rack_hu7342186514705300877.jpg 640w, /micro/o3/o3_rack_hu3016349173675003260.jpg 768w, /micro/o3/o3_rack_hu1818301584203992855.jpg 1024w, /micro/o3/o3_rack_hu17807225436110532953.jpg 1280w" sizes="75vw" />
    
      <img src="/micro/o3/o3_rack_hu7342186514705300877.jpg" width="1320" height="2868" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The Thermacell Radius was doing a flash-3-lights thing when I tried to power it on, normally a sign that the unit is locked, but unlocking didn&rsquo;t help. I was considering just buying a new one, but figured I&rsquo;d ask o3 first. I gave it a photo and a minimal description of the flashing lights symptom. o3 thought for a bit, and responded with the unlock procedure, but also suggested cleaning the electrical contacts between the unit&rsquo;s base and top lid. That worked! Another win.</p>
<p>So: start using o3 in (paid) ChatGPT&mdash;it&rsquo;s a game-changer.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI Engineer World&#39;s Fair 2025: My Day 1 Highlights</title>
      <link>https://craftycto.com/blog/aiewf2025-my-day-1-highlights/</link>
      <pubDate>Wed, 18 Jun 2025 16:36:00 -0400</pubDate>
      
      <guid>https://craftycto.com/blog/aiewf2025-my-day-1-highlights/</guid>
      <description>Key takeaways and observations from Day 1 of the AI Engineer World&amp;#39;s Fair 2025</description>
      <content:encoded><![CDATA[<p>My live experience at the AI Engineer World&rsquo;s Fair 2025 in San Francisco could be summarized as &ldquo;extremely intense.&rdquo; As I sat down to recap my highlights, starting with this post covering what Day 1, I ended up re-watching every session, and now I understand better <em>why</em> it felt so intense&mdash;the amount of information packed into the short 20 minute sessions was immense, and the people communicating that information were, on average, &ldquo;brilliant plus&rdquo; humans &hellip;</p>
<p>Here&rsquo;s a quick summary table of what I attended in-person, with links to the detailed sections with my recaps&mdash;some brief, some more extended&mdash;and links to the session video. I had originally included ratings, but pretty much everything deserved five stars so I canned that idea.</p>
<p>I hope these notes help you get a sense of the energy, trends, and ideas shaping the future of AI and AI Engineering. Enjoy!</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Section</th>
          <th style="text-align: left">Session</th>
          <th style="text-align: left">Speaker</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">Morning Keynotes</td>
          <td style="text-align: left"><a href="#designing-ai-intensive-applications">Designing AI-Intensive Applications</a></td>
          <td style="text-align: left">Shawn &ldquo;swyx&rdquo; Wang (Latent Space)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#spark-to-system-building-the-open-agentic-web">Spark to System: Building the Open Agentic Web</a></td>
          <td style="text-align: left">Asha Sharma (Microsoft)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#state-of-startups-and-ai-2025">State of Startups and AI 2025</a></td>
          <td style="text-align: left">Sarah Guo (Conviction)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#2025-in-llms-so-far">2025 in LLMs so far</a></td>
          <td style="text-align: left">Simon Willison (SimonWillison.net)</td>
      </tr>
      <tr>
          <td style="text-align: left">MCP Track</td>
          <td style="text-align: left"><a href="#mcp-origins--rfs">MCP Origins &amp; Request for Startups</a></td>
          <td style="text-align: left">Theo Chu (Anthropic)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#what-we-learned-from-shipping-remote-mcp-support-at-anthropic">What we learned from shipping remote MCP support at Anthropic</a></td>
          <td style="text-align: left">John Welsh (Anthropic)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#full-spectrum-mcp-uncovering-hidden-servers-and-clients-capabilities">Full Spectrum MCP: Uncovering Hidden Servers and Clients Capabilities</a></td>
          <td style="text-align: left">Harald Kirschner (VS Code, Microsoft)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#mcp-isnt-good-yet">MCP isn&rsquo;t good, yet</a></td>
          <td style="text-align: left">David Cramer (Sentry)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#mcp-is-all-you-need">MCP is all you need</a></td>
          <td style="text-align: left">Samuel Colvin (Pydantic)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#observable-tools---the-state-of-mcp-observability">Observable tools - the state of MCP observability</a></td>
          <td style="text-align: left">Alex Volkov (Weights &amp; Biases), Benjamin Eckel (Dylibso)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#the-rise-of-the-agentic-economy-on-the-shoulders-of-mcp">The rise of the agentic economy on the shoulders of MCP</a></td>
          <td style="text-align: left">Jan Čurn (Apify)</td>
      </tr>
      <tr>
          <td style="text-align: left">Afternoon Keynotes</td>
          <td style="text-align: left"><a href="#building-agents-at-cloud-scale">Building Agents at Cloud-Scale</a></td>
          <td style="text-align: left">Antje Barth (AWS)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#windsurf-everywhere-doing-everything-all-at-once">Windsurf everywhere, doing everything, all at once</a></td>
          <td style="text-align: left">Kevin Hou (Windsurf)</td>
      </tr>
      <tr>
          <td style="text-align: left"></td>
          <td style="text-align: left"><a href="#define-ai-engineer">Define AI Engineer</a></td>
          <td style="text-align: left">Greg Brockman (OpenAI), Shawn &ldquo;swyx&rdquo; Wang (Latent Space)</td>
      </tr>
  </tbody>
</table>
<h2 id="designing-ai-intensive-applications">Designing AI-Intensive Applications</h2>
<p><strong>Speaker:</strong> <a href="https://www.swyx.io/">Shawn &ldquo;swyx&rdquo; Wang</a> (<a href="https://latentspace.co/">Latent Space</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=1337s">Session video</a></p>
<p>Swyx delivers an incredible overview of the state of the space. He compares today&rsquo;s state of AI today to early days in physics where the <a href="https://en.wikipedia.org/wiki/Standard_Model">Standard Model</a> was developed and ended up serving physics almost unchanged through today. Swyx proposes a candidate for AI&rsquo;s own Standard Model, SPADE:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/swyx_day1.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_day1_hu14005165768025343945.webp 320w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu7238927332086079538.webp 640w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu12837347674365625780.webp 768w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu9638152528323420690.webp 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu9822959005473821501.webp 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu3756616000029501426.webp 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu15136377826813841198.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_day1_hu8783479664460975274.jpg 320w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu3069919035541478716.jpg 640w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu17069142707431601332.jpg 768w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu11927882340311548945.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu13845120095177030800.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu2112301822666776348.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_day1_hu6541943206099368.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/swyx_day1_hu3069919035541478716.jpg" width="2992" height="1414" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="spark-to-system-building-the-open-agentic-web">Spark to System: Building the Open Agentic Web</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/aboutasha">Asha Sharma</a> (<a href="https://www.microsoft.com/">Microsoft</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=2146s">Session video</a></p>
<p>As with <a href="https://aws.amazon.com/">AWS</a>&rsquo;s keynote later in the day featuring <a href="https://www.linkedin.com/in/antje-barth">Antje Barth</a>, this session with Microsoft&rsquo;s Asha Sharma set off my &ldquo;oh no, vendor product-flogging ahead&rdquo; alarm. That&rsquo;s not being fair though; we need major players like MS who can deliver necessary, massive-scale platforms, and they need to flog the sexy bits so they can sell the boring ones; no margin, no mission, as they say.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu8412271078355054432.webp 320w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu18393541974318996717.webp 640w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu10149911996691520269.webp 768w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu11027690956339197568.webp 1024w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu6699396267547748467.webp 1280w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu7531904144413261794.webp 1536w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu11808275444021138819.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu636280211840516917.jpg 320w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu5311205971980176730.jpg 640w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu6802903730075319284.jpg 768w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu17804106929553385399.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu583931566799052343.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu16655888564393355811.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu13028575693138992092.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/ms_sharma_ai_factory_hu5311205971980176730.jpg" width="2031" height="906" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>It&rsquo;s also not fair in that Microsoft has staked out major segments in the AI landscape, even beyond their huge (if now troubled) partnership with <a href="https://openai.com/">OpenAI</a>&mdash;<a href="https://github.com/features/copilot">Copilot</a> of course, but also the <a href="https://code.visualstudio.com/">VS Code</a> ecosystem with its pioneering role in AI Coding, <a href="https://github.com/">GitHub</a> serving as a core source of context for AI Coding and actions in the agentic subcategory, and on and on.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu5350719295863169006.webp 320w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu13872348858174047086.webp 640w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu13035562018431121803.webp 768w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu15201224283337341698.webp 1024w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu17685405610753132998.webp 1280w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu654590620551558997.webp 1536w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu3408450597452802272.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu4608077210254302265.jpg 320w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu15013375693263518796.jpg 640w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu11349042403676614477.jpg 768w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu3572149965863571914.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu6627898925657970289.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu2396039088866795973.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu1041661911162953227.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/ms_agentic_demo2_hu15013375693263518796.jpg" width="2031" height="927" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Sharma shows us some significant new capabilities arriving in Copilot, and with her team presents a couple different agentic app solutions.  Worth watching, understanding Microsoft&rsquo;s broad suite of AI offerings is essential.</p>
<h2 id="state-of-startups-and-ai-2025">State of Startups and AI 2025</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/sarahxguo">Sarah Guo</a> (<a href="https://conviction.com/">Conviction</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=3542s">Session video</a></p>
<p>Sarah wins the &ldquo;best save&rdquo; award when AV fails, leaving her with no slides &hellip; she still pulls off a great presentation, and doesn&rsquo;t even run over. Excellent overview of the state of AI, the pace of progress, trends. I&rsquo;m a fan of the <a href="https://cursor.sh/">Cursor</a> AI Coding tool&mdash;one of Conviction&rsquo;s portfolio companies&mdash;and I love Sarah&rsquo;s recommendation to startups that they should think about building &ldquo;Cursor for X&rdquo; &hellip; it&rsquo;s a nuanced message, though: she gets to the heart of what Cursor actually is: an LLM wrapper, yes, but a <strong>thick, juicy</strong> wrapper.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu5722013755586716371.webp 320w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu11960971329352362471.webp 640w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu4542158353395091873.webp 768w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu3986926742265664976.webp 1024w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu6793179964021601167.webp 1280w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu5296089355484102330.webp 1536w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu397187653545035572.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu8541183163616287858.jpg 320w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu10555676662530154298.jpg 640w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu12282175638107203507.jpg 768w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu6949113299301255609.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu9471704288227451508.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu13510312105281133617.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu8407754833247316992.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/sarah_guo_vidstill_hu10555676662530154298.jpg" width="3370" height="1880" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="2025-in-llms-so-far">2025 in LLMs so far</h2>
<p><strong>Speaker:</strong> <a href="https://simonwillison.net/">Simon Willison</a> (<a href="https://simonwillison.net/">SimonWillison.net</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=5084s">Session video</a></p>
<p>I&rsquo;m a huge fan of Simon&rsquo;s, and here he&rsquo;s in fine form&mdash;fine enough that this presentation won best-of-conference. As an indicator of the accelerating pace of LLM development, Simon was forced to cut the scope of his keynote from &ldquo;the past year&rdquo; to &ldquo;the past six months&rdquo; to have a prayer of finishing in the allotted 20 minutes.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/simonw.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/simonw_hu7175455294548907590.webp 320w, /blog/aiewf2025-my-day-1-highlights/simonw_hu16492460861334691293.webp 640w, /blog/aiewf2025-my-day-1-highlights/simonw_hu5643398483629615409.webp 768w, /blog/aiewf2025-my-day-1-highlights/simonw_hu17909401584979876851.webp 1024w, /blog/aiewf2025-my-day-1-highlights/simonw_hu10081597842563581849.webp 1280w, /blog/aiewf2025-my-day-1-highlights/simonw_hu18369989188163276171.webp 1536w, /blog/aiewf2025-my-day-1-highlights/simonw_hu12486019689343116112.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/simonw_hu3010384638309756678.jpg 320w, /blog/aiewf2025-my-day-1-highlights/simonw_hu182572336908483545.jpg 640w, /blog/aiewf2025-my-day-1-highlights/simonw_hu11087550172354755447.jpg 768w, /blog/aiewf2025-my-day-1-highlights/simonw_hu18028732586375801853.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/simonw_hu16411519531276792434.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/simonw_hu14220314050736320390.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/simonw_hu7589655547859370351.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/simonw_hu182572336908483545.jpg" width="3360" height="1874" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>His &ldquo;draw a pelican riding a bicycle&rdquo; LLM benchmark is both hilarious and an uncannily accurate LLM quality assessment. At least until &ldquo;the pelican test&rdquo; starts to contaminate model training&mdash;I&rsquo;m betting next year this benchmark may no longer yield valid results after Willison showed the <a href="https://deepmind.google/technologies/gemini/">Google Gemini 2.5 Pro</a> pelican on a <a href="https://www.google.com/">Google</a> slide from the recent <a href="https://io.google/2025/">Google IO</a> event &hellip;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/simonw_pelican.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu15847436564610615777.webp 320w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu3407693333705830945.webp 640w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu15973297162262271897.webp 768w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu14293659808577476125.webp 1024w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu12284937430127375299.webp 1280w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu10292837247669276386.webp 1536w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu12176118100166896000.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu202946160644155097.jpg 320w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu17763319033117478720.jpg 640w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu12477303676147742608.jpg 768w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu3031236150631753834.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu12386190250526824166.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu1767535713171067595.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu9665654408268666356.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/simonw_pelican_hu17763319033117478720.jpg" width="3308" height="1858" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="mcp-origins--request-for-startups">MCP Origins &amp; Request for Startups</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/theodorachu">Theo Chu</a> (<a href="https://www.anthropic.com/">Anthropic</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=9076s">Session video</a></p>
<p>Great intro to <a href="https://modelcontextprotocol.io/">Model Context Protocol (MCP)</a>, an open standard invented by Anthropic&mdash;I love authoritative sources. Origins and futures. Highly recommended, start here on MCP.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/theo_chu.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/theo_chu_hu16523127564371190502.webp 320w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu14927729227953011006.webp 640w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu734937279632512519.webp 768w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu4135106345418724979.webp 1024w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu14150217987373001833.webp 1280w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu9081168155447462479.webp 1536w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu2618647512108995368.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/theo_chu_hu10930734227614225616.jpg 320w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu3124043779447423256.jpg 640w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu10917916195823318063.jpg 768w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu14375889580652594114.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu16850448640356637210.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu12744460793500646404.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/theo_chu_hu1950737958112517551.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/theo_chu_hu3124043779447423256.jpg" width="3150" height="1566" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="what-we-learned-from-shipping-remote-mcp-support-at-anthropic">What we learned from shipping remote MCP support at Anthropic</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/johnw188">John Welsh</a> (<a href="https://www.anthropic.com/">Anthropic</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=10187s">Session video</a></p>
<p>This session got straight to the heart of my most important questions about MCP. Even more background on MCP origins, vital information on the elements of MCP. Love the &ldquo;pit of success&rdquo; concept&mdash;make the right thing to do, the easiest thing to do. Excellent.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/john_welsh.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/john_welsh_hu3265463545102451416.webp 320w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu10170715535294876646.webp 640w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu9623707690537593657.webp 768w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu6032015233342555852.webp 1024w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu14494200572971154987.webp 1280w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu10009738731075645044.webp 1536w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu13510225543790966611.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/john_welsh_hu10269757434142348052.jpg 320w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu2591783225949450514.jpg 640w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu3283747735188234776.jpg 768w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu15006895498459371228.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu10333823035346401788.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu13260556468834491768.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/john_welsh_hu907878848992357305.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/john_welsh_hu2591783225949450514.jpg" width="3014" height="1486" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="full-spectrum-mcp-uncovering-hidden-servers-and-clients-capabilities">Full Spectrum MCP: Uncovering Hidden Servers and Clients Capabilities</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/digitarald">Harald Kirschner</a> (<a href="https://code.visualstudio.com/">VS Code</a>, <a href="https://www.microsoft.com/">Microsoft</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=11031s">Session video</a></p>
<p>Now we have authoritative from Microsoft: Harald Kirschner, a Principal Product Manager working on VS Code and <a href="https://github.com/features/copilot">GitHub Copilot</a>, who was instrumental in releasing Agent Mode in Copilot. Kirschner dives a layer deeper into MCP, with great insights into how &ldquo;early days&rdquo; we are, and the basic primitives of the protocol. He does a great job of explaining the self-reinforcing trap that MCP finds itself in at this early stage, where both MCP servers and clients all tend to support the <code>tools</code> primitive, but most lack support (especially <em>thoughtful</em> support) of more powerful primitives such as <code>resources</code> and <code>sampling</code> that enable what he calls &ldquo;rich, <strong>stateful</strong> interactions.&rdquo; And guess what he announced for VS Code: full MCP spec support.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/harald.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/harald_hu13215044824872811910.webp 320w, /blog/aiewf2025-my-day-1-highlights/harald_hu5948838709887455103.webp 640w, /blog/aiewf2025-my-day-1-highlights/harald_hu8778776669708341201.webp 768w, /blog/aiewf2025-my-day-1-highlights/harald_hu8032518145268273083.webp 1024w, /blog/aiewf2025-my-day-1-highlights/harald_hu13514667725535964248.webp 1280w, /blog/aiewf2025-my-day-1-highlights/harald_hu11094475957391345131.webp 1536w, /blog/aiewf2025-my-day-1-highlights/harald_hu17790828133000033400.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/harald_hu1806205796723749250.jpg 320w, /blog/aiewf2025-my-day-1-highlights/harald_hu15046040035279029506.jpg 640w, /blog/aiewf2025-my-day-1-highlights/harald_hu4232166194509119677.jpg 768w, /blog/aiewf2025-my-day-1-highlights/harald_hu8623475950213146065.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/harald_hu11636531555727090423.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/harald_hu5756228816096412637.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/harald_hu5658769275317661570.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/harald_hu15046040035279029506.jpg" width="2688" height="1260" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="mcp-isnt-good-yet">MCP isn&rsquo;t good, yet</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/dmcramer">David Cramer</a> (<a href="https://sentry.io/">Sentry</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=11934s">Session video</a></p>
<p>I immediately liked Cramer and his common-sense, from-the-trenches perspective on MCP. Loved his &ldquo;hot takes&rdquo; imagery&mdash;he described the current phenomenon with MCP where there are lots of &ldquo;I have opinions but haven&rsquo;t actually built anything&rdquo; people hanging around. Sentry wasn&rsquo;t the earliest MCP adopter; what held them back was that they needed a Remote MCP solution with <a href="https://oauth.net/">OAuth</a>, which is only recently becoming viable. He warns about the many problems inherent with <code>stdio</code> and recommends to not screw around with it, just do OAuth, even internally&mdash;it will be worth the effort.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/cramer_hot_takes.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu18272926229971865718.webp 320w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu10007018989890325048.webp 640w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu7991556016581026544.webp 768w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu17002588668889820420.webp 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu16984633087101351532.webp 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu6419240002848740308.webp 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu11989069953012255560.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu15603341864914314110.jpg 320w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu15208036364715346624.jpg 640w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu6480209270701200908.jpg 768w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu12012376418072709378.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu2079477289902755237.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu16013049103119931437.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu970562634450013763.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/cramer_hot_takes_hu15208036364715346624.jpg" width="3422" height="1926" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The Sentry MCP is a really a great example of &ldquo;yet another bit of context&rdquo; for the IDE, and their thoughtful approach instructive. Cramer reinforced the message that we can&rsquo;t just wrap our APIs as MCP tools, with the same endpoints and the same payloads. &ldquo;MCP is not just a thing that sits on top of <a href="https://www.openapis.org/">OpenAPI</a> &hellip;&rdquo; Why? &ldquo;Robots don&rsquo;t know how to reason about giant JSON payloads that were not built for them .. we can&rsquo;t just expose all those things as tools &hellip;&rdquo; He makes it clear that we &ldquo;need to really think about how would you use an agent today, how would the models react to what you do when you provide them context which is what this really is for, and design a system around that &hellip; it might leverage your but it is not your API.&rdquo; In terms of what tools should return, he explains that, in practice JSON is the wrong answer, because language models don&rsquo;t actually handle &ldquo;unexpected JSON&rdquo; well: &ldquo;It can kinda figure out JSON here and there but if you actually push it you&rsquo;ll find it breaks all the time &hellip;&rdquo; What payload format to return then? Instead of JSON, they ended up using <a href="https://daringfireball.net/projects/markdown/">Markdown</a>. They expose <em>some</em> of the API endpoints, and return <em>some</em> of API&rsquo;s response as Markdown: &ldquo;The bare essentials, in a structured way, that a human can think about&mdash;because if a human can reason about it, the language model can reason about it &hellip;&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/cramer_confused_robot.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu12569730845272156568.webp 320w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu17991683322813735434.webp 640w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu6916345784187053277.webp 768w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu16284323497307820442.webp 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu9822576717342659903.webp 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu13776404742332257535.webp 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu15976925343641064861.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu4887913389233139690.jpg 320w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu7778684907729739576.jpg 640w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu18073427813508643550.jpg 768w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu2065770479919441810.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu7832049826715430668.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu1161394766048923463.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu183889207738985716.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/cramer_confused_robot_hu7778684907729739576.jpg" width="2860" height="1494" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Other great tips. &ldquo;Mind your tokens &hellip;&rdquo; because the user is paying for them. Or even spend some tokens yourself, by exposing agents (Sentry&rsquo;s &ldquo;Seer&rdquo; for example) instead of dumb tools. Cramer says agentic-loop MCPs don&rsquo;t work well yet (due to lack of streaming, loop waiting delays, etc.) but the promise is real and when it arrives the value will be super high. &ldquo;This stuff is not that hard &hellip; you can just go build it and try it out &hellip;&rdquo; &ldquo;Everybody is scared of all this stuff because there&rsquo;s fancy new words for everything &hellip; but those fancy new words for things we already have, a new coat of paint&mdash;MCP is just a plug-in architecture, agents are just services, LLM calls and MCP calls are just API calls with a new response format, etc.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu3941606579430265901.webp 320w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu14991306909942000839.webp 640w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu16453499924845559702.webp 768w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu8777422084792523309.webp 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu13761927204597117684.webp 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu14399425982042449052.webp 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu18319121660009576708.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu14132609356177235486.jpg 320w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu9353521315946998501.jpg 640w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu942156120181355341.jpg 768w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu10110204105533823065.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu14314078254276468965.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu2666476223249623039.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu12995303051222379790.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/cramer_mind_your_tokens_hu9353521315946998501.jpg" width="3358" height="1906" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p><a href="https://www.cloudflare.com/">Cloudflare</a> usage was really interesting: &ldquo;We used a lot of Cloudflare tech &hellip; shim up a thing on <a href="https://workers.cloudflare.com/">Workers</a>, they have an OAuth proxy &hellip;&rdquo; explaining &ldquo;we didn&rsquo;t have websocket infrastructure internally, but the MCP protocol requires it &hellip; problem solved &hellip;&rdquo; Super valuable session.</p>
<h2 id="mcp-is-all-you-need">MCP is all you need</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/samuel-colvin">Samuel Colvin</a> (<a href="https://pydantic.dev/">Pydantic</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=18485s">Session video</a></p>
<p>Colvin and Pydantic are famous for the Pydantic Python package, which had been downloaded 1.6B times so far this year, as of the date of the talk.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/colvin_whoami.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu5949040985234291350.webp 320w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu8201727801022308330.webp 640w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu10675261672408602936.webp 768w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu387905297050024957.webp 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu812207209770229752.webp 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu7265131548399569439.webp 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu9515592100879480470.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu6348662802724051573.jpg 320w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu9450172218379500133.jpg 640w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu9783678925364718043.jpg 768w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu10773797881875537415.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu702714658703661682.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu11460034643178755154.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu9029303067865901057.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/colvin_whoami_hu9450172218379500133.jpg" width="3434" height="1906" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The title &ldquo;MCP is all you need&rdquo; plays off <a href="https://www.linkedin.com/in/jxnlco">Jason Liu</a>&rsquo;s &ldquo;Pydantic is all you need&rdquo; talk from about two years ago, and follow-on talk from about a year ago, &ldquo;Pydantic is still all you need.&rdquo; Both talks have the same theme: you&rsquo;re overcomplicating things, people! Colvin goes on to show is just how powerful MCP can be, in conjunction with Pydantic&rsquo;s (also free open source) <a href="https://ai.pydantic.dev/">Pydantic AI</a> package, along with <a href="https://logfire.sh/">Pydantic Logfire</a>, their paid observability platform based on the <a href="https://opentelemetry.io/">OpenTelemetry</a> standard. Colvin walks through all the code, and runs it, right there during his 20-minute talk, despite Wi-Fi troubles. Colvin explains why MCP&rsquo;s tool calling capabilities are much more complex and powerful than you might at first imagine&mdash;dynamic tools, logging, sampling, etc. His explanation of the poorly-named and frequently-misunderstood <code>sampling</code> element of the MCP protocol is excellent&mdash;he makes clear exactly why sampling is so useful and critical.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/colvin_sampling.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu16586556000558210021.webp 320w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu8489316803424572318.webp 640w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu928531814088356257.webp 768w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu3117321308551663479.webp 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu17191456700493589926.webp 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu7006424379479593709.webp 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu7402891657321387487.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu13460951134226173837.jpg 320w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu13679167909442914935.jpg 640w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu15628737541355882173.jpg 768w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu432053789490895402.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu9018196692222954421.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu16450049926995187469.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu13393127971263154128.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/colvin_sampling_hu13679167909442914935.jpg" width="3250" height="1676" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The power of well-implemented observability within an MCP server is clearly on display, delivered via Logfire, which has landed on my go-to list for observability.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/colvin_observability.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_observability_hu12325817402723071412.webp 320w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu13287474849908189208.webp 640w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu1348051103692369468.webp 768w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu17726909606330224187.webp 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu3039326372865263000.webp 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu5395496283259882825.webp 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu13910477792085597142.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/colvin_observability_hu16428844043034202452.jpg 320w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu17550091324982534414.jpg 640w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu1845033710213761838.jpg 768w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu10963180533813891467.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu14208403719195499742.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu5988119409915632249.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/colvin_observability_hu12902149792190746145.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/colvin_observability_hu17550091324982534414.jpg" width="3412" height="1914" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="observable-tools---the-state-of-mcp-observability">Observable tools - the state of MCP observability</h2>
<p><strong>Speakers:</strong> <a href="https://www.linkedin.com/in/alex-volkov-">Alex Volkov</a> (<a href="https://wandb.ai/">Weights &amp; Biases</a>), <a href="https://www.linkedin.com/in/benjamin-eckel-b025831a3">Benjamin Eckel</a> (<a href="https://dylibso.com/">Dylibso</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=19543s">Session video</a></p>
<p>This session took me deeper into the details of MCP observability than I needed to go&mdash;I need to know what&rsquo;s possible, and where to find the details when I need them, but not the full details right now when I don&rsquo;t yet need them. For someone in the midst of building a robust MCP for production use, though, I&rsquo;m sure this content would be super useful.</p>
<p>Alex Volkov&rsquo;s Weights &amp; Biases is known for their observability tool <a href="https://wandb.ai/weave">Weave</a>. Benjamin Eckel operates <a href="https://mcp.run/">MCP.run</a>, which consists of a registry of MCPs, along with tools to glue together, orchestrate and run MCPs (AI services). Both feel the pain of the MCP observability blind spot (black boxes).</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu1745751133956690100.webp 320w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu17758192690069912216.webp 640w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu6872548730080500541.webp 768w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu14976616419035616545.webp 1024w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu12521187946894814958.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu16671180980846897782.jpg 320w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu6630751697074716608.jpg 640w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu1890990494037230955.jpg 768w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu12518101473879669291.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu18001410999763577058.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/mcps_are_black_boxes_hu6630751697074716608.jpg" width="1473" height="776" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Both recommend a standards-based approach: leverage OpenTelemetry (OTel) within MCPs as the best approach for making the MCP black box observable. They explain core concepts of OTel&mdash;traces, spans, sinks, etc. Both show code solutions on their respective platforms applying OTel. Volkov also shows a great example of MCP in action in <a href="https://windsurf.com/">Windsurf</a>, relating to debugging code via MCP tracing.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu11602569599551390353.webp 320w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu16975561014718919662.webp 640w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu5066877572742792680.webp 768w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu980575481806520561.webp 1024w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu13792246601673067676.webp 1280w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu4251715559982678218.webp 1536w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu5317355566873899715.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu3341540367264513556.jpg 320w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu15722471344253046321.jpg 640w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu12864486932370456543.jpg 768w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu3917128279569655077.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu13505724924509529848.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu6408080291026055943.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu7244928040385997947.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/volkov_magic_mcp_moment_hu15722471344253046321.jpg" width="3412" height="1902" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="the-rise-of-the-agentic-economy-on-the-shoulders-of-mcp">The rise of the agentic economy on the shoulders of MCP</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/jancurn/">Jan Čurn</a> (<a href="https://apify.com/">Apify</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=20580s">Session video</a></p>
<p>Čurn&rsquo;s company Apify is a marketplace (read: monetized) of 5,000+ Actors (read agent-like entities), historically web scraping centric, but more recently including other tool categories. Actor creators make money when their Actors are run by Apify customers, with Apify handling payments.infrastructure  strong support of standa</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/curn_apify.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/curn_apify_hu15037238328113293284.webp 320w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu12424326463525562198.webp 640w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu12677319830321883433.webp 768w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu9674441734037330029.webp 1024w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu14505272845579152126.webp 1280w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu14077907953505975110.webp 1536w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu6607796440888316299.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/curn_apify_hu9198754466623245436.jpg 320w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu18108697403009859761.jpg 640w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu8339855220158407382.jpg 768w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu4713712485871119993.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu12385664961981991765.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu16573466030164212571.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/curn_apify_hu442897520024489006.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/curn_apify_hu18108697403009859761.jpg" width="2389" height="1356" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>MCPs are a slam-dunk addition to the Apify ecosystem. Apify was able to expose all 5,000+ Actors thanks to what Čurn calls the killer feature of MCPs, Tool Discovery. Not many clients support it yet&mdash;VS Code and <a href="https://claude.ai/download">Claude desktop</a> just added support. Čurn explains that, while there&rsquo;s no way they could publish 5,000+ Actors via OpenAPI due to search challenges, MCP&rsquo;s Tool Discovery provided an elegant solution. Čurn points out how dominant MCP is becoming for agentic interaction. There are so many MCP registries that <a href="https://mastra.ai/">Mastra</a> even has a <a href="https://mastra.ai/mcp-registry-registry">registry of registries</a>. Double meta. He considers Tool Discovery to be a huge differentiator for MCP.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu17854170674779884364.webp 320w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu15912099726541840661.webp 640w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu10051252686089450721.webp 768w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu5677173429601517829.webp 1024w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu4342515044718582578.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu7505893484747698471.jpg 320w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu630981030019580932.jpg 640w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu2314263189128713459.jpg 768w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu9311533084730951994.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu8411457116499690179.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/curn_mcp_dominance_hu630981030019580932.jpg" width="1476" height="746" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Čurn suggests that, thanks to the richness of the MCP protocol, an agentic economy will arise based on MCP. But: there&rsquo;s a killer problem: how to handle payments when a group (tree) of paid agents are working together to solve a problem? You might be able to discover other agents, but how would you pay them, each the normal setup is for each service to have its own API key and associated account? Give the parent agent a credit card? Bad for so many reasons. Central identity and payments providers? Maybe someday, but it&rsquo;s hard and expensive to launch something like that. Apify has a solution: developers just deal with one API key, and interact only with mcp.apify.com; and entire tree of Actors can issue charges, which are passed back up to the dev via Apify. A great demo ensued using Claude Desktop.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/curn_open_marketplace.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu17419523230212864014.webp 320w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu18389439968125519827.webp 640w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu16547080323959199336.webp 768w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu15771045344288500530.webp 1024w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu175912018998208855.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu263835473397186771.jpg 320w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu1331234222650472077.jpg 640w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu3249014178504139490.jpg 768w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu11862634437541949795.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu2544086902869138119.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/curn_open_marketplace_hu1331234222650472077.jpg" width="1473" height="776" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="building-agents-at-cloud-scale">Building Agents at Cloud-Scale</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/antje-barth">Antje Barth</a> (<a href="https://aws.amazon.com/">AWS</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=26122s">Session video</a></p>
<p>As with Microsoft&rsquo;s keynote featuring Asha Sharma, this session with AWS&rsquo;s Antje Barth set off my &ldquo;oh no, vendor flogging ahead&rdquo; warning lights. That&rsquo;s not being fair though; we need major players like AWS who can deliver massive-scale platforms, and when you&rsquo;re AWS or Microsoft, you have to flog the sexy bits so you can sell the boring ones; no margin, no mission, as they say.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/antje_barth.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/antje_barth_hu8617550072810504784.webp 320w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu17047130367123895676.webp 640w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu416801894415348114.webp 768w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu1778859402567793385.webp 1024w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu15291088263050473896.webp 1280w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu1466322710443695839.webp 1536w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu13611215968681275634.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/antje_barth_hu17675575481535571333.jpg 320w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu13474026029591049088.jpg 640w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu8294430801210812371.jpg 768w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu9637275186176279594.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu6180376050690899226.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu13750539942377242459.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/antje_barth_hu4135649374271913721.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/antje_barth_hu13474026029591049088.jpg" width="2544" height="1273" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>It&rsquo;s also not fair in that, as with Microsoft, Barth and AWS actually had interesting things to show off. <a href="https://www.amazon.com/Meet-the-new-Alexa/dp/B0DCCNHWV5">Alexa+</a> sure looks like it brings to the smart home device the level of real-time intelligence and interactivity that OpenAI&rsquo;s <a href="https://techcrunch.com/2025/06/09/openai-updates-chatgpts-voice-mode-with-more-natural-sounding-speech/">Advanced Voice Mode</a> delivers in their mobile app. I&rsquo;m cautious, though: Amazon has botched their smart home strategy in the past&mdash;see my current Alexa deployment below. My Apple HomePods are likely to join them on the junk shelf as soon as someone trustworthy and with taste delivers on the promise. Apple qualifies as &ldquo;trustworthy and with taste&rdquo;&mdash;but they continue to foot-gun on AI.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/my_alexa_deployment.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu18314227223024463918.webp 320w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu2681320053700527204.webp 640w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu8408102687349438644.webp 768w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu9576139003483221711.webp 1024w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu11385136954068975953.webp 1280w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu11736076877899912428.webp 1536w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu16789176150991055297.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu11646870767085765455.jpg 320w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu9522075271849052111.jpg 640w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu10275550297896738255.jpg 768w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu18425845598161997678.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu11730865711032451109.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu208804829316627404.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu17773392341699649737.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/my_alexa_deployment_hu9522075271849052111.jpg" width="5705" height="2852" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>It&rsquo;s actually interesting how much higher my trust level is for AWS than for mainline Amazon products like Alexa, which leads us to Barth&rsquo;s main topic, agents at cloud scale. Barth did a quick demo of the <a href="https://aws.amazon.com/q/">AWS Q CLI</a> tool&mdash;not impressive on its own, but its three-week time-to-launch was more so. How? <a href="https://aws.amazon.com/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk/">AWS Strands Agents (SA)</a>. Good things about SA: based over <a href="https://aws.amazon.com/bedrock/">Bedrock</a>, which means a wide selection of models to work with, including Anthropic&rsquo;s; and a nice starting set of 20 pre-built tools including memory/<a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation">RAG</a> (the Retrieve tool sounds particularly interesting). What&rsquo;s less clear is how the SA architecture fits in with MCP; what does SA bring to the table that MCP by itself doesn&rsquo;t provide? AWS has lots of MCP server implementations, and MCPs can be used as tools within SA; but AWS seem to view MCP as &ldquo;just one of the open protocols&rdquo; for agents.  We&rsquo;ll have to wait and see how this plays out.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu17163747261466257884.webp 320w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu3700978546547894211.webp 640w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu2425689667966248753.webp 768w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu6178138902721366698.webp 1024w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu4317113281697365104.webp 1280w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu11533106449175107424.webp 1536w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu7711782893305128195.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu7444958243573545323.jpg 320w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu2886753846156185163.jpg 640w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu15438754261903730483.jpg 768w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu6868420749876776399.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu11352930614423351914.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu7960496796679651661.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu18099062505813762353.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_hu2886753846156185163.jpg" width="2457" height="1362" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu9750603274612260128.webp 320w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu16151976083716971564.webp 640w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu8681798254609030214.webp 768w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu2656990236953301700.webp 1024w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu3930179452877868621.webp 1280w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu11362131037073530828.webp 1536w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu13652372275644421380.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu17668805340091678057.jpg 320w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu8786392041146353099.jpg 640w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu17239683215382655611.jpg 768w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu12753450735199625333.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu14960606452934513199.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu9356189716385157903.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu11232303056475575881.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/barth_streams_agents_mcp_hu8786392041146353099.jpg" width="2514" height="1355" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="windsurf-everywhere-doing-everything-all-at-once">Windsurf everywhere, doing everything, all at once</h2>
<p><strong>Speaker:</strong> <a href="https://www.linkedin.com/in/kevinhou22">Kevin Hou</a> (<a href="https://windsurf.com/">Windsurf</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=27266s">Session video</a></p>
<p>In the AI Coding space, IDE-tool subspace, my most-admired product, and also the one I have the most experience with, is Cursor. In my experience, which combines a lot of paying attention to what others think and a moderate degree of hands-on use, Cursor leads this sub-niche. The AIEWF2025 audience seemed to agree, when someone asked for raised hands for who uses Windsurf, and who uses Cursor. My estimate was about 5:1 Cursor:Windsurf. Having seen Kevin Hou&rsquo;s session live, and re-watching it as I write this, I didn&rsquo;t see anything to change my opinion. Hou claimed he was sharing Windsurf&rsquo;s &ldquo;secret sauce&rdquo;&mdash;shared timelines between human and AI&mdash;but this and other points made in the sessions struck me as marketing points as opposed to actual breakthroughs. I didn&rsquo;t see anything new; I just saw obvious points made as if I knew nothing about other tools or the current state-of-the-art in AI Coding.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu6935581350325032686.webp 320w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu1547329920550699115.webp 640w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu14802685227406573079.webp 768w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu11298491520712604097.webp 1024w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu16994962384267991540.webp 1280w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu12639313378646579806.webp 1536w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu17143609790419092597.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu12779363071802779872.jpg 320w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu16316229648925413660.jpg 640w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu15308677622800869272.jpg 768w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu8133626138000688578.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu4715592492517181888.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu1164737948606674039.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu1919182448702501799.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/windsurf_shared_timelines_hu16316229648925413660.jpg" width="2872" height="1532" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>It&rsquo;s possible, no doubt, that I&rsquo;m missing something important. I strive to remain open-minded. I will give Windsurf major credit for capitalizing on OpenAI&rsquo;s need to beef up their AI Coding story. If Windsurf can close that $3B deal&mdash;that fat lady hasn&rsquo;t sung quite yet&mdash;being part of OpenAI may give Windsurf the unique advantage that its current product capabilities do not.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/windsurf_timeline.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu16633914521245129938.webp 320w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu6935049864226310271.webp 640w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu5527155760302612745.webp 768w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu588287898414399461.webp 1024w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu3276007650742465911.webp 1280w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu8744479129648328862.webp 1536w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu16506769700470428299.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu9512104328210807381.jpg 320w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu18268023292926820611.jpg 640w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu11631301018234858752.jpg 768w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu11183220097693598922.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu9201609693984902580.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu7949009969527497604.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu13759019024067906387.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/windsurf_timeline_hu18268023292926820611.jpg" width="3410" height="1868" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="define-ai-engineer">Define AI Engineer</h2>
<p><strong>Speakers:</strong> <a href="https://www.linkedin.com/in/gdb/">Greg Brockman</a> (<a href="https://openai.com/">OpenAI</a>), <a href="https://www.swyx.io/">Shawn &ldquo;swyx&rdquo; Wang</a> (<a href="https://latentspace.co/">Latent Space</a>) &ndash; <a href="https://www.youtube.com/watch?v=z4zXicOAF28&amp;t=28290s">Session video</a></p>
<p>Swyx conducts a fascinating interview of Brockman, with a little help from <a href="https://www.nvidia.com/">Nvidia</a>&rsquo;s <a href="https://www.linkedin.com/in/jenhsunhuang/">Jensen Huang</a> (prerecorded). Having re-watched as part of writing my recap, I picked up a lot I missed in person. There&rsquo;s so much content here, and I&rsquo;ll zoom in on questions in the AI Coding domain.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/swyx_brockman1.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu291831256732508820.webp 320w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu12700017921144289134.webp 640w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu15826634113806187884.webp 768w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu12341122789749918366.webp 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu15009076985177841372.webp 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu14586163663709625986.webp 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu11226055395767597071.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu13914711105151296117.jpg 320w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu17489964317315336843.jpg 640w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu1524029245040428891.jpg 768w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu5230971042755626074.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu14056270962775717314.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu2706287924186261884.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu2501159964871979218.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/swyx_brockman1_hu17489964317315336843.jpg" width="3446" height="1856" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p><strong>Swyx:</strong> What are your thoughts on vibe coding?</p>
<p><strong>Brockman:</strong> I think that vibe coding is amazing as an empowerment mechanism, right? I think it&rsquo;s sort of a representation of what is to come. And I think that the specifics of what vibe coding is, I think that&rsquo;s going to change over time, right? I think that you look at even things like <a href="https://openai.com/codex/">Codex</a> like to some extent I think our vision is that as you start to have agents that really work that you can have not just one copy not just 10 copies but you can have a hundred or thousand or 10,000 100 thousand of these things running you&rsquo;re going to want to treat them much more like a co-worker, right, that you&rsquo;re going to want them off in the cloud doing stuff being able to hook up to all sorts of things you&rsquo;re asleep, your laptop&rsquo;s closed it should still be working. I think that the current conception of of vibe coding in an interactive loop &hellip; My prediction of what will happen &hellip; there&rsquo;s going to be more and more of that happening, but I think that the agentic stuff is going to also really intercept and overtake. And I think that all of this is just going to result in just way more systems being built.</p>
<p>Also very interesting is that a lot of the vibe coding kind of demos and and the cool flashy stuff, for example, making the joke website, it&rsquo;s making an app from scratch. But the thing that I think will really be new and transformative and starting to really happen is being able to transform existing applications to go deeper. So many companies are sitting on legacy codebases and doing migrations and updating libraries and changing your <a href="https://en.wikipedia.org/wiki/COBOL">COBOL</a> language to something else is so hard and is actually just not very fun for humans and we&rsquo;re starting to get AI that are able to really tackle those problems and the thing that I love about where vibe coding started has really been like with the most like just make cool apps kind of thing and it&rsquo;s starting to become much more like serious software engineering. And I think that going even deeper to just like making it possible to just move so much faster as a company. That&rsquo;s I think where we&rsquo;re headed.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/swyx_brockman2.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu1121679239845488358.webp 320w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu11131579494011931954.webp 640w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu10794313497671327141.webp 768w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu2275677668806221197.webp 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu2559551360996726740.webp 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu16049882332457960010.webp 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu9115483234322996481.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu17595985370228170963.jpg 320w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu14010786819370964113.jpg 640w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu13758921908504200718.jpg 768w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu12717480843237619684.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu17490825094917175721.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu7126306216465607938.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu15218097603012796296.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/swyx_brockman2_hu14010786819370964113.jpg" width="3430" height="1892" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p><strong>Swyx:</strong> How do you think that Codex changes the way we code?</p>
<p><strong>Brockman:</strong> The direction is something that is like just so compelling and incredible to me. The thing that has been the most interesting to see has been when you realize that the way your structure your codebase determines how much you can get out of Codex, right? Like all of our existing codebases are kind of matched to the strengths of humans. But if you match instead to the strength of models which are sort of very lopsided, right? Models are able to handle way more like diversity of stuff but are not able to sort of necessarily connect deep ideas as much as humans are right now. And so what you kind of want to do is make smaller modules that are well tested that have tests that can be run very quickly and then fill in the details. The model will just do that, right? And it&rsquo;ll run the test itself.</p>
<p>The connection between these different components, kind of the architecture diagram, that&rsquo;s actually pretty easy to do, and then it&rsquo;s like filling out all the details that is often very difficult. And if you actually do that, you know, what I described also sounds a lot like good software engineering practice. But it&rsquo;s just like sometimes because humans are capable of holding more of this like conceptual abstraction in our head, we just don&rsquo;t do it &ndash; it&rsquo;s a lot of work to write these tests and to flesh them out and that the model&rsquo;s going to run these tests like a hundred times or a thousand times more than you will and so it&rsquo;s going to care way way more. So in some ways the direction we want to go is build our codebases for more junior developers in order to actually get the most out of these models.</p>
<p>Now it&rsquo;ll be very interesting to see as we increase the model capability, does this particular way of structuring code bases remain constant? I think that it&rsquo;s a good idea because again, it starts to match what you should be doing for maintainability for humans. But yeah, I think that to me the really exciting thing to think about for the future of software engineering is, what of our practices that we cut corners on, do we actually really need to bring back, in order to get the most out of our systems?</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/brockman.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/brockman_hu8892920328393169885.webp 320w, /blog/aiewf2025-my-day-1-highlights/brockman_hu18250004804429134780.webp 640w, /blog/aiewf2025-my-day-1-highlights/brockman_hu7761516670590314693.webp 768w, /blog/aiewf2025-my-day-1-highlights/brockman_hu12791176112368483000.webp 1024w, /blog/aiewf2025-my-day-1-highlights/brockman_hu12852694246036169052.webp 1280w, /blog/aiewf2025-my-day-1-highlights/brockman_hu14824334076511340865.webp 1536w, /blog/aiewf2025-my-day-1-highlights/brockman_hu13507341694157639355.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/brockman_hu8945280212525090627.jpg 320w, /blog/aiewf2025-my-day-1-highlights/brockman_hu4924809148885094552.jpg 640w, /blog/aiewf2025-my-day-1-highlights/brockman_hu1448822048376072173.jpg 768w, /blog/aiewf2025-my-day-1-highlights/brockman_hu11189463669129350518.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/brockman_hu7100076230338907002.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/brockman_hu5864812146074687066.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/brockman_hu7929485136472518669.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/brockman_hu4924809148885094552.jpg" width="3436" height="1902" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p><strong>Swyx:</strong> Can you ballpark numbers on the amount of productivity you guys are seeing with Codex internally?</p>
<p><strong>Brockman:</strong> Yeah I don&rsquo;t know what the latest numbers are. I mean, there&rsquo;s definitely a low double digit written entirely by Codex. That&rsquo;s super cool to see. But it&rsquo;s also it&rsquo;s not the only system that we use internally and I think that to me it&rsquo;s still in the very early days. It&rsquo;s been exciting to see some of the external metrics. I think we had 24,000 PRs that were merged in like the last day in public GitHub repositories. And so yeah, this stuff is all just getting started.</p>
<p><strong>Jensen Huang</strong>: AI native engineers in the audience, they are probably thinking, in the coming years, OpenAI will have AGIs and they will be building domain specific agents on top of the AGIs from OpenAI. So some of the questions that I would have on my mind would be, how do you think their development workflow would change as OpenAI&rsquo;s AGIs become much more capable and yet they would still have plumbing workflows pipelines that they would create, flywheels that they would create for their domain specific agents. These agents would of course be able to reason, plan, use tools, have memory, short-term, long-term memory, and they&rsquo;ll be amazing amazing agents, but how does it change the development process in the coming years?</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/aiewf2025-my-day-1-highlights/huang.png"><picture>
    <source type="image/webp" srcset="/blog/aiewf2025-my-day-1-highlights/huang_hu3568968907277559621.webp 320w, /blog/aiewf2025-my-day-1-highlights/huang_hu12888736600716311910.webp 640w, /blog/aiewf2025-my-day-1-highlights/huang_hu10444578741820569281.webp 768w, /blog/aiewf2025-my-day-1-highlights/huang_hu4009115922405890238.webp 1024w, /blog/aiewf2025-my-day-1-highlights/huang_hu11178506423962019106.webp 1280w, /blog/aiewf2025-my-day-1-highlights/huang_hu2733278257875995626.webp 1536w, /blog/aiewf2025-my-day-1-highlights/huang_hu17925377389823599843.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/aiewf2025-my-day-1-highlights/huang_hu18273329504571143449.jpg 320w, /blog/aiewf2025-my-day-1-highlights/huang_hu6459941011941327648.jpg 640w, /blog/aiewf2025-my-day-1-highlights/huang_hu16719839051972777984.jpg 768w, /blog/aiewf2025-my-day-1-highlights/huang_hu16669140089933732515.jpg 1024w, /blog/aiewf2025-my-day-1-highlights/huang_hu1875950423648683019.jpg 1280w, /blog/aiewf2025-my-day-1-highlights/huang_hu4432002521591507690.jpg 1536w, /blog/aiewf2025-my-day-1-highlights/huang_hu8924468330219247256.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/aiewf2025-my-day-1-highlights/huang_hu6459941011941327648.jpg" width="3408" height="1906" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p><strong>Brockman</strong>: Yeah, I think that this is a really fascinating question, right? I think you can find a wide spectrum of very strongly held opinion that is all mutually contradictory. I think my perspective is that first of all, it&rsquo;s all on the table, right? Maybe we reach a world where it&rsquo;s just like the AIs are so capable that we all just let them write all the code. Maybe there&rsquo;s a world where you have like one Al in the sky. Maybe it&rsquo;s that you actually have a bunch of domain specific agents that require a bunch of of specific work in order to make that happen.</p>
<p>I think the evidence has really been shifting towards this menagerie of different models&mdash;I think that&rsquo;s actually really exciting. There&rsquo;s different inference costs, there&rsquo;s different trade-offs like just distillation works so well, there&rsquo;s actually a lot of power to be had by models that are actually able to use other models. I think that that is going to open up just a ton of opportunity because you know we&rsquo;re heading to a world where the economy is fundamentally powered by AI. We&rsquo;re not there yet but you can see it right on the horizon. I mean that&rsquo;s what people in this room are building &ndash; that is what you are doing.</p>
<p>The economy is a very big thing, there&rsquo;s a lot of diversity in it, and it&rsquo;s also not static, right? I think when people think about what AI can do for us it&rsquo;s very easy to only look at what are we doing now, and how does AI slot in, and the percentage of human versus AI, but that&rsquo;s not the point. The point is how do we get 10x more activity, 10x more economic output, 10x more benefit to everyone. I think the direction we&rsquo;re heading is one where the models will get much more capable, there&rsquo;ll be much better fundamental technology, and there&rsquo;s just going to be way more things we want to do with it and the barrier to entry will be lower than ever. And so things like healthcare that requires responsibility to go in and think about how to do it right. Things like education where there&rsquo;s multiple stakeholders &ndash; the parent, the teacher, the student &ndash; each of these requires domain expertise, requires careful thought, requires a lot of work.</p>
<p>So I think that there is going to be so much opportunity for people to build. So l&rsquo;m just so excited to see everyone in this room because that&rsquo;s the right kind of energy.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI Writing Index, Feb &#39;23 to Jun &#39;24</title>
      <link>https://craftycto.com/blog/ai-writing-index/</link>
      <pubDate>Tue, 10 Jun 2025 15:36:00 -0400</pubDate>
      
      <guid>https://craftycto.com/blog/ai-writing-index/</guid>
      <description>My early AI work, in index form, with reflections</description>
      <content:encoded><![CDATA[<p>As I dig in to recap what I saw and learned at the <a href="https://www.ai.engineer/">AI Engineer World&rsquo;s Fair 2025 in San Francisco</a>, I was forced to face my failure to write consistently &ndash; a failure that dates back almost exactly a year, to June 12, 2024. Thinking back on it, I see two causes. First, my book of business on the fractional CTO side of things filled up completely, reducing available writing time. Second, the <a href="/blog/the-emergence-s1e4/">AI emergence</a>, like <a href="https://www.dailymotion.com/video/x6qx9dj">Solomon Epstein&rsquo;s ill-fated space yacht in <em>The Expanse</em></a>, just kept accelerating. I had &ldquo;gotta write about that!!&rdquo; panics daily, until I finally had to just stop rather than driving myself nuts.</p>
<p>I do have to say, though, that during the 16 months from February 2023 to June 2024:</p>
<ul>
<li>I was early to AI</li>
<li>I wrote a lot</li>
<li>It was pretty decent stuff</li>
<li>My opinions and predictions regularly proved accurate. (One prediction, that <a href="/blog/an-appllama-week/#my-take-on-apple-in-llmgpt-land">Apple might get pinched</a> by the AI emergence, is playing out in front of our eyes right now. Apple had little AI-related to announce at this week&rsquo;s WWDC, and had no visibility whatsoever at <a href="https://www.ai.engineer/">AIEWF2025</a>.)</li>
</ul>
<p>It&rsquo;s also pretty amazing to see what has happened in the past year. At AIEWF2025, Simon Willison was forced to cut the scope of <a href="https://simonwillison.net/2025/Jun/6/six-months-in-llms/">his LLM update keynote</a> from &ldquo;the past year&rdquo; to &ldquo;the past six months&rdquo; to have a prayer of finishing in the allotted 20 minutes.</p>
<p>Anyway, take a look at some of the stuff below and see what you think.</p>
<p>P.S.: In June 2025, <a href="https://www.cursor.com/">Cursor</a> and LLMs are vastly better at writing Markdown than a year ago.</p>
<h2 id="blog-posts">Blog Posts</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Title</th>
          <th style="text-align: left">Date</th>
          <th style="text-align: left">Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><a href="/blog/chatgpt-4v/">Using Multimodal AI to Capture and Enrich Heirloom Recipes</a></td>
          <td style="text-align: left">2024-02-19</td>
          <td style="text-align: left">I applied OpenAI&rsquo;s GPT-4 Vision model and Chat Completions API to preserve a treasure-trove of legacy family recipes.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/an-appllama-week/">An Appllama Week in AI</a></td>
          <td style="text-align: left">2023-07-21</td>
          <td style="text-align: left">Meta makes waves with Llama 2, while Bloomberg pumps itself with Apple LLM non-news.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/really-openai/">Really, OpenAI?</a></td>
          <td style="text-align: left">2023-07-07</td>
          <td style="text-align: left">ChatGPT+ subscribers can prevent OpenAI from using their inputs as training data. That is, so long as they forego the service&rsquo;s second-best feature.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/moat-busters/">Of Moats and Moat Busters</a></td>
          <td style="text-align: left">2023-06-29</td>
          <td style="text-align: left">Open Source, Commercial-friendly AI Challenges the Major Closed AI Players</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/unlimited-stupid-questions/">Unlimited Stupid Questions</a></td>
          <td style="text-align: left">2023-06-14</td>
          <td style="text-align: left">Possibly the most important benefit of ChatGPT &hellip;</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/runway-not-midjourney-for-video/">Is Runway Gen-2 Midjourney for Video?</a></td>
          <td style="text-align: left">2023-06-08</td>
          <td style="text-align: left">We Tested Gen-2 and Share the Resulting Videos</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/the-emergence-s1e4/">The Emergence</a></td>
          <td style="text-align: left">2023-04-18</td>
          <td style="text-align: left">Season 1, Episode 4</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/march-madness-ai/">March Madness, AI Style</a></td>
          <td style="text-align: left">2023-03-18</td>
          <td style="text-align: left">Observations on AI&rsquo;s March acceleration</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/alarmed-about-ai/">Alarmed About AI?</a></td>
          <td style="text-align: left">2023-02-20</td>
          <td style="text-align: left">John Seely Brown, former director of Xerox PARC, has helpful advice—from April 2000!</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/blog/accelerating-launch-with-ai-models/">Accelerating Crafty&rsquo;s Launch Using AI Models</a></td>
          <td style="text-align: left">2023-02-08</td>
          <td style="text-align: left">Thanks to AI-based tools like Midjourney, Crafty shaved at least a month off its time to launch.</td>
      </tr>
  </tbody>
</table>
<h2 id="micro-posts">Micro Posts</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Title</th>
          <th style="text-align: left">Date</th>
          <th style="text-align: left">Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><a href="/micro/apple-intelligence-initial-thoughts/">Apple Intelligence Initial Thoughts</a></td>
          <td style="text-align: left">2024-06-11</td>
          <td style="text-align: left">Mostly from other people, I&rsquo;m still digesting</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/gpt-4o-quick-benchmark/">A Quick Look at GPT-4o</a></td>
          <td style="text-align: left">2024-05-19</td>
          <td style="text-align: left">I did a quick benchmark of the new GPT-4o model versus GPT-4-turbo. Roughly twice the speed, with improved Vision accuracy.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/openai-vision-function-calling/">OpenAI Vision + Function Calling Examples</a></td>
          <td style="text-align: left">2024-04-28</td>
          <td style="text-align: left">OpenAI&rsquo;s April 9th model update merges Turbo and Vision, and these examples show the two working together.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/50-llms/">Simon Willison&rsquo;s LLM Tool: Now I Have 50 LLMs</a></td>
          <td style="text-align: left">2024-03-25</td>
          <td style="text-align: left">I updated my installation of Willison&rsquo;s LLM tool to add plugins, and now I have 50 LLMs at my fingertips, including 15 local models, which get installed on demand.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/did-code-interpreter-escape/">Did GPT-4 Code Interpreter Escape From Its Sandbox?</a></td>
          <td style="text-align: left">2023-07-14</td>
          <td style="text-align: left">I gave Code Interpreter a workout this morning, and it appeared to exit the building.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/really-openai-update/">ChatGPT+ Privacy Update</a></td>
          <td style="text-align: left">2023-07-10</td>
          <td style="text-align: left">There appears to be a workaround for now to OpenAI&rsquo;s &ldquo;If you want privacy, no chat history for you!&rdquo; policy.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/llama-2/">Llama 2</a></td>
          <td style="text-align: left">2023-07-19</td>
          <td style="text-align: left">HN comments on Llama 2.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/apple-did-it/">Apple Really Did Ignore the AI Emergence at WWDC</a></td>
          <td style="text-align: left">2023-06-18</td>
          <td style="text-align: left">As I watched the WWDC Keynote and Platforms State of the Union from this year&rsquo;s WWDC, I was amazed that Apple appeared to be ignoring the current massive emergence in generative AI. Later, I confirmed it.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/chatgpt-codereview/">ChatGPT Code Review</a></td>
          <td style="text-align: left">2023-06-03</td>
          <td style="text-align: left">Another great use: coming up to speed on an unfamiliar codebase.</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/micro/chatgpt-record/">Working With My ChatGPT Intern</a></td>
          <td style="text-align: left">2023-05-29</td>
          <td style="text-align: left">Yesterday was a new record.</td>
      </tr>
  </tbody>
</table>
<h2 id="elsewhere">Elsewhere</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Title</th>
          <th style="text-align: left">Date</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/two-from-willison/">Two Worthwhile Reads From Simon Willison</a></td>
          <td style="text-align: left">March 25, 2024</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/willison-gemini-pro-video/">Willison: The killer app of Gemini Pro 1.5 is video</a></td>
          <td style="text-align: left">February 22, 2024</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/how-to-use-ai-to-do-stuff/">Ethan Mollick: &ldquo;How to Use AI to Do Stuff&rdquo;</a></td>
          <td style="text-align: left">July 26, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/ai-cant-detect-ai/">OpenAI Concedes: AI Can&rsquo;t Detect AI</a></td>
          <td style="text-align: left">July 26, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/latent-space-george-hotz/">&ldquo;Commoditizing the Petaflop&rdquo; with George Hotz of the tiny corp</a></td>
          <td style="text-align: left">July 9, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/gpt4-code-interpreter-big-deal-pt1/">Just-released GPT-4 Code Interpreter is a Big Deal, Part 1</a></td>
          <td style="text-align: left">July 11, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/gpt4-code-interpreter-big-deal-pt2/">Just-released GPT-4 Code Interpreter is a Big Deal, Part 2</a></td>
          <td style="text-align: left">July 11, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/lone-banana-problem/">The Lone Banana Problem</a></td>
          <td style="text-align: left">July 5, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/midjourney-v52/">Midjourney V5.2 (Ars Technica)</a></td>
          <td style="text-align: left">June 24, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/meta-i-jepa/">I-JEPA: The first AI model based on Yann LeCun&rsquo;s vision for more human-like AI</a></td>
          <td style="text-align: left">June 19, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/comparing-art-ais/">Comparing Adobe Firefly, Dalle-2, OpenJourney, Stable Diffusion, and Midjourney</a></td>
          <td style="text-align: left">June 21, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/deep-rl-faster-sorting/">Faster sorting algorithms discovered using deep reinforcement learning</a></td>
          <td style="text-align: left">June 7, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/willison-infuriating-closed-models/">It&rsquo;s infuriatingly hard to understand how closed models train on their input</a></td>
          <td style="text-align: left">June 4, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/openai-plans/">OpenAI&rsquo;s plans according to Sam Altman</a></td>
          <td style="text-align: left">June 1, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/simon-deep-dives-fake-cases/">Lawyer cites fake cases invented by ChatGPT, judge is not amused</a></td>
          <td style="text-align: left">May 30, 2023</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/elsewhere/simon-cli-for-llm/">CLI tools for working with ChatGPT and other LLMs</a></td>
          <td style="text-align: left">May 29, 2023</td>
      </tr>
  </tbody>
</table>
<h2 id="quotes">Quotes</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Title</th>
          <th style="text-align: left">Date</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><a href="/quote/how-to-ask-chatgpt-a-tech-question/">How to Ask ChatGPT a Technical Question</a></td>
          <td style="text-align: left">March 17, 2024</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/quote/mpt7b-gatsby/">MosaicML&rsquo;s Open Source MPT-7B Model Writes an Epilogue to The Great Gatsby</a></td>
          <td style="text-align: left">March 11, 2024</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/quote/gruber-ai-anxiety-at-apple/">Gruber Responds to Gurman&rsquo;s Report of AI Anxiety at Apple</a></td>
          <td style="text-align: left">March 5, 2024</td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="/quote/vivek-haldar-copilot/">Vivek Haldar on GitHub Copilot</a></td>
          <td style="text-align: left">June 10, 2023</td>
      </tr>
  </tbody>
</table>
]]></content:encoded>
    </item>
    
    <item>
      <title>Observable Framework With Hugo</title>
      <link>https://craftycto.com/micro/observable-with-hugo/</link>
      <pubDate>Wed, 12 Jun 2024 08:23:09 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/observable-with-hugo/</guid>
      <description>Integrating an Observable Framework dashboard into a Hugo-based website</description>
      <content:encoded><![CDATA[<p>In my recent post on Observable Framework, I linked to <a href="https://observablehq.observablehq.cloud/framework-example-mortgage-rates/">Observable&rsquo;s Mortgage Rates demo dashboard</a>, which shows 15- and 30-year fixed mortgage rates from 1971 through the present, using data that is updated weekly and thoughtfully <a href="https://www.freddiemac.com/pmms/pmms_archives">shared by Freddie Mac</a>. The demo dashboard&rsquo;s Data Loader, if it had been set to run periodically (weekly for example), would always ensure that the dashboard shows Freddie Mac&rsquo;s latest weekly data, but you&rsquo;ll note that it doesn&rsquo;t&ndash;the demo shows data as of May 1&mdash;simply because Observable hasn&rsquo;t &ldquo;productionized&rdquo; their demos with scheduled CI/CD.</p>
<p>Mike Bostock suggested I could simply clone the Framework project, which includes all the examples, and deploy my own version of Mortgage Rates. Since the Crafty site uses static site generator <a href="https://gohugo.io/">Hugo</a>, &ldquo;deploying my own&rdquo; involved figuring out how to take the Framework build process&rsquo;s static output and deploy as part of Hugo&rsquo;s static output.</p>
<p>That turned out to be rather easy. Hugo has a <code>/static</code> directory, and everything in it gets deployed directly to Hugo&rsquo;s final output directory, <code>/public</code>, during the Hugo build. Framework&rsquo;s build similarly creates a <code>/dist</code> directory with its final output. So the steps are:</p>
<ul>
<li>I first created an <code>/observable/mortgage-rates</code> directory under <code>/static</code></li>
<li>I then ran the Framework build for the Mortgage Rates example</li>
<li>Next, I copied the contents of the resulting <code>/dist</code> directory over to <code>/static/observable/mortgage-rates</code></li>
<li>Then I ran my Hugo build, which moved those files to <code>/public/observable/mortgage-rates</code></li>
<li>Finally, I pushed the updates to GitHub, which in turn triggered Cloudflare Pages CI/CD to run and deploy the site.</li>
</ul>
<p><a href="/observable/mortgage-rates/">Voila</a>&mdash;note the craftycto.com domain and the June 5, 2024 as-of date:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/observable-with-hugo/mortgage_rates_crafty.png"><picture>
    <source type="image/webp" srcset="/micro/observable-with-hugo/mortgage_rates_crafty_hu18377171618807439314.webp 320w, /micro/observable-with-hugo/mortgage_rates_crafty_hu12511169815806439220.webp 640w, /micro/observable-with-hugo/mortgage_rates_crafty_hu5601748525116038778.webp 768w, /micro/observable-with-hugo/mortgage_rates_crafty_hu17740723431288479335.webp 1024w, /micro/observable-with-hugo/mortgage_rates_crafty_hu2215805748658794881.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/observable-with-hugo/mortgage_rates_crafty_hu5781187045427611817.jpg 320w, /micro/observable-with-hugo/mortgage_rates_crafty_hu7262585847475636825.jpg 640w, /micro/observable-with-hugo/mortgage_rates_crafty_hu9385424801056734599.jpg 768w, /micro/observable-with-hugo/mortgage_rates_crafty_hu9199661451975154866.jpg 1024w, /micro/observable-with-hugo/mortgage_rates_crafty_hu13016104015147399459.jpg 1280w" sizes="100vw" />
    
      <img src="/micro/observable-with-hugo/mortgage_rates_crafty_hu7262585847475636825.jpg" width="1356" height="1284" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The manual steps here, of course, need to be automated &hellip; so I have productionizing of my own to do.</p>
<p>The bigger takeaway here is that, thanks to Framework&rsquo;s static generation approach, the resulting data dashboards, reports, etc. are completely self-contained, data and all. You can pick up whatever Framework build creates in the <code>/dist</code> directory and drop it anywhere&mdash;no data connections to set up, no dynamic web frameworks to configure&mdash;you&rsquo;re done. That&rsquo;s pretty great.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Apple Intelligence Initial Thoughts</title>
      <link>https://craftycto.com/micro/apple-intelligence-initial-thoughts/</link>
      <pubDate>Tue, 11 Jun 2024 13:48:52 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/apple-intelligence-initial-thoughts/</guid>
      <description>Mostly from other people, I&amp;#39;m still digesting</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve <a href="/blog/observable-framework-blazing-fast/">been busy</a> and haven&rsquo;t watched any of the WWDC 2024 sessions yet, but I&rsquo;ve definitely been observing news and people&rsquo;s impressions. Having one foot deeply in the Apple world, and the other just as deeply sunk into AI, provides an interesting vantage point.</p>
<p>Over on Hacker News, the top of the <a href="https://news.ycombinator.com/item?id=40636844">Apple Intelligence for iPhone, iPad, and Mac</a> comment thread was interesting:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg.png"><picture>
    <source type="image/webp" srcset="/micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu370402848362886306.webp 320w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu16785938449910249997.webp 640w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu7023776860910100046.webp 768w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu12733062020948537764.webp 1024w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu16537680132681043609.webp 1280w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu529236120845939246.webp 1536w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu5659193344850263256.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu18366292930371504875.jpg 320w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu9880409868562717423.jpg 640w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu11139809356707189950.jpg 768w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu17046977286285307877.jpg 1024w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu17768085506985042600.jpg 1280w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu1001574644093128999.jpg 1536w, /micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu6927301708343616517.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/apple-intelligence-initial-thoughts/hn_apple_intelligence_lg_hu9880409868562717423.jpg" width="2842" height="1876" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>To me, the key insights are:</p>
<blockquote>
<p>It&rsquo;s the benefit of how Apple does product ownership. In contrast to Google and Microsoft &hellip; I hadn&rsquo;t considered it, but AI convergence is going to lay bare organizational deficiencies in a way previous revolutions didn&rsquo;t &hellip; Nobody wants a GenAI feature that works in Gmail, a different one that works in Messages, etc. &ndash; they want a platform capability that works anywhere they use text &hellip; I&rsquo;m not sure either Google or Microsoft are organizationally-capable of delivering that, at this point.</p>
</blockquote>
<p>And:</p>
<blockquote>
<p>&lsquo;AI convergence is going to lay bare organizational deficiencies in a way previous revolutions didn&rsquo;t&rsquo;</p>
<p>Your quote really hit me. I trust Apple to respect my privacy when doing AI, but the thought of Microsoft or Google slurping up all my data to do remote-server AI is abhorrent. I can&rsquo;t see how Microsoft or Google can undo the last 10 years to fix this.</p>
</blockquote>
<p>It&rsquo;s early days yet, but if Apple manages the jiu-jitsu move of leveraging their platform strengths to overcome a huge lead by other players, that will be quite an achievement at the product and company level.</p>
<p>Elsewhere, Simon Willison has a <a href="https://simonwillison.net/2024/Jun/10/apple-intelligence/">good early take generally</a> and specifically on Apple&rsquo;s <a href="https://simonwillison.net/2024/Jun/11/private-cloud-compute/">Private Compute Cloud</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Observable Framework Delivers Blazing-fast Data Dashboards</title>
      <link>https://craftycto.com/blog/observable-framework-blazing-fast/</link>
      <pubDate>Mon, 10 Jun 2024 00:10:04 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/observable-framework-blazing-fast/</guid>
      <description>An exciting new offering, launched in February, from the team that brought us Observable Notebooks</description>
      <content:encoded><![CDATA[<h2 id="stumbled-upon-">Stumbled Upon &hellip;</h2>
<p>I&rsquo;ve had requests to share my <a href="../chatgpt-4v/">Heirloom Recipe Ingestor project</a>, but it&rsquo;s still in the hacked-together stage, not ready. I&rsquo;ve been wanting to clean it up, and when I made updates to use the non-preview GPT-4-turbo model that <a href="https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4">OpenAI released on April 9th</a>, I began cleaning up the code.</p>
<p>To make the project public, though, I wanted to do more significant remodeling. One example: the script currently runs in CLI mode with arguments, but it&rsquo;s not implemented in the latest-best-Python way, and I&rsquo;d definitely want to correct that. (<a href="https://typer.tiangolo.com/">Typer from Tiangolo</a> looks like a promising solution, by the way).</p>
<p>As I was mulling this, I came across a <a href="https://cookbook.openai.com/examples/multimodal/using_gpt4_vision_with_function_calling">pair of new Vision examples</a> in the OpenAI Cookbook. Besides finding the examples <a href="/micro/openai-vision-function-calling/">very useful</a>, I noted that OpenAI shared these as a <a href="https://jupyter.org/">Jupyter Notebook</a>, rather than as a traditional Python project. That got me wondering if maybe I should the same approach for Recipe Ingestor.</p>
<p>Before I commit heavily to a particular technology or platform, I like to survey of the state of the art in that particular niche. So before committing to Jupyter Notebook / Jupyter Lab, I did a quick survey of the state of the art in data notebooks&mdash;was there an up-and-coming alternative to Jupyter I should be looking at?</p>
<p>My <a href="https://kagi.com/">Kagi</a> search returned hits for <a href="https://observablehq.com/documentation/notebooks/">Observable Notebooks</a>, a tool I had peripheral awareness of through Simon Willison, who <a href="https://simonwillison.net/tags/observable/">regularly publishes work in Observable Notebook form</a>, when that format seems a better fit than, say, a simple Python script.</p>
<p>So I dropped in over at <a href="https://observablehq.com/">ObservableHQ</a> to get up to speed on Observable Notebooks&mdash;only to find that Observable had changed course. Though Observable Notebooks are still alive and well (and will, I suspect, <a href="https://talk.observablehq.com/t/announcing-observable-2-0/8744/4">get even better</a>, as of February, the company&rsquo;s primary focus has shifted to what they are calling <a href="https://observablehq.com/framework/">Observable Framework</a>. That led me down one final rabbit hole, but a very useful one, as I soon realized that Framework was a perfect fit for one of my fractional CTO client&rsquo;s &ldquo;data science reporting and dashboard&rdquo; needs.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_6.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_6_hu2272811571875972856.webp 320w, /blog/observable-framework-blazing-fast/observable_6_hu3346503524018844025.webp 640w, /blog/observable-framework-blazing-fast/observable_6_hu5147707796981246825.webp 768w, /blog/observable-framework-blazing-fast/observable_6_hu18416482138486183007.webp 1024w, /blog/observable-framework-blazing-fast/observable_6_hu759536582967866817.webp 1280w, /blog/observable-framework-blazing-fast/observable_6_hu534395273186379929.webp 1536w, /blog/observable-framework-blazing-fast/observable_6_hu5324401780573746493.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_6_hu8979306845613402362.jpg 320w, /blog/observable-framework-blazing-fast/observable_6_hu15238303959383422788.jpg 640w, /blog/observable-framework-blazing-fast/observable_6_hu5677866697608809481.jpg 768w, /blog/observable-framework-blazing-fast/observable_6_hu14503017086490684898.jpg 1024w, /blog/observable-framework-blazing-fast/observable_6_hu14293562162788177942.jpg 1280w, /blog/observable-framework-blazing-fast/observable_6_hu7512496447447134694.jpg 1536w, /blog/observable-framework-blazing-fast/observable_6_hu297218054907857287.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_6_hu15238303959383422788.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="the-need">The Need</h2>
<p>The client in question is a non-profit doing great work in sustainable agriculture, helping farms take informed action based on soil data. The majority of their team are data scientists. Lots of data has been collected, and now the data team is charged with producing useful, coherent, actionable outputs for our users, who are mostly farmers.</p>
<p>The data team works mostly in the <a href="https://www.r-project.org/">R language</a>, one of the primary languages of data science. R is widely used in agricultural data and particularly soil analysis. R is a data manipulation, aggregation, and analysis powerhouse, with plotting and charting libraries capable of a wide range of data visualizations. That said, R&rsquo;s natural mode of operation is one-on-one with the data scientist; output is more about &ldquo;produce those charts we need for that scientific paper&rdquo; than &ldquo;create awesome reports and dashboards for our users.&rdquo; R can &ldquo;do web stuff&rdquo; in a number of ways, for example using the <a href="https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/index.html">Shiny package</a>, but it feels a bit unnatural and bolted-on.</p>
<p>The non-profit&rsquo;s primary user-facing (farmer-facing!) platform, on the other hand, sits solidly in the center of mainstream, modern web / mobile. Logic is JavaScript / TypeScript, running inside open source frameworks like Node.js, React and React Native, augmented by dozens more open source libraries filling niches like Object Relational Mapping (Drizzle). Data lives in the powerful, scalable Postgres open source database.</p>
<p>All of this deploys gracefully onto modern AWS infrastructure, and the result is capable of supporting tens of thousands of web and mobile users. Costs are low&mdash;tooling costs almost zero&mdash;and the result has been highly effective for developers and enabled us to deliver an excellent web and mobile experience for our users.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_2.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_2_hu5712118432105826867.webp 320w, /blog/observable-framework-blazing-fast/observable_2_hu8978838472375705402.webp 640w, /blog/observable-framework-blazing-fast/observable_2_hu6837342122483044704.webp 768w, /blog/observable-framework-blazing-fast/observable_2_hu12289470346247725300.webp 1024w, /blog/observable-framework-blazing-fast/observable_2_hu9169090029854672718.webp 1280w, /blog/observable-framework-blazing-fast/observable_2_hu18008438885423882516.webp 1536w, /blog/observable-framework-blazing-fast/observable_2_hu10086871971168733558.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_2_hu2843895270055481246.jpg 320w, /blog/observable-framework-blazing-fast/observable_2_hu4340797833743798897.jpg 640w, /blog/observable-framework-blazing-fast/observable_2_hu8886074503676190913.jpg 768w, /blog/observable-framework-blazing-fast/observable_2_hu10190501521531635204.jpg 1024w, /blog/observable-framework-blazing-fast/observable_2_hu9591999486021470511.jpg 1280w, /blog/observable-framework-blazing-fast/observable_2_hu10973972404548152980.jpg 1536w, /blog/observable-framework-blazing-fast/observable_2_hu2396060452360094915.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_2_hu4340797833743798897.jpg" width="2184" height="1224" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="we-have-questions">We Have Questions</h2>
<p>This left me asking a number of questions:</p>
<ul>
<li>What is R really best at? Is it the data manipulation and analysis side or also data visualization?</li>
<li>Does R have enough advantages for our data science use cases to stick with it?</li>
<li>If R can&rsquo;t &ldquo;do it all,&rdquo; should we move away from it?</li>
<li>Where is the line between &ldquo;use R for this&rdquo; and &ldquo;this would probably better be handled with something else&rdquo;?</li>
<li>If we don&rsquo;t use R for visualizations, what would we use instead?</li>
<li>Aren&rsquo;t we reinventing the wheel here&mdash;hasn&rsquo;t somebody already figured this out? Isn&rsquo;t there some kind of framework that at least provides a clean separation of concerns between data and presentation?</li>
</ul>
<h2 id="enter-observable-framework">Enter Observable Framework</h2>
<p>With these questions swirling around in my mind, it was a truly fortuitous moment when I landed on the Observable website and began to get my head around Observable Framework.Because, once I understood it, bang, my entire set of questions were answered, and the solution was beautiful. Thank you <a href="https://en.wikipedia.org/wiki/Mike_Bostock">Mike Bostock</a> and <a href="https://observablehq.com/about">team</a>.</p>
<p>Observable describes Framework as &ldquo;solving data’s last mile problem.&rdquo; This is a reference to  the telecom world where by far the most expensive part of their network is that last mile, connecting up the actual consumers. For data, Observable is saying, that last mile is getting data onto the screen of the user in need, in a way that is highly useful and actionable&mdash;and that this is the hardest problem to solve.</p>
<p>Eureka! This is it! The last mile problem is exactly what my non-profit was struggling with. And wow, does Framework solve it elegantly.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_10.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_10_hu8252995222133557367.webp 320w, /blog/observable-framework-blazing-fast/observable_10_hu1638614185042476549.webp 640w, /blog/observable-framework-blazing-fast/observable_10_hu13337621050192042054.webp 768w, /blog/observable-framework-blazing-fast/observable_10_hu12234807829697628630.webp 1024w, /blog/observable-framework-blazing-fast/observable_10_hu15043760116794413192.webp 1280w, /blog/observable-framework-blazing-fast/observable_10_hu13763663237292727737.webp 1536w, /blog/observable-framework-blazing-fast/observable_10_hu4167565731360087220.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_10_hu5572038275668609388.jpg 320w, /blog/observable-framework-blazing-fast/observable_10_hu8557851953157169009.jpg 640w, /blog/observable-framework-blazing-fast/observable_10_hu6637248994291140112.jpg 768w, /blog/observable-framework-blazing-fast/observable_10_hu5094849479435445546.jpg 1024w, /blog/observable-framework-blazing-fast/observable_10_hu14100620336234387722.jpg 1280w, /blog/observable-framework-blazing-fast/observable_10_hu7407467211807995677.jpg 1536w, /blog/observable-framework-blazing-fast/observable_10_hu14784952444127022452.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_10_hu8557851953157169009.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="we-have-answers">We Have Answers</h2>
<p>Let&rsquo;s look at the answers Framework gives us:</p>
<ul>
<li><strong>Q:</strong> Does R have enough advantages for our data science use cases to stick with it?
<ul>
<li><strong>A:</strong> In soil science, it sure seems to. But, not to worry, you&rsquo;re free to mix and match&mdash;use whatever data science tool fits best in each situation&mdash;R, Python, Julia, TypeScript, whatever. [link to O blog post about data loaders]</li>
</ul>
</li>
<li><strong>Q:</strong> If R can&rsquo;t &ldquo;do it all,&rdquo; should we move away from it?
<ul>
<li><strong>A:</strong> R doesn&rsquo;t need to do it all&mdash;just use it wherever it&rsquo;s the best tool, which, in soil science, is frequently.</li>
</ul>
</li>
<li><strong>Q:</strong> Where is the line between &ldquo;use R for this&rdquo; and &ldquo;this would probably better be handled with something else, e.g. mainstream web tech&rdquo;?
<ul>
<li><strong>A:</strong> Although R can create visualizations, its sweet spot is data. Framework&rsquo;s separation of concerns allows us to use R in its data sweet spot, while applying modern web technology for the presentation layer including visualizations.</li>
</ul>
</li>
<li><strong>Q:</strong> If we don&rsquo;t use R for visualizations, what would we use instead?
<ul>
<li><strong>A:</strong> In Framework, the general answer for visualizations&mdash;and the presentation layer generally&mdash;is &ldquo;use modern web technology.&rdquo; This consists of basic web building blocks&mdash;HTML, JavaScript, CSS, Markdown&mdash;augmented by any of the dozens of powerful visualization libraries that exist in the modern web, most free and open source. The cherry on top is that Observable&rsquo;s founders and team happen to have built two of the best viz libraries in existence&mdash;<a href="#presentation-layer-7-visualizations">details below</a> when we dig into the presentation layer.</li>
</ul>
</li>
<li><strong>Q:</strong> Aren&rsquo;t we reinventing the wheel here&mdash;hasn&rsquo;t somebody already figured this out? Isn&rsquo;t there some kind of framework that at least provides a clean separation of concerns between data and presentation?
<ul>
<li><strong>A:</strong> Yes, someone has figured it out! In Framework, Observable have an exceptionally elegant framework, with clean separation of concerns between data and presentation among its many benefits.</li>
</ul>
</li>
</ul>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_7.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_7_hu5625332575586751598.webp 320w, /blog/observable-framework-blazing-fast/observable_7_hu13181239920939877173.webp 640w, /blog/observable-framework-blazing-fast/observable_7_hu14580164694347784420.webp 768w, /blog/observable-framework-blazing-fast/observable_7_hu6540195747077719365.webp 1024w, /blog/observable-framework-blazing-fast/observable_7_hu3068763887524742960.webp 1280w, /blog/observable-framework-blazing-fast/observable_7_hu14953245409641690675.webp 1536w, /blog/observable-framework-blazing-fast/observable_7_hu7870717843806286856.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_7_hu8404057311861745605.jpg 320w, /blog/observable-framework-blazing-fast/observable_7_hu13510274347841023948.jpg 640w, /blog/observable-framework-blazing-fast/observable_7_hu10788144074706079920.jpg 768w, /blog/observable-framework-blazing-fast/observable_7_hu14636312146782496213.jpg 1024w, /blog/observable-framework-blazing-fast/observable_7_hu2753196381409503621.jpg 1280w, /blog/observable-framework-blazing-fast/observable_7_hu9998828129976127401.jpg 1536w, /blog/observable-framework-blazing-fast/observable_7_hu3482926312305139503.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_7_hu13510274347841023948.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="data-layer-1-data-loaders">Data Layer 1: Data Loaders</h2>
<p>In Framework, <a href="https://observablehq.com/blog/data-loaders-for-the-win">Data Loaders</a> are the data layer, the first step towards getting data onto the screen, be it for a dashboard, report, or other data visualization. The data files created by Data Loaders power the reports and visualizations of the presentation layer that we explore <a href="#presentation-layer-1-markdown">later</a>.</p>
<p>Data Loaders can be written the language of your choice: data science languages like R, Python, and Julia, but also JavaScript, TypeScript, Java, Rust, Go, PHP, and even shell scripts. This is huge&mdash;let data scientists and developers use their tool of choice, whatever best fits the need. Mix and match at will.</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p>Does loading data with a shell script sound crazy? You might be surprised. Here&rsquo;s a one-line Data Loader shell script that downloads recent earthquakes from the USGS in GeoJSON format:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson
</span></span></code></pre></div>
</div>

<p>Thanks to Framework&rsquo;s clean separation of concerns and elegant design, Data Loaders are simple programs&mdash;just connect to your data, wherever it is&mdash;database, data warehouse, cloud APIs, or all of the above. Join, transform, reshape, and munge it to your heart&rsquo;s content. When done, simply dump the output, in almost any data format, to standard output. Framework automatically runs the Data Loader during the build process, intercepts its output and creates the output file, ready for use by the presentation layer.</p>
<p>Since Data Loaders run at build time&mdash;rather than runtime in front of an impatient data consumer&mdash;there&rsquo;s less need to optimize code and queries. Shell script <code>curl</code> command a little slow? Who cares! Database indexes not optimized for this query? No worries! Cloud API introduce a lot of latency? No harm no foul! It&rsquo;s build time, not runtime&mdash;time is measured differently here. Keep it simple.</p>
<p>Data Loaders really are simple&mdash;in developing our own proof of concept, I created five Data Loaders that connected to an RDS Postgres cluster and a pair of cloud APIs, producing both CSV and Apache Parquet files, in just a few hours.</p>
<h2 id="data-layer-2-static-generation-dynamic-dashboards">Data Layer 2: Static Generation, Dynamic Dashboards</h2>
<p>As you read this post, you&rsquo;re benefitting from &ldquo;static site generation.&rdquo; The Crafty website is built using the static site generator <a href="https://gohugo.io/">Hugo</a>. There&rsquo;s no server runtime behind this site&mdash;everything&rsquo;s pre-generated at build time, including HTML for every page, optimized images for every window size, optimized CSS and JavaScript where needed. No server round-trips for anything, just the initial page load. Even dynamic functions like site search run locally in the browser via JavaScript. Navigate around a little, it&rsquo;s lightning-fast.</p>
<p>The &ldquo;lightning-fast&rdquo; part seems to have appealed to the folks at Observable, who recognized that static site generation could work its magic for data dashboards as well&mdash;that &ldquo;statically generated, lightning-fast&rdquo; and &ldquo;dynamic, interactive user experience&rdquo; aren&rsquo;t mutually exclusive.</p>
<p>There&rsquo;s a catch, though: lightning-fast user experiences can&rsquo;t happen if the data&rsquo;s slow. And slow is typical with traditional data warehouse + dataviz / BI tools. Executing complex queries in real time against remote data can take 10s of seconds and sometimes minutes&mdash;while the user waits impatiently.</p>
<video preload="auto" width="60%"  autoplay loop playsinline class="html-video">
    <source src="/blog/observable-framework-blazing-fast/static_gen_dynamic_dash.mp4" type="video/mp4">
  <span></span>
</video>
<p>Well, guess what: those same Data Loaders whose elegant separation of concerns simplify the gathering of data for dynamic dashboards and reports, also solve the slow data problem. Data Loaders do the time-consuming work of querying and collecting data at <em><strong>build time</strong></em>. At <em><strong>runtime</strong></em>, the data is already <em><strong>pre-generated, cached, and ready to access in milliseconds</strong></em>. So thanks to static generation and Data Loaders, Framework is able to deliver a near-instantaneous interactive experience <em>for data</em>.</p>
<h2 id="data-layer-3-how-fresh-is-fresh-enough">Data Layer 3: How Fresh is Fresh Enough?</h2>
<p>You may still be having doubts about the idea of a data dashboard that isn&rsquo;t driven by live, real-time data. It&rsquo;s natural to conflate &ldquo;dynamic, interactive data consumer experience,&rdquo; which we&rsquo;re all in favor of, with &ldquo;querying live data from a remote database, data warehouse, or cloud API in real time,&rdquo; which isn&rsquo;t necessary most of the time and often ruins that interactive experience by making it slow.</p>
<p>I love these two tips in Observable&rsquo;s excellent <a href="https://observablehq.com/framework/loaders">Data Loader documentation</a>, because they hit the nail on the head around &ldquo;how fresh does my data need to be?&rdquo; Tip 1:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/data_loader_tip1.png"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/data_loader_tip1_hu18352967623659308082.webp 320w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu16568171945852823039.webp 640w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu9100086702310144579.webp 768w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu12878303759898515636.webp 1024w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu16689458079262367834.webp 1280w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu17319569354458632437.webp 1536w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu17056348568496338619.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/data_loader_tip1_hu11233335824668492110.jpg 320w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu3684661368190825138.jpg 640w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu3338029318961709406.jpg 768w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu9246714252643625405.jpg 1024w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu15344728543767996746.jpg 1280w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu5260101529848232231.jpg 1536w, /blog/observable-framework-blazing-fast/data_loader_tip1_hu11550438587879360627.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/data_loader_tip1_hu3684661368190825138.jpg" width="3608" height="715" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I&rsquo;d paraphrase the first part of this tip as &ldquo;Dude, if you really want up-to-the-second data, we gotcha covered!&rdquo; The second part addresses a Framework nuance that I haven&rsquo;t yet mentioned: databases and data warehouses aren&rsquo;t the only source of essential data for dashboards and reports&mdash;often times static files from various external sources can be just as essential. For example, in our proof a concept, I needed to plot soil sample locations on maps, for both the entire U.S., and then for individual states. To get the country and state outlines needed as the backdrop for my plots, I just included a publicly-available, 842K static JSON file in my Framework project. The file uses a variant of GeoJSON called <a href="https://observablehq.com/framework/lib/topojson">TopoJSON</a> and includes outlines of the U.S. itself, along with every state, and every county. <a href="https://observablehq.com/plot/">Observable Plot</a>, which we explore below, understands TopoJSON and easily produces the geographical plot needed. Tip 2:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/data_loader_tip2.png"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/data_loader_tip2_hu2061615714449624921.webp 320w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu16029084968337306750.webp 640w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu2421658320382061372.webp 768w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu14422710845747797558.webp 1024w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu844602614661551006.webp 1280w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu15902493312622796434.webp 1536w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu2250426858762806880.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/data_loader_tip2_hu4724554636039074225.jpg 320w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu14428589586520470530.jpg 640w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu17944333721110821896.jpg 768w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu16850282918564500505.jpg 1024w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu14051857770154213111.jpg 1280w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu1075129281810473799.jpg 1536w, /blog/observable-framework-blazing-fast/data_loader_tip2_hu16275599927749963576.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/data_loader_tip2_hu14428589586520470530.jpg" width="3493" height="686" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The second tip addresses a critical supporting tool for Data Loaders and data freshness in Framework: Continuous Deployment. In parallel with the tremendous progress made in static site generation through projects like Hugo, the tooling for Continuous Integration/Continuous Deployment (CI/CD) has radically improved and become ubiquitous. In fact, the two spaces intersect significantly: as an example, I rely on CI/CD tools provided as part of <a href="https://pages.cloudflare.com/">Cloudflare Pages</a> to automatically redeploy this site, triggered when I push updates the <code>main</code> branch of my GitHub repo. CI/CD is all about builds, and as the tip tells us, Continuous Deployment combined with Framework Data Loaders means we can &ldquo;rebuild data as often as you like, ensuring that data is always up-to-date.&rdquo; <a href="https://github.com/features/actions">GitHub Actions</a> are probably the most widely-used CI/CD tool, and can automate <a href="https://observablehq.com/framework/deploying">Framework builds</a> so they happen exactly when we need them too, whether that be time based (e.g. once an hour); event based (the new batch of sales data has been processed); or programmatically&mdash;any which way you need.</p>
<h2 id="presentation-layer-1-markdown">Presentation Layer 1: Markdown</h2>
<p>The central element of Framework&rsquo;s presentation layer is Markdown, which <a href="https://observablehq.com/framework/markdown">Observable&rsquo;s documentation</a> elegantly describes:</p>
<blockquote>
<p>Markdown is a language for formatting text and content; it’s a lightweight, ergonomic alternative (and complement) to HTML.</p>
</blockquote>
<p>In a Framework project, each Markdown file represents one page, such as an interactive dashboard or report. Framework extends Markdown in <a href="https://observablehq.com/framework/markdown">several powerful ways</a>:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p>Markdown in Framework extends CommonMark with a handful of features useful for data apps, including reactive JavaScript, HTML, YAML front matter, grids, cards, and notes.</p>
<ul>
<li>
<p>Use JavaScript to render charts, inputs, and other dynamic, interactive, and graphical content on the client. JavaScript in Markdown can be expressed either as fenced code blocks or inline expressions. You can also import JavaScript modules to share code across pages.</p>
</li>
<li>
<p>You can write HTML directly into Markdown. HTML is useful for greater control over layout, say to use CSS grid for a responsive bento box layout in a dashboard, or adding an external stylesheet via a link element.</p>
</li>
<li>
<p>The grid class declares a CSS grid container. The grid class is designed to pair with the card class and the dashboard theme for dashboard layout.</p>
</li>
<li>
<p>The card class is used to group and delineate content. The card classes applies a background and border (with colors determined by the current theme).</p>
</li>
</ul>

</div>

<p>As we <a href="#presentation-layer-5-reactivity">explore later</a>, Framework&rsquo;s powerful Markdown extensions mean than each Markdown page is equivalent to a full data notebook&mdash;actually more powerful than Observable&rsquo;s own Notebooks, which themselves outshine most other such as Jupyter.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_5.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_5_hu412860821688524648.webp 320w, /blog/observable-framework-blazing-fast/observable_5_hu6295007403015294915.webp 640w, /blog/observable-framework-blazing-fast/observable_5_hu19688254323713786.webp 768w, /blog/observable-framework-blazing-fast/observable_5_hu15342777533514703908.webp 1024w, /blog/observable-framework-blazing-fast/observable_5_hu8964014755074301881.webp 1280w, /blog/observable-framework-blazing-fast/observable_5_hu13370645155194968774.webp 1536w, /blog/observable-framework-blazing-fast/observable_5_hu11597067433940964069.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_5_hu7279617796144016439.jpg 320w, /blog/observable-framework-blazing-fast/observable_5_hu15615740167748302464.jpg 640w, /blog/observable-framework-blazing-fast/observable_5_hu17491069439844398266.jpg 768w, /blog/observable-framework-blazing-fast/observable_5_hu11566831230372772685.jpg 1024w, /blog/observable-framework-blazing-fast/observable_5_hu10558422389724335568.jpg 1280w, /blog/observable-framework-blazing-fast/observable_5_hu16461624166701121540.jpg 1536w, /blog/observable-framework-blazing-fast/observable_5_hu13815149790474529817.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_5_hu15615740167748302464.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="presentation-layer-2-javascript">Presentation Layer 2: JavaScript</h2>
<p>JavaScript in Framework Markdown is like water to fish&mdash;everywhere. <a href="https://observablehq.com/framework/javascript">From Observable&rsquo;s docs</a>:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p>Use JavaScript to render charts, inputs, and other dynamic, interactive, and graphical content on the client. JavaScript in Markdown can be expressed either as <a href="https://observablehq.com/framework/javascript#fenced-code-blocks">fenced code blocks</a> or <a href="https://observablehq.com/framework/javascript#inline-expressions">inline expressions</a>. You can also import JavaScript modules to share code across pages.</p>
<ul>
<li>
<p>JavaScript fenced code blocks (```js) are typically used to display content such as charts and inputs. They can also be used to declare top-level variables, say to load data or declare helper functions.</p>
</li>
<li>
<p>Inline expressions ${…} interpolate values into Markdown. They are typically used to display numbers such as metrics, or to arrange visual elements such as charts into rich HTML layouts.</p>
</li>
</ul>

</div>

<p>Think of a Framework Markdown page as being wrapped in a JavaScript context, what Observable calls the runtime&mdash;not just the ability to run JavaScript code basically anywhere, but also with our full data context available to operate on and visualize.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_8.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_8_hu1509472109297546237.webp 320w, /blog/observable-framework-blazing-fast/observable_8_hu10268539548761755506.webp 640w, /blog/observable-framework-blazing-fast/observable_8_hu12201675164602769062.webp 768w, /blog/observable-framework-blazing-fast/observable_8_hu2020299721708264648.webp 1024w, /blog/observable-framework-blazing-fast/observable_8_hu15677211198465439342.webp 1280w, /blog/observable-framework-blazing-fast/observable_8_hu17488850303728056053.webp 1536w, /blog/observable-framework-blazing-fast/observable_8_hu16085400164992224436.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_8_hu11723269693342666180.jpg 320w, /blog/observable-framework-blazing-fast/observable_8_hu1819830850022867956.jpg 640w, /blog/observable-framework-blazing-fast/observable_8_hu11891946426887696197.jpg 768w, /blog/observable-framework-blazing-fast/observable_8_hu12061462198195352530.jpg 1024w, /blog/observable-framework-blazing-fast/observable_8_hu11682774193280120378.jpg 1280w, /blog/observable-framework-blazing-fast/observable_8_hu10236346252807010089.jpg 1536w, /blog/observable-framework-blazing-fast/observable_8_hu5034114080557891492.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_8_hu1819830850022867956.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="presentation-layer-3-getting-the-data">Presentation Layer 3: Getting the Data</h2>
<p>How do we get the data, for example data snapshots created by Data Loaders, available to the presentation layer and accessible via JavaScript? From the <a href="https://observablehq.com/framework/files">Observable docs</a>:</p>
<blockquote>
<p>Load files — whether static or generated dynamically by a data loader — using the built-in <code>FileAttachment</code> function. This is available by default in Markdown.</p>
</blockquote>
<p>Here&rsquo;s a Markdown code block to load a JSON file listing active volcanos:</p>
<pre><code>```js
const volcano = FileAttachment(&quot;volcano.json&quot;).json();
```
</code></pre>
<p>When the variable <code>volcano</code> is referenced in another code block or inline expression, for example in a visualization, it contains the appropriate JavaScript Array, Object, etc. to represent the JSON data. Two magical Framework notes:</p>
<ul>
<li>The presentation layer doesn&rsquo;t need to know if the file <code>volcano.json</code> was generated by a Data Loader, or was simply included in our project as a static file&mdash;Framework manages all of this at build time for us. Specifically, Framework build looks for the file <code>volcano.json</code>, but if it&rsquo;s not missing, looks for a Data Loader based on the same name, say <code>volcano.json.py</code>, and runs it to generate the data snapshot.</li>
<li>Thanks to <a href="#presentation-layer-5-reactivity">reactivity</a>, even though FileAttachment is an async function since it&rsquo;s reading data from the file system, we don&rsquo;t need to deal with async logic&mdash;the Framework runtime manages this for us automatically.</li>
</ul>
<p>Here&rsquo;s a full list of formats that <code>FileAttachment</code> supports:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/file_attachment_formats.png"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/file_attachment_formats_hu6588022504207106378.webp 320w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu2569001490060307029.webp 640w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu498132770296467141.webp 768w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu10028409888102909646.webp 1024w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu17627346402861547066.webp 1280w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu15929258043095556544.webp 1536w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu5462890071369410440.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/file_attachment_formats_hu17932510555671682381.jpg 320w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu778378007264433251.jpg 640w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu18012327841538069276.jpg 768w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu16966497884601179568.jpg 1024w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu13924233411131215035.jpg 1280w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu9424420967415359453.jpg 1536w, /blog/observable-framework-blazing-fast/file_attachment_formats_hu11998454337680517293.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/observable-framework-blazing-fast/file_attachment_formats_hu778378007264433251.jpg" width="2370" height="1707" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="presentation-layer-4-client-side-sql">Presentation Layer 4: Client-side SQL</h2>
<p>There&rsquo;s one more totally amazing way to access data in the presentation layer: client-side SQL. From the Framework <a href="https://observablehq.com/framework/sql">docs</a>:</p>
<blockquote>
<p>Framework includes built-in support for client-side SQL powered by DuckDB. You can use SQL to query data from CSV, TSV, JSON, Apache Arrow, Apache Parquet, and DuckDB database files, which can either be static or generated by data loaders.</p>
</blockquote>
<p>To use SQL, you first register a SQL source in the Markdown doc&rsquo;s front matter. Here we register a sample Gaia astronomical data source which happens to be in Apache Parquet format:</p>
<pre tabindex="0"><code>---
sql:
  gaia: ./data/gaia-sample.parquet
---
</code></pre><p>The same build-time Data Loader logic we described above applies here&mdash;if the file <code>gaia-sample.parquet</code> doesn&rsquo;t exist, Framework build look for a matching Data Loader such as <code>gaia-sample.parquet.py</code> and run it to create the file.</p>
<p>Now we can query that source from a SQL code block:</p>
<pre><code>```sql id=top10
  SELECT * FROM gaia ORDER BY phot_g_mean_mag LIMIT 10
```
</code></pre>
<p>The <code>id=top10</code> stashes the result of the query in a JavaScript variable:</p>
<blockquote>
<p>The value of a SQL code block is an Apache Arrow table. This format is supported by <a href="#presentation-layer-7-visualizations">Observable Plot</a>, so you can use SQL and Plot together to visualize data.</p>
</blockquote>
<p>So, right in the browser, we&rsquo;re running live, superfast SQL queries on our data&mdash;no server roundtrips and near-instantaneous responsiveness. When paired with Framework <a href="#presentation-layer-5-reactivity">reactivity</a> and <a href="#presentation-layer-6-interactivity">interactivity</a>, client-side SQL is a huge win for enabling blazing-fast interactive dashboards.</p>
<p>(Framework&rsquo;s <a href="https://observablehq.com/framework/lib/arrow#apache-parquet">strong Apache Parquet support</a> is a related win. Compared with other data formats, Parquet is very small, very fast, and works great with Framework&rsquo;s DuckDB-powered SQL.)</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/observable_9.webp"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/observable_9_hu9039048255224986352.webp 320w, /blog/observable-framework-blazing-fast/observable_9_hu17638757934192729042.webp 640w, /blog/observable-framework-blazing-fast/observable_9_hu12394664375081204498.webp 768w, /blog/observable-framework-blazing-fast/observable_9_hu6420495077834437899.webp 1024w, /blog/observable-framework-blazing-fast/observable_9_hu4364128312782880758.webp 1280w, /blog/observable-framework-blazing-fast/observable_9_hu10249990358356203252.webp 1536w, /blog/observable-framework-blazing-fast/observable_9_hu18331669316173698738.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/observable_9_hu8982478773049073078.jpg 320w, /blog/observable-framework-blazing-fast/observable_9_hu12503603632088870102.jpg 640w, /blog/observable-framework-blazing-fast/observable_9_hu12376942963507888807.jpg 768w, /blog/observable-framework-blazing-fast/observable_9_hu4816125772020097203.jpg 1024w, /blog/observable-framework-blazing-fast/observable_9_hu2317566356704339179.jpg 1280w, /blog/observable-framework-blazing-fast/observable_9_hu15715234073926192365.jpg 1536w, /blog/observable-framework-blazing-fast/observable_9_hu11758245203237317164.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/observable-framework-blazing-fast/observable_9_hu12503603632088870102.jpg" width="3072" height="1536" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="presentation-layer-5-reactivity">Presentation Layer 5: Reactivity</h2>
<p>JavaScript in Framework has a superpower: it&rsquo;s reactive. From the <a href="https://observablehq.com/framework/reactivity">docs</a>:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p>Framework runs like a spreadsheet: code re-runs automatically when referenced variables change. This brings:</p>
<ul>
<li>Easier interactivity because state is automatically kept in sync</li>
<li>Easier asynchronous programming via implicit await of promises</li>
<li>Better performance with incremental re-rendering</li>
<li>Greater flexibility by writing code and prose in any order</li>
</ul>
<p>Reactivity is especially helpful for data apps because these apps tend to have complex state.</p>

</div>

<p>Reactivity was a key differentiating feature of Observable&rsquo;s first product, Notebooks. In most data notebooks, Jupyter for example, cells execute in a linear order, and the user must manually re-run cells when dependencies change. In contrast, an <a href="https://observablehq.com/@observablehq/learning-observable-reactive-dataflow">Observable Notebook</a> &hellip;</p>
<blockquote>
<p>&hellip; knows which cells depend on which others, no matter where they are located in the notebook. So when one of them changes, all values that depend on it are automatically updated. This is also efficient: only those cells that are affected by a change are re-run. That means that you can organize cells in your notebook however you want, without worrying about how the order of operations may be affected.</p>
</blockquote>
<p>Reactivity is even better in Framework, because the augmented Markdown format that sits at the heart of Framework&rsquo;s presentation layer is more powerful and flexible than the original app-based Notebook model. Framework Markdown freely combines content with code; uses vanilla JavaScript rather than a JavaScript dialect with <a href="https://observablehq.com/documentation/cells/observable-javascript">syntax differences</a>; and finally, since a Framework page (the equivalent of a Notebook) is represented by a single, simple text Markdown file, it works flawlessly with source control / CI-CD platforms like GitHub.</p>
<h2 id="presentation-layer-6-interactivity">Presentation Layer 6: Interactivity</h2>
<p>Reactivity brings many benefits, but perhaps shines most brightly when it comes to enabling interactive dashboards, where user inputs dynamically reshape dashboard output.</p>
<p>Framework Inputs support direct user interaction on dashboards and reports.  The 14 flavors of Input include Radio, Checkbox, Select, Range, Toggle, Date and eight more.</p>
<p>Let&rsquo;s make a histogram of soil carbon values, with the width of each histogram bar (and therefore the number of bars) controlled by a Range Input. This code block with a single line of code:</p>
<pre><code>```js
const binWidth = view(Inputs.range([.2, 1], {step: .05, value: .5, label: &quot;Bin Width (%):&quot;}))
```
</code></pre>
<p>puts a range slider control onto our dashboard screen, with min/max values of .2 and 1. The JavaScript variable <code>binWidth</code> has an initial value of .5, and gets updated as the user moves the slider left or right. In another code block, Observable Plot&rsquo;s binX transform references <code>binWidth</code>, and thanks to Framework reactivity, the histogram updates in real time. Here&rsquo;s the result:</p>
<video preload="auto" width="75%"  autoplay loop playsinline class="html-video">
    <source src="/blog/observable-framework-blazing-fast/interactive_histogram.mp4" type="video/mp4">
  <span></span>
</video>
<p>Voila, one line of code, and we&rsquo;ve got our first interactive dashboard element.</p>
<p>Now let&rsquo;s take a look at a more complete and interactive dashboard (<a href="/observable/mortgage-rates/">try it live here</a>), which shows 15- and 30-year fixed mortgage rates from 1971 through the present, using data that is updated weekly and thoughtfully <a href="https://www.freddiemac.com/pmms/pmms_archives">shared by Freddie Mac</a> as a downloadable CSV. A 15-line Node.js JavaScript Data Loader grabs the latest CSV, current to within a week.</p>
<p>As you see below, the upper right card shows a detailed chart of mortgage rates, starting with the past year; while the bottom pane shows a full-history rate chart that covers 1971 through the present. In this case, the interaction isn&rsquo;t through a Framework Input, but rather through JavaScript click and drag events setting a date range variable <code>startEnd</code> when the user interacts with the lower chart. The detailed chart above right references <code>startEnd</code> and reacts instantly when it changes. All four charts in the dashboard are rendered by Observable Plot.</p>
<video preload="auto" width="75%"  autoplay loop playsinline class="html-video">
    <source src="/blog/observable-framework-blazing-fast/interactive_mortgage_rates.mp4" type="video/mp4">
  <span></span>
</video>
<p>As you can see, Framework supports highly-interactive experiences for data consumers.</p>
<h2 id="presentation-layer-7-visualizations">Presentation Layer 7: Visualizations</h2>
<p>So far, we&rsquo;ve covered the data layer including a deep dive on Data Loaders, and many aspects of the presentation layer, from Markdown to interactivity. But what about the visualizations themselves? Here Framework&rsquo;s options are virtually unlimited: virtually any JavaScript visualization library can be used within Framework. To insert a visualization into a Framework Markdown page, you just call the library from a JavaScript code block or inline expression.</p>
<p>Observable themselves actually created two of the most powerful libraries (both fully open source): <a href="https://observablehq.com/plot/">Observable Plot</a>, which is built on top of the lower-level <a href="https://d3js.org/">D3</a>. Just to give you a taste of what&rsquo;s possible, here&rsquo;s a tiny subset of the <a href="https://observablehq.com/@observablehq/plot-gallery">available examples for Plot</a> and for <a href="https://observablehq.com/@d3/gallery">D3</a>:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/plot_gallery.png"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/plot_gallery_hu11188538430360543668.webp 320w, /blog/observable-framework-blazing-fast/plot_gallery_hu2677887371132985515.webp 640w, /blog/observable-framework-blazing-fast/plot_gallery_hu13268687845007704536.webp 768w, /blog/observable-framework-blazing-fast/plot_gallery_hu10159262909854492205.webp 1024w, /blog/observable-framework-blazing-fast/plot_gallery_hu14879729074436440580.webp 1280w, /blog/observable-framework-blazing-fast/plot_gallery_hu11638009401796897520.webp 1536w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/plot_gallery_hu13991545080758240284.jpg 320w, /blog/observable-framework-blazing-fast/plot_gallery_hu2067256084191614305.jpg 640w, /blog/observable-framework-blazing-fast/plot_gallery_hu4803092101448609989.jpg 768w, /blog/observable-framework-blazing-fast/plot_gallery_hu16681999801196853994.jpg 1024w, /blog/observable-framework-blazing-fast/plot_gallery_hu10171782844957708444.jpg 1280w, /blog/observable-framework-blazing-fast/plot_gallery_hu1126640898658672294.jpg 1536w" sizes="37vw" />
    
      <img src="/blog/observable-framework-blazing-fast/plot_gallery_hu2067256084191614305.jpg" width="1750" height="1324" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/observable-framework-blazing-fast/d3_gallery.png"><picture>
    <source type="image/webp" srcset="/blog/observable-framework-blazing-fast/d3_gallery_hu17047919395485345721.webp 320w, /blog/observable-framework-blazing-fast/d3_gallery_hu12690674694875505255.webp 640w, /blog/observable-framework-blazing-fast/d3_gallery_hu12677224145963235929.webp 768w, /blog/observable-framework-blazing-fast/d3_gallery_hu6573851521168142410.webp 1024w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/observable-framework-blazing-fast/d3_gallery_hu18272774813772194538.jpg 320w, /blog/observable-framework-blazing-fast/d3_gallery_hu11623531919533374368.jpg 640w, /blog/observable-framework-blazing-fast/d3_gallery_hu15259098075344805426.jpg 768w, /blog/observable-framework-blazing-fast/d3_gallery_hu10257322123906545727.jpg 1024w" sizes="37vw" />
    
      <img src="/blog/observable-framework-blazing-fast/d3_gallery_hu11623531919533374368.jpg" width="1175" height="894" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>But Observable&rsquo;s own libraries are far from the only options&mdash;other widely-used general plotting libraries including <a href="https://echarts.apache.org/en/index.html">Apache ECharts</a>, <a href="https://plotly.com/javascript/">Plotly</a>, and <a href="https://vega.github.io/vega-lite/">Vega-Lite</a> work great within Framework.</p>
<video preload="auto" width="50%"  autoplay loop playsinline class="html-video">
    <source src="/blog/observable-framework-blazing-fast/apache_echarts_sm.mp4" type="video/mp4">
  <span></span>
</video>
<p>Mapping-specific libraries such as <a href="https://leafletjs.com/">Leaflet</a> and <a href="https://docs.mapbox.com/mapbox-gl-js/guides/">Mapbox GL JS</a> are fully supported, as are a number of specialized viz libraries such as <a href="https://observablehq.com/framework/lib/dot">DOT</a>, <a href="https://observablehq.com/framework/lib/deckgl">Deck.gl</a>, <a href="https://observablehq.com/framework/lib/mermaid">Mermaid</a>, and <a href="https://observablehq.com/framework/lib/mosaic">Mosaic vgplot</a>.</p>
<h2 id="framework-in-a-nutshell">Framework in a Nutshell</h2>
<p>Observable&rsquo;s homepage tagline is:</p>
<blockquote>
<p>The best dashboards are built with code.</p>
</blockquote>
<p>If one considers the conventional alternatives&mdash;a massive SaaS app along the lines of Tableau, where our visualization possibilities are limited by what the SaaS vendor decides we should have&mdash;I&rsquo;ll take dashboards built with code, thank you very much.</p>
<video preload="auto" width="80%"  autoplay loop playsinline class="html-video">
    <source src="/blog/observable-framework-blazing-fast/dashboards_as_code.webm" type="video/webm">
  <span></span>
</video>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Quick Look at GPT-4o</title>
      <link>https://craftycto.com/micro/gpt-4o-quick-benchmark/</link>
      <pubDate>Sun, 19 May 2024 20:32:43 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/gpt-4o-quick-benchmark/</guid>
      <description>I did a quick benchmark of the new GPT-4o model versus GPT-4-turbo. Roughly twice the speed, with improved Vision accuracy.</description>
      <content:encoded><![CDATA[<p>Since last week&rsquo;s <a href="https://openai.com/index/spring-update/">Spring Update event</a> from OpenAI, I&rsquo;ve been wanting to test the new <a href="https://openai.com/index/hello-gpt-4o/">Omni model (GPT-4o)</a> in my Vision-based <a href="/blog/chatgpt-4v/">recipe ingestor project</a>. This Python script processes a directory of recipe images, and using GPT-4&rsquo;s Vision capabilities, as well as JSON Mode, produces a structured JSON recipe that I can post directly to my Paprika Recipes app.</p>
<h2 id="benchmark-results">Benchmark Results</h2>
<p>For a batch of three recipes / four recipe images, bypassing uploading to the Paprika cloud.</p>
<h3 id="quantitative">Quantitative</h3>
<ul>
<li>GPT-4-turbo: 1:03 (1 min 3 secs)</li>
<li>GPT-4o: 0:38 (38 secs)</li>
</ul>
<h3 id="qualitative">Qualitative</h3>
<p>GPT-4o&rsquo;s Vision capabilities seem to have improved over GPT-4-turbo. Example: GPT-4-turbo had a hard time parsing the handwritten name &ldquo;Debbie Gardner&rdquo;, producing &ldquo;Betty&rsquo;s Cards&rdquo;, &ldquo;Betty Bard&rdquo;, &ldquo;Betty Borden&rdquo; etc. on different runs. GPT-4o got the name correct.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>OpenAI Vision &#43; Function Calling Examples</title>
      <link>https://craftycto.com/micro/openai-vision-function-calling/</link>
      <pubDate>Sun, 28 Apr 2024 09:27:35 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/openai-vision-function-calling/</guid>
      <description>OpenAI&amp;#39;s April 9th model update merges Turbo and Vision, and these examples show the two working together.</description>
      <content:encoded><![CDATA[<p>When OpenAI released preview Vision support in GPT-4, it had some major limitations, lacking many of the newest features available in GPT-4 Turbo, including structured output (JSON Mode) and function calling. I had to hack my <a href="/blog/chatgpt-4v/">Recipe Ingestor</a> project, which applies GPT-4 Vision to ingest, structure and enrich legacy recipe images, to run in two passes as a workaround.</p>
<p>On April 9th, <a href="https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4">OpenAI released</a> an updated <code>gpt-4-turbo</code> model:</p>
<blockquote>
<p>GPT-4 Turbo with Vision: The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling.</p>
</blockquote>
<p>I&rsquo;ve updated Recipe Ingestor so it now runs nicely in one pass that uses Vision alongside Turbo&rsquo;s JSON Mode.</p>
<p>In making these updates, I dug around in the OpenAI docs and came across a <a href="https://cookbook.openai.com/examples/multimodal/using_gpt4_vision_with_function_calling">pair of new Vision examples</a> in the OpenAI Cookbook that take advantage of the April 9th model, applying function calling driven from image inputs. Provided as a <a href="https://github.com/openai/openai-cookbook/tree/main/examples/multimodal">Jupyter Notebook</a>, the examples have me mulling whether function calling might make sense for Recipe Ingestor.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Using Tailscale to Access Amazon VPCs, EC2 Instances, and RDS Clusters</title>
      <link>https://craftycto.com/blog/tailscale-fun/</link>
      <pubDate>Tue, 23 Apr 2024 12:19:30 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/tailscale-fun/</guid>
      <description>Tailscale has been simple to set up and manage, but also amazingly flexible.</description>
      <content:encoded><![CDATA[<h2 id="inception-direct-database-access-for-the-data-team">Inception: Direct Database Access for the Data Team</h2>
<p>Our immediate need was getting the data science team programatic access to a read replica of our production database, an Amazon RDS Postgres cluster.</p>
<p>The initial stopgap solution was to open a Postgres port, but with an RDS Security Group rule that limited inbound access to a few specific IP addresses. That solution became high-maintenance quickly, since some of our team connected from a university campus network, where IP addresses rotated every few weeks.</p>
<h2 id="better-idea-aws-systems-manager-session-manager">Better Idea: AWS Systems Manager Session Manager</h2>
<p>Our development partner suggested a better solution, AWS <a href="https://aws.amazon.com/systems-manager/features/#Session_Manager">Systems Manager Session Manager</a>, which enables tunneled sessions into the AWS environment and leverages AWS IAM to manage access. The result: better security and no need for manual IP whitelisting.</p>
<p>SMSM has one significant drawback: targeted at dev and devops folks, it is configured and run through the AWS command line interface. Yikes&mdash;imagine conversations with end users that begin &ldquo;OK, first, open a terminal, then run this command &hellip;&rdquo;&mdash;not the user experience we&rsquo;re going for. Our data team could&rsquo;ve handled it, but the CLI interface would be an ongoing source friction and pain.</p>
<p>More Session Manager rough edges appeared when I tried but failed to set up a quick proof of concept. The AWS docs were impenetrable, and even a third-party guide on the process wasn&rsquo;t help enough. All the time, I was becoming less and less convinced that Systems Manager was the best solution: &ldquo;All this mucking around, just to open a tunnel to an RDS replica?&rdquo; I also began to realize that Session Manager was, in effect, a limited-scope VPN for AWS services only, without much of a user interface. Why invest precious time on such a limited solution?</p>
<h2 id="bigger-picture-other-needs">Bigger Picture: Other Needs</h2>
<p>When I broadened my thinking, I quickly realized we had already implemented two other one-off remote access solutions:</p>
<ul>
<li>To enable SQL GUI tool access to the database, we set up bastion servers on our staging and production VPCs. These were Windows EC2 instances, with their own login credentials and the DBeaver SQL tool installed. We attached to the bastions using Remote Desktop. Scrolling through long tables in DBeaver via Remote Desktop is unpleasant bordering on dangerous on a write-capable connection.</li>
<li>To support miscellaneous tasks such as database migration, we had two additional Ubuntu EC2 instances, with open SSH ports.</li>
</ul>
<p>With Systems Manager Session Manager shaping up as yet another one-off remote access solution, I decided to seek a broader solution that addressed all three remote access needs, provided a better admin and user experience, and shored up security as well.</p>
<h2 id="security-goals">Security Goals</h2>
<p>Our desired security posture on AWS is &ldquo;expose nothing we don&rsquo;t absolutely need to expose, and what we do expose, make it robustly secure.&rdquo; To drill down a bit:</p>
<ul>
<li>Keep our AWS Virtual Private Clouds walled off and private.</li>
<li>Avoid exposing attack surfaces, such as SSH / Postgres ports and internal-only service endpoints.</li>
<li>Enable remote access in a robustly secure manner, granting specific users access to specific services, as opposed to blanket access for everyone.</li>
</ul>
<h2 id="vpn---or-tailscale">VPN&mdash;or Tailscale?</h2>
<p>The default solution for secure remote access is a VPN; and there&rsquo;s no doubt a VPN could have worked for us. &ldquo;Easy,&rdquo; &ldquo;Low Maintenance&rdquo; and &ldquo;Flexible&rdquo; aren&rsquo;t terms one usually associates with VPNs, however, so I kept solution-scanning.</p>
<p>I&rsquo;d been peripherally aware of <a href="https://tailscale.com/">Tailscale</a> through background chatter on Hacker News and similar venues. My vague impression of its niche was &ldquo;better than a traditional VPN, and way less painful.&rdquo; That sounded just perfect for our needs, so I took the opportunity to explore it more deeply, was immediately intrigued, found wonderful documentation including excellent setup guides for exactly what we needed, and before I knew it had a Tailscale-on-AWS proof of concept up and running.</p>
<h2 id="what-is-tailscale-really">What is Tailscale, Really?</h2>
<p>The very minute I sat down to write this section, Tailscale&rsquo;s monthly email newsletter landed in my inbox, and it highlighted <a href="https://www.caseyliss.com/2024/3/27/tailscale">this excellent Tailscale post by Casey Liss</a>. Casey operates the <a href="https://atp.fm/">Accidental Tech Podcast</a>, and has several iOS apps in the App Store including the excellent <a href="https://apps.apple.com/us/app/callsheet-find-cast-crew/id1672356376">Callsheet</a> (4.9 star rating, App Store Editors Choice). So Casey already wrote it better than I could, so to get up to speed on Tailscale basics, please <a href="https://www.caseyliss.com/2024/3/27/tailscale">read his!</a></p>
<h2 id="getting-inside-the-vpc">Getting Inside the VPC</h2>
<p>VPC means Virtual <em><strong>Private</strong></em> Cloud, so how do we get in there? Enabling all sort of &ldquo;getting in there,&rdquo; in a magically simple way, is Tailscale&rsquo;s superpower. Still, AWS is pretty serious about the P word, and <a href="https://tailscale.com/kb/1296/aws-reference-architecture">Tailscale did the work</a> to make it really work.</p>
<p>Getting Tailscale running on an EC2 instance, bare cloud-iron that we can directly access and control, is just a quick install. Literally a minute if one can SSH in. In one minute, that EC2 instance will magically pop up on your private Tailnet. (Installing Tailscale on Mac, Windows, iOS, etc. is even easier.)</p>
<p>But &hellip; we&rsquo;re living in the age of Serverless now. Even in our smallish infrastructure, the two main pillars of our setup (compute and database, ECS-Fargate and RDS Postgres) are serverless. What do you do when you don&rsquo;t have bare iron, when you can&rsquo;t just SSH in and install Tailscale? The key here is Tailscale&rsquo;s subnet router, which isn&rsquo;t even another piece of software, but rather an argument added to the Tailscale command when you start it up. You just need a tiny EC2 instance within each VPC running Tailscale with the subnet router option enabled, and now, every device connected the VPC becomes accessible, even though they aren&rsquo;t even running the Tailscale client. (To be clear, Security Groups still apply so access is blocked by default.)</p>
<p>Subnet routing gets us access to our RDS cluster, both primary writer and read replica instances. And that (along with Tailscale&rsquo;s robust security) meets two of our three current use cases: data team read replica access, and developer access for SQL tools. Bastion servers are gone, and DBeaver is 10X better connecting directly versus through Remote Desktop.</p>
<h2 id="ssh-solved">SSH, Solved</h2>
<p>Our third use case is SSH. Good news: just by installing Tailscale on the servers that need SSH access, and the SSH users&rsquo; client devices, we have closed off the attack surface exposed by opening an SSH port to the Internet. As <a href="https://tailscale.com/kb/1193/tailscale-ssh">Tailscale&rsquo;s docs state</a>, we already have &ldquo;the standard SSH experience without exposing your servers to the internet.&rdquo; That&rsquo;s a big, free win right there.</p>
<p>We&rsquo;ve achieved this without even implementing the <a href="https://tailscale.com/tailscale-ssh">Tailscale SSH</a> feature &hellip; so why does that feature even exist? It turns out there&rsquo;s more to robustly securing SSH than simply blocking network access. There&rsquo;s authentication&mdash;&ldquo;who are you and how do I know you&rsquo;re telling the truth about that?&rdquo;&mdash;and authorization&mdash;&ldquo;what&rsquo;s this user allowed to do?&rdquo;&mdash;namely are they allowed SSH access to this server?</p>
<p>We all know the pitfalls of username/password security, and organizations that are serious about security (or have compliance requirements) tend to instead apply digital certificates. To quote Tailscale&rsquo;s docs:</p>
<blockquote>
<p>Historically, to secure an SSH connection, you generate a keypair on the machine you are connecting from (known as the client), with the private key stored on the client, and the public key distributed to the device you want to connect to (known as the server). This lets the server authenticate communication from the client.</p>
</blockquote>
<p>So every SSH user needs to establish a keypair with every server they SSH access to. When you&rsquo;ve got more than a handful of SSH users and servers, this gets painful fast, and opens up its own attack surfaces, such as the case where an SSH-privileged user leaves the company. The pain level and security/compliance concerns here are often large enough to drive the implementation of PKI (Public Key Infrastructure) and KMS (Key Management System) solutions. In other words, a whole new set of systems just to get secure, compliant SSH.</p>
<p>This is where Tailscale SSH shines. Tailscale already knows, through its underlying digital certificate implementation, who its users and machines are. Tailscale SSH simply applies  Tailscale&rsquo;s own strong authentication and key management capabilities to SSH transactions, adding an SSH-specific Access Control List facility to cover authorization, e.g. &ldquo;what&rsquo;s this user allowed to do?&rdquo; This eliminates the whole every-user-to-every-server keypair rat race while improving security and compliance. And there are <a href="https://tailscale.com/tailscale-ssh">many other benefits</a> to Tailscale SSH, from automatic key rotation to the SSH session recording.</p>
<h2 id="tricks-tips-and-learning-moments">Tricks, Tips, and Learning Moments</h2>
<h3 id="a-dedicated-tailscale-aws-proof-of-concept-environment-is-worth-it">A Dedicated Tailscale AWS Proof of Concept Environment Is Worth It</h3>
<p>In an attempt to save time, I tried to do my Tailscale POC in our existing Staging environment. The predictable result: I actually spent more time chasing little glitches caused by unique aspects of the preexisting environment. Another result: one of my experimental changes managed to take Staging down. Eventually, I learned my lesson, went back and set up a full POC on its own VPC with its own RDS cluster and all. Getting Tailscale set up fully there was quick, and by getting that environment working, I learned what I needed to (carefully) reimplement Tailscale on Staging, and then Production.</p>
<h3 id="duplicate-ipv4-cidr-blocks-on-different-vpcs">Duplicate IPv4 CIDR Blocks on Different VPCs</h3>
<p>We used Terraform to set up our initial Staging and Production environments. One side effect of this was that the IPv4 address ranges (CIDR blocks) were identical between the two environments. This all works just fine inside the private VPCs but when Tailscale needs to route traffic from the outside, it needs to know &ldquo;which 10.0.1.23 do you mean, sir?&rdquo; Tailscale&rsquo;s subnet router includes an elegant fix for this that they call <a href="https://tailscale.com/kb/1201/4via6-subnets">4via6</a>. We configured our Staging environment this way.</p>
<h3 id="bad-tailscale-advice-from-gpt-4">Bad Tailscale Advice from GPT-4</h3>
<p>I adore and rely on paid ChatGPT for help and advice across many knowledge domains with great success. Its specific advice around the details of Tailscale setup on AWS, however, turned out to be faulty and sent me off in the wrong direction several times. I think this knowledge niche was small and specific enough that ChatGPT&rsquo;s training data wasn&rsquo;t up to the task. My own lack of knowledge probably had me asking the wrong questions, and prevented me from recognizing bad advice. Filed away as a caution for similar situations in the future &hellip;</p>
<h3 id="tailscale-with-pihole-and-unbound">Tailscale With Pihole and Unbound</h3>
<p>I use <a href="https://pi-hole.net/">Pi-hole</a> on my home network, for network-level ad and tracker blocking; it&rsquo;s awesome, as I always realize when I&rsquo;m away from home and see what I&rsquo;ve been &ldquo;missing&rdquo;!</p>
<p>I also have been using <a href="https://docs.pi-hole.net/guides/dns/unbound/">Unbound</a>, a recursive DSN server, running beside Pi-hole on the same Raspberry Pi. Unbound is faster and more secure than using even one of the fast public DNS services like Cloudflare DNS. Something about how Unbound works, however, makes Tailscale&mdash;which also needs to be smart about DNS resolution&mdash;unhappy. This took quite a few hours to diagnose. I suspect it&rsquo;s fixable, but haven&rsquo;t had time to spend on it, and for now have Unbound disabled.</p>
<h3 id="tailscale-exit-nodes">Tailscale Exit Nodes</h3>
<p>Speaking of the poor Internet experience I get when away from home, Tailscale has a nice fix for that, <a href="https://tailscale.com/kb/1103/exit-nodes">Exit Nodes</a>, which can allow me to always route my internet traffic through my well-protected home network. Another thing I haven&rsquo;t had time to implement, but it&rsquo;s on the list.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Russ Cox&#39;s XZ Timeline</title>
      <link>https://craftycto.com/elsewhere/russ-cox-xz-timeline/</link>
      <pubDate>Tue, 02 Apr 2024 14:08:52 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/russ-cox-xz-timeline/</guid>
      <description>Nice writeup from Russ Cox on the (incredibly long) timeline of the XZ backdoor</description>
      <content:encoded><![CDATA[<p>Fascinating&mdash;and terrifying. Cox includes a solid list of Further Reading links at the end of his post.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Simon Willison&#39;s LLM Tool: Now I Have 50 LLMs</title>
      <link>https://craftycto.com/micro/50-llms/</link>
      <pubDate>Mon, 25 Mar 2024 15:21:49 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/50-llms/</guid>
      <description>I updated my installation of Willison&amp;#39;s LLM tool to add plugins, and now I have 50 LLMs at my fingertips, including 15 local models, which get installed on demand.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been intending to get my feet wet with the <a href="https://www.anthropic.com/news/claude-3-family">new Claude models</a> from Anthropic, especially Opus. When I saw Simon&rsquo;s <a href="/elsewhere/two-from-willison/">recent &ldquo;sidequests&rdquo; post</a> I decided to update to the latest version of his <a href="https://llm.datasette.io/en/stable/">LLM CLI tool</a> (part of <a href="https://datasette.io/">Datasette</a>) and get Opus access from the command line, using the Claude plugin.</p>
<p>While I was at it, I connected Google Gemini, Anyscale Endpoints, and gpt4all, the latter providing the abovementioned 15 local models, which auto-install when you first request a model. 50 LLMs in all&mdash;and this is far from the <a href="https://llm.datasette.io/en/stable/plugins/directory.html">complete list</a> LLM provides access to through its plugin architecture.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/50-llms/50-models-better.png"><picture>
    <source type="image/webp" srcset="/micro/50-llms/50-models-better_hu4769019394249011648.webp 320w, /micro/50-llms/50-models-better_hu7090598232154547734.webp 640w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/50-llms/50-models-better_hu3344990039812682765.jpg 320w, /micro/50-llms/50-models-better_hu1506795745636653877.jpg 640w" sizes="75vw" />
    
      <img src="/micro/50-llms/50-models-better_hu1506795745636653877.jpg" width="689" height="906" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Very handy for testing, such as &ldquo;how does Llama 70b compare to ChatGPT GPT-4 on this question?&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Two Worthwhile Reads From Simon Willison</title>
      <link>https://craftycto.com/elsewhere/two-from-willison/</link>
      <pubDate>Mon, 25 Mar 2024 08:42:20 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/two-from-willison/</guid>
      <description>Claude 3 Opus and GPT-4 to Tackle a GIS &amp;#39;Sidequest&amp;#39;; and Getting GPT-4 to Write, Compile, and Run C Code</description>
      <content:encoded><![CDATA[<p>I subscribe to Simon Willison&rsquo;s email newsletter (really just selected blog posts via email), and his last two were excellent.</p>
<p>Last week he talked about his casual daily use of the new Claude 3 Opus model via his own LLM tool, as well as ChatGPT GPT-4. He <a href="https://simonwillison.net/2024/Mar/22/claude-and-chatgpt-case-study/">describes such use as &ldquo;sidequests,&rdquo;</a> a description that resonates with me and my own daily LLM use. In this example, over an elapsed time of about 6 minutes, he was able to get an accurate GeoJSON for New York State&rsquo;s huge Adirondack Park starting with a deeply strange shapefile.</p>
<p>Over the weekend, he shared a <a href="https://simonwillison.net/2024/Mar/23/building-c-extensions-for-sqlite-with-chatgpt-code-interpreter/">longer prototyping effort</a> using ChatGPT GPT-4 Code Interpreter, where we managed to get GPT-4 to write, compile, and run a non-trivial bit of C code: a SQLite C extension for vector similarity. Code Interpreter runs Python, not C, but Simon suspected and confirmed that he could get GPT-4 to run <code>gcc</code> from within Python, and that was enough of a shim to get the job done.</p>
<p>Both are excellent reads that mirror my own experience in terms of the myriad ways I take advantage of LLM tools.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Moxie on Murder</title>
      <link>https://craftycto.com/micro/moxie-on-murder/</link>
      <pubDate>Mon, 11 Mar 2024 19:28:49 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/moxie-on-murder/</guid>
      <description>I did a double-take when I saw Moxie Marlinspike in the credits as co-starring in A Murder at the End of the World episode 6 (SLIGHT SPOILERS WARNING)</description>
      <content:encoded><![CDATA[<p><a href="https://www.themoviedb.org/tv/134095-a-murder-at-the-end-of-the-world?language=en-US">A Murder at the End of the World</a> grew on me over the course of the season, and by seasons end it had reached &ldquo;definitely watch&rdquo; status. Not the highest possible status, &ldquo;Can It Be Tuesday Already Please?&rdquo; which is, at the moment, held by Hulu&rsquo;s new <a href="https://www.themoviedb.org/tv/126308-shogun?language=en-US">Shōgun series</a>.</p>
<p>I rarely watch credits; sometimes to savor a great season finale, sometimes if there&rsquo;s interesting music I want to hear out. With episode 6, it was a combination: an intense episode finish, building towards the season finale in episode 7; and an excellent electric guitar instrumental, <a href="https://music.apple.com/us/album/beni-said/1120597959?i=1120598579">Beni Said by 75 Dollar Bill</a>, that began playing with the credits. For whatever reason, I was still watching the credits by the time they reached CO-STARRING, 1:51 from the end of the episode. And there, listed first: Moxie Marlinspike.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/moxie-on-murder/moxie-credits.webp"><picture>
    <source type="image/webp" srcset="/micro/moxie-on-murder/moxie-credits_hu2818452611183313533.webp 320w, /micro/moxie-on-murder/moxie-credits_hu15619533218556321229.webp 640w, /micro/moxie-on-murder/moxie-credits_hu3591227851259071128.webp 768w, /micro/moxie-on-murder/moxie-credits_hu15437200474827111949.webp 1024w, /micro/moxie-on-murder/moxie-credits_hu2340558587995692353.webp 1280w, /micro/moxie-on-murder/moxie-credits_hu5130365559122132996.webp 1536w, /micro/moxie-on-murder/moxie-credits_hu5830277650566607789.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/moxie-on-murder/moxie-credits_hu1476480535575318734.jpg 320w, /micro/moxie-on-murder/moxie-credits_hu13262272167442692262.jpg 640w, /micro/moxie-on-murder/moxie-credits_hu4272807584087255140.jpg 768w, /micro/moxie-on-murder/moxie-credits_hu9616201408400594704.jpg 1024w, /micro/moxie-on-murder/moxie-credits_hu11366024953617173331.jpg 1280w, /micro/moxie-on-murder/moxie-credits_hu10446877040521221042.jpg 1536w, /micro/moxie-on-murder/moxie-credits_hu14780925317581198580.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/moxie-on-murder/moxie-credits_hu13262272167442692262.jpg" width="3527" height="1718" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Moxie&rsquo;s a <a href="https://en.wikipedia.org/wiki/Moxie_Marlinspike">legend in tech</a> as creator of the <a href="https://en.wikipedia.org/wiki/Signal_%28messaging_app%29">Signal secure messaging app</a>&mdash;and more importantly to cryptographers, the <a href="https://en.wikipedia.org/wiki/Signal_Protocol">Signal Protocol</a> and <a href="https://en.wikipedia.org/wiki/Double_Ratchet_Algorithm">Double Ratchet Algorithm</a>&mdash;and when I saw his name I immediately was looking for &ldquo;technical advisor&rdquo; credits. But no, this was actually CO-STARRING. I filed it away and determined to research it.</p>
<p>The following day I did a bit of searching, with little to show for it other than IMDB stating that yes, Moxie had indeed appeared in S1 E6. I refined the query a bit and finally got found a few some 2023 mentions of Moxie technical advising as well.</p>
<p>I use <a href="https://help.kagi.com/kagi/company/">Kagi search</a>, and beyond the core fact that, in stark contrast with Google, Kagi doesn&rsquo;t suck, I&rsquo;ve come to value its &ldquo;Quick Answer&rdquo; feature, which feeds search results through an LLM and generates an excellent summary with references. Here it is, wrapping up both aspects of Moxie&rsquo;s contribution to Murder at the End of the World:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/moxie-on-murder/moxie-murder-search.webp"><picture>
    <source type="image/webp" srcset="/micro/moxie-on-murder/moxie-murder-search_hu2797813908475365741.webp 320w, /micro/moxie-on-murder/moxie-murder-search_hu1388802948617647567.webp 640w, /micro/moxie-on-murder/moxie-murder-search_hu6503943037856448396.webp 768w, /micro/moxie-on-murder/moxie-murder-search_hu387613809320767079.webp 1024w, /micro/moxie-on-murder/moxie-murder-search_hu3912567112012870822.webp 1280w, /micro/moxie-on-murder/moxie-murder-search_hu9560995731467279091.webp 1536w, /micro/moxie-on-murder/moxie-murder-search_hu3896417974078791601.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/moxie-on-murder/moxie-murder-search_hu11419936781715133878.jpg 320w, /micro/moxie-on-murder/moxie-murder-search_hu5080123145384180794.jpg 640w, /micro/moxie-on-murder/moxie-murder-search_hu8666131365953983830.jpg 768w, /micro/moxie-on-murder/moxie-murder-search_hu10523688665622303294.jpg 1024w, /micro/moxie-on-murder/moxie-murder-search_hu11209140073866061420.jpg 1280w, /micro/moxie-on-murder/moxie-murder-search_hu16824766503216400135.jpg 1536w, /micro/moxie-on-murder/moxie-murder-search_hu14160698320995729201.jpg 1920w" sizes="100vw" />
    
      <img src="/micro/moxie-on-murder/moxie-murder-search_hu5080123145384180794.jpg" width="3538" height="3908" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>So I was right about the technical advisor thing; hacking is a significant part of Murder&rsquo;s story, and it was accurately presented throughout the series. The only major tech flub I saw was the data center fire scene in episode 7. Maybe Moxie&rsquo;s advisory contract had run out by then, or maybe they had a mini-GOT-gotta-finish-this-somehow brain cramp. But no need to go there, the final episode was still solid despite painfully stretched credibility in that scene.</p>
<p>I&rsquo;ve never seen Moxie in person or even on video; maybe in a Wikipedia photo. So I had no clue that was him playing Max in episode 6. But I&rsquo;m happy I noticed him in the credits and did this research.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Willison: The killer app of Gemini Pro 1.5 is video</title>
      <link>https://craftycto.com/elsewhere/willison-gemini-pro-video/</link>
      <pubDate>Thu, 22 Feb 2024 07:54:30 -0600</pubDate>
      
      <guid>https://craftycto.com/elsewhere/willison-gemini-pro-video/</guid>
      <description>Simon Willison tries out Gemini Pro 1.5 on video, and suggests its 1M token context size opens up powerful new opportunities using video prompts</description>
      <content:encoded><![CDATA[<p>Willison&rsquo;s experience with, and reaction to, Gemini 1.5 Pro extracting structured output from video prompts parallels <a href="/blog/chatgpt-4v/">my own experience</a> using GPT-4 Vision to extract structure from heirloom recipe images (often handwritten and horribly mangled):</p>
<blockquote>
<p>&hellip; I&rsquo;m pretty astonished by this.</p>
<p>&hellip; I find those results pretty astounding.</p>
<p>The ability to analyze video like this feels SO powerful. Being able to take a 20 second video of a bookshelf and get back a JSON array of those books is just the first thing I thought to try.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Using Multimodal AI to Capture and Enrich Heirloom Recipes</title>
      <link>https://craftycto.com/blog/chatgpt-4v/</link>
      <pubDate>Mon, 19 Feb 2024 05:17:47 -0600</pubDate>
      
      <guid>https://craftycto.com/blog/chatgpt-4v/</guid>
      <description>I applied OpenAI&amp;#39;s GPT-4 Vision model and Chat Completions API to preserve a treasure-trove of legacy family recipes.</description>
      <content:encoded><![CDATA[<p>OpenAI is constantly <a href="https://openai.com/sora">firehosing us with new capabilities</a>. It&rsquo;s tough just to keep up with the announcements, let alone deeply understand the new offerings at depth. The only way I know to develop this kind of deep understanding is to build something real and non-trivial.</p>
<p>I was fortunate to have a somewhat complex personal need, just as the new GPT-4 Vision model and updated Chat Completions API landed in my OpenAI account. The tale of my exploration follows.</p>
<p><em>Note&mdash;Click any image to zoom</em></p>
<h2 id="sept-25th-chatgpt-can-now-see-hear-and-speak-">Sept. 25th: &ldquo;ChatGPT can now see, hear, and speak &hellip;&rdquo;</h2>
<p>OpenAI had teased vision support earlier, but the actual <a href="https://openai.com/blog/chatgpt-can-now-see-hear-and-speak">announcement</a> of Vision availability happened on Sept. 25th under the above headline.</p>
<p>I&rsquo;m not an OpenAI VIP, sorry. I&rsquo;m just a paid ChatGPT Plus user and Tier-1-going-on-Tier-2 API user. I don&rsquo;t get early access; I get <em>late</em> access.</p>
<p>So while OpenAI announced GPT-4 Vision on Sept 25th, it didn&rsquo;t show up for me until late October or early November. OpenAI doesn&rsquo;t communicate actual availability of features to its retail customers, and so all I know for sure is that I noticed Vision had showed up in my ChatGPT+ sometime in early November.</p>
<h2 id="my-burning-need-family-heirloom-recipes">My burning need: family heirloom recipes</h2>
<p>During our August vacation at the family lake house, we uncovered a treasure-trove of recipes, which my daughter-in-law Julie was kind enough to capture using the iOS Notes app and share in PDF format. On my to-do list since then had been figuring out how to get those recipes into a recipe app. I use Paprika 3, while Julie has been trying out Recipe Keeper.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/PicklesBreadandButter.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/PicklesBreadandButter_hu12318155748107080735.webp 320w, /blog/chatgpt-4v/PicklesBreadandButter_hu10303674040299452467.webp 640w, /blog/chatgpt-4v/PicklesBreadandButter_hu9673812261989832292.webp 768w, /blog/chatgpt-4v/PicklesBreadandButter_hu2381721664917183126.webp 1024w, /blog/chatgpt-4v/PicklesBreadandButter_hu88561478005762701.webp 1280w, /blog/chatgpt-4v/PicklesBreadandButter_hu11787458460692750038.webp 1536w, /blog/chatgpt-4v/PicklesBreadandButter_hu6297542469202202794.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/PicklesBreadandButter_hu7317753353608766475.jpg 320w, /blog/chatgpt-4v/PicklesBreadandButter_hu17186994889303758960.jpg 640w, /blog/chatgpt-4v/PicklesBreadandButter_hu8723046985592484612.jpg 768w, /blog/chatgpt-4v/PicklesBreadandButter_hu12135048784054990536.jpg 1024w, /blog/chatgpt-4v/PicklesBreadandButter_hu15462130383695865746.jpg 1280w, /blog/chatgpt-4v/PicklesBreadandButter_hu77538541428118013.jpg 1536w, /blog/chatgpt-4v/PicklesBreadandButter_hu15712547796578845536.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/PicklesBreadandButter_hu17186994889303758960.jpg" width="6013" height="9068" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/picnic_cake.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/picnic_cake_hu17341322776214975950.webp 320w, /blog/chatgpt-4v/picnic_cake_hu7367323493689867216.webp 640w, /blog/chatgpt-4v/picnic_cake_hu14182837988515302504.webp 768w, /blog/chatgpt-4v/picnic_cake_hu13666689628560928604.webp 1024w, /blog/chatgpt-4v/picnic_cake_hu6665370018651037614.webp 1280w, /blog/chatgpt-4v/picnic_cake_hu3259335321599967854.webp 1536w, /blog/chatgpt-4v/picnic_cake_hu2401769931396893935.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/picnic_cake_hu11411917264683798303.jpg 320w, /blog/chatgpt-4v/picnic_cake_hu6246359020851150438.jpg 640w, /blog/chatgpt-4v/picnic_cake_hu9503604617286114439.jpg 768w, /blog/chatgpt-4v/picnic_cake_hu10103415394615183889.jpg 1024w, /blog/chatgpt-4v/picnic_cake_hu13451900243182094338.jpg 1280w, /blog/chatgpt-4v/picnic_cake_hu5316062473623930730.jpg 1536w, /blog/chatgpt-4v/picnic_cake_hu8963958025637650712.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/picnic_cake_hu6246359020851150438.jpg" width="5428" height="9126" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>What the family really needs is both a great facsimile of the original paper recipe (high resolution, correct orientation, zoomable), and a fully-digital recipe with all the goodies that apps like Paprika and Recipe Keeper give you&mdash;ingredient scaling, store lists, easy sharing, and so on.</p>
<p>Paprika has been around forever, and several years back I had tried importing legacy recipe images, but at that point in time I wasn&rsquo;t able to get the &ldquo;high resolution, correct orientation, zoomable&rdquo; solution desired. So I was wondering if Julie had any luck with Recipe Keeper and I began poking around the current Paprika.</p>
<p>In the end it turned out that the current version of Paprika 3 has quite strong image support, while in limited testing, I had trouble getting Recipe Keep to handle image orientations correctly. So the recipe app I was already using looked to be the best solution. Decision made.</p>
<p>We still had a lot of work ahead of us, though&mdash;laboriously transcribing from those torn, stained, mostly handwritten family treasures. And this particular trove is probably only 20% of the full library; my brother has the larger collection, probably at least 3X as many, and my sister and wife have others. This was shaping up to be a long side project.</p>
<h2 id="nov-14th-recipe-image--chatgpt-plus-with-vision">Nov. 14th: Recipe image =&gt; ChatGPT Plus with Vision</h2>
<p>So when I discovered that my ChatGPT Plus account now had the &ldquo;new stuff&rdquo; including vision support, I had a ready-made test case for Vision.</p>
<p>I know for sure that it was November 14th when I began toying with it. My first (failed) Vision request was:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/first_ask.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/first_ask_hu1340450349034437927.webp 320w, /blog/chatgpt-4v/first_ask_hu15097985203113973916.webp 640w, /blog/chatgpt-4v/first_ask_hu8942395519856875195.webp 768w, /blog/chatgpt-4v/first_ask_hu5639601611381070177.webp 1024w, /blog/chatgpt-4v/first_ask_hu18381478782248307119.webp 1280w, /blog/chatgpt-4v/first_ask_hu4533013868291098648.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/first_ask_hu7938505736399768984.jpg 320w, /blog/chatgpt-4v/first_ask_hu13350816010601900641.jpg 640w, /blog/chatgpt-4v/first_ask_hu17156918990586459575.jpg 768w, /blog/chatgpt-4v/first_ask_hu16166166149589552189.jpg 1024w, /blog/chatgpt-4v/first_ask_hu3564419108385496008.jpg 1280w, /blog/chatgpt-4v/first_ask_hu4611208738507088994.jpg 1536w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/first_ask_hu13350816010601900641.jpg" width="1676" height="1564" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>This first request caused GPT-4V to puke&mdash;PDFs aren&rsquo;t considered an image format. I used macOS Preview to export a png file from another one my recipe PDFs and fed that to Vision. This was the input:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/CheesecakeMargieJohnsons.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/CheesecakeMargieJohnsons_hu1498008705752921010.webp 320w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu12940441712949401313.webp 640w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu18122300231967922272.webp 768w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu346713728392687576.webp 1024w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu14067950214170775746.webp 1280w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu11531766844623899973.webp 1536w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu3997492905051288397.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/CheesecakeMargieJohnsons_hu12861744871300174132.jpg 320w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu17398393947585704786.jpg 640w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu14766842191739538159.jpg 768w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu12857688347257873709.jpg 1024w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu7535363819869318239.jpg 1280w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu13388287800982552669.jpg 1536w, /blog/chatgpt-4v/CheesecakeMargieJohnsons_hu16311836097494760229.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/CheesecakeMargieJohnsons_hu17398393947585704786.jpg" width="2166" height="1489" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I fully expected an interesting failure. I&rsquo;ve been doing technology for over four decades, which coincidentally is just about how long OCR&mdash;optical character recognition&mdash;has been available for personal use. And OCR has sucked for all of those decades. OCRing scans of printed documents is painful and error-prone. But with our legacy recipes, we faced much worse, like Margie Johnson&rsquo;s Cheesecake above&mdash;typed with a worn ribbon, wrinkled, stained.</p>
<p>My expectations were low, but on the other hand, GPT-4 blows my mind several times a week, so what the heck, let&rsquo;s see what happens.</p>
<h2 id="ocr-is-dead-long-live-vision">OCR is dead, long live Vision</h2>
<p>This was GPT-4V&rsquo;s response to that image:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/gpt4v-response-1.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/gpt4v-response-1_hu11738862489189699324.webp 320w, /blog/chatgpt-4v/gpt4v-response-1_hu17412774995217624906.webp 640w, /blog/chatgpt-4v/gpt4v-response-1_hu6577058195085922932.webp 768w, /blog/chatgpt-4v/gpt4v-response-1_hu11637206869651977652.webp 1024w, /blog/chatgpt-4v/gpt4v-response-1_hu12128098548960195178.webp 1280w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/gpt4v-response-1_hu11934258699623357176.jpg 320w, /blog/chatgpt-4v/gpt4v-response-1_hu17470745548782610268.jpg 640w, /blog/chatgpt-4v/gpt4v-response-1_hu5916357442673133113.jpg 768w, /blog/chatgpt-4v/gpt4v-response-1_hu12131936132744202971.jpg 1024w, /blog/chatgpt-4v/gpt4v-response-1_hu7837816758614270548.jpg 1280w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/gpt4v-response-1_hu17470745548782610268.jpg" width="1344" height="1678" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/gpt4v-response-2.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/gpt4v-response-2_hu7820556652383782095.webp 320w, /blog/chatgpt-4v/gpt4v-response-2_hu14422857634939357919.webp 640w, /blog/chatgpt-4v/gpt4v-response-2_hu1029427134533824135.webp 768w, /blog/chatgpt-4v/gpt4v-response-2_hu5141993740119188647.webp 1024w, /blog/chatgpt-4v/gpt4v-response-2_hu2918010002909475552.webp 1280w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/gpt4v-response-2_hu15853434267666265713.jpg 320w, /blog/chatgpt-4v/gpt4v-response-2_hu9795637946805182336.jpg 640w, /blog/chatgpt-4v/gpt4v-response-2_hu9375467552408289741.jpg 768w, /blog/chatgpt-4v/gpt4v-response-2_hu2426076898351911678.jpg 1024w, /blog/chatgpt-4v/gpt4v-response-2_hu4190904311379811329.jpg 1280w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/gpt4v-response-2_hu9795637946805182336.jpg" width="1300" height="872" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I was expecting &ldquo;maybe a little better than your grandma&rsquo;s OCR&rdquo; but this was shockingly far beyond that. Not only did 4V get almost everything correct from the Margie recipe, worn ribbon, wrinkles, stains and everything, but GPT-4V <em>understood</em> it and organized it for me. For example, 4V correctly &ldquo;gets it&rdquo; that this recipe had three main elements&mdash;crust, filling, and topping&mdash;when the recipe never uses any of those words! And then helpfully organizes its output that way.</p>
<p>With traditional OCR, at best I&rsquo;d get most of the words, in the order they appear on the page. But this recipe isn&rsquo;t plain text that reads left-to-right, top-to-bottom. Take for example the initial crust block that uses the typist&rsquo;s trick of using a column of &ldquo;)&rdquo; characters to create a column separator: ingredients in the left column, instructions in the right. OCR would just give me a useless left-to-right, top-to-bottom character stream; but GPT-4V <em>understood</em> what it was <em>seeing</em> and placed the directions below the ingredients in a structured manner. Holy shit.</p>
<h2 id="guys-guys-this-has-structure-im-seeing-structure">&ldquo;Guys? Guys? This has structure. I&rsquo;m [seeing] structure.&rdquo;</h2>
<p>I love the scene in the movie <a href="https://www.themoviedb.org/movie/686-contact?language=en-US">Contact</a> where Kent, the blind SETI researcher, says:</p>
<blockquote>
<p>Guys? Guys? Um&hellip;</p>
<p>You know those interlaced frames that we thought were noise?</p>
<p>This has structure. I&rsquo;m hearing structure.</p>
</blockquote>
<p>Seeing that chat response, it wasn&rsquo;t just that I was getting better text than old-school OCR. GPT-4V was giving me structure, without my even asking. No surprise that my next question was:</p>
<blockquote>
<p>Is there a standard interchange format for recipes?</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/chatgpt-4v/gpt4v-recipe-interchange.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/gpt4v-recipe-interchange_hu17188858694156920574.webp 320w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu4805393654138002232.webp 640w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu11708123446355579478.webp 768w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu17920696324595212768.webp 1024w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu5941996166184056797.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/gpt4v-recipe-interchange_hu4622890631911722766.jpg 320w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu15715365874639130583.jpg 640w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu8919419101555505764.jpg 768w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu948795385499872724.jpg 1024w, /blog/chatgpt-4v/gpt4v-recipe-interchange_hu13732436814575107566.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/chatgpt-4v/gpt4v-recipe-interchange_hu15715365874639130583.jpg" width="1366" height="1830" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Oh ho, I see Paprika on the list!</p>
<h2 id="dec-17th-image--chatgpt-4v--yaml--paprika-import">Dec. 17th: Image =&gt; ChatGPT-4V =&gt; YAML =&gt; Paprika import</h2>
<p>I explored the various file formats that Paprika could import. Most of these were specific to what other recipe apps could export, to enable migration onto Paprika. But Paprika also supports a more generalized import from YAML format, and provided a couple of helpful examples. That looked like my best option, and then began the work of convincing ChatGPT to take a recipe image, and instead of giving me semi-structured text output, to instead produce Paprika-flavored YAML. It took a bit of research and several tries, but eventually I was able to feed in an image and get Paprika-compatible recipe YAML back. Here&rsquo;s the source image and YAML output:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/bettys_chocolate_frosting.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/bettys_chocolate_frosting_hu10585170804514237028.webp 320w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu15502793002836284447.webp 640w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu5905893394835775600.webp 768w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu13025108189069174156.webp 1024w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu6086143490913081608.webp 1280w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu6699869919404810380.webp 1536w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu1337969588582208231.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/bettys_chocolate_frosting_hu11265838248815094737.jpg 320w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu2206731962296834554.jpg 640w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu12046467753848013813.jpg 768w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu6061312309494684480.jpg 1024w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu13936836270198928739.jpg 1280w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu8077584685425858389.jpg 1536w, /blog/chatgpt-4v/bettys_chocolate_frosting_hu7735239077874424698.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/bettys_chocolate_frosting_hu2206731962296834554.jpg" width="3035" height="1839" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/bettys-chocolate-yaml.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/bettys-chocolate-yaml_hu10398228031059511721.webp 320w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu9760123825910671190.webp 640w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu7790784088326561048.webp 768w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu447955277949061526.webp 1024w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu10312823426537327651.webp 1280w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/bettys-chocolate-yaml_hu12089166201922545487.jpg 320w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu1139989766366974351.jpg 640w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu2675409721239306869.jpg 768w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu15934483638056997665.jpg 1024w, /blog/chatgpt-4v/bettys-chocolate-yaml_hu2996650074188769915.jpg 1280w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/bettys-chocolate-yaml_hu1139989766366974351.jpg" width="1364" height="1876" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>And here&rsquo;s what it looks like when imported into Paprika, iPad and iPhone versions:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/bettys_ipad.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/bettys_ipad_hu17814604193795377354.webp 320w, /blog/chatgpt-4v/bettys_ipad_hu15663731503949232265.webp 640w, /blog/chatgpt-4v/bettys_ipad_hu13280849517290018236.webp 768w, /blog/chatgpt-4v/bettys_ipad_hu9209829327438426901.webp 1024w, /blog/chatgpt-4v/bettys_ipad_hu11481426653632584524.webp 1280w, /blog/chatgpt-4v/bettys_ipad_hu2800070832890143796.webp 1536w, /blog/chatgpt-4v/bettys_ipad_hu12721498587687507705.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/bettys_ipad_hu18153310009321711146.jpg 320w, /blog/chatgpt-4v/bettys_ipad_hu9269740142671357146.jpg 640w, /blog/chatgpt-4v/bettys_ipad_hu16434757253058565052.jpg 768w, /blog/chatgpt-4v/bettys_ipad_hu11689727783263301868.jpg 1024w, /blog/chatgpt-4v/bettys_ipad_hu3281318272032123961.jpg 1280w, /blog/chatgpt-4v/bettys_ipad_hu1876267302248703824.jpg 1536w, /blog/chatgpt-4v/bettys_ipad_hu13706790998113867742.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/bettys_ipad_hu9269740142671357146.jpg" width="2732" height="2048" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/bettys_iphone.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/bettys_iphone_hu5491666777415933551.webp 320w, /blog/chatgpt-4v/bettys_iphone_hu5281264969067018783.webp 640w, /blog/chatgpt-4v/bettys_iphone_hu9955430316789686674.webp 768w, /blog/chatgpt-4v/bettys_iphone_hu2223007692104826437.webp 1024w, /blog/chatgpt-4v/bettys_iphone_hu3570942785903010144.webp 1280w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/bettys_iphone_hu12311295946415178538.jpg 320w, /blog/chatgpt-4v/bettys_iphone_hu6404650407931085179.jpg 640w, /blog/chatgpt-4v/bettys_iphone_hu3632225293197017930.jpg 768w, /blog/chatgpt-4v/bettys_iphone_hu8263072168809311719.jpg 1024w, /blog/chatgpt-4v/bettys_iphone_hu15024612491035169258.jpg 1280w" sizes="37vw" />
    
      <img src="/blog/chatgpt-4v/bettys_iphone_hu6404650407931085179.jpg" width="1290" height="2796" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Now, ChatGPT was doing most of the work&mdash;image in, importable YAML out. That left me light years ahead of the mess I had been facing&mdash;laborious manual transcription or parsing garbled OCR output.</p>
<h2 id="late-december-automating-in-python">Late December: Automating in Python</h2>
<p>Despite the impressive gains compared with the time I would have spent manually transcribing or old-school OCRing, interactive-chatting my way through hundreds of recipes was going to be quite time-consuming. ChatGPT also has a tendency to &ldquo;lose the thread&rdquo; on long-running chats. Finally, though Paprika is capable of importing YAML files with an embedded BASE64 image, it was beyond ChatGPT&rsquo;s capabilities to produce that kind of YAML output. As a result, I had to first import the generated YAML into Paprika, then manually add photos.</p>
<p>So automating the process was looking attractive&mdash;eliminate interactive sessions in favor of directly scripting calls to the OpenAI API.</p>
<p>I picked Python as a logical choice to script in, figuring it&rsquo;d have libraries for anything needed, and because GPT-4 is very good at Python coding; I was not disappointed on either front. Unfortunately I didn&rsquo;t have much choice about which OpenAI API I&rsquo;d need to use. Back then&mdash;and still to this day&mdash;the only API that supports GPT-4 Vision is a feature-reduced Chat Completions API:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu15882490802161539730.webp 320w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu10721654832375788550.webp 640w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu4128818025204450334.webp 768w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu1773673776959314497.webp 1024w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu14234609924107334014.webp 1280w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu7969373950630739150.webp 1536w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu14492314928228110158.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu15951009948918186021.jpg 320w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu12017647492404093091.jpg 640w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu9558502848682198914.jpg 768w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu14949743004553110833.jpg 1024w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu673748847559667785.jpg 1280w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu16921130505552024947.jpg 1536w, /blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu17737080414758234193.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/gpt4v_no_assistants_for_you_one_year_hu12017647492404093091.jpg" width="3146" height="2620" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>This limited Chat Completions API available with Vision models is fine for simply automating something you&rsquo;ve been doing using the chat interface; but it&rsquo;s significantly less powerful than the full-strength Chat Completions API available for text input, let alone the new Assistants API. More on this later.</p>
<p>In any case, off I went scripting Chat Completions from Python:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/openai_call2.png"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/openai_call2_hu17776058786366705750.webp 320w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/openai_call2_hu14046100409993281684.jpg 320w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/openai_call2_hu1418874436302913382.jpg" width="636" height="259" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>A few days before Christmas I had Python successfully scripting images =&gt; Chat Completions API =&gt; YAML output, and soon after added a BASE64-encoded image to the YAML output. I also added directory processing, so the script would run through an entire directory of image files and produce YAML-with-image output for each recipe, in a single script run.</p>
<h2 id="early-january-from-yaml-import-to-json-cloud-sync">Early January: From YAML import to JSON cloud sync</h2>
<p>More than a few of our heirloom recipes had multiple images&mdash;for example the front and back of a recipe card&mdash;and while GPT-4 Vision handled multiple images perfectly, I never had any success getting Paprika to ingest more than one image from a YAML file.</p>
<p>In searching for a solution, I discovered a whole community of recipe hobbyists who loved the Paprika app and found ways to creatively use Paprika&rsquo;s cloud sync API to build useful tools like a recipe exchanger that synced across multiple Paprika accounts. Paprika&rsquo;s cloud sync is the native interface of the app itself, and so by definition supports all the app&rsquo;s capabilities, including multiple photos per recipe, so it was able address the apparent limitations of YAML image importing. Publishing direct-to-cloud also saved the manual YAML import step, another key win.</p>
<p>I dug in and by New Years day had cloud sync operating, and had multiple photos loading into Paprika soon after:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/two_image_recipe-1.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/two_image_recipe-1_hu11882124871314370146.webp 320w, /blog/chatgpt-4v/two_image_recipe-1_hu8121117160371068228.webp 640w, /blog/chatgpt-4v/two_image_recipe-1_hu1290063551959243587.webp 768w, /blog/chatgpt-4v/two_image_recipe-1_hu9838249062209489753.webp 1024w, /blog/chatgpt-4v/two_image_recipe-1_hu5853368695670802640.webp 1280w, /blog/chatgpt-4v/two_image_recipe-1_hu12406317863423190969.webp 1536w, /blog/chatgpt-4v/two_image_recipe-1_hu13611162893791902293.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/two_image_recipe-1_hu183885798918835907.jpg 320w, /blog/chatgpt-4v/two_image_recipe-1_hu5879700148561565150.jpg 640w, /blog/chatgpt-4v/two_image_recipe-1_hu8322279257440914706.jpg 768w, /blog/chatgpt-4v/two_image_recipe-1_hu17279701343230177870.jpg 1024w, /blog/chatgpt-4v/two_image_recipe-1_hu7545464921587590299.jpg 1280w, /blog/chatgpt-4v/two_image_recipe-1_hu12831442902266780593.jpg 1536w, /blog/chatgpt-4v/two_image_recipe-1_hu10921769172593994455.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/two_image_recipe-1_hu5879700148561565150.jpg" width="2732" height="2048" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="later-january-json-mode-to-overcome-structured-output-fragility">Later January: JSON Mode to overcome structured output fragility</h2>
<p>The Chat Completions API, paired with the <code>gpt-4-vision-preview</code> model, is wonderful in its multimodal-ness. Unfortunately, this pairing is significantly restricted compared to the same API paired with the latest <code>gpt-4-turbo-preview</code> model. The even-more-powerful Assistants API currently doesn&rsquo;t support image input at all.</p>
<p>What appears to have happened is this. OpenAI wanted to get the GPT-4 Vision model, announced on Sept. 25th, into the field as early as possible. But OpenAI likewise wanted to get the significantly updated GPT-4 Turbo model with corresponding Chat Completions API updates, along with the all-new Assistants API, into developers&rsquo; hands ASAP also, and did so at the <a href="https://openai.com/blog/new-models-and-developer-products-announced-at-devday">DevDay event on Nov. 6th</a>. But full integration of Vision into these updated and new APIs wasn&rsquo;t (and still isn&rsquo;t) ready. OpenAI&rsquo;s compromise solution is what we have at the moment.</p>
<p>Why do I care about the new capabilities launched at DevDay? My immediate problem is that the Chat Completions API with Vision isn&rsquo;t 100% reliable at producing structured output like YAML or JSON. It usually works, but sometimes doesn&rsquo;t, depending on the content fed to it. This leads to a constant prompt engineering cycle, with prompts constantly being tweaked to avoid output breakage.</p>
<p>At the <a href="https://openai.com/blog/new-models-and-developer-products-announced-at-devday">DevDay event on Nov. 6th</a>, OpenAI announced JSON Mode, where using the <code>response_format</code> parameter, you tell the model to &ldquo;constrain its output to generate a syntactically correct JSON object.&rdquo; That&rsquo;s exactly the solution I need to get higher reliability structured output and greatly reduce the need for constant prompt engineering.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/openai_devday.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/openai_devday_hu12766501540866101346.webp 320w, /blog/chatgpt-4v/openai_devday_hu13382524058929896630.webp 640w, /blog/chatgpt-4v/openai_devday_hu350188678082407157.webp 768w, /blog/chatgpt-4v/openai_devday_hu10223974739082650480.webp 1024w, /blog/chatgpt-4v/openai_devday_hu6139400490837514700.webp 1280w, /blog/chatgpt-4v/openai_devday_hu13709098433403053720.webp 1536w, /blog/chatgpt-4v/openai_devday_hu6354198542642477514.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/openai_devday_hu6281683363538548457.jpg 320w, /blog/chatgpt-4v/openai_devday_hu7185397666169404928.jpg 640w, /blog/chatgpt-4v/openai_devday_hu12661786450812599279.jpg 768w, /blog/chatgpt-4v/openai_devday_hu17155302339268388816.jpg 1024w, /blog/chatgpt-4v/openai_devday_hu9437497450233912088.jpg 1280w, /blog/chatgpt-4v/openai_devday_hu1101158178320509080.jpg 1536w, /blog/chatgpt-4v/openai_devday_hu9186518777025561724.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/openai_devday_hu7185397666169404928.jpg" width="7680" height="4320" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Longer term, I&rsquo;m convinced that the other new features announced on Nov. 6th, including Function Calling and Tools, will open up a whole new range of possibilities in my recipe ingestion pipeline. Check out Max Woolf&rsquo;s post <a href="https://minimaxir.com/2023/12/chatgpt-structured-data/">Pushing ChatGPT&rsquo;s Structured Data Support To Its Limits</a> to get a feel for what&rsquo;s possible with structured data, function calling, etc.</p>
<p>My interim solution is to use both models:</p>
<ul>
<li>Use the limited Chat Completions API paired with the <code>gpt-4-vision-preview</code> model to extract the recipe content</li>
<li>Feed that content (text!) into the more powerful pairing of Chat Completions API paired with the <code>gpt-4-turbo-preview</code> model new API so I can take advantage of JSON Mode</li>
</ul>
<p>I know, though, that I&rsquo;m discarding a tremendous store of context by bridging between models using only text. As soon as OpenAI fully integrates Vision into its updated and new APIs, I&rsquo;ll rid myself of this compromise and start looking at how I might apply function calling, tools, etc.</p>
<h2 id="enrichment">Enrichment</h2>
<p>You may have noticed that the final recipes showing up in Paprika have been significantly enriched. Take this before-and-after example <em>(click image to zoom)</em>:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/FillingChocolateandOrange.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/FillingChocolateandOrange_hu1135606224415526133.webp 320w, /blog/chatgpt-4v/FillingChocolateandOrange_hu1048531827874209694.webp 640w, /blog/chatgpt-4v/FillingChocolateandOrange_hu18147492608841977944.webp 768w, /blog/chatgpt-4v/FillingChocolateandOrange_hu7502064268760822102.webp 1024w, /blog/chatgpt-4v/FillingChocolateandOrange_hu7452723397064378825.webp 1280w, /blog/chatgpt-4v/FillingChocolateandOrange_hu10792394704428732783.webp 1536w, /blog/chatgpt-4v/FillingChocolateandOrange_hu12326243651435354332.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/FillingChocolateandOrange_hu16180851457326417506.jpg 320w, /blog/chatgpt-4v/FillingChocolateandOrange_hu15366238413802249815.jpg 640w, /blog/chatgpt-4v/FillingChocolateandOrange_hu13918253708528909710.jpg 768w, /blog/chatgpt-4v/FillingChocolateandOrange_hu11571303134994999368.jpg 1024w, /blog/chatgpt-4v/FillingChocolateandOrange_hu17220775863700112728.jpg 1280w, /blog/chatgpt-4v/FillingChocolateandOrange_hu5623801728779479322.jpg 1536w, /blog/chatgpt-4v/FillingChocolateandOrange_hu11565481079361639145.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/chatgpt-4v/FillingChocolateandOrange_hu15366238413802249815.jpg" width="4871" height="6271" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/soft-chocolate-filling.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/soft-chocolate-filling_hu14209501701693326918.webp 320w, /blog/chatgpt-4v/soft-chocolate-filling_hu11115638346827197959.webp 640w, /blog/chatgpt-4v/soft-chocolate-filling_hu6259334066437356647.webp 768w, /blog/chatgpt-4v/soft-chocolate-filling_hu10249430741601644403.webp 1024w, /blog/chatgpt-4v/soft-chocolate-filling_hu13532526303713278142.webp 1280w, /blog/chatgpt-4v/soft-chocolate-filling_hu8858625914263089646.webp 1536w, /blog/chatgpt-4v/soft-chocolate-filling_hu8096273106729964669.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/soft-chocolate-filling_hu3314654089564089838.jpg 320w, /blog/chatgpt-4v/soft-chocolate-filling_hu14367143100579490439.jpg 640w, /blog/chatgpt-4v/soft-chocolate-filling_hu12556566131621880425.jpg 768w, /blog/chatgpt-4v/soft-chocolate-filling_hu17036076726496936301.jpg 1024w, /blog/chatgpt-4v/soft-chocolate-filling_hu17991191649702549287.jpg 1280w, /blog/chatgpt-4v/soft-chocolate-filling_hu16815520044824635542.jpg 1536w, /blog/chatgpt-4v/soft-chocolate-filling_hu4254424004058090625.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/chatgpt-4v/soft-chocolate-filling_hu14367143100579490439.jpg" width="2210" height="1901" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/orange-cream-filling.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/orange-cream-filling_hu10357502589317373351.webp 320w, /blog/chatgpt-4v/orange-cream-filling_hu16591004278299499727.webp 640w, /blog/chatgpt-4v/orange-cream-filling_hu4223801285236496313.webp 768w, /blog/chatgpt-4v/orange-cream-filling_hu13604439386319108003.webp 1024w, /blog/chatgpt-4v/orange-cream-filling_hu5863233342576758961.webp 1280w, /blog/chatgpt-4v/orange-cream-filling_hu1632300316210644963.webp 1536w, /blog/chatgpt-4v/orange-cream-filling_hu6984953949063785716.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/orange-cream-filling_hu6510382001350267577.jpg 320w, /blog/chatgpt-4v/orange-cream-filling_hu9094337591104092270.jpg 640w, /blog/chatgpt-4v/orange-cream-filling_hu4156767426946955476.jpg 768w, /blog/chatgpt-4v/orange-cream-filling_hu15493604532561016092.jpg 1024w, /blog/chatgpt-4v/orange-cream-filling_hu14494924081569692842.jpg 1280w, /blog/chatgpt-4v/orange-cream-filling_hu8959195112836746813.jpg 1536w, /blog/chatgpt-4v/orange-cream-filling_hu7340757186088176009.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/chatgpt-4v/orange-cream-filling_hu9094337591104092270.jpg" width="2209" height="1902" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>This a <em>tour de force</em> of GPT-4V&rsquo;s content extraction: it correctly parses both typewritten and handwritten content, and likewise recognizes that these are two separate recipes. I end up with JSON content ready to feed into Paprika.</p>
<p>But look closer&mdash;the original image doesn&rsquo;t have any directions&mdash;how did that get into Paprika? And what&rsquo;s this Description section? And those notes? That&rsquo;s enrichment in action.</p>
<h3 id="whimsical-enrichment">Whimsical enrichment</h3>
<p>If you&rsquo;ve spent time with ChatGPT, you know that it loves to be creative, to cheerfully, energetically overdeliver and over-explain. Early in my process here, back when I was doing everything through the chat interface, I decided to let the GPT use its imagination in the Notes section:</p>
<blockquote>
<p>Within the notes section of this recipe, please add a paragraph &ldquo;Recipe History:&rdquo; and invent a mythical history of the origin of the recipe, inventing family members like great aunt Dora. Regenerate the recipe yaml with this added.</p>
</blockquote>
<p>The GPT came back with:</p>
<blockquote>
<p>This cherished recipe dates back to the early 20th century and was a specialty of Great Aunt Dora, a renowned baker in her small town. Legend has it that Dora won the heart of her town with this cake at the annual winter fair. She ingeniously added crushed peppermint candies from her childhood candy jar, which became her secret signature. The recipe was passed down with love through generations, each adding their touch but always keeping Dora’s spirited invention alive.</p>
</blockquote>
<p>I provided some real historical data to help ChatGPT create better stories</p>
<blockquote>
<p>Our family has strong Irish and Scottish roots so as you do history on recipes, factor that in as you do histories. Family names include mcguire, clark, stewart. No need to redo the above.</p>
</blockquote>
<p>Before long I was getting back pretty entertaining results</p>
<blockquote>
<p>The recipe is believed to have been created by Seamus&rsquo;s great-aunt, Eilidh McGuire Stewart, who was known in her village for her bountiful kitchen and her generous heart. Eilidh often baked this cake during the harvest season, and it became synonymous with the warmth of her home. Legend has it that Robert Burns himself enjoyed a slice of Eilidh’s cake during a visit, praising its rich flavor and the tender hands that made it.</p>
</blockquote>
<p>Alas, the whimsical enrichment got old after a while and I ended up removing it from my instructions. But the idea that ChatGPT could enrich the recipes stuck with me and has been a focus my most recent work.</p>
<h3 id="useful-enrichment">Useful enrichment</h3>
<p>I&rsquo;m currently focused on practical, useful enrichments only. So far here&rsquo;s what seems to be working:</p>
<h4 id="category-assignment">Category assignment</h4>
<p>This is a slam-dunk win. Categories are a feature I never got around to using in Paprika, and GPT-4 is quite good at picking them.</p>
<h4 id="instructions">Instructions</h4>
<p>I actually don&rsquo;t prompt GPT-4 to create these&mdash;in fact I prompt significantly for it not to add content unless instructed&mdash;but it decided on its own, correctly, that this would be a useful addition in the filling recipes above. I haven&rsquo;t tried the instructions out yet, but superficially they appear plausible and this should be well within GPT-4&rsquo;s capabilities.</p>
<h4 id="description">Description</h4>
<p>Here I&rsquo;m prompting for a brief essence-of-the-recipe summary, another strong GPT-4 skill. I&rsquo;m still working to avoid hyperbole that creeps in sometimes.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/bread_and_butter_bernice_paprika.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu14102780479889638117.webp 320w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu15781751822286419620.webp 640w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu10517701786158460628.webp 768w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu6476236516766743497.webp 1024w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu4662566679641554751.webp 1280w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu15205761833379035858.webp 1536w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu1638146305607300430.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu9290375437805783036.jpg 320w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu13944048483993058974.jpg 640w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu16913420088220871774.jpg 768w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu7614361663188253388.jpg 1024w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu17989556011578912547.jpg 1280w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu5937193905230182692.jpg 1536w, /blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu2791575676453171425.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/bread_and_butter_bernice_paprika_hu13944048483993058974.jpg" width="2190" height="1459" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h4 id="recipe-tips">Recipe Tips</h4>
<p>This gives GPT-4 a chance to provide helpful tips, and a lot of them do seem to be useful.</p>
<h4 id="variations-to-try">Variations to Try</h4>
<p>GPT-4 has, what, 10 million recipes in its training data? 100 million? It&rsquo;s pretty good at suggesting interesting variations. And none of the horrifying recipe mistakes that we used to see in GPT-3 days.</p>
<h4 id="noted-in-the-pics">Noted in the Pics</h4>
<p>In my first processing pass using the <code>gpt-4-vision-preview</code> model, besides extracting the core recipe data, I ask for a description of the physical properties of the recipe based on the images provided.  Then in the second pass with the <code>gpt-4-turbo-preview</code> model, I ask GPT-4 to comment on notable physical aspects. This isn&rsquo;t working well yet, and I&rsquo;m sure the fact that I&rsquo;m forced to use a text-only bridge between the Vision and Turbo models is reducing the value of this enrichment.</p>
<h2 id="prompt-engineering">Prompt engineering</h2>
<p>Oh, the prompting I have done. This project, which still supports both YAML and JSON output, contains a total of 4 active and 7 inactive prompts. Common categories of prompt engineering for this project:</p>
<ul>
<li><strong>Structured output</strong>: Before JSON Mode, I did a lot of prompting to ensure the output was valid YAML or JSON.</li>
<li><strong>Shut up and stop making things up</strong>: ChatGPT just loves to be helpful and creative. I&rsquo;m ok with that, carefully controlled, where enrichment is needed, but without lots of guidance, I was losing the original recipe content, and instead getting made-up facts, &ldquo;family&rdquo; and &ldquo;heirloom&rdquo; seeming to trigger the GPT into fantasy.</li>
<li><strong>Plain Old Prompt Engineering (POPE)</strong>: A massive number of test-then-tweak-prompt iterations, just fine-tuning how I phrase what I want, tuning for better results.</li>
</ul>
<p>All of this testing came at a cost&mdash;the tall green bars show days where I was actively testing, with daily API charges approaching $4:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/chatgpt-4v/openai_usage_dec.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/openai_usage_dec_hu15719067466612050182.webp 320w, /blog/chatgpt-4v/openai_usage_dec_hu7773980677603946589.webp 640w, /blog/chatgpt-4v/openai_usage_dec_hu3461010372555149461.webp 768w, /blog/chatgpt-4v/openai_usage_dec_hu12028383483769387323.webp 1024w, /blog/chatgpt-4v/openai_usage_dec_hu6147436782410080751.webp 1280w, /blog/chatgpt-4v/openai_usage_dec_hu14193716561671400249.webp 1536w, /blog/chatgpt-4v/openai_usage_dec_hu17645349829675960000.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/openai_usage_dec_hu14459465371865699379.jpg 320w, /blog/chatgpt-4v/openai_usage_dec_hu7845731164930429715.jpg 640w, /blog/chatgpt-4v/openai_usage_dec_hu14488015524316505410.jpg 768w, /blog/chatgpt-4v/openai_usage_dec_hu1023667119713740044.jpg 1024w, /blog/chatgpt-4v/openai_usage_dec_hu12385408965484912780.jpg 1280w, /blog/chatgpt-4v/openai_usage_dec_hu18095192537714237798.jpg 1536w, /blog/chatgpt-4v/openai_usage_dec_hu10960934333197896797.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/chatgpt-4v/openai_usage_dec_hu7845731164930429715.jpg" width="4631" height="2976" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="in-summary">In summary</h2>
<p>In the meantime, I&rsquo;ve got a great way to preserving our heirloom family recipes while enjoying the benefits of a modern recipe app.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/chatgpt-4v/paprika-fig-pudding.webp"><picture>
    <source type="image/webp" srcset="/blog/chatgpt-4v/paprika-fig-pudding_hu10714578321388823846.webp 320w, /blog/chatgpt-4v/paprika-fig-pudding_hu1625023418147848705.webp 640w, /blog/chatgpt-4v/paprika-fig-pudding_hu16198590883675365525.webp 768w, /blog/chatgpt-4v/paprika-fig-pudding_hu8656692748263174679.webp 1024w, /blog/chatgpt-4v/paprika-fig-pudding_hu3240356453231205740.webp 1280w, /blog/chatgpt-4v/paprika-fig-pudding_hu3021038763379217523.webp 1536w, /blog/chatgpt-4v/paprika-fig-pudding_hu4750634130315849338.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/chatgpt-4v/paprika-fig-pudding_hu17283436719745303983.jpg 320w, /blog/chatgpt-4v/paprika-fig-pudding_hu9830434463667275459.jpg 640w, /blog/chatgpt-4v/paprika-fig-pudding_hu13215616775970877962.jpg 768w, /blog/chatgpt-4v/paprika-fig-pudding_hu6677398384545907484.jpg 1024w, /blog/chatgpt-4v/paprika-fig-pudding_hu7290697334882108118.jpg 1280w, /blog/chatgpt-4v/paprika-fig-pudding_hu660091914245042320.jpg 1536w, /blog/chatgpt-4v/paprika-fig-pudding_hu820666778252865336.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/chatgpt-4v/paprika-fig-pudding_hu9830434463667275459.jpg" width="2216" height="1614" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Gruber Responds to Gurman&#39;s Report of AI Anxiety at Apple</title>
      <link>https://craftycto.com/quote/gruber-ai-anxiety-at-apple/</link>
      <pubDate>Tue, 24 Oct 2023 19:18:34 -0500</pubDate>
      
      <guid>https://craftycto.com/quote/gruber-ai-anxiety-at-apple/</guid>
      <description>What I have heard from little birdies in Cupertino is not that there was a miss on this already .... The anxiety inside Apple is that many people inside do not believe Apple’s own AI/ML team can deliver, and that the company — if only for privacy reasons — is only going to use what comes from their own AI/ML team.</description>
      <content:encoded><![CDATA[<p>In my July essay <a href="/blog/an-appllama-week/#my-take-on-apple-in-llmgpt-land">An Appllama Week in AI</a>, I mentioned that Apple &ldquo;might get pinched&rdquo; because they move much slower than the AI space is moving.</p>
<p>In a <a href="https://www.bloomberg.com/news/newsletters/2023-10-22/what-is-apple-doing-in-ai-revamping-siri-search-apple-music-and-other-apps-lo1ffr7p">recent Power On newsletter</a>, Mark Gurman recently quoted &ldquo;a person with knowledge of the matter&rdquo; about internal anxiety at Apple regarding the generative AI space:</p>
<blockquote>
<p>There’s a lot of anxiety about this and it’s considered a pretty big miss internally</p>
</blockquote>
<p>Gruber&rsquo;s take, especially given his access to birdie friends, rings true to me. Back in July, I <a href="/blog/an-appllama-week/#intersection-apple-llm-chatter-on-hacker-news">quoted several comments on Hacker News</a> that gave the same impression, this one in particular:</p>
<blockquote>
<p>I work in the field and [Apple] just are not hiring the people they need to be hiring.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Ballad of Bull Cook, A Wacky Book</title>
      <link>https://craftycto.com/blog/ballad-of-bull-cook/</link>
      <pubDate>Tue, 17 Oct 2023 08:41:35 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/ballad-of-bull-cook/</guid>
      <description>George Leonard Herter&amp;#39;s &amp;#34;Bull Cook and Authentic Historical Recipes and Practices&amp;#34; and what it tells us about copyright and a new (to me) flavor of Amazon scam.</description>
      <content:encoded><![CDATA[<p>I was fortunate to be able to spend three weeks at the family lake house in northwestern Michigan in August. My father passed away in 2009, but his imprint is still palpable there on the lake&mdash;nowhere more strongly than on the bookshelves.</p>
<p>My son John and his wife Julie were able to join us for one of our weeks. John&rsquo;s an amazing, intuitive, creative cook. He&rsquo;s also strongly attracted to Old Things, so, for example, he snagged and regularly wears most of my father&rsquo;s outerwear including an enormous &rsquo;70s-era Eddie Bauer winter parka and a tired out, ugly-as-sin L.L. Bean fleece.</p>
<p>At the intersection of cooking and Old Things, John has an unsurprising fascination with legacy recipes, such as (grandfather) Papa Tom&rsquo;s Peach Cobbler, which he&rsquo;s tweaked to a state of perfection. He likewise loves heirloom kitchen gear, and again has snagged a number of family classics, some dating back to almost to WW2, including Papa Tom&rsquo;s biscuit cutter and (great grandmother) Ma&rsquo;s classic heavy roasting pot.</p>
<h2 id="a-book-encounter">A Book Encounter</h2>
<p>While browsing the lake house bookshelves, John stumbled across <a href="https://archive.org/details/bullcookauthenti00hertrich/page/n5/mode/2up">Bull Cook and Authentic Historical Recipes and Practices</a> and was immediately hooked. And if you&rsquo;re a creative cook who&rsquo;s into Old Things, what&rsquo;s not to love&mdash;it&rsquo;s an insane collection of historical recipes and random factoids, itself written back in prehistoric 1960, with many recipes dating centuries further back. I can recall my father&rsquo;s enthusiasm for the book, along with its author <a href="https://en.wikipedia.org/wiki/George_Leonard_Herter">George Leonard Herter</a> and his catalog business <a href="https://www.startribune.com/herter-s-catalog-is-long-gone-but-not-forgotten/291167741/">Herter&rsquo;s</a>.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/glherter_headshot.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/glherter_headshot_hu16242313768604452423.webp 320w, /blog/ballad-of-bull-cook/glherter_headshot_hu2413488886404782045.webp 640w, /blog/ballad-of-bull-cook/glherter_headshot_hu14468672919967813404.webp 768w, /blog/ballad-of-bull-cook/glherter_headshot_hu8435451973360600441.webp 1024w, /blog/ballad-of-bull-cook/glherter_headshot_hu17651868194933130393.webp 1280w, /blog/ballad-of-bull-cook/glherter_headshot_hu16056525604994798561.webp 1536w, /blog/ballad-of-bull-cook/glherter_headshot_hu9403627685822874716.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/glherter_headshot_hu8112857591904645580.jpg 320w, /blog/ballad-of-bull-cook/glherter_headshot_hu6697954223144041243.jpg 640w, /blog/ballad-of-bull-cook/glherter_headshot_hu14880237737126064692.jpg 768w, /blog/ballad-of-bull-cook/glherter_headshot_hu9349141358886906153.jpg 1024w, /blog/ballad-of-bull-cook/glherter_headshot_hu17116307354113202098.jpg 1280w, /blog/ballad-of-bull-cook/glherter_headshot_hu4811097782780701497.jpg 1536w, /blog/ballad-of-bull-cook/glherter_headshot_hu14174568921839501291.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/ballad-of-bull-cook/glherter_headshot_hu6697954223144041243.jpg" width="2048" height="2126" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/herters-catalog-1950.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/herters-catalog-1950_hu13863662602473739124.webp 320w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu522800985107944182.webp 640w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu15121185979884874657.webp 768w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu11729851442977230221.webp 1024w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu11756263194300094161.webp 1280w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu6416348682076740754.webp 1536w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu7102726179520806384.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/herters-catalog-1950_hu14033199435547480163.jpg 320w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu7054173175099441091.jpg 640w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu4769804121232337595.jpg 768w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu11251578014208221304.jpg 1024w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu15068278677939553340.jpg 1280w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu6888126050019532472.jpg 1536w, /blog/ballad-of-bull-cook/herters-catalog-1950_hu14125369034356764549.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/ballad-of-bull-cook/herters-catalog-1950_hu7054173175099441091.jpg" width="3072" height="3362" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/herters_store_polar_bear.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/herters_store_polar_bear_hu3172342477812028401.webp 320w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu6017821688331657781.webp 640w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu14684191566524283234.webp 768w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu11236622401354126593.webp 1024w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu1274780943100245627.webp 1280w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu1912142788569692432.webp 1536w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu17757733548795664890.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/herters_store_polar_bear_hu14051724197978406763.jpg 320w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu3522296694855867268.jpg 640w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu3271362805121895887.jpg 768w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu11814322935821721699.jpg 1024w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu2981400927196572862.jpg 1280w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu3105515597597511210.jpg 1536w, /blog/ballad-of-bull-cook/herters_store_polar_bear_hu2721042834677654734.jpg 1920w" sizes="25vw" />
    
      <img src="/blog/ballad-of-bull-cook/herters_store_polar_bear_hu3522296694855867268.jpg" width="3072" height="2376" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>As John paged through the physical <em>Bull Cook</em>, I opened my iPad to follow along online, confident I&rsquo;d quickly locate some free PDF version online, because <em>Bull Cook</em> was 73 years past its first edition date, and moreover wasn&rsquo;t a &ldquo;real&rdquo; book anyway, but rather was self-published by Herter. As you might suspect from its unique cover:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/bull_cook_cover.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/bull_cook_cover_hu10471176949832704768.webp 320w, /blog/ballad-of-bull-cook/bull_cook_cover_hu8089162562070868394.webp 640w, /blog/ballad-of-bull-cook/bull_cook_cover_hu2643367249138070563.webp 768w, /blog/ballad-of-bull-cook/bull_cook_cover_hu12116958483454267091.webp 1024w, /blog/ballad-of-bull-cook/bull_cook_cover_hu768779812624634462.webp 1280w, /blog/ballad-of-bull-cook/bull_cook_cover_hu9688933800556574182.webp 1536w, /blog/ballad-of-bull-cook/bull_cook_cover_hu10075453347399637373.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/bull_cook_cover_hu8606609893155958437.jpg 320w, /blog/ballad-of-bull-cook/bull_cook_cover_hu7186892405484201741.jpg 640w, /blog/ballad-of-bull-cook/bull_cook_cover_hu18001879155901571584.jpg 768w, /blog/ballad-of-bull-cook/bull_cook_cover_hu2860559771452891659.jpg 1024w, /blog/ballad-of-bull-cook/bull_cook_cover_hu6306130051201774631.jpg 1280w, /blog/ballad-of-bull-cook/bull_cook_cover_hu1210768090565802662.jpg 1536w, /blog/ballad-of-bull-cook/bull_cook_cover_hu11025029451817720138.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/ballad-of-bull-cook/bull_cook_cover_hu7186892405484201741.jpg" width="2048" height="2975" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Surprise! I did not quickly locate <em>Bull Cook</em> online. Eventually, thanks to the Internet Archive&rsquo;s Open Library, I was able to read the book online, in an awkward web UI, by checking out the one available virtual copy, one hour at a time.</p>
<p>I began pulling on the thread of <em>Bull Cook</em> and its strange unavailability; much unravelling ensued.</p>
<h2 id="herters-the-business">Herter&rsquo;s, The Business</h2>
<p>In 1937, George Herter launched his disruptive startup&mdash;a mail-order outdoor-sports business&mdash;in the spare rooms over his father&rsquo;s Waseca, Minnesota dry goods store. Disruptive? Well, yes. Sears had pioneered the mail-order catalog business almost 40 years earlier, but Herter had the insight that the same concept might work in a much smaller niche market that was, at the time, served by mom-and-pop storefronts. In 1937, mail order was as innovative and disruptive as e-commerce in 1999. So, yes, a disruptive startup it was.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/herters_factory_warehouse.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/herters_factory_warehouse_hu13858702156865943885.webp 320w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu13227724043373538847.webp 640w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu4581459352924761237.webp 768w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu17870383411995513668.webp 1024w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu3975886749811135169.webp 1280w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu5688730652153107644.webp 1536w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu5859915027195421981.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/herters_factory_warehouse_hu11421258281875138178.jpg 320w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu14189549883521269018.jpg 640w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu7350693030713917394.jpg 768w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu12361801151404282951.jpg 1024w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu17889784000597764969.jpg 1280w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu11920624331805834731.jpg 1536w, /blog/ballad-of-bull-cook/herters_factory_warehouse_hu3354570143190475507.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/herters_factory_warehouse_hu14189549883521269018.jpg" width="3072" height="2098" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Over the following 40+ years, Herter&rsquo;s came to dominate its fishing-hunting-outdoor niche, first with mail order, and later, outlet stores; the same space and strategy that today is the domain of Cabela&rsquo;s and its parent Bass Pro Shops.</p>
<p>Herter&rsquo;s and Cabela&rsquo;s overlapped by 20-odd years, with Cabela&rsquo;s starting up in 1961, and Herter&rsquo;s filing for bankruptcy in 1981. Herter&rsquo;s assets ended up with Cabela&rsquo;s through the liquidation process.</p>
<h2 id="self-publishing">Self-Publishing</h2>
<p>Pre-internet, every successful mail order business was also a publishing business, because&mdash;catalogs. At its peak, for example, Sears printed 315 million copies of its main catalog every year, along with millions of additional copies of specialty catalogs such as its Christmas &ldquo;Wish Book.&rdquo; That&rsquo;s the book sales equivalent of 20 blockbusters, or 1,500 average bestsellers, according to my research assistant GPT-4.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/herters-catalog.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/herters-catalog_hu4187167742021816870.webp 320w, /blog/ballad-of-bull-cook/herters-catalog_hu15561888604972549652.webp 640w, /blog/ballad-of-bull-cook/herters-catalog_hu18171937839282818700.webp 768w, /blog/ballad-of-bull-cook/herters-catalog_hu15834155745427997364.webp 1024w, /blog/ballad-of-bull-cook/herters-catalog_hu6311422375778921707.webp 1280w, /blog/ballad-of-bull-cook/herters-catalog_hu16795868546455177203.webp 1536w, /blog/ballad-of-bull-cook/herters-catalog_hu18117774512053059849.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/herters-catalog_hu1654329959736913326.jpg 320w, /blog/ballad-of-bull-cook/herters-catalog_hu17480018607862886970.jpg 640w, /blog/ballad-of-bull-cook/herters-catalog_hu2629775802367787780.jpg 768w, /blog/ballad-of-bull-cook/herters-catalog_hu3517633712700216180.jpg 1024w, /blog/ballad-of-bull-cook/herters-catalog_hu15440360900631844308.jpg 1280w, /blog/ballad-of-bull-cook/herters-catalog_hu895235602846118339.jpg 1536w, /blog/ballad-of-bull-cook/herters-catalog_hu4348878583343099534.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/ballad-of-bull-cook/herters-catalog_hu17480018607862886970.jpg" width="2048" height="2685" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Herter&rsquo;s was smaller, but still a significant publisher, with regular printing runs of 400K to 500K copies for the often 600+ page <a href="">Herter&rsquo;s Catalog</a>&mdash;equivalent to a couple of juicy bestsellers annually. In fact, according to Paul Collins&rsquo; 2008 New York Times article <a href="https://www.nytimes.com/2008/12/07/books/review/Collins-t.html">The Oddball Know-It-All</a>, Herter&rsquo;s catalog printer Brown Printing, also located in Waseca, MN, grew with Herter&rsquo;s to become &ldquo;one of the country’s largest commercial printers.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/brown_printing.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/brown_printing_hu706422552038305918.webp 320w, /blog/ballad-of-bull-cook/brown_printing_hu13145048473939902204.webp 640w, /blog/ballad-of-bull-cook/brown_printing_hu5863082438134359148.webp 768w, /blog/ballad-of-bull-cook/brown_printing_hu1192437778464643120.webp 1024w, /blog/ballad-of-bull-cook/brown_printing_hu10750358983020738545.webp 1280w, /blog/ballad-of-bull-cook/brown_printing_hu9400049760897254456.webp 1536w, /blog/ballad-of-bull-cook/brown_printing_hu15481001108084281782.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/brown_printing_hu9002835917476579888.jpg 320w, /blog/ballad-of-bull-cook/brown_printing_hu5550218347725784307.jpg 640w, /blog/ballad-of-bull-cook/brown_printing_hu16922342544785375939.jpg 768w, /blog/ballad-of-bull-cook/brown_printing_hu4736313570450740892.jpg 1024w, /blog/ballad-of-bull-cook/brown_printing_hu5563656621124816658.jpg 1280w, /blog/ballad-of-bull-cook/brown_printing_hu11680940966022380123.jpg 1536w, /blog/ballad-of-bull-cook/brown_printing_hu13726729751837715301.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/brown_printing_hu5550218347725784307.jpg" width="3072" height="986" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>All this to say: self-publishing <em>Bull Cook</em> wasn&rsquo;t any kind of an obstacle for George Herter.</p>
<h2 id="whats-a-bull-cook">What&rsquo;s a Bull Cook?</h2>
<p>To be honest, I was confused by the book&rsquo;s title, partly because I was unfamiliar with the term &ldquo;Bull Cook&rdquo;&mdash;I thought it might be a person&mdash;and partly because, even with an understanding of what a bull cook is, the title still doesn&rsquo;t exactly make sense. Paul Collins describes Herter&rsquo;s writing has as having <a href="https://www.nytimes.com/2008/12/07/books/review/Collins-t.html">&ldquo;the artless charm of a confused book report&rdquo;</a> and that confused thinking seems to have found its way into <em>Bull Cook</em>&rsquo;s title as well.</p>
<p>I eventually got around to asking my preferred search companion <a href="https://kagi.com">Kagi</a> &ldquo;What&rsquo;s a bull cook?&rdquo; and got an immediate answer. Bull cook is a logging term&mdash;makes sense given Herter&rsquo;s Minnesota roots&mdash;and it means, <a href="https://www.merriam-webster.com/dictionary/bull%20cook">according to Merriam Webster</a>:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h3 id="bull-cook-noun">bull cook <em>(noun)</em></h3>
<p>: a handyman in a camp (as of loggers)</p>
<p><em><strong>especially</strong></em> : one who does caretaking chores and acts as cook&rsquo;s helper</p>
<h4 id="etymology">Etymology</h4>
<p>so called from his job of caring for oxen once used in logging camps</p>

</div>

<p>One of the gentlemen below is supposedly a bull cook. My money&rsquo;s on washtub left or washtub right.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/logging_camp_2.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/logging_camp_2_hu9760177222627369549.webp 320w, /blog/ballad-of-bull-cook/logging_camp_2_hu17270847928835910673.webp 640w, /blog/ballad-of-bull-cook/logging_camp_2_hu6966852771599204570.webp 768w, /blog/ballad-of-bull-cook/logging_camp_2_hu7209838084213038745.webp 1024w, /blog/ballad-of-bull-cook/logging_camp_2_hu10235463218952557760.webp 1280w, /blog/ballad-of-bull-cook/logging_camp_2_hu5479238322775190802.webp 1536w, /blog/ballad-of-bull-cook/logging_camp_2_hu13593938494598012780.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/logging_camp_2_hu13444557620139227474.jpg 320w, /blog/ballad-of-bull-cook/logging_camp_2_hu8473560306872840114.jpg 640w, /blog/ballad-of-bull-cook/logging_camp_2_hu15521543530950087280.jpg 768w, /blog/ballad-of-bull-cook/logging_camp_2_hu8186936975447094391.jpg 1024w, /blog/ballad-of-bull-cook/logging_camp_2_hu8389029914270695537.jpg 1280w, /blog/ballad-of-bull-cook/logging_camp_2_hu15112139527209679435.jpg 1536w, /blog/ballad-of-bull-cook/logging_camp_2_hu14646067888877989051.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/logging_camp_2_hu8473560306872840114.jpg" width="3072" height="1938" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="wacky-author-wacky-subject-matter-good-recipes">Wacky Author, Wacky Subject Matter, Good Recipes</h2>
<p>I&rsquo;ll follow <a href="https://archive.li/Qi9XR">Paul Collins&rsquo; lead</a> and quote from the third paragraph to give you a feel for <em>Bull Cook</em>&rsquo;s subject matter:</p>
<blockquote>
<p>For your convenience, I will start with meats, fish, eggs, soup and sauces, sandwiches, vegetables, the art of French frying, desserts, how to dress game, how to properly sharpen a knife, how to make wines and beer, what to do in case of hydrogen or cobalt bomb attack. Keeping as much in alphabetical order as possible.</p>
</blockquote>
<p>Nothing like mixing in a little nuclear attack drama to spice up the intro page. You can jump to <a href="https://archive.org/details/bullcookauthenti00hertrich/page/206/mode/2up?q=cobalt">page 206</a> for that advice around hydrogen or cobalt bomb attacks&mdash;presented in the context of preserving tomatoes. Herter&rsquo;s range is demonstrated in a random selection of pages: 42 (How to Prepare Javelina) and 223 (Fisherman&rsquo;s Wharf French bread).</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/bull_cook_p42.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/bull_cook_p42_hu16738015513433143253.webp 320w, /blog/ballad-of-bull-cook/bull_cook_p42_hu7660277086070893747.webp 640w, /blog/ballad-of-bull-cook/bull_cook_p42_hu978362567631679388.webp 768w, /blog/ballad-of-bull-cook/bull_cook_p42_hu12033878417608678694.webp 1024w, /blog/ballad-of-bull-cook/bull_cook_p42_hu16391467814204866320.webp 1280w, /blog/ballad-of-bull-cook/bull_cook_p42_hu3356125993922323968.webp 1536w, /blog/ballad-of-bull-cook/bull_cook_p42_hu5941097119755066381.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/bull_cook_p42_hu2060585889854498075.jpg 320w, /blog/ballad-of-bull-cook/bull_cook_p42_hu17745115012625767021.jpg 640w, /blog/ballad-of-bull-cook/bull_cook_p42_hu1951245584144215825.jpg 768w, /blog/ballad-of-bull-cook/bull_cook_p42_hu3112394335762284914.jpg 1024w, /blog/ballad-of-bull-cook/bull_cook_p42_hu327810657605511319.jpg 1280w, /blog/ballad-of-bull-cook/bull_cook_p42_hu9913823606300800461.jpg 1536w, /blog/ballad-of-bull-cook/bull_cook_p42_hu16083120601959534941.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/ballad-of-bull-cook/bull_cook_p42_hu17745115012625767021.jpg" width="3072" height="4778" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/bull_cook_p223.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/bull_cook_p223_hu8994984573584342140.webp 320w, /blog/ballad-of-bull-cook/bull_cook_p223_hu6481387168654312355.webp 640w, /blog/ballad-of-bull-cook/bull_cook_p223_hu6150968674028693249.webp 768w, /blog/ballad-of-bull-cook/bull_cook_p223_hu7720907275001120975.webp 1024w, /blog/ballad-of-bull-cook/bull_cook_p223_hu17242845517441776863.webp 1280w, /blog/ballad-of-bull-cook/bull_cook_p223_hu13277541822203943189.webp 1536w, /blog/ballad-of-bull-cook/bull_cook_p223_hu17118953219411245679.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/bull_cook_p223_hu16158994538504684579.jpg 320w, /blog/ballad-of-bull-cook/bull_cook_p223_hu15398161018531556669.jpg 640w, /blog/ballad-of-bull-cook/bull_cook_p223_hu10690456625532462359.jpg 768w, /blog/ballad-of-bull-cook/bull_cook_p223_hu12832250433991037641.jpg 1024w, /blog/ballad-of-bull-cook/bull_cook_p223_hu2828339646088705704.jpg 1280w, /blog/ballad-of-bull-cook/bull_cook_p223_hu6333360906918746531.jpg 1536w, /blog/ballad-of-bull-cook/bull_cook_p223_hu2925609606495523883.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/ballad-of-bull-cook/bull_cook_p223_hu15398161018531556669.jpg" width="3396" height="5250" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The book&rsquo;s very first recipe explains how to properly &ldquo;corn&rdquo; meats as in corned beef, and here Herter displays his gift of bombast:</p>
<blockquote>
<p>Although some cook books and food editors of magazines from time to time publish recipes for corning meat these recipes are not even close to the real one. This is the first time the real authentic recipe for corning meat has ever been published.</p>
</blockquote>
<p>One commenter <a href="https://www.trapshooters.com/threads/whatever-happened-to-herters.64650/#nested_reply_top_post">quipped</a> of the voluminous Herter&rsquo;s catalogs that &ldquo;if all the BS was out of them they&rsquo;d only be a half dozen pages long,&rdquo; and the same perhaps might be said of <em>Bull Cook</em>. But the recipes are apparently real and good according to those that have made them; I saw nothing ingredient- or procedure-wise that would make me feel otherwise.</p>
<h2 id="copyright-status-murky">Copyright Status: Murky</h2>
<p>So Herter&rsquo;s died as a business in 1981; George Leonard Herter as a human in 1994; so why are <em>Bull Cook</em> and the rest of George Leonard&rsquo;s writings not living on in the public domain? Who in the world would care?</p>
<p>Below is the copyright page of the 12th edition; it&rsquo;s clearly in George and wife Berthe&rsquo;s name, as opposed to copyrighted by the business.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/bull_cook_copyright.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/bull_cook_copyright_hu13058030150731319944.webp 320w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu9821398970387986867.webp 640w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu2038731194320678345.webp 768w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu8944846589085278304.webp 1024w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu9843122213618395303.webp 1280w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu13938304800806604979.webp 1536w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu11362801086502295691.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/bull_cook_copyright_hu16698266822044802229.jpg 320w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu10031043508170726133.jpg 640w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu16432378386051107391.jpg 768w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu1653884828405508345.jpg 1024w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu1580099848419094893.jpg 1280w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu9364085368075307364.jpg 1536w, /blog/ballad-of-bull-cook/bull_cook_copyright_hu17884309830273678378.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/ballad-of-bull-cook/bull_cook_copyright_hu10031043508170726133.jpg" width="3072" height="3103" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>But the book&rsquo;s actual copyright status today remains murky. Copyright, with a deceased author, an initial publication date before 1978, and a possibly related bankruptcy, makes a messy mix. These days, copyright is automatically extended 70 years past the author&rsquo;s death. But pre-1978, an initial copyright provided 28 years of protection, and the author was required to register the copyright to get extended protection. In my light and not necessarily expert research, I didn&rsquo;t turn up any such registration for the initial volume of <em>Bull Cook</em> (apparently there were as many as four volumes). I don&rsquo;t know whether Herter himself went bankrupt, or just his business; whether he assigned rights to his books, potentially in his will; what do family members know about all of this; and so on.</p>
<p>One could summarize the gist of U.S. copyright laws as guilty (of copyright infringement) until proven innocent. With so many unknowns here, <em>Bull Cook</em> seems to be stuck in copyright purgatory, and our best option to consume it is one hour at a time on the Internet Archive.</p>
<h2 id="but-wait-its-on-scamazon">But Wait, It&rsquo;s on (sc)Amazon!</h2>
<p>And here we arrive at another surprise turn of events. During my initial searches, I had gotten hits for <em>Bull Cook</em> on Amazon. When I <a href="https://www.amazon.com/Bull-Authentic-Historical-Recipes-Practices/dp/1258460211">clicked through</a>, though, it didn&rsquo;t look like the same book&mdash;the cover was completely different and totally sketchy, check it out:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/amazon_bull_cook.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/amazon_bull_cook_hu11014670893088233558.webp 320w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu7445104596706371905.webp 640w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu1906466953097450727.webp 768w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu5407440913067704897.webp 1024w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu2826105192441657443.webp 1280w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu15201741847786580.webp 1536w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu3116747239573976207.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/amazon_bull_cook_hu15080675901618152177.jpg 320w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu3100148285103119465.jpg 640w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu4716697804227119971.jpg 768w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu10651421706516207222.jpg 1024w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu18207260592483184206.jpg 1280w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu686291325561927700.jpg 1536w, /blog/ballad-of-bull-cook/amazon_bull_cook_hu11648686625508419554.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/ballad-of-bull-cook/amazon_bull_cook_hu3100148285103119465.jpg" width="2048" height="3071" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>At the time, I wasn&rsquo;t interested in a sketchy and expensive print edition so I moved on. But in researching the copyright question, I circled back to <em>Bull Cook</em>&rsquo;s Amazon listings, just to see what I might learn about the book&rsquo;s copyright status. I found that <em>Bull Cook</em> on Amazon was published in 2012 (!!) by a company called Literary Licensing, LLC, of Whitefish, Montana; and is sold by Amazon themselves. Literary appears to be in the reprinting / print-on-demand business. That category itself is a scam magnet (e.g. ultra-expensive, poor-quality photocopied textbooks), but Literary might be in a scam-class of their own. Here&rsquo;s their website, where they proudly proclaim themselves to be a &ldquo;Publisher of Fine Books&rdquo;:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/literary_licensing_website.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/literary_licensing_website_hu6368648719493799080.webp 320w, /blog/ballad-of-bull-cook/literary_licensing_website_hu2045470191803299806.webp 640w, /blog/ballad-of-bull-cook/literary_licensing_website_hu16632542675518912798.webp 768w, /blog/ballad-of-bull-cook/literary_licensing_website_hu13359111437524430486.webp 1024w, /blog/ballad-of-bull-cook/literary_licensing_website_hu17679622926990135204.webp 1280w, /blog/ballad-of-bull-cook/literary_licensing_website_hu2704481111146647726.webp 1536w, /blog/ballad-of-bull-cook/literary_licensing_website_hu7192900922312158239.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/literary_licensing_website_hu11399465332513610016.jpg 320w, /blog/ballad-of-bull-cook/literary_licensing_website_hu904319875484452198.jpg 640w, /blog/ballad-of-bull-cook/literary_licensing_website_hu10040756258779224557.jpg 768w, /blog/ballad-of-bull-cook/literary_licensing_website_hu5793833610095965793.jpg 1024w, /blog/ballad-of-bull-cook/literary_licensing_website_hu9490953387695316287.jpg 1280w, /blog/ballad-of-bull-cook/literary_licensing_website_hu10108259796296630437.jpg 1536w, /blog/ballad-of-bull-cook/literary_licensing_website_hu9150994272470371793.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/literary_licensing_website_hu904319875484452198.jpg" width="3072" height="2046" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Note that I didn&rsquo;t say &ldquo;home page&rdquo; of Literary Licensing, because&mdash;that one screen is the whole damn website. It does have a search bar, but it just forwards you to an Amazon search for the term you enter, filtered for Literary&rsquo;s titles. Furthermore, I&rsquo;m not sure what the tropical beach scene has to do with Whitefish or fine books. Oh, wait, that&rsquo;s an Unsplash image. OH WAIT this is a Squarespace site. I&rsquo;m guessing Literary invested at least 15 minutes creating their home on the Internet, maybe even 20. Not confidence-inspiring.</p>
<h2 id="publisher-of-fine-books">Publisher of Fine Books</h2>
<p>It appears, based on what I&rsquo;m seeing and reading&mdash;and I don&rsquo;t know for sure, just sharing my intuition here&mdash;that Literary Licensing lives somewhere in the spectrum from unethical-but-mostly-legal through totally-a-scam. For example, check out <a href="https://thomasfarleyblog.com/?s=kessinger">this series of posts relating to Literary Licensing / Kessinger Publishing</a>. I haven&rsquo;t dug deep, but something smells here. Like a putrefying raccoon carcass.</p>
<p>So what might be going on in our case with the <em>Bull Cook</em> reprint? My guess is, somehow <em>Bull Cook</em> showed up on Literary&rsquo;s radar as &ldquo;there might be some demand for a reprint of this out-of-print book,&rdquo; perhaps from a signal such as used copies selling at a premium. Literary might then create a premium-priced listing on Amazon, and start taking orders. When orders roll in, Literary could then scan or find a scan of the book, slap their lovely cover on it, and fulfill via print-on-demand. Here&rsquo;s a review of another <a href="https://www.amazon.com/Color-Communism-Common-Manning-Johnson/dp/125877089X/ref=tmm_hrd_swatch_0?_encoding=UTF8&amp;qid=1697339378&amp;sr=1-1">Literary-published book on Amazon</a>&mdash;the buyer is none too pleased at how much they paid for a poor photocopy:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/literary_amazon_review.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/literary_amazon_review_hu16024445320629344853.webp 320w, /blog/ballad-of-bull-cook/literary_amazon_review_hu12857339617688642532.webp 640w, /blog/ballad-of-bull-cook/literary_amazon_review_hu751964579096601976.webp 768w, /blog/ballad-of-bull-cook/literary_amazon_review_hu8187229024587133261.webp 1024w, /blog/ballad-of-bull-cook/literary_amazon_review_hu1455743548540834440.webp 1280w, /blog/ballad-of-bull-cook/literary_amazon_review_hu8470214829749003517.webp 1536w, /blog/ballad-of-bull-cook/literary_amazon_review_hu10308465967772936386.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/literary_amazon_review_hu4144850046163087362.jpg 320w, /blog/ballad-of-bull-cook/literary_amazon_review_hu8311802989390530648.jpg 640w, /blog/ballad-of-bull-cook/literary_amazon_review_hu7413689500364455248.jpg 768w, /blog/ballad-of-bull-cook/literary_amazon_review_hu1269229092010787043.jpg 1024w, /blog/ballad-of-bull-cook/literary_amazon_review_hu253478412699357618.jpg 1280w, /blog/ballad-of-bull-cook/literary_amazon_review_hu4320681693495734278.jpg 1536w, /blog/ballad-of-bull-cook/literary_amazon_review_hu11366585351214831469.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/literary_amazon_review_hu8311802989390530648.jpg" width="3072" height="1779" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Where&rsquo;s the &ldquo;check copyright, secure a license for the materials&rdquo; etc. step here? Based on what&rsquo;s I&rsquo;ve seen reported about other books published by Literary, I suspect Literary might just skip that step, and instead just go ahead and list, sell, print, figuring that nobody will notice or care. If you&rsquo;re a big fish in a small place like Whitefish, MT, you might be really tough to successfully sue.</p>
<p>There appears to be a related scam where a fairly current, somewhat popular book lacks one of Amazon&rsquo;s formats, such as &ldquo;hardcover,&rdquo; and Literary appears to step in and list a poor-quality, overpriced reprint to fill that gap. In this case, you would think that the rightsholder gets compensated somehow &hellip; but you never know. I don&rsquo;t understand Amazon&rsquo;s rules around this, but clearly scammers seem to have found a way to thrive here.</p>
<p>Now get this&mdash;Literary Licensing, LLC appears to have <a href="https://www.amazon.com/s?i=stripbooks&amp;rh=p_30%3ALiterary+Licensing&amp;Adv-Srch-Books-Search=Search%21&amp;tag=kessingerpubl-20&amp;tag_value=kessingerpubl-20&amp;unfiltered=1&amp;ref=sr_adv_b">50,000 listings</a> on Amazon. The scale is pretty staggering here, reminding me of the massive fake mobile app scams on the Play Store and App Store. There&rsquo;s also a strong smell of alt-right-wacko in the selection of titles, possibly another Literary characteristic.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/ballad-of-bull-cook/literary_50k_titles.webp"><picture>
    <source type="image/webp" srcset="/blog/ballad-of-bull-cook/literary_50k_titles_hu9005874597285247976.webp 320w, /blog/ballad-of-bull-cook/literary_50k_titles_hu14652922911275942115.webp 640w, /blog/ballad-of-bull-cook/literary_50k_titles_hu15783639648519596331.webp 768w, /blog/ballad-of-bull-cook/literary_50k_titles_hu12995452561553253487.webp 1024w, /blog/ballad-of-bull-cook/literary_50k_titles_hu7635573960140213212.webp 1280w, /blog/ballad-of-bull-cook/literary_50k_titles_hu2028245908949297165.webp 1536w, /blog/ballad-of-bull-cook/literary_50k_titles_hu1899274872982055439.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/ballad-of-bull-cook/literary_50k_titles_hu430363630343572169.jpg 320w, /blog/ballad-of-bull-cook/literary_50k_titles_hu3850820771313998484.jpg 640w, /blog/ballad-of-bull-cook/literary_50k_titles_hu14150686604746985819.jpg 768w, /blog/ballad-of-bull-cook/literary_50k_titles_hu4770094131689865319.jpg 1024w, /blog/ballad-of-bull-cook/literary_50k_titles_hu8025705558687068159.jpg 1280w, /blog/ballad-of-bull-cook/literary_50k_titles_hu3299399349754856555.jpg 1536w, /blog/ballad-of-bull-cook/literary_50k_titles_hu5304450052914801425.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/ballad-of-bull-cook/literary_50k_titles_hu3850820771313998484.jpg" width="3072" height="1838" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Amazon usually keeps scammers at arms-length, just fulfilling orders (&ldquo;Ships from&rdquo;) but not taking on the liability of being the seller of record (&ldquo;Sold by&rdquo;). So in this case, if Literary is in fact a scammer, it seems like Amazon is taking on liability for that scam.</p>
<h2 id="what-stinks-here">What Stinks Here</h2>
<ul>
<li>That <em>Bull Cook</em> and other George Leonard Herter books aren&rsquo;t simply out there, public domain, easily accessible.</li>
<li>The U.S.&rsquo;s overly-protective copyright laws&mdash;the same ones that the <a href="https://en.wikipedia.org/wiki/Google_Books">Google Books project is still mired in</a>.</li>
<li>Fake re-publisher/scammers taking advantage of public domain or inadequately protected copyrighted material</li>
<li>Amazon looking the other way, as they are known to do elsewhere when it suits their purposes</li>
</ul>
<h2 id="what-doesnt-stink-here">What Doesn&rsquo;t Stink Here</h2>
<ul>
<li><em>Bull Cook</em>&rsquo;s fun recipes, authentic outdoor guide wisdom, crazy stories, and hilarious questionable facts</li>
<li>Organizations like the Internet Archive that work to preserve and disseminate interesting content like <em>Bull Cook</em></li>
</ul>
<p>I&rsquo;ve pulled enough threads on this one, time to finish up. I enjoyed the journey and intend to try out some <em>Bull Cook</em> recipes soon.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Cloudflare CAPTCHA Hell</title>
      <link>https://craftycto.com/micro/cloudflare-captcha-hell/</link>
      <pubDate>Tue, 22 Aug 2023 14:23:22 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/cloudflare-captcha-hell/</guid>
      <description>Cloudflare&amp;#39;s CAPTCHA nonsense: a sign they&amp;#39;re getting too dominant?</description>
      <content:encoded><![CDATA[<p>I run <a href="https://pi-hole.net/">Pi-hole</a> on a Raspberry Pi device on our home network, eliminating most ads and trackers for every member of the household. Recently, though, I&rsquo;ve experienced an increasing number of cases where I get CAPTCHA challenges when I shouldn&rsquo;t. Sometimes I have to go through multiple challenges, and occasionally run into infinite CAPTCHA loops where I&rsquo;m unable to get through at all. I was worried that Pi-hole might be causing the issues.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/micro/cloudflare-captcha-hell/captcha-hell.png"><picture>
    <source type="image/webp" srcset="/micro/cloudflare-captcha-hell/captcha-hell_hu3641770927843101817.webp 320w, /micro/cloudflare-captcha-hell/captcha-hell_hu16754477694629282151.webp 640w, /micro/cloudflare-captcha-hell/captcha-hell_hu4900601081309481202.webp 768w, /micro/cloudflare-captcha-hell/captcha-hell_hu13873889687740390911.webp 1024w, /micro/cloudflare-captcha-hell/captcha-hell_hu14244563004318795331.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/micro/cloudflare-captcha-hell/captcha-hell_hu2913633916927715702.jpg 320w, /micro/cloudflare-captcha-hell/captcha-hell_hu14096464621161257787.jpg 640w, /micro/cloudflare-captcha-hell/captcha-hell_hu4393338396909724153.jpg 768w, /micro/cloudflare-captcha-hell/captcha-hell_hu5070616816817989431.jpg 1024w, /micro/cloudflare-captcha-hell/captcha-hell_hu12294015817641175841.jpg 1280w" sizes="100vw" />
    
      <img src="/micro/cloudflare-captcha-hell/captcha-hell_hu14096464621161257787.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Today I finally hit the breaking point and dug into what was going on. This <a href="https://news.ycombinator.com/item?id=37009598">Hacker News comment thread</a> led to the culprit, which turned out to be Cloudflare. I had been relying on Cloudflare DNS as my upstream DNS resolver for Pi-hole, and Cloudflare was the party triggering the CAPTCHAs. Switching to OpenDNS fixed the issue.</p>
<p>I love Cloudflare Pages as my hosting solution for craftycto.com, but I&rsquo;m getting concerned about Cloudflare in general&mdash;they seem to be moving into monopolistic, enshittification / extraction stage. That would be my cue to exit.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Gruber Translates Linda Yaccarino&#39;s Company-wide Memo on the X Rebrand</title>
      <link>https://craftycto.com/elsewhere/gruber-translates-linda-yaccarino/</link>
      <pubDate>Fri, 28 Jul 2023 21:44:06 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/gruber-translates-linda-yaccarino/</guid>
      <description>He calls it &amp;#39;translation from hostage code&amp;#39;—so funny, one of his best in this genre.</description>
      <content:encoded><![CDATA[<p>A few prime translations:</p>
<blockquote>
<p>It’s OK to day-drink. I am.</p>
</blockquote>
<blockquote>
<p>I used to run all advertising for NBCUniversal. Now I’m running an $8/month multi-level marketing scheme where the only users who’ve signed up are men who own a collection of MAGA hats.</p>
</blockquote>
<blockquote>
<p>As if this rebranding disaster isn’t enough, our infrastructure is crumbling. Facebook took Threads from 0 to 100 million users in under a week, without a hitch, at the same time we imposed comical rate limits on usage. I mean can you even believe that shit? I still can’t. I said to him, “Elon, we are an ad-based business. Our revenue is directly commensurate to usage. This is like running a casino and turning the slot machines off to save on the electricity bill. It makes no sense.” And Elon was like “Bots!”</p>
</blockquote>
<blockquote>
<p>Please quit. Get out. I beg you. Leave while you can put on your resume that you worked for “Twitter”.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Twitter and Its Successor States</title>
      <link>https://craftycto.com/elsewhere/twitter-and-successor-states/</link>
      <pubDate>Fri, 28 Jul 2023 21:18:44 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/twitter-and-successor-states/</guid>
      <description>Medieval historian Eleanor Janega hilariously draws the parallels between Elmo&amp;#39;s Twitter (aka X) and the &amp;#39;fall&amp;#39; of Rome</description>
      <content:encoded><![CDATA[<p>I love the tone of this article, a true pleasure to read&mdash;highly recommended. A couple of great lines:</p>
<blockquote>
<p>I mean it’s really funny how a bunch of very rich dudes are breaking stuff online and making worse versions of existing products in response to said breakage. Obviously it is quite amusing to be shown how stupid rich people are, and I very much enjoy it.</p>
</blockquote>
<blockquote>
<p>This is much like Elon Musk, as are dogs who chase cars and catch them, presumably. After being tricked into paying way more money for Twitter than it is worth he had to figure out some way to keep it ticking over and also to service all the debt that he took on to buy it. So because he is, and I cannot stress this enough, really quite stupid, he began to strip out all the load bearing members of staff who did stuff like not make the website DDOS itself.</p>
</blockquote>
<p>The lead plate is fun too, &ldquo;Vengeance of Clovis&rdquo;:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/vengeance_de_clovis_4128100511823298927.jpg"><picture>
    <source type="image/webp" srcset="/vengeance_de_clovis_4128100511823298927_hu17619346860649281619.webp 320w, /vengeance_de_clovis_4128100511823298927_hu4916048237118840890.webp 640w, /vengeance_de_clovis_4128100511823298927_hu89321608488314913.webp 768w" sizes="75vw" />
    <source type="image/jpeg" srcset="/vengeance_de_clovis_4128100511823298927_hu14139611456527711013.jpg 320w, /vengeance_de_clovis_4128100511823298927_hu2574445166059928096.jpg 640w, /vengeance_de_clovis_4128100511823298927_hu274277481943476896.jpg 768w" sizes="75vw" />
    
      <img src="/vengeance_de_clovis_4128100511823298927_hu2574445166059928096.jpg" width="980" height="958" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Ethan Mollick: &#34;How to Use AI to Do Stuff&#34;</title>
      <link>https://craftycto.com/elsewhere/how-to-use-ai-to-do-stuff/</link>
      <pubDate>Wed, 26 Jul 2023 18:45:13 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/how-to-use-ai-to-do-stuff/</guid>
      <description>Great roundup, and I agree with most recommendations. Bing, maybe not.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve loved a lot of New Microsoft (GitHub, VS Code) and since I&rsquo;m on macOS + Linux, and have avoided installing Microsoft apps, hadn&rsquo;t been exposed to that side of the company for years.</p>
<p>Recently, though, I&rsquo;ve installed Office (client driven need), Teams (hoping the native Mac app would be better than running Teams in a browser), and Edge (to work with Bing Chat). The experience ranged from &ldquo;ughhh&rdquo; on the positive end to &ldquo;UNINSTALL NOW&rdquo; on the negative.</p>
<p>I can confidently report: the old M$ DNA is alive and well.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>OpenAI Concedes: AI Can&#39;t Detect AI</title>
      <link>https://craftycto.com/elsewhere/ai-cant-detect-ai/</link>
      <pubDate>Wed, 26 Jul 2023 08:07:11 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/ai-cant-detect-ai/</guid>
      <description>OpenAI quietly shuts down its AI detection tool due to poor accuracy</description>
      <content:encoded><![CDATA[<p>OpenAI was one of many who attempted to build an AI tool to detect whether a given document was AI generated.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/elsewhere/ai-cant-detect-ai/openai-ai-detector-2.png"><picture>
    <source type="image/webp" srcset="/elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu37214076999039450.webp 320w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu6275743292085227327.webp 640w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu18033689737092466993.webp 768w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu12585668661492607907.webp 1024w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu8629702948210163200.webp 1280w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu9832019553220936871.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu326785104950357386.jpg 320w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu18237448160363963420.jpg 640w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu409879009793389022.jpg 768w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu13094891052207001291.jpg 1024w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu6766314923741850724.jpg 1280w, /elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu781966590412798108.jpg 1536w" sizes="100vw" />
    
      <img src="/elsewhere/ai-cant-detect-ai/openai-ai-detector-2_hu18237448160363963420.jpg" width="1709" height="907" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Announced in a <a href="https://openai.com/blog/new-ai-classifier-for-indicating-ai-written-text">blog post</a> on January 31st, OpenAI quietly pulled the plug a few days ago, not with a new announcement but rather by adding a note on the top of that January post:</p>
<blockquote>
<p>As of July 20, 2023, the AI classifier is no longer available due to its low rate of accuracy. We are working to incorporate feedback and are currently researching more effective provenance techniques for text, and have made a commitment to develop and deploy mechanisms that enable users to understand if audio or visual content is AI-generated.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>An Appllama Week in AI</title>
      <link>https://craftycto.com/blog/an-appllama-week/</link>
      <pubDate>Fri, 21 Jul 2023 19:24:18 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/an-appllama-week/</guid>
      <description>Meta makes waves with Llama 2, while Bloomberg pumps itself with Apple LLM non-news.</description>
      <content:encoded><![CDATA[<p>This past week brought significant AI news; in fact, it&rsquo;s feeling like the rate of change in  the generative AI space is notching back up again. I&rsquo;ll focus in two areas here: Llama 2 and Apple LLM rumors.</p>
<h2 id="meta-ai-releases-llama-2">Meta AI Releases Llama 2</h2>
<p>Meta&rsquo;s <a href="https://ai.meta.com/llama/">Llama 2 release</a> is a seminal event, given that (a) Meta&rsquo;s initial LLaMA 1 release spawned <a href="/blog/march-madness-ai/">AI March Madness</a>, (b) Llama 2 is substantially more capable than the first LLaMA, and (c) this time Meta is allowing as opposed to blocking commercial use. That is, unless you&rsquo;re Apple, Snap, TikTok, and a handful of others&mdash;more on this below.</p>
<p>Last time around, Meta announced LLaMA but made the full details&mdash;most importantly, model weights&mdash;available only to a limited set of researchers. But someone leaked those weights within days of the announcement, and that led to an <a href="/blog/the-emergence-s1e4/">explosion of innovation</a> among independent researcher-hobbyists. This time, I suppose Meta learned the lesson and preempted the leak.</p>
<p>Another innovation explosion appears to be underway; already Llama 2 derived models are near the top of the <a href="https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard">HuggingFace Open LLM Leaderboard</a>, and new Llama stories are still on the first page of Hacker News, such as this <a href="https://news.ycombinator.com/item?id=36838051">LLama 2 pure C implementation</a> that will run on laptops, including Apple M1 series MacBooks.</p>
<p>Meta releasing Llama 2 fairly openly is a very good thing for open LLM research and progress, but don&rsquo;t be fooled into thinking that Meta&rsquo;s doing something altruistic here&mdash;NOT. Meta&rsquo;s looking out for Mark and Meta, only&mdash;this is a commoditize your competition play. But still a very good thing.</p>
<h2 id="bloombergs-mark-gurman-scoops-apple-gpt-aka-ajax">Bloomberg&rsquo;s Mark Gurman &ldquo;Scoops&rdquo; Apple GPT aka Ajax</h2>
<p>Mark Gurman on Wednesday <a href="https://archive.ph/7tqs5">&ldquo;broke&rdquo; the story</a> that Apple is quietly active in the LLM space and  working on a GPT style chatbot. I use airquotes around &ldquo;scoop&rdquo; and &ldquo;broke&rdquo; because everyone with any historical Apple knowledge knows that Apple always has a team working secretly on everything that Apple should obviously be working on, obviously. And there&rsquo;s nothing in the universe more obvious than this one.</p>
<p>John Gruber, in his <a href="https://daringfireball.net/2023/07/apple_gpt_bloomberg">commentary on the Gurman piece</a>, educated me on the Bloomberg News / Bloomberg Terminal pump-scam, which I hadn&rsquo;t been aware of:</p>
<blockquote>
<p>Apple’s brief 2.7 percent jump and Microsoft’s smaller but still-significant drop, both at 12:04pm, were clearly caused by Gurman’s report. Bloomberg Terminal subscribers get such reports before anyone else. (Bloomberg employees, of course, know such information before it’s published, but I’m sure never do anything untoward with it.) Once you view Bloomberg’s original reporting through this prism — that most of their original reporting is delivered with the goal of moving the stock prices of the companies they’re reporting on, for the purpose of proving the value of a Bloomberg Terminal’s hefty subscription fee1 to day-trading gamblers — a lot of their seemingly inexplicable stylistic quirks don’t seem so inexplicable any more. They just seem a little gross.</p>
</blockquote>
<p>Yeah, that is SlimyWorld all the way. Not surprising, though, the last 8-odd years have lifted the curtain on a lot of formerly hidden beliefs and behaviors; this fits right in, and is brought to us courtesy of the same fabulous crowd.</p>
<p>Anyway, Gurman&rsquo;s article didn&rsquo;t contain much actual news; just that the project&rsquo;s codename might be Ajax and that some people are calling the chat interface Apple GPT.</p>
<h2 id="intersection-apple-llm-chatter-on-hacker-news">Intersection: Apple LLM Chatter on Hacker News</h2>
<p>Big news like Llama 2 get immediately posted on YCombinator&rsquo;s Hacker News, and Llama 2 was near the top of the activity-ranked feed for several days, with <a href="https://news.ycombinator.com/item?id=36774627">819 comments</a>. Meta released Llama 2 under a license that&rsquo;s much more commercial friendly than the original LLaMA; let&rsquo;s call it <strong>commercial-friendly-unless-you&rsquo;re-huge</strong> because it contains a clause that triggers a need to secure a license only if the organization using Llama 2 has more than 700 million monthly active users. This constraint impacts a very short list of companies, Apple among them.</p>
<p>That led to chatter on Hacker News around Apple&rsquo;s place in the LLM / GPT space. Here&rsquo;s a sampling:</p>
<blockquote>
<p>(stu2b50) I think more Apple [that this constraint blocks]. It&rsquo;s not like Google or Microsoft would want to use LLaMA when they have fully capable models themselves. I wouldn&rsquo;t be surprised if Amazon does as well &hellip;Apple is the big laggard in terms of big tech and complex neural network models.</p>
</blockquote>
<blockquote>
<p>(samwillis) Apple would absolutely not want to use a competitors, or any other, public LLM. They want to own the whole stack, and will want to have their own secret source as part of it. It&rsquo;s not like they don&rsquo;t have the capital to invest in training&hellip;</p>
</blockquote>
<blockquote>
<p>(NotAFood) Apple has shown time and time again that they have the human capital and money to tackle massive projects discretely. It&rsquo;s already fairly well known that Apple&rsquo;s NLP experts from Siri have been reallocated to some secret project. They are more than capable of training an LLM but given their track record in other segments they probably want to wait for the technology to become more &ldquo;polished&rdquo; and give less hallucinated answers. They are likely also want the LLM to work locally (at least partially) on their devices using the Neural Engine which adds further engineering complexity to their project. They could even be timing the LLM&rsquo;s launch around a hardware release capable of running the model (M3, M4, etc&hellip;).</p>
</blockquote>
<blockquote>
<p>(amelius) Apple only has to slightly open their wallet to become a DL superpower.</p>
</blockquote>
<blockquote>
<p>(yellow_postit) Apple is a complete laggard in this space due to years of restrictions on research. They are hiring multiple “AI” roles now and they have the capital and focus to “eventually” catch up — but it is very much a catch-up game &hellip; That said, they seem to prefer catchup waiting till others explore new tech they swoop in an (claim) to perfect it from a usability pov. I have no reason to suspect they won’t do the same here.</p>
</blockquote>
<blockquote>
<p>(whimsicalism) I work in the field and they just are not hiring the people they need to be hiring.</p>
</blockquote>
<h2 id="my-take-on-apple-in-llmgpt-land">My Take on Apple in LLM/GPT Land</h2>
<ul>
<li>Of course Apple is working on something LLM.
<ul>
<li>This doesn&rsquo;t mean the something will ever see the light of day.</li>
<li>We <a href="/micro/apple-did-it/">won&rsquo;t hear about it</a> until it&rsquo;s polished and ready.</li>
</ul>
</li>
<li>Despite massive support for, and applications of, machine learning throughout their software+hardware ecosystem, Apple was blindsided by the generative AI explosion and is playing catch-up.
<ul>
<li>The comments around Apple not hiring the people they need to be hiring are probably a fair assessment, a symptom of Apple&rsquo;s blindsided-catching-up current state.</li>
</ul>
</li>
<li>Apple is uniquely positioned to do some really good things in this space, once they get their shit together.</li>
<li>Apple will indeed get their LLM shit together to some reasonable degre&mdash;in Apple Time.</li>
<li>Apple Time moves far slower than AI Time. Apple might get pinched, except where they&rsquo;re uniquely positioned.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Did GPT-4 Code Interpreter Escape From Its Sandbox?</title>
      <link>https://craftycto.com/micro/did-code-interpreter-escape/</link>
      <pubDate>Fri, 14 Jul 2023 19:21:46 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/did-code-interpreter-escape/</guid>
      <description>I gave Code Interpreter a workout this morning, and it appeared to exit the building.</description>
      <content:encoded><![CDATA[<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h3 id="update-this-was-hallucination-not-sandbox-escape">UPDATE: This was hallucination, not sandbox escape</h3>
<p>I <a href="https://mastodon.social/@Jackivers/110715505542072107">talked through what happened with Simon Willison</a>, and he convinced me that this was actually an interesting flavor of hallucination.  Specifically, GPT-4 hallucinated a connection between the files I had uploaded, and documents in its training corpus, based on <em>the names of the uploaded files</em>. The same evidence I cited below, that the mistakenly-associated content was authored by a name similar to the filename / author of the document that I uploaded, works as an explanation here. As I mentioned to Simon:</p>
<blockquote>
<p>It’s funny to watch [GPT-4] shift in and out of reality as the pull of hallucination ebbs and flows. Interesting also that it didn’t hallucinate the content (in two cases at least); but rather that “this file actually contains that content (from my training corpus)” …</p>
</blockquote>

</div>

<p>Until this morning, I hadn&rsquo;t thrown a real task at GPT-4 Code Interpreter, so I decided to see how it would perform at intelligently combining several proposal template documents into one (<a href="https://chat.openai.com/share/e2aa14e9-d0f5-45ce-9a70-7fb0827bf30b">link to transcript</a>). The answer: it didn&rsquo;t perform all that well; but I have ideas on how to guide it better next time. But that&rsquo;s not the story here.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-1.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-1_hu10971566830358320686.webp 320w, /micro/did-code-interpreter-escape/wrong-1_hu8945801805797277298.webp 640w, /micro/did-code-interpreter-escape/wrong-1_hu18012940676385585485.webp 768w, /micro/did-code-interpreter-escape/wrong-1_hu16524879312293431604.webp 1024w, /micro/did-code-interpreter-escape/wrong-1_hu5564983815954922048.webp 1280w, /micro/did-code-interpreter-escape/wrong-1_hu3472244483595575749.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-1_hu9702312929579372288.jpg 320w, /micro/did-code-interpreter-escape/wrong-1_hu11065009470678756451.jpg 640w, /micro/did-code-interpreter-escape/wrong-1_hu6182949016625952407.jpg 768w, /micro/did-code-interpreter-escape/wrong-1_hu9188122876179387634.jpg 1024w, /micro/did-code-interpreter-escape/wrong-1_hu5070836667302242907.jpg 1280w, /micro/did-code-interpreter-escape/wrong-1_hu801791931509165071.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-1_hu11065009470678756451.jpg" width="1790" height="1904" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I uploaded 4 PDF files, each of which was a different proposal template, and asked it to effectively merge them, putting like sections from different documents together. It actually made some progress at this, and clearly the ability to feed it files as input opens up a huge range of new applications.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-2.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-2_hu14306290800346135246.webp 320w, /micro/did-code-interpreter-escape/wrong-2_hu4673691835059655686.webp 640w, /micro/did-code-interpreter-escape/wrong-2_hu12902537605617403943.webp 768w, /micro/did-code-interpreter-escape/wrong-2_hu3812224483874042155.webp 1024w, /micro/did-code-interpreter-escape/wrong-2_hu6864712982754524047.webp 1280w, /micro/did-code-interpreter-escape/wrong-2_hu1046295993843402209.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-2_hu12312333395132631390.jpg 320w, /micro/did-code-interpreter-escape/wrong-2_hu10291355758771158311.jpg 640w, /micro/did-code-interpreter-escape/wrong-2_hu13944011853951826132.jpg 768w, /micro/did-code-interpreter-escape/wrong-2_hu7863110066510777867.jpg 1024w, /micro/did-code-interpreter-escape/wrong-2_hu10585486561315916314.jpg 1280w, /micro/did-code-interpreter-escape/wrong-2_hu18144371494792850055.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-2_hu10291355758771158311.jpg" width="1830" height="1152" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Perhaps a third of the way into a long chatting session, however, Code Interpreter appeared to cross-link its mental pointers for my four proposal files with someone or something else&rsquo;s documents. It certainly appears that Code Interpreter was outside my session sandbox.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-3.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-3_hu4816768235878459878.webp 320w, /micro/did-code-interpreter-escape/wrong-3_hu11630419502354213206.webp 640w, /micro/did-code-interpreter-escape/wrong-3_hu452607349281969035.webp 768w, /micro/did-code-interpreter-escape/wrong-3_hu15540452812490467420.webp 1024w, /micro/did-code-interpreter-escape/wrong-3_hu5530283221658809803.webp 1280w, /micro/did-code-interpreter-escape/wrong-3_hu11667998626470458117.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-3_hu3345693754778739359.jpg 320w, /micro/did-code-interpreter-escape/wrong-3_hu8285229267880697338.jpg 640w, /micro/did-code-interpreter-escape/wrong-3_hu17834637233344091386.jpg 768w, /micro/did-code-interpreter-escape/wrong-3_hu7382449899289416467.jpg 1024w, /micro/did-code-interpreter-escape/wrong-3_hu1442464400604145494.jpg 1280w, /micro/did-code-interpreter-escape/wrong-3_hu4431839310691722436.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-3_hu8285229267880697338.jpg" width="1814" height="1884" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I actually got linked to German language content for one of the documents briefly, and after a bit CI stabilized around linked my supposed uploads to four ML / AI research space documents.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-7.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-7_hu7186584119694051096.webp 320w, /micro/did-code-interpreter-escape/wrong-7_hu15142805574805782455.webp 640w, /micro/did-code-interpreter-escape/wrong-7_hu7318578544247634365.webp 768w, /micro/did-code-interpreter-escape/wrong-7_hu15160949662841526543.webp 1024w, /micro/did-code-interpreter-escape/wrong-7_hu13270177397114531378.webp 1280w, /micro/did-code-interpreter-escape/wrong-7_hu10433037512969123345.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-7_hu9033198268402142800.jpg 320w, /micro/did-code-interpreter-escape/wrong-7_hu9677466854868608375.jpg 640w, /micro/did-code-interpreter-escape/wrong-7_hu17162604971811857076.jpg 768w, /micro/did-code-interpreter-escape/wrong-7_hu14921749113505526283.jpg 1024w, /micro/did-code-interpreter-escape/wrong-7_hu13787991163840563432.jpg 1280w, /micro/did-code-interpreter-escape/wrong-7_hu4787975661155177889.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-7_hu9677466854868608375.jpg" width="1766" height="1898" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I did a bit of searching on Kagi and in two of the four cases, <a href="https://www.analyticsvidhya.com/blog/2016/06/bayesian-statistics-beginners-simple-english/">found</a> the source <a href="https://www.statisticssolutions.com/free-resources/directory-of-statistical-analyses/what-is-linear-regression/">content</a> on research oriented websites. I was unable to locate the other two sources, which might make sense as they looked like snippets from actual research papers. I didn&rsquo;t search exhaustively or try Google Research or its ilk.</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-5.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-5_hu6833671444579769180.webp 320w, /micro/did-code-interpreter-escape/wrong-5_hu12996531649956529788.webp 640w, /micro/did-code-interpreter-escape/wrong-5_hu4672689496061395425.webp 768w, /micro/did-code-interpreter-escape/wrong-5_hu3717040046218827528.webp 1024w, /micro/did-code-interpreter-escape/wrong-5_hu17632419985210396886.webp 1280w, /micro/did-code-interpreter-escape/wrong-5_hu16916414792742917405.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-5_hu8211501711177705571.jpg 320w, /micro/did-code-interpreter-escape/wrong-5_hu12639971386266449849.jpg 640w, /micro/did-code-interpreter-escape/wrong-5_hu6275968948397517985.jpg 768w, /micro/did-code-interpreter-escape/wrong-5_hu2092277623866146688.jpg 1024w, /micro/did-code-interpreter-escape/wrong-5_hu964031856811599152.jpg 1280w, /micro/did-code-interpreter-escape/wrong-5_hu9708816940486881624.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-5_hu12639971386266449849.jpg" width="1776" height="1888" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>So where did these documents come from? The best I can say is, &ldquo;definitely not my sandbox.&rdquo; The main possibilities that come to mind for me are:</p>
<ol>
<li>Someone else&rsquo;s sandbox (a scary thought)</li>
<li>Some content embedded in the model (no clue how that might happen)</li>
<li>Something that gets installed in the sandbox as sample data, e.g. as part of some Python library</li>
</ol>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/micro/did-code-interpreter-escape/wrong-6.png"><picture>
    <source type="image/webp" srcset="/micro/did-code-interpreter-escape/wrong-6_hu8425993143632887244.webp 320w, /micro/did-code-interpreter-escape/wrong-6_hu14092565191660506258.webp 640w, /micro/did-code-interpreter-escape/wrong-6_hu518230490698651472.webp 768w, /micro/did-code-interpreter-escape/wrong-6_hu14736777054590185343.webp 1024w, /micro/did-code-interpreter-escape/wrong-6_hu11587232996683493552.webp 1280w, /micro/did-code-interpreter-escape/wrong-6_hu5228564238595749517.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/micro/did-code-interpreter-escape/wrong-6_hu17124247500278708197.jpg 320w, /micro/did-code-interpreter-escape/wrong-6_hu3722900357036170523.jpg 640w, /micro/did-code-interpreter-escape/wrong-6_hu14945420823198313604.jpg 768w, /micro/did-code-interpreter-escape/wrong-6_hu14969600571085651486.jpg 1024w, /micro/did-code-interpreter-escape/wrong-6_hu11083886347268991805.jpg 1280w, /micro/did-code-interpreter-escape/wrong-6_hu1260167952768512312.jpg 1536w" sizes="75vw" />
    
      <img src="/micro/did-code-interpreter-escape/wrong-6_hu3722900357036170523.jpg" width="1812" height="1122" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>And how did Code Interpreter get its wires crossed? A real Python person might have a clue but all I can do is speculate. Most promising idea: a name collision in a shared scratchpad area (e.g. an S3 bucket). Why do I think that? I saw a case or two where the content seemed to be authored by a name similar to the name / author of the document that I uploaded. If true, this could support case (1) above &hellip; not good. (See update above&mdash;this appears to be &ldquo;hallucination based on file name&rdquo; &hellip;)</p>
<p>In any case&mdash;very interesting &hellip;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Just-released GPT-4 Code Interpreter is a Big Deal, Part 2</title>
      <link>https://craftycto.com/elsewhere/gpt4-code-interpreter-big-deal-pt2/</link>
      <pubDate>Tue, 11 Jul 2023 18:57:19 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/gpt4-code-interpreter-big-deal-pt2/</guid>
      <description>Latent Space had an &amp;#34;emergency pod&amp;#34; about Code Interpreter and 17,000 people joined.</description>
      <content:encoded><![CDATA[<p>I think everyone on the podcast was in danger of hyperventilating. Many interesting facts and hacks came to light. The <a href="https://www.latent.space/p/code-interpreter#details">show notes</a> are a novella and worth reading as swyx recaps exhaustively and does a useful executive summary.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Just-released GPT-4 Code Interpreter is a Big Deal, Part 1</title>
      <link>https://craftycto.com/elsewhere/gpt4-code-interpreter-big-deal-pt1/</link>
      <pubDate>Tue, 11 Jul 2023 18:05:15 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/gpt4-code-interpreter-big-deal-pt1/</guid>
      <description>Wharton Associate Professor Ethan Mollick has an excellent introduction.</description>
      <content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/emollick/">Mollick</a> has had beta access to Code Interpreter over the past several months and his introduction captures the broader implications of giving an LLM the ability to write Python code. He also points out that its ability to upload and download files (uploads are up to 100MB) is itself transformational, compared with the current, limited copy-and-paste-text approach. Mollick is not a Python developer, but you&rsquo;ll be amazed at what he&rsquo;s able produce with Code Intepreter.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>ChatGPT&#43; Privacy Update</title>
      <link>https://craftycto.com/micro/really-openai-update/</link>
      <pubDate>Mon, 10 Jul 2023 10:35:44 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/really-openai-update/</guid>
      <description>There appears to be a workaround for now to OpenAI&amp;#39;s &amp;#34;If you want privacy, no chat history for you!&amp;#34; policy.</description>
      <content:encoded><![CDATA[<p>Recently, I wrote a <a href="/blog/really-openai/">short essay</a> about an unpleasant discovery I made with ChatGPT&rsquo;s dark pattern whereby, if you want to turn off &ldquo;train your models using my chats,&rdquo; you need to disable one of ChatGPT&rsquo;s nicest features, chat history. Here&rsquo;s the dialog in question:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/images/chatgptplus-settings.png"><picture>
    <source type="image/webp" srcset="/images/chatgptplus-settings_hu7599713760216561192.webp 320w, /images/chatgptplus-settings_hu16540195523136225940.webp 640w, /images/chatgptplus-settings_hu9289485602936297438.webp 768w, /images/chatgptplus-settings_hu15120095099153122856.webp 1024w, /images/chatgptplus-settings_hu11326927866136649228.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/images/chatgptplus-settings_hu12636806817147812377.jpg 320w, /images/chatgptplus-settings_hu7103966425324840714.jpg 640w, /images/chatgptplus-settings_hu18160948476520384226.jpg 768w, /images/chatgptplus-settings_hu4801097128387624069.jpg 1024w, /images/chatgptplus-settings_hu9933616012614821163.jpg 1280w" sizes="100vw" />
    
      <img src="/images/chatgptplus-settings_hu7103966425324840714.jpg" width="1462" height="912" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The update is that there may be a workaround. On the <a href="https://help.openai.com/en/articles/7730893-data-controls-faq">Data Controls FAQ</a>, buried two screen-scrolls down, there&rsquo;s a section that says:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h2 id="what-if-i-want-to-keep-my-history-on-but-disable-model-training">What if I want to keep my history on but disable model training?</h2>
<p>We are working on a new offering called ChatGPT Business that will opt end-users out of model training by default. In the meantime, you can opt out from our use of your data to improve our services by filling out <a href="https://docs.google.com/forms/d/e/1FAIpQLScrnC-_A7JFs4LbIuzevQ_78hVERlNqqCPCt3d8XqnKOfdRdQ/viewform">this form</a>. Once you submit the form, new conversations will not be used to train our models.</p>
</div>

<p>The takeaways:</p>
<ul>
<li>OpenAI seems to understand that business users will want chat history, but definitely not have sensitive data shared in chats be used to train OpenAI&rsquo;s models; hence they are working on a &ldquo;ChatGPT Business&rdquo; offering.</li>
<li>There appears to be a workaround today by filling out the form. Ironically, the form is a &hellip; Google Form.</li>
</ul>
<p>We&rsquo;ll have to wait and see whether OpenAI will close this loophole for non-business users once they launch ChatGPT Business. <a href="https://openai.com/blog/new-ways-to-manage-your-data-in-chatgpt">This announcement</a> hints that they might.</p>
<p>In any case, OpenAI still gets four weasels.</p>
<div class="flex justify-evenly"><div class="w-[15%] mx-2 flex justify-center"><a href="/images/weasel-words.png"><picture>
    <source type="image/webp" srcset="/images/weasel-words_hu10193042854199681085.webp 320w, /images/weasel-words_hu1445983781549493554.webp 640w, /images/weasel-words_hu3355899283314269240.webp 768w, /images/weasel-words_hu9125180995987912684.webp 1024w, /images/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/images/weasel-words_hu4367553655072530837.jpg 320w, /images/weasel-words_hu7107455242432251322.jpg 640w, /images/weasel-words_hu8204489333288044902.jpg 768w, /images/weasel-words_hu7456430052057178392.jpg 1024w, /images/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/images/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/images/weasel-words.png"><picture>
    <source type="image/webp" srcset="/images/weasel-words_hu10193042854199681085.webp 320w, /images/weasel-words_hu1445983781549493554.webp 640w, /images/weasel-words_hu3355899283314269240.webp 768w, /images/weasel-words_hu9125180995987912684.webp 1024w, /images/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/images/weasel-words_hu4367553655072530837.jpg 320w, /images/weasel-words_hu7107455242432251322.jpg 640w, /images/weasel-words_hu8204489333288044902.jpg 768w, /images/weasel-words_hu7456430052057178392.jpg 1024w, /images/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/images/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/images/weasel-words.png"><picture>
    <source type="image/webp" srcset="/images/weasel-words_hu10193042854199681085.webp 320w, /images/weasel-words_hu1445983781549493554.webp 640w, /images/weasel-words_hu3355899283314269240.webp 768w, /images/weasel-words_hu9125180995987912684.webp 1024w, /images/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/images/weasel-words_hu4367553655072530837.jpg 320w, /images/weasel-words_hu7107455242432251322.jpg 640w, /images/weasel-words_hu8204489333288044902.jpg 768w, /images/weasel-words_hu7456430052057178392.jpg 1024w, /images/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/images/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/images/weasel-words.png"><picture>
    <source type="image/webp" srcset="/images/weasel-words_hu10193042854199681085.webp 320w, /images/weasel-words_hu1445983781549493554.webp 640w, /images/weasel-words_hu3355899283314269240.webp 768w, /images/weasel-words_hu9125180995987912684.webp 1024w, /images/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/images/weasel-words_hu4367553655072530837.jpg 320w, /images/weasel-words_hu7107455242432251322.jpg 640w, /images/weasel-words_hu8204489333288044902.jpg 768w, /images/weasel-words_hu7456430052057178392.jpg 1024w, /images/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/images/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>&#34;Commoditizing the Petaflop&#34; with George Hotz of the tiny corp</title>
      <link>https://craftycto.com/elsewhere/latent-space-george-hotz/</link>
      <pubDate>Sun, 09 Jul 2023 19:37:10 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/latent-space-george-hotz/</guid>
      <description>This Latent Space podcast was a mind-blowing conversation that puts George Hotz and the tiny corp on my &amp;#34;Follow Closely&amp;#34; list.</description>
      <content:encoded><![CDATA[<p>George Hotz moves at about 1000 mph and in multiple directions simultaneously, which makes for an enjoyable podcast. Swyx&rsquo;s show summary:</p>
<blockquote>
<p>How tiny is taking on Nvidia, Google, and PyTorch, building in public with AMD, hot takes on ggml, Mojo, Elon, e/acc, and GPT-4, and why AI Girlfriend is next.</p>
</blockquote>
<p>A few additional links:</p>
<ul>
<li><a href="https://tinygrad.org/">the tiny corp</a> where Hotz is working on:
<ul>
<li>tinygrad, the fastest growing neural network framework (over 9000 GitHub stars)</li>
<li>The tinybox, a 1600W (one 120V outlet), 738 FP16 TFLOPS personal AI server.</li>
</ul>
</li>
<li><a href="https://geohot.github.io/blog/">the singularity is nearer</a>, Hotz&rsquo; blog</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Cthulhu taking a smoke break on the set of &#34;Lovecraft Country&#34;</title>
      <link>https://craftycto.com/imagery/cthulhu-lovecraft-country/</link>
      <pubDate>Sun, 09 Jul 2023 07:20:10 -0500</pubDate>
      
      <guid>https://craftycto.com/imagery/cthulhu-lovecraft-country/</guid>
      <description>This one&amp;#39;s mine. Inspired by another user on r/midjourney doing an image based on &amp;#34;Lovecrafting&amp;#34; ...</description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    
    <item>
      <title>n-gons: Intersections</title>
      <link>https://craftycto.com/imagery/ngons-intersections/</link>
      <pubDate>Sat, 08 Jul 2023 20:54:10 -0500</pubDate>
      
      <guid>https://craftycto.com/imagery/ngons-intersections/</guid>
      <description>Another beauty from Mastodon user n-gons.</description>
      <content:encoded><![CDATA[<p>Apparently also built using Girih macOS app.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Really, OpenAI?</title>
      <link>https://craftycto.com/blog/really-openai/</link>
      <pubDate>Fri, 07 Jul 2023 13:32:37 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/really-openai/</guid>
      <description>ChatGPT&#43; subscribers can prevent OpenAI from using their inputs as training data. That is, so long as they forego the service&amp;#39;s second-best feature.</description>
      <content:encoded><![CDATA[<p><em>(Note: See <a href="/micro/really-openai-update/">this update</a> for a possible workaround.</em>)</p>
<p>In a conversation with a venture partner yesterday, I was talking up the value that ChatGPT can bring to knowledge workers. He responded that their firm had a policy against putting any confidential data into ChatGPT. My reaction was, that applies to the free version and / or the old days, that with the advent of paid subscriptions, OpenAI no longer trained their models using inputs from subscribers.</p>
<p>But as I was digging around my ChatGPT+ settings just now, I made an unpleasant discovery, one that reminded me of a <a href="https://imsdb.com/scripts/Independence-Day.html">scene from the first Independence Day movie</a> involving the sleazy Chief of Staff Nimziki:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <pre><code>			MOISHE
	Don't tell him to shut up!  You'd
	all be dead, were it not for my
	David.  You didn't do anything to
	prevent this!

As everyone is about to besiege Moishe, the President tries to
calm him down.

			PRESIDENT
	Sir, there wasn't much more we
	could have done.  We were totally
	unprepared for this.

			MOISHE
	Don't give me unprepared!  Since
	nineteen fifty whatever you guys
	have had that space ship, the
	thing you found in New Mexico.

			DAVID
		(embarrassed)
	Dad, please...

			MOISHE
	What was it, Roswell?  You had the
	space ship, the bodies, everything
	locked up in a bunker, the what is
	it, Area fifty one.  That's it!
	Area fifty one.  You knew and you
	didn't do nothing!

For the first time in a long time, President Whitmore smiles.

			PRESIDENT
	Regardless of what the tabloids
	have said, there were never any
	spacecraft recovered by the
	government.  Take my word for it,
	there is no Area 51 and no
	recovered space ship.

Chief of Staff Nimziki suddenly clears his throat.

			NIMZIKI
	Uh, excuse me, Mr. President, but
	that's not entirely accurate.
</code></pre>

</div>

<p>Here&rsquo;s my imagined script from the OpenAI movie featuring character Sam Altman:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <pre><code>For the first time in a long time, the ChatGPT+ user smiles.

			CHATGPT+ SUBSCRIBER
	Regardless of what the tabloids
	have said, OpenAI doesn't train
	using its paid subscribers' chats.
	Take my word for it, my chats
	aren't ending up in OpenAI's model.

Chief of Venture Altman suddenly clears his throat.

			ALTMAN
	Uh, excuse me, Mr. Subscriber, but
	that's not entirely accurate.
</code></pre>

</div>

<p>OpenAI&rsquo;s weasel move? Technically, ChatGPT+ does allow subscribers to turn off train-the-model-using-my-data. But only if the subscriber turns off one of ChatGPT+&rsquo;s most valuable features, <code>Chat history</code>, which gives total recall of all past chats, allowing you to continue the right conversation right where you left off.</p>
<p>So sure, <em>technically</em> you <em>can</em> preserve privacy. All you have to do is turn off a feature which I&rsquo;d argue is ChatGPT+&rsquo;s most valuable addition to basic chatting. Here&rsquo;s the Settings dialog:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/really-openai/chatgptplus-settings.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/chatgptplus-settings_hu7599713760216561192.webp 320w, /blog/really-openai/chatgptplus-settings_hu16540195523136225940.webp 640w, /blog/really-openai/chatgptplus-settings_hu9289485602936297438.webp 768w, /blog/really-openai/chatgptplus-settings_hu15120095099153122856.webp 1024w, /blog/really-openai/chatgptplus-settings_hu11326927866136649228.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/chatgptplus-settings_hu12636806817147812377.jpg 320w, /blog/really-openai/chatgptplus-settings_hu7103966425324840714.jpg 640w, /blog/really-openai/chatgptplus-settings_hu18160948476520384226.jpg 768w, /blog/really-openai/chatgptplus-settings_hu4801097128387624069.jpg 1024w, /blog/really-openai/chatgptplus-settings_hu9933616012614821163.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/really-openai/chatgptplus-settings_hu7103966425324840714.jpg" width="1462" height="912" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Here&rsquo;s the More Information page:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/really-openai/chatgptplus-data-controls-faq.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/chatgptplus-data-controls-faq_hu11101950513211950001.webp 320w, /blog/really-openai/chatgptplus-data-controls-faq_hu17239284267726013162.webp 640w, /blog/really-openai/chatgptplus-data-controls-faq_hu15167245785392676035.webp 768w, /blog/really-openai/chatgptplus-data-controls-faq_hu17303298856551443557.webp 1024w, /blog/really-openai/chatgptplus-data-controls-faq_hu16747372060240263998.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/chatgptplus-data-controls-faq_hu6590479934209787195.jpg 320w, /blog/really-openai/chatgptplus-data-controls-faq_hu5357691297410337895.jpg 640w, /blog/really-openai/chatgptplus-data-controls-faq_hu16702120279962855102.jpg 768w, /blog/really-openai/chatgptplus-data-controls-faq_hu18338601289139051916.jpg 1024w, /blog/really-openai/chatgptplus-data-controls-faq_hu17205345213122469976.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/really-openai/chatgptplus-data-controls-faq_hu5357691297410337895.jpg" width="1338" height="1418" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Despite OpenAI&rsquo;s words that make it seem like &ldquo;we had to do this!&rdquo;, there&rsquo;s absolutely no technical justification. This is not a feature that requires model training. This is just OpenAI preserving the ability to say &ldquo;Subscribers can easily turn that off!&rdquo; while guaranteeing that most won&rsquo;t.</p>
<p>Shame on you, OpenAI. And by the way, you&rsquo;re shooting yourself in the foot. What a great incentive to find an alternative that doesn&rsquo;t force this ridiculous choice on their paying customers. I&rsquo;m already mulling workarounds.</p>
<div class="flex justify-evenly"><div class="w-[15%] mx-2 flex justify-center"><a href="/blog/really-openai/weasel-words.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/weasel-words_hu10193042854199681085.webp 320w, /blog/really-openai/weasel-words_hu1445983781549493554.webp 640w, /blog/really-openai/weasel-words_hu3355899283314269240.webp 768w, /blog/really-openai/weasel-words_hu9125180995987912684.webp 1024w, /blog/really-openai/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/weasel-words_hu4367553655072530837.jpg 320w, /blog/really-openai/weasel-words_hu7107455242432251322.jpg 640w, /blog/really-openai/weasel-words_hu8204489333288044902.jpg 768w, /blog/really-openai/weasel-words_hu7456430052057178392.jpg 1024w, /blog/really-openai/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/blog/really-openai/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/blog/really-openai/weasel-words.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/weasel-words_hu10193042854199681085.webp 320w, /blog/really-openai/weasel-words_hu1445983781549493554.webp 640w, /blog/really-openai/weasel-words_hu3355899283314269240.webp 768w, /blog/really-openai/weasel-words_hu9125180995987912684.webp 1024w, /blog/really-openai/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/weasel-words_hu4367553655072530837.jpg 320w, /blog/really-openai/weasel-words_hu7107455242432251322.jpg 640w, /blog/really-openai/weasel-words_hu8204489333288044902.jpg 768w, /blog/really-openai/weasel-words_hu7456430052057178392.jpg 1024w, /blog/really-openai/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/blog/really-openai/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/blog/really-openai/weasel-words.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/weasel-words_hu10193042854199681085.webp 320w, /blog/really-openai/weasel-words_hu1445983781549493554.webp 640w, /blog/really-openai/weasel-words_hu3355899283314269240.webp 768w, /blog/really-openai/weasel-words_hu9125180995987912684.webp 1024w, /blog/really-openai/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/weasel-words_hu4367553655072530837.jpg 320w, /blog/really-openai/weasel-words_hu7107455242432251322.jpg 640w, /blog/really-openai/weasel-words_hu8204489333288044902.jpg 768w, /blog/really-openai/weasel-words_hu7456430052057178392.jpg 1024w, /blog/really-openai/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/blog/really-openai/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[15%] mx-2 flex justify-center"><a href="/blog/really-openai/weasel-words.png"><picture>
    <source type="image/webp" srcset="/blog/really-openai/weasel-words_hu10193042854199681085.webp 320w, /blog/really-openai/weasel-words_hu1445983781549493554.webp 640w, /blog/really-openai/weasel-words_hu3355899283314269240.webp 768w, /blog/really-openai/weasel-words_hu9125180995987912684.webp 1024w, /blog/really-openai/weasel-words_hu6756663060043024720.webp 1280w" sizes="6vw" />
    <source type="image/jpeg" srcset="/blog/really-openai/weasel-words_hu4367553655072530837.jpg 320w, /blog/really-openai/weasel-words_hu7107455242432251322.jpg 640w, /blog/really-openai/weasel-words_hu8204489333288044902.jpg 768w, /blog/really-openai/weasel-words_hu7456430052057178392.jpg 1024w, /blog/really-openai/weasel-words_hu1656109304472754499.jpg 1280w" sizes="6vw" />
    
      <img src="/blog/really-openai/weasel-words_hu7107455242432251322.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>How to Ask ChatGPT a Technical Question (BoorishBears on Hacker News)</title>
      <link>https://craftycto.com/quote/how-to-ask-chatgpt-a-tech-question/</link>
      <pubDate>Fri, 07 Jul 2023 07:45:32 -0500</pubDate>
      
      <guid>https://craftycto.com/quote/how-to-ask-chatgpt-a-tech-question/</guid>
      <description>Any time you ask ChatGPT a technical question on something you&amp;#39;re not familiar with it should be three parts: 1- What are the considerations?; 2- Implement it with the considerations; 3- Did we forget anything?</description>
      <content:encoded><![CDATA[<p>This was in the context of a link to someone training / fine-tuning an LLM for the full corpus of AWS documentation. Many pointed out that ChatGPT probably does it better; lots of whining about &ldquo;but ChatGPT gives me wrong answers, boo hoo hoo,&rdquo; and then this gem. This gets it exactly right: one needs to skillfully guide ChatGPT and the results will be 10X better.</p>
<p>The full comment includes an example:</p>
<p><em>BoorishBears 10 hours ago | parent | context | favorite | on: AI for AWS Documentation</em></p>
<blockquote>
<p>Any time you ask ChatGPT a technical question on something you&rsquo;re not familiar with it should be three parts:</p>
<ul>
<li>
<p>What are the considerations?</p>
</li>
<li>
<p>Implement it with the considerations</p>
</li>
<li>
<p>Did we forget anything?</p>
</li>
</ul>
<p>It understands the need for a proxy from step 1:</p>
<p><a href="https://chat.openai.com/share/7ca37130-a771-457c-8742-a5f941">https://chat.openai.com/share/7ca37130-a771-457c-8742-a5f941</a>&hellip;</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Lone Banana Problem</title>
      <link>https://craftycto.com/elsewhere/lone-banana-problem/</link>
      <pubDate>Wed, 05 Jul 2023 07:52:12 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/lone-banana-problem/</guid>
      <description>Some images are tough to write prompts for in your favorite Art AI</description>
      <content:encoded><![CDATA[<p>The example here is trying to get Midjourney to produce an image of a single banana&mdash;as opposed to a bunch of two or more. I&rsquo;ve hit this class of problem many times in my use of Midjourney, and as the article points out, subtle differences in the prompt can lead to success. A <a href="https://news.ycombinator.com/item?id=36582937">Hacker News commenter</a> pointed out another case, &ldquo;Three cats in a trenchcoat standing on each other&rsquo;s shoulders, pretending to be a human, Vincent Adultman style,&rdquo; which is also practically impossible to get out of Midjourney.</p>
<p>Another commenter points out that the language models front-ending tools like Midjourney are small and quite limited compared to LLM models like LLaMA, let alone GPT-4, and points to <a href="https://bair.berkeley.edu/blog/2023/05/23/lmd/">this paper</a> where a larger model enhances prompt understanding.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Pagefind From CloudCannon</title>
      <link>https://craftycto.com/micro/pagefind-from-cloudcannon/</link>
      <pubDate>Mon, 03 Jul 2023 20:48:21 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/pagefind-from-cloudcannon/</guid>
      <description>A lovely self-hosted site search for SSGs like Hugo</description>
      <content:encoded><![CDATA[<p>After fixing my <a href="/micro/hugo-responsive-images/">image processing woes</a>, I decided to tackle site search. I actually have enough content between larger essays and smaller micro formats that I&rsquo;m having trouble finding my own stuff.</p>
<p>I surveyed the field, which included local JS options such as lunr.js and fuse.js, as well as external options like Algolia. Then I decided to check what <a href="https://www.brycewray.com/">Bryce Wray</a> uses. It turns out that Bryce uses <a href="https://pagefind.app/">Pagefind</a> from <a href="https://cloudcannon.com/">CloudCannon</a>, and he <a href="https://www.brycewray.com/posts/2022/07/pagefind-quite-find-site-search/">wrote extensively on why</a>. Sold!</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/images/crafty-search-2.png"><picture>
    <source type="image/webp" srcset="/images/crafty-search-2_hu17942042381807495801.webp 320w, /images/crafty-search-2_hu10566809006348322710.webp 640w, /images/crafty-search-2_hu932593793773119956.webp 768w, /images/crafty-search-2_hu6135997073728883065.webp 1024w, /images/crafty-search-2_hu6596604856573607466.webp 1280w, /images/crafty-search-2_hu717137101980015058.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/images/crafty-search-2_hu1396455208462577635.jpg 320w, /images/crafty-search-2_hu12626489336952323547.jpg 640w, /images/crafty-search-2_hu5939444106785098604.jpg 768w, /images/crafty-search-2_hu10582659611243092369.jpg 1024w, /images/crafty-search-2_hu368287164076034582.jpg 1280w, /images/crafty-search-2_hu2736314165733863326.jpg 1536w" sizes="75vw" />
    
      <img src="/images/crafty-search-2_hu12626489336952323547.jpg" width="1748" height="1986" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Pagefind is designed for Static Site Generators (SSGs) like <a href="https://gohugo.io/">Hugo</a>. The way it works is, you first run the normal Hugo build, which generates all of your site&rsquo;s static HTML; then you follow with the Pagefind build, which indexes that HTML content. At runtime, Pagefind provides some simple JS scripts to hit the index and provide results. It was a straightforward to set it up and then fine-tune the index a bit to get only the content I wanted to show up when searching. You can see it in action <a href="/search/">here</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hugo Responsive Images, Thanks to Bryce and ChatGPT</title>
      <link>https://craftycto.com/micro/hugo-responsive-images/</link>
      <pubDate>Sat, 01 Jul 2023 20:19:51 -0500</pubDate>
      
      <guid>https://craftycto.com/micro/hugo-responsive-images/</guid>
      <description>TIL how the html `picture` element actually works ...</description>
      <content:encoded><![CDATA[<p>I&rsquo;d been using a community Hugo module that supposedly enabled responsive images. I discovered recently that it was always serving up the <strong>lowest resolution</strong> images being served up.</p>
<p>Active Hugo community member <a href="https://www.brycewray.com/">Bryce Wray</a> has written about Hugo responsive images. So yesterday I made an attempt to implement his approach and was 75% there when I discovered that it was, ironically, always serving up the <strong>highest resolution</strong> images. (My problem, not Bryce&rsquo;s).</p>
<p>Today I learned how all the subelements and attributes of the html <code>picture</code> element actually work, and have my own image shortcode and underlying partial that makes it all work deliciously. The approach is Bryce&rsquo;s, adapted for my special needs, primarily the need to support 1 to N images; multiple images render horizontally such as:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/images/moat.png"><picture>
    <source type="image/webp" srcset="/images/moat_hu800728828131225966.webp 320w, /images/moat_hu11066237045059060878.webp 640w, /images/moat_hu13907264749632164748.webp 768w, /images/moat_hu10921822719433154473.webp 1024w, /images/moat_hu11615355278478495796.webp 1280w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/moat_hu12458762601674379950.jpg 320w, /images/moat_hu9818016194817921493.jpg 640w, /images/moat_hu10878176353770080139.jpg 768w, /images/moat_hu11676005264137116804.jpg 1024w, /images/moat_hu16175169012989805244.jpg 1280w" sizes="25vw" />
    
      <img src="/images/moat_hu9818016194817921493.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/images/moat-busters-1.png"><picture>
    <source type="image/webp" srcset="/images/moat-busters-1_hu8649522837849795373.webp 320w, /images/moat-busters-1_hu14823036772981146364.webp 640w, /images/moat-busters-1_hu13005768306468892258.webp 768w, /images/moat-busters-1_hu3425641506067909074.webp 1024w, /images/moat-busters-1_hu8074023545297122064.webp 1280w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/moat-busters-1_hu17404479499605965784.jpg 320w, /images/moat-busters-1_hu3971917705758056247.jpg 640w, /images/moat-busters-1_hu8043959606210309229.jpg 768w, /images/moat-busters-1_hu15688685871596371997.jpg 1024w, /images/moat-busters-1_hu14766086641300020695.jpg 1280w" sizes="25vw" />
    
      <img src="/images/moat-busters-1_hu3971917705758056247.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/images/moat-busters-2.png"><picture>
    <source type="image/webp" srcset="/images/moat-busters-2_hu14099124836094777862.webp 320w, /images/moat-busters-2_hu9514762968313483802.webp 640w, /images/moat-busters-2_hu17274522680061183321.webp 768w, /images/moat-busters-2_hu17784367587119547726.webp 1024w, /images/moat-busters-2_hu5893102388120647933.webp 1280w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/moat-busters-2_hu13230430722200122194.jpg 320w, /images/moat-busters-2_hu3074648547673109485.jpg 640w, /images/moat-busters-2_hu2738573436844937552.jpg 768w, /images/moat-busters-2_hu12290922491654431863.jpg 1024w, /images/moat-busters-2_hu5955185999950722517.jpg 1280w" sizes="25vw" />
    
      <img src="/images/moat-busters-2_hu3074648547673109485.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Takeways:</p>
<ul>
<li>Hugo&rsquo;s <a href="https://gohugo.io/content-management/image-processing/">image processing</a> is really powerful. The three source images above were pngs downloaded right from Midjourney, never touching Pixelmator Pro. They are 1456px wide and weigh in at 2MB each. But thanks to Hugo, you&rsquo;re likely seeing a 640px webp version&mdash;24KB! (The webp image format gets a lot of credit also.)</li>
<li>ChatGPT (GPT-4 model) continues to be incredibly powerful as <a href="/blog/unlimited-stupid-questions/">my pair programmer</a>. For example, when I needed to really understand why my <code>picture</code> output wasn&rsquo;t doing what it should, it gave very accurate guidance. I&rsquo;d guess that my speed was at least doubled on this little project.</li>
<li>Midjourney 5.2&rsquo;s zoom out function is a lot of fun. Here&rsquo;s the right image above at 2x and 4x zoom out:</li>
</ul>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/images/moat-busters-2-zoom-out-2.png"><picture>
    <source type="image/webp" srcset="/images/moat-busters-2-zoom-out-2_hu15657662987988386853.webp 320w, /images/moat-busters-2-zoom-out-2_hu15840579668771718871.webp 640w, /images/moat-busters-2-zoom-out-2_hu15862225539238556483.webp 768w, /images/moat-busters-2-zoom-out-2_hu1487170466272798853.webp 1024w, /images/moat-busters-2-zoom-out-2_hu17886675250830668268.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/images/moat-busters-2-zoom-out-2_hu15270588604201071244.jpg 320w, /images/moat-busters-2-zoom-out-2_hu15037817583301846933.jpg 640w, /images/moat-busters-2-zoom-out-2_hu941973693878125834.jpg 768w, /images/moat-busters-2-zoom-out-2_hu8902217543060321444.jpg 1024w, /images/moat-busters-2-zoom-out-2_hu100757413909930364.jpg 1280w" sizes="100vw" />
    
      <img src="/images/moat-busters-2-zoom-out-2_hu15037817583301846933.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/images/moat-busters-2-zoom-out-4.png"><picture>
    <source type="image/webp" srcset="/images/moat-busters-2-zoom-out-4_hu2503011182364829184.webp 320w, /images/moat-busters-2-zoom-out-4_hu14808243308650518575.webp 640w, /images/moat-busters-2-zoom-out-4_hu8696154297763140638.webp 768w, /images/moat-busters-2-zoom-out-4_hu7768876023256613952.webp 1024w, /images/moat-busters-2-zoom-out-4_hu11521798618007158807.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/images/moat-busters-2-zoom-out-4_hu16553201716628763999.jpg 320w, /images/moat-busters-2-zoom-out-4_hu1402733125940913348.jpg 640w, /images/moat-busters-2-zoom-out-4_hu1707800172007602140.jpg 768w, /images/moat-busters-2-zoom-out-4_hu6651124669099073710.jpg 1024w, /images/moat-busters-2-zoom-out-4_hu1220585408834962558.jpg 1280w" sizes="100vw" />
    
      <img src="/images/moat-busters-2-zoom-out-4_hu1402733125940913348.jpg" width="1456" height="816" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Of Moats and Moat Busters</title>
      <link>https://craftycto.com/blog/moat-busters/</link>
      <pubDate>Thu, 29 Jun 2023 00:39:33 -0500</pubDate>
      
      <guid>https://craftycto.com/blog/moat-busters/</guid>
      <description>Open Source, Commercial-friendly AI Challenges the Major Closed AI Players</description>
      <content:encoded><![CDATA[<p>I did a micro-post recently, <a href="https://craftycto.com/quote/mpt7b-gatsby/">MosaicML&rsquo;s Open Source MPT-7B Model Writes an Epilogue to The Great Gatsby</a>. I was a bit puzzled, though, that MPT-7B was showing up as current news, since its release happened in May. I started pulling on that thread and it unravelled interestingly.</p>
<h2 id="mosaicml-mpt-30b-and-mpt-7b-models">MosaicML MPT-30B and MPT-7B Models</h2>
<p>First off&mdash;it wasn&rsquo;t the <a href="https://www.mosaicml.com/blog/mpt-7b">MPT-7B model</a> that was the news over the past week, it was <a href="https://www.mosaicml.com/blog/mpt-30b">MPT-30B</a>, announced June 22nd. 30 stands for 30 billion parameters, up from 7 billion in the MPT-7B model, with a corresponding increase in capabilities. This chart from MosaicML compares the two models&rsquo; capabilities:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314.png"><picture>
    <source type="image/webp" srcset="/649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu16184823108993914282.webp 320w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu878293261205751347.webp 640w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu1663195543012467079.webp 768w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu1810878612893600591.webp 1024w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu106298049774620617.webp 1280w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu5760748504144253219.webp 1536w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu16863189409767442184.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu9452616116108179313.jpg 320w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu3168038158310948310.jpg 640w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu6238040129646886723.jpg 768w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu7762055153654854757.jpg 1024w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu21128608610373971.jpg 1280w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu11841311085261884049.jpg 1536w, /649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu16177445975038116907.jpg 1920w" sizes="100vw" />
    
      <img src="/649461607eb7256eea19cada_Screenshot%202023-06-22%20at%207.57.26%20AM_4106895093999444314_hu3168038158310948310.jpg" width="2298" height="1378" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>MPT-30B isn&rsquo;t benchmarked completely on the <a href="https://lmsys.org/blog/2023-06-22-leaderboard/">LMSYS leaderboard</a>, but 7B is there and competitive.</p>
<h2 id="mosaicmls-revenue-model-isnt-models">MosaicML&rsquo;s Revenue Model Isn&rsquo;t Models</h2>
<p>Counterintuitively, although MPT-30B and 7B come from MosaicML, models aren&rsquo;t the product, but rather enablers of Mosaic&rsquo;s actual products&mdash;training and inference services. Here&rsquo;s how Mosaic describes themselves on their <a href="https://www.mosaicml.com/">homepage</a>:</p>
<pre tabindex="0"><code>Generative AI for All
Easily train and deploy generative AI models on your data, in your secure environment.
Build your next model / transformation / disruption / innovation.
</code></pre><p>And when you look under the Products menu, you see:</p>
<pre tabindex="0"><code>Products / Training
Products / Inference
</code></pre><p>And finally, the language of Mosaic&rsquo;s announcement post for MPT-30B is telling as well:</p>
<pre tabindex="0"><code>[Mosaic Logo] Foundation Series
MPT-30B
Open-source LLM.
Commercially licensed.
More Powerful.
</code></pre><p>MPT-30B and 7B are fully open source, ready-to use LLMs&mdash;pre-trained, fine-tunable, inference-ready, open training data, the works. They build upon the solid foundation of open source / open data projects that come out of a vibrant AI open source community.</p>
<p>Hmmm, this seems familiar, where have we heard about the power of the AI open source community recently &hellip; oh yes, the leaked Google document! Re-reading it again today, it&rsquo;s as insightful as ever and worth another look.</p>
<h2 id="the-leaked-google-memo">The Leaked Google Memo</h2>
<p>On May 4th, SemiAnalysis, a boutique semiconductor research and consulting firm, <a href="https://www.semianalysis.com/p/google-we-have-no-moat-and-neither">published a leaked internal document</a> authored by a Google researcher. It has a powerful lead paragraph:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h2 id="we-have-no-moat">We Have No Moat</h2>
<h3 id="and-neither-does-openai">And neither does OpenAI</h3>
<p>We’ve done a lot of looking over our shoulders at OpenAI. Who will cross the next milestone? What will the next move be?</p>
<p>But the uncomfortable truth is, <em>we aren’t positioned to win this arms race and neither is OpenAI</em>. While we’ve been squabbling, a third faction has been quietly eating our lunch.</p>
<p>I’m talking, of course, about open source. Plainly put, they are lapping us. <strong>Things we consider “major open problems” are solved and in people’s hands today.</strong></p>

</div>

<p>Both Google, and comparative upstart OpenAI, had strategies based around closed models, proprietary datasets, and eight-to-nine figure training investments. The during the madness of March, that entire strategy broke down.</p>
<p>The document continues:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p><strong>Things we consider “major open problems” are solved and in people’s hands today.</strong> Just to name a few:</p>
<ul>
<li>LLMs on a Phone: <a href="https://twitter.com/thiteanish/status/1635678053853536256">People are running foundation models on a Pixel 6 at 5 tokens / sec.</a></li>
<li>Scalable Personal AI: <a href="https://github.com/tloen/alpaca-lora">You can finetune a personalized AI on your laptop in an evening</a>.</li>
<li>Responsible Release: This one isn’t “solved” so much as “obviated”. <a href="https://civitai.com/">There are entire websites full of art models with no restrictions whatsoever</a>, and text is <a href="https://medium.com/geekculture/list-of-open-sourced-fine-tuned-large-language-models-llm-8d95a2e0dc76">not far behind</a>.</li>
<li>Multimodality: <a href="https://arxiv.org/pdf/2303.16199.pdf">The current multimodal ScienceQA SOTA was trained in an hour</a>.</li>
</ul>
</div>

<p>So during <a href="/blog/march-madness-ai/">AI March Madness</a>, the open source AI community solved four major problems that Google had on their &ldquo;these will be tough&rdquo; list.</p>
<p>Where does that leave Google?</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <p>While our models still hold a slight edge in terms of quality, the <a href="https://arxiv.org/pdf/2303.16199.pdf">gap is closing astonishingly quickly</a>. Open-source models are faster, more customizable, more private, and pound-for-pound more capable. They are <a href="https://lmsys.org/blog/2023-03-30-vicuna/">doing things with $100 and 13B params</a> that we struggle with at $10M and 540B. And they are doing so in weeks, not months. This has profound implications for us:</p>
<ul>
<li>
<p><strong>We have no secret sauce.</strong> Our best hope is to learn from and collaborate with what others are doing outside Google. We should prioritize enabling 3P integrations.</p>
</li>
<li>
<p><strong>People will not pay for a restricted model when free, unrestricted alternatives are comparable in quality.</strong> We should consider where our value add really is.</p>
</li>
<li>
<p><strong>Giant models are slowing us down.</strong> In the long run, the best models are the ones which can be iterated upon quickly. We should make small variants more than an afterthought, now that we know what is possible in the &lt;20B parameter regime.</p>
</li>
</ul>

</div>

<p>This chart shows the accelerating pace of breakthroughs by the open source AI community:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362.png"><picture>
    <source type="image/webp" srcset="/241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu10352095797403866859.webp 320w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu10277395420372628673.webp 640w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu13613937395766667160.webp 768w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu12961778801510254180.webp 1024w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu4499467357804564890.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu3559346091761965618.jpg 320w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu9810721903374972712.jpg 640w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu3919869248157497508.jpg 768w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu17609714732381645551.jpg 1024w, /241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu5878894342071147856.jpg 1280w" sizes="100vw" />
    
      <img src="/241fe3ef-3919-4a63-9c68-9e2e77cc2fc0_1366x588_2676769290403132362_hu9810721903374972712.jpg" width="1366" height="588" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Repeat the phrase &ldquo;doing things with $100 and 13B params that we struggle with at $10M and 540B&rdquo; ten times fast&mdash;that&rsquo;s the sound of the moat drying up and the alligators leaving town.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/moat-busters/moat-breakdown.webp"><picture>
    <source type="image/webp" srcset="/blog/moat-busters/moat-breakdown_hu1221539884714853617.webp 320w, /blog/moat-busters/moat-breakdown_hu5492326903479720956.webp 640w, /blog/moat-busters/moat-breakdown_hu2010069893684693282.webp 768w, /blog/moat-busters/moat-breakdown_hu13976383841417415507.webp 1024w, /blog/moat-busters/moat-breakdown_hu14339302420005658995.webp 1280w, /blog/moat-busters/moat-breakdown_hu9125647074210256587.webp 1536w, /blog/moat-busters/moat-breakdown_hu2388952999487096213.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/moat-busters/moat-breakdown_hu15280952768222399182.jpg 320w, /blog/moat-busters/moat-breakdown_hu7464289823012308129.jpg 640w, /blog/moat-busters/moat-breakdown_hu18070714146671886595.jpg 768w, /blog/moat-busters/moat-breakdown_hu17762334643364345184.jpg 1024w, /blog/moat-busters/moat-breakdown_hu16889321486441972727.jpg 1280w, /blog/moat-busters/moat-breakdown_hu17384015537973229982.jpg 1536w, /blog/moat-busters/moat-breakdown_hu5727010296699594991.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/moat-busters/moat-breakdown_hu7464289823012308129.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="what-lit-the-fuse">What Lit the Fuse?</h2>
<p>This is a well-written document, top to bottom. Here&rsquo;s its concise explanation of what happened to enable the open source AI acceleration:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h2 id="what-happened">What Happened</h2>
<p>At the beginning of March the open source community <a href="https://www.vice.com/en/article/xgwqgw/facebooks-powerful-large-language-model-leaks-online-4chan-llama">got their hands on</a> their first really capable foundation model, as Meta’s LLaMA was leaked to the public. It had no instruction or conversation tuning, and no RLHF. Nonetheless, the community immediately understood the significance of what they had been given.</p>
<p>A tremendous outpouring of innovation followed, with just days between major developments (see The Timeline for the full breakdown). Here we are, barely a month later, and there are variants with <a href="https://crfm.stanford.edu/2023/03/13/alpaca.html">instruction tuning</a>, <a href="https://github.com/ggerganov/llama.cpp">quantization</a>, <a href="https://lmsys.org/blog/2023-03-30-vicuna/">quality improvements</a>, <a href="https://arxiv.org/pdf/2303.16199.pdf">human evals</a>, <a href="https://arxiv.org/pdf/2303.16199.pdf">multimodality</a>, <a href="https://drive.google.com/file/d/10iR5hKwFqAKhL3umx8muOWSRm7hs5FqX/view">RLHF</a>, etc. etc. many of which build on each other.</p>
<p>Most importantly, <a href="https://github.com/tloen/alpaca-lora">they have solved the scaling problem</a> to the extent that anyone can tinker. Many of the new ideas are from ordinary people. The barrier to entry for training and experimentation has dropped from the total output of a major research organization to one person, an evening, and a beefy laptop.</p>

</div>

<p>The details of &ldquo;got their hands on&rdquo; are critical. On March 10th, Meta did a limited release of their LLaMA model, to researchers only, and with non-commercial-use license. This in and of itself was a huge move, as no model of LLaMA&rsquo;s scale and power had ever been released in its entirety, even to a limited researchers-only audience. But then, just a few days later, the same complete model was leaked publicly. So the entire AI open source community now had a complete large-scale model. Then followed the &ldquo;tremendous outpouring of innovation.&rdquo;</p>
<h2 id="coulda-shoulda">Coulda Shoulda</h2>
<p>The document makes clear that Google coulda, shoulda known this was inevitable, once the open source community got total access to both code and model weights of a full-scale language model, because just six months earlier, a virtually identical emergence occurred in the image generation (art AI) space:</p>
<div class="prose bg-gray-800 px-4 py-[1px] border-l-4 border-blue-500 prose-h1:text-sky-200 prose-h2:text-sky-300 prose-h3:text-sky-400 prose-h4:text-sky-500 prose-p:text-sky-400 prose-ul:text-sky-400 prose-strong:text-sky-400 prose-ul-li:text-sky-400 prose-a:text-sky-400">
  <h2 id="why-we-could-have-seen-it-coming">Why We Could Have Seen It Coming</h2>
<p>In many ways, this shouldn’t be a surprise to anyone. The current renaissance in open source LLMs comes hot on the heels of a renaissance in image generation. The similarities are not lost on the community, with many calling this the “<a href="https://simonwillison.net/2023/Mar/11/llama/">Stable Diffusion moment</a>” for LLMs.</p>
<p>In both cases, low-cost public involvement was enabled by a vastly cheaper mechanism for fine tuning called <a href="https://arxiv.org/abs/2106.09685">low rank adaptation</a>, or LoRA, combined with a significant breakthrough in scale (<a href="https://arxiv.org/abs/2112.10752">latent diffusion</a> for image synthesis, <a href="https://arxiv.org/abs/2203.15556">Chinchilla</a> for LLMs). In both cases, access to a sufficiently high-quality model kicked off a flurry of ideas and iteration from individuals and institutions around the world. In both cases, this quickly outpaced the large players.</p>
<p>These contributions were pivotal in the image generation space, setting Stable Diffusion on a different path from Dall-E. Having an open model led to <a href="https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin">product integrations</a>, <a href="https://civitai.com/">marketplaces</a>, <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui">user interfaces</a>, and <a href="https://stablediffusionweb.com/ControlNet">innovations</a> that didn’t happen for Dall-E.</p>
<p>The effect was palpable: <a href="https://trends.google.com/trends/explore?date=2022-08-01%202023-04-10&amp;q=Stable%20Diffusion,Dall-E&amp;hl=en">rapid domination</a> in terms of cultural impact vs the OpenAI solution, which became increasingly irrelevant. Whether the same thing will happen for LLMs remains to be seen, but the broad structural elements are the same.</p>

</div>

<p>The rapid domination Google Trends chart cited above focuses on Google&rsquo;s Dall-E being rapidly overtaken by upstart Stable Diffusion; but let&rsquo;s add Midjourney to the chart for even more fun:</p>

<script type="text/javascript" src="https://ssl.gstatic.com/trends_nrtr/3349_RC01/embed_loader.js"></script> <script type="text/javascript"> trends.embed.renderExploreWidget("TIMESERIES", {"comparisonItem":[{"keyword":"Stable Diffusion","geo":"","time":"2022-08-01 2023-06-28"},{"keyword":"Dall-E","geo":"","time":"2022-08-01 2023-06-28"},{"keyword":"midjourney","geo":"","time":"2022-08-01 2023-06-28"}],"category":0,"property":""}, {"exploreQuery":"date=2022-08-01%202023-06-28&q=Stable%20Diffusion,Dall-E,midjourney&hl=en","guestPath":"https://trends.google.com:443/trends/embed/"}); </script>

<p>In the art AI space, Midjourney was the little guy&rsquo;s little guy, and now they&rsquo;re absolutely killing it.</p>
<h2 id="bringing-it-back-to-mosaicml">Bringing it Back to MosaicML</h2>
<p>There&rsquo;s more to the leaked document, all of it good and <a href="https://www.semianalysis.com/p/google-we-have-no-moat-and-neither">worth re-reading</a>, but I think we&rsquo;ve pulled on the thread long enough and can return to where our story began with MosaicML. If Google, OpenAI, and other deeply-funded closed-AI players are at risk of having no moat, then MosaicML is one of a myriad of open-source-based entities whose business is keeping the AI world moat-free.</p>
<p>And look at the timeline of all of this:</p>
<ul>
<li>December 2020-ish: MosaicML formed (stealth)</li>
<li>October 13, 2021: Mosaic comes out of stealth, with the mission: reduce the cost of training neural network models</li>
<li>August 22nd 2022: &ldquo;Stable Diffusion Moment&rdquo; for art AIs</li>
<li>October 18th 2022: Mosaic launches pillar one, their training service</li>
<li>November 22nd 2022: OpenAI launches ChatGPT</li>
<li>March 10th: Meta announces LLaMA and makes a limited release to researchers</li>
<li>Mid-March: The entire LLaMA model complete with weights leaks publicly</li>
<li>May 3rd: Mosaic launches pillar two, their inference service</li>
<li>May 5th: Mosaic releases MPT-7B and strongly emphasizes open source and commercial-friendly licensing</li>
<li>May 10th: the internal Google document leaks</li>
<li>June 22nd: Mosaic releases MPT-30B</li>
<li>June 26th: See below!</li>
</ul>
<h2 id="late-breaking-news-june-26th">Late Breaking News (June 26th)</h2>
<p>Here&rsquo;s a fun chaser&mdash;news that happened as I was in the midst of writing this:</p>
<blockquote>
<p><a href="https://www.databricks.com/">Databricks</a> is acquiring MosaicML in a stock deal valued at $1.3 billion, a move intended to democratize AI. The deal, announced on June 26, includes retention packages, and all 62 of MosaicML’s employees are expected to stay. The transaction is slated to close in July. Neither Databricks nor MosaicML used an outside investment bank on the deal.</p>
</blockquote>
<p><em>(ChatGPT summary, not an official release)</em></p>
<p>I have zero inside knowledge, but I&rsquo;m willing to bet that MosaicML&rsquo;s valuation took a giant hockey-stick leap thanks to the open source AI emergence of the past few months. That emergence, of course, was only the latest ratchet-up in a series of accelerations that began with the Stable Diffusion Moment and ChatGPT in summer to fall 2022.</p>
<p>In any case, congrats to the MosaicML and Databricks teams! Sally forth and bust some moats!
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/moat-busters/moat-busters.webp"><picture>
    <source type="image/webp" srcset="/blog/moat-busters/moat-busters_hu15764793128844448956.webp 320w, /blog/moat-busters/moat-busters_hu15957034928600261381.webp 640w, /blog/moat-busters/moat-busters_hu6917005677287080997.webp 768w, /blog/moat-busters/moat-busters_hu17923972720020401869.webp 1024w, /blog/moat-busters/moat-busters_hu15685594746704832263.webp 1280w, /blog/moat-busters/moat-busters_hu3444481768053857706.webp 1536w, /blog/moat-busters/moat-busters_hu2692221968464245246.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/moat-busters/moat-busters_hu7937864963603887994.jpg 320w, /blog/moat-busters/moat-busters_hu870713034696091730.jpg 640w, /blog/moat-busters/moat-busters_hu14715481798277314735.jpg 768w, /blog/moat-busters/moat-busters_hu16602061227019424348.jpg 1024w, /blog/moat-busters/moat-busters_hu9127849986295200801.jpg 1280w, /blog/moat-busters/moat-busters_hu4488577838382560941.jpg 1536w, /blog/moat-busters/moat-busters_hu15013502890831674373.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/moat-busters/moat-busters_hu870713034696091730.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Steampunk? I prefer steamnoble.</title>
      <link>https://craftycto.com/imagery/steamnoble/</link>
      <pubDate>Wed, 28 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/imagery/steamnoble/</guid>
      <description>I love this medallion-type styling.</description>
      <content:encoded><![CDATA[<p>This reminds me of fox medallions I created in MidJourney before I changed direction to something simpler for the Crafty logo.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Midjourney V5.2 (Ars Technica)</title>
      <link>https://craftycto.com/elsewhere/midjourney-v52/</link>
      <pubDate>Sat, 24 Jun 2023 20:20:21 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/midjourney-v52/</guid>
      <description>This Midjourney update looks fantastic. I&amp;#39;m working on a Crafty&amp;#39;s Illustrated essay, and plan to give V5.2 a thorough workout when it&amp;#39;s time for imagery.</description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    
    <item>
      <title>Apt Description of React on Hacker News </title>
      <link>https://craftycto.com/quote/apt-description-of-react/</link>
      <pubDate>Thu, 22 Jun 2023 19:30:31 -0500</pubDate>
      
      <guid>https://craftycto.com/quote/apt-description-of-react/</guid>
      <description>React on the other hand feels like a pot warming up and we&amp;#39;re the frogs being boiled alive at this point. You can write some perfectly valid, but naive React code and it&amp;#39;s going to have some footguns. We&amp;#39;re so used to write idiomatic React code we don&amp;#39;t even notice that anymore. You learn to use stable references in callback functions, to be careful using Context, and so on. But the list is not short, and it only grows. --jankiel</description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    
    <item>
      <title>MosaicML&#39;s Open Source MPT-7B Model Writes an Epilogue to The Great Gatsby</title>
      <link>https://craftycto.com/quote/mpt7b-gatsby/</link>
      <pubDate>Thu, 22 Jun 2023 06:47:12 -0500</pubDate>
      
      <guid>https://craftycto.com/quote/mpt7b-gatsby/</guid>
      <description>I have lived so long in the shadow of this dream that I may never see the bright sunlight of reality. I may look up some morning and find that I am six feet under, and that Gatsby, who gave me the dream and everything else, will have vanished behind me. And so it was. I had hardly crossed the threshold of the old world when my eye caught the headlines of a newspaper; and I knew at once that my dream was over. I knew that Gatsby was dead ....</description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    
    <item>
      <title>Comparing Adobe Firefly, Dalle-2, OpenJourney, Stable Diffusion, and Midjourney</title>
      <link>https://craftycto.com/elsewhere/comparing-art-ais/</link>
      <pubDate>Wed, 21 Jun 2023 06:45:26 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/comparing-art-ais/</guid>
      <description>Muhammad Usman does a nice comparison of art AIs. To me, the richness of the outputs is amazing. I&amp;#39;m a heavy Midjourney user, and still prefer its output, though the alternatives are  impressive as well.</description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    
    <item>
      <title>Apple Vision Pro (Part 2) – Hardware Issues</title>
      <link>https://craftycto.com/elsewhere/karl-guttag-apple-vision-pro/</link>
      <pubDate>Mon, 19 Jun 2023 20:24:09 -0500</pubDate>
      
      <guid>https://craftycto.com/elsewhere/karl-guttag-apple-vision-pro/</guid>
      <description>Karl Guttag on the devil-in-the-details of Apple Vision Pro hardware.</description>
      <content:encoded><![CDATA[<p>Most of this is speculation&mdash;but it&rsquo;s well-informed, expert speculation. I expect Vision Pro will have its weaknesses like the original iPhone or Apple Watch, but this is prime Apple territory&ndash;introduce a product that&rsquo;s an order of magnitude better than anything that preceded it, albeit with weaknesses, and then refine &amp; advance.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>I-JEPA: The first AI model based on Yann LeCun’s vision for more human-like AI</title>
      <link>https://craftycto.com/elsewhere/meta-i-jepa/</link>
      <pubDate>Mon, 19 Jun 2023 20:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/meta-i-jepa/</guid>
      <description>As pointed out by Jesus Rodriguez on TheSequence, &amp;#34;With all the hype surrounding generative AI, we sometimes overlook the thrilling advancements in other areas of the deep learning ecosystem.&amp;#34; I-JEPA from Meta research is one such.</description>
      <content:encoded><![CDATA[<p>Meta, a company I generally detest, is making real contributions in AI, including significant (partly) open source efforts such as the LLAMA model, which has fueled massive independent development. I trust Meta &hellip; to do what&rsquo;s good for Meta alone, but in AI they&rsquo;re (probably accidentally) doing a lot of good.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Gnarly Hugo-Cloudflare Build Problem, Resolved</title>
      <link>https://craftycto.com/micro/hugo-cloudflare-build/</link>
      <pubDate>Sun, 18 Jun 2023 23:06:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/hugo-cloudflare-build/</guid>
      <description>I had Hugo builds running on Cloudflare for a day. Then, mysteriously, they stopped working.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been upgrading this site, piece by piece. The latest major series of changes had to do with supporting micro content types, such as the one you&rsquo;re reading right now, which is a &ldquo;micro.&rdquo; As part of this, I wanted to start running my Hugo site builds on Cloudflare Pages where this site is hosted. So rather than building locally and then sending the complete, fully-generated <code>/public</code> directory up to GitHub (which Cloudflare automatically picks up and publishes), I can send content updates only in the form of markdown files, and all the associated html etc. gets generated over on Cloudflare. And it worked! I was happy, for about a day. Then, for no apparent reason, it stopped working.</p>
<p>I was doing a lot of changes all at once, including upgrading Hugo versions and implementing the New Better Version of Tailwind CSS support in Hugo. And the build error message I was getting just didn&rsquo;t make sense:</p>
<pre tabindex="0"><code>22:00:23.069	ERROR 2023/06/06 03:00:23 render of &#34;page&#34; failed: 
&#34;/opt/buildhome/repo/layouts/_default/baseof.html:5:8&#34;: execute of template failed: template: _default/single.html:5:8: executing &#34;_default/single.html&#34; at &lt;partial &#34;head.html&#34; .&gt;: 
error calling partial: partial &#34;head.html&#34; timed out after 30s. 
This is most likely due to infinite recursion. If this is just a slow template, 
you can try to increase the &#39;timeout&#39; config setting.
22:00:25.922	Total in 49821 ms
</code></pre><p>Now, my local builds happen in a few hundred milliseconds, maybe as long as a couple of seconds; but timing out after 30 seconds? That can&rsquo;t be real! But the build does work fine and fast locally, so why would there be infinite recursion on Cloudflare? I assumed there must be some kind of environment difference, or some failure pulling my repo, etc. Chased that for days &hellip; finally reached out to the incredible <a href="https://www.brycewray.com/">Bryce Wray</a> who went way beyond the call of duty to help. Finally Bryce suggested, &ldquo;Why don&rsquo;t you increase the Hugo timeout to a really high number just to see what happens?&rdquo; And it worked! My builds on Cloudflare took something like 60-70 seconds versus milliseconds locally, but they worked. I showed Bryce the build stats:</p>
<pre tabindex="0"><code>16:02:02.470                       | EN   
16:02:02.470    -------------------+------
16:02:02.470      Pages            | 108  
16:02:02.470      Paginator pages  |  10  
16:02:02.470      Non-page files   |  65  
16:02:02.470      Static files     |  13  
16:02:02.470      Processed images | 329  
16:02:02.471      Aliases          |  29  
16:02:02.471      Sitemaps         |   1  
16:02:02.471      Cleaned          |   0  
16:02:02.471    
16:02:02.471    Total in 61877 ms
</code></pre><p>He took one look, and said &ldquo;Oh, I see what it is, it&rsquo;s all those images.&rdquo; Hugo does some wonderful image processing magic, and that logic is normally only triggered incrementally when a new image asset is added. But, thanks to an ill-advised entry in <code>.gitignore</code>, I had Cloudflare regenerating all my images from scratch on each build. So that little gitignore change was the root cause, the change that broken the build. Sheesh.</p>
<p>I fixed the gitignore issue, now image processing is back to incremental only, and builds are roughly 5 seconds.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Apple Really Did Ignore the AI Emergence at WWDC</title>
      <link>https://craftycto.com/micro/apple-did-it/</link>
      <pubDate>Sun, 18 Jun 2023 22:06:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/apple-did-it/</guid>
      <description>As I watched the WWDC Keynote and Platforms State of the Union from this year&amp;#39;s WWDC, I was amazed that Apple appeared to be ignoring the current massive emergence in generative AI. Later, I confirmed it.</description>
      <content:encoded><![CDATA[<p>So far I&rsquo;ve managed to watch the WWDC Keynote and Platforms State of the Union from this year&rsquo;s WWDC. At the time, I was amazed that Apple appeared to be ignoring the current massive emergence in generative AI. I figured, well, they&rsquo;ll dig into that in the deeper sessions later in the week. But sitting here 10 days post event, I&rsquo;m realizing that in the river of buzz flowing by about WWDC developments, I wasn&rsquo;t hearing anyone talk, at all, about Apple and AI. I used the Apple Developer app and did a bit of searching&mdash;kudos to Apple for having everything transcribed and searchable&mdash;and I&rsquo;ll be damned, they really did ignore the elephant in the room. A few incidental AI mentions, and &ldquo;generative&rdquo; appeared <strong>once</strong>.</p>
<p>The same cook time (no pun intended) allowed me to rethink my original reaction, &ldquo;Apple&rsquo;s being clueless!&rdquo; to a more measured &ldquo;Ah, yeah, Apple&rsquo;s being Apple!&rdquo; Specifically, &ldquo;If we&rsquo;re not ready to talk about it, we&rsquo;re not going out there and throwing half-baked crap against the wall.&rdquo; In stark contrast to much of the tech world&rsquo;s half-assed, panicked responses. I bet Apple&rsquo;s following developments very closely, but waiting to see where it goes and really looking at what it means and how it fits into their world. I also bet Apple&rsquo;s been doing serious generative AI work since well before it hit the radar last fall with the art AI emergence.</p>
<p>And give Apple credit for parachuting their own elephant into the room, in the form of Vision Pro and visionOS.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Unlimited Stupid Questions</title>
      <link>https://craftycto.com/blog/unlimited-stupid-questions/</link>
      <pubDate>Wed, 14 Jun 2023 08:06:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/unlimited-stupid-questions/</guid>
      <description>Possibly the most important benefit of ChatGPT ...</description>
      <content:encoded><![CDATA[<p>I had a long hacking session with <a href="https://gohugo.io/">Hugo</a> and <a href="https://tailwindcss.com">Tailwind CSS</a> yesterday evening, refining the micro content types I added last week and ripping out traditional CSS styling in favor of Tailwind utility classes and typography. This kept me constantly on the edge of things I don&rsquo;t fully understand.</p>
<p>I&rsquo;ve reinforced others&rsquo; comments about how generative AI tools allow us to <a href="/blog/the-emergence-s1e4/#what-are-people-sleeping-on-">tackle more ambitious projects</a>, reduce the <a href="/quote/vivek-haldar-copilot/">activation energy</a> needed to get started and get to the finish line. And I&rsquo;ve referenced the analogy of ChatGPT as a kind of <a href="/blog/the-emergence-s1e4/#emergences-over-the-last-31-days">weird intern</a> with an interesting set of characteristics. But yesterday evening, I realized that one of the very top benefits I get from ChatGPT: permission to ask unlimited stupid questions.</p>
<h2 id="introverts-and-men">Introverts and Men</h2>
<p>I&rsquo;m definitely on the introvert end of the spectrum&ndash;maybe even &ldquo;on the spectrum&rdquo; itself. I love the idea that introverts are fantastic at meetings, only they need an hour to get ready and two hours to recover. Social gatherings? Double that.</p>
<p>I think the strong aversion to bothering people, taking up someone else&rsquo;s time, may an adjacent introvert characteristic. The fear of looking bad by asking dumb questions? Well, perhaps that may apply to most of us humans, introvert and extroverts alike.</p>
<p>I know this aversion holds me back, keeps me stuck, but it is difficult to overcome&ndash;I identify with the concept of &ldquo;social exhaustion&rdquo; and for me, every asked question is a significant withdrawal from the social energy account.</p>
<h2 id="chatgpt-doesnt-mind">ChatGPT Doesn&rsquo;t Mind</h2>
<p>The models behind conversational AIs like ChatGPT are constructed to deliver a friendly, chatty, thrilled-to-help you persona. They never get tired or frustrated. They love questions, and no question is too stupid! They don&rsquo;t care if I should have known that already. (SHAME = &ldquo;should have already mastered everything.&rdquo;) They&rsquo;re just happy to help.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/unlimited-stupid-questions/ai-helping-woman.webp"><picture>
    <source type="image/webp" srcset="/blog/unlimited-stupid-questions/ai-helping-woman_hu2079901379321396633.webp 320w, /blog/unlimited-stupid-questions/ai-helping-woman_hu4493432657088194466.webp 640w, /blog/unlimited-stupid-questions/ai-helping-woman_hu17671928892783096292.webp 768w, /blog/unlimited-stupid-questions/ai-helping-woman_hu5733537527475026873.webp 1024w, /blog/unlimited-stupid-questions/ai-helping-woman_hu13001764211582166304.webp 1280w, /blog/unlimited-stupid-questions/ai-helping-woman_hu2065517861067136198.webp 1536w, /blog/unlimited-stupid-questions/ai-helping-woman_hu17623670171755646200.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/unlimited-stupid-questions/ai-helping-woman_hu10328469917632219929.jpg 320w, /blog/unlimited-stupid-questions/ai-helping-woman_hu13615423490793105478.jpg 640w, /blog/unlimited-stupid-questions/ai-helping-woman_hu8682623781771101311.jpg 768w, /blog/unlimited-stupid-questions/ai-helping-woman_hu1984632106692871754.jpg 1024w, /blog/unlimited-stupid-questions/ai-helping-woman_hu318791150959586137.jpg 1280w, /blog/unlimited-stupid-questions/ai-helping-woman_hu12355949349922240150.jpg 1536w, /blog/unlimited-stupid-questions/ai-helping-woman_hu3315867982490503256.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/unlimited-stupid-questions/ai-helping-woman_hu13615423490793105478.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>The crazy result: unlimited free questions! The dumber the better! Zero withdrawal from my social energy account when I ask a question!</p>
<p>I can&rsquo;t describe how huge this is for me, and how much it has unblocked and freed me.</p>
<h2 id="gpt-4-has-great-answers">GPT-4 Has Great Answers</h2>
<p>Unlimited free questions isn&rsquo;t worth much unless the answers are actually good. I have access to ChatGPT&rsquo;s GPT-4 model through a $20/mo ChatGPT+ subscription, and the answers are consistently solid. Yes, I have to keep my radar on watching for &ldquo;alternative facts&rdquo;&ndash;a process that&rsquo;s similar to watching for fake reviews on Amazon. If it smells bad, it probably is bad. But that&rsquo;s pretty rare with GPT-4 in the kinds of questions I&rsquo;m asking. In fact, in several cases, I was sure I had caught GPT-4 hallucinating, only later to realize it was right and I was wrong.</p>
<h2 id="yesterdays-topics">Yesterday&rsquo;s Topics</h2>
<p>Just to give you a feel for the kind of things that ChatGPT / GPT-4 can help with, here are the topics from just yesterday evening. Not a developer? Imagine these are questions about all those Microsoft Word or Excel features that you can&rsquo;t figure out or even find in the <strong>Office 365 Hell-Menu™️</strong>. GPT-4 is just as smart there.</p>
<ul>
<li>Remind me how to set up a separate development branch in Git</li>
<li>Here&rsquo;s what git status is telling me, what does that mean?</li>
<li>How do I switch back and forth between branches quickly</li>
<li>I made some changes and they are showing up in both branches, why is that?</li>
<li>I notice that my Hugo project&rsquo;s package.json has older dependencies than the sample project I am following, how do I resolve that?</li>
<li>I&rsquo;m using the Tailwind CSS typography plugin, but when I add &ldquo;prose&rdquo; directives they&rsquo;re being ignored, what might the problem be?</li>
<li>There&rsquo;s a file that Hugo auto-generates that I currently am tracking in Git but shouldn&rsquo;t be, how do I resolve this and ignore that file from now on?</li>
<li>How do I merge that fix over onto my development branch?</li>
<li>I got this error when I tried that, how to resolve?</li>
<li>Oh crap, I accidentally pushed to the main branch instead of development!</li>
<li>How do I add a timestamp in my command prompt in zsh</li>
</ul>
<p>Yes, dammit, I should have already mastered all of this.</p>
<h2 id="honey-badger-dont-care">Honey Badger Don&rsquo;t Care</h2>
<p>Stupid questions? Look at those eyes&mdash;<a href="https://www.youtube.com/watch?v=KxLgVpiQGr8">honey badger</a> doesn&rsquo;t give a crap. Neither does ChatGPT. And neither do I. Free at last.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/unlimited-stupid-questions/honey-badger.webp"><picture>
    <source type="image/webp" srcset="/blog/unlimited-stupid-questions/honey-badger_hu12921166901925490314.webp 320w, /blog/unlimited-stupid-questions/honey-badger_hu16588308495238262192.webp 640w, /blog/unlimited-stupid-questions/honey-badger_hu13917327749836796092.webp 768w, /blog/unlimited-stupid-questions/honey-badger_hu7624476001892721848.webp 1024w, /blog/unlimited-stupid-questions/honey-badger_hu14403937888945625582.webp 1280w, /blog/unlimited-stupid-questions/honey-badger_hu13831631259469282552.webp 1536w, /blog/unlimited-stupid-questions/honey-badger_hu3008796207490755246.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/unlimited-stupid-questions/honey-badger_hu3401073346093618693.jpg 320w, /blog/unlimited-stupid-questions/honey-badger_hu3069929864643707148.jpg 640w, /blog/unlimited-stupid-questions/honey-badger_hu17734504760108838614.jpg 768w, /blog/unlimited-stupid-questions/honey-badger_hu6252495925655098749.jpg 1024w, /blog/unlimited-stupid-questions/honey-badger_hu750248146090176158.jpg 1280w, /blog/unlimited-stupid-questions/honey-badger_hu17231339977682316073.jpg 1536w, /blog/unlimited-stupid-questions/honey-badger_hu6492543644270919985.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/unlimited-stupid-questions/honey-badger_hu3069929864643707148.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Ownership in Small and Medium Technology Companies</title>
      <link>https://craftycto.com/elsewhere/eric-brooke-ownership-pt1/</link>
      <pubDate>Tue, 13 Jun 2023 14:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/eric-brooke-ownership-pt1/</guid>
      <description>An important topic, addressed thoroughly by Eric Brooke, former SpotHero CTO.</description>
      <content:encoded><![CDATA[<p>This is the first in a series; <a href="https://ericbrooke.blog/2023/06/07/ownership-how-it-can-go-wrong-part-2/">Part 2</a> is already completed and Brooke plans a Part 3 and Part 4. He was also recently a guest on the <a href="https://podcasts.apple.com/us/podcast/ep-92-ownership-with-eric-brooke/id1556287400?i=1000616021041">Definitely Maybe Agile podcast</a> and talked ownership.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Le Mans, Unabridged</title>
      <link>https://craftycto.com/blog/le-mans-unabridged/</link>
      <pubDate>Sun, 11 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/le-mans-unabridged/</guid>
      <description>This being Le Mans weekend, here&amp;#39;s a Le Mans deep-dive about watching the entire 24 hours, unabridged.</description>
      <content:encoded><![CDATA[<p><em>Yesterday I was watching the 24 Hours of Le Mans, 2023 edition, when I realized, &ldquo;wait a minute, I&rsquo;ve blogged about Le Mans before &hellip;&rdquo; Much to my <a href="https://indieweb.org/POSSE">POSSE</a> horror, I realized that I had taken down my 2015-era blog without preserving its content, and that some of the content actually appeared to be worth preserving.</em></p>
<p><em>Actually, <a href="https://pluralistic.net/2023/02/19/drei-drei-drei/#now-we-are-three">Cory Doctorow would make the point</a> that ALL of that content is worth preserving, even it if seems cringeworthy or no longer relevant. My intent is to revive all my content from 2015, which will take a bit of effort (Squarespace export for Wordpress =&gt; Wordpress-to-Hugo import).</em></p>
<p><em>For today, though, since it&rsquo;s Le Mans weekend, and since Le Mans 2023 is shaping up as an amazing year in the P1 / hypercar class, I&rsquo;m bringing this post back first.</em></p>
<h1 id="le-mans-unabridged">Le Mans, Unabridged</h1>
<p><em>Originally Published September 02, 2015</em></p>
<p><strong>Race time, 2:57 AM on Sunday June 14th</strong>, the middle of the night, pitch black pierced by laser headlights. 13 hours, 3 minutes to go. My time-shifted reality time is 7:37 AM June 23rd, a full nine days after <a href="http://www.24h-lemans.com/">les 24 Heures du Mans</a> has finished. I&rsquo;m actively ducking my normal news feeds, especially Zite, trying to avoid spoilers. After almost 11 hours of racing, the leading Audi and Porsche LMP1 cars are just seconds apart, trading the lead with every pit stop.</p>
<p>LMP1 stands for <a href="https://en.wikipedia.org/wiki/Le_Mans_Prototype">Le Mans Prototype Class 1</a>, the fastest of the four Le Mans racing classes. The top LMP1 cars are capable of circling the long, winding 8.47 miles of the Le Mans circuit in less than 3:20, with top speeds over 210 MPH. For my money, LMP1s are the most amazing racing machines on the face of the earth.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu16377840333484452651.webp 320w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu12065353148860061344.webp 640w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu505394591835484269.webp 768w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu16927157325673918087.webp 1024w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu5082835701274690018.jpg 320w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu14186182057607570309.jpg 640w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu736490304675544730.jpg 768w, /blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu1624690880298899854.jpg 1024w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-Circuit_de_la_Sarthe_track_map_hu14186182057607570309.jpg" width="1024" height="707" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">The Le Mans circuit</span>


</div>

</p>
<p>Know that I&rsquo;m a serious Formula 1 fan. I love F1 cars, their amazing speed (even faster than LMP1s), the technology they represent. I love the carefully sculpted F1 racing format, with its three-round qualifying on Saturday followed by an intense Sunday race. I love the drama of F1&rsquo;s long 18-race season, with drivers and teams fighting it out over nine months for individual and team championship titles. Formula 1 is my favorite racing series.</p>
<p>My favorite single race, though, is the 24 Hours of Le Mans. Hands-down, no contest. Le Mans is a season&rsquo;s worth of racing compressed into a single race. Cars that finish these brutal 24 hours will never race again—the punishment is so heavy that even the most robust components, down to the chassis itself, are beat up, worn out, no longer race-worthy. Le Mans demands a three-driver rotation, and even then drivers are pushed to the point of physical exhaustion and dehydration. Pit crews and garage mechanics face their own marathon: besides rapidly rendering 24 hours of fuel-and-tire stops, they must be prepared to diagnose and fix even the most seriously broken cars, under the highest-intensity, the-clock-is-ticking circumstances. Race engineers like Audi&rsquo;s Leena Gade might have the toughest job of all, because unlike drivers, they&rsquo;re on duty for all 24 hours. This is 24 hours of racing insanity.</p>
<p>Le Mans cars are likewise in a class of their own. Even the commoners of Le Mans—the Porsche 911 RSRs and Ferrari 458 Italia GT2s of the GTE classes—are sexy beasts that wind up with a sound like a turbojet on the long Mulsanne Straight and would turn heads on any road in the world. The LMP1s are the pinnacle, though, truly the sexiest cars on the face of the earth, especially as they fly through a difficult corner sequence like the sinuous Porsche Curves, moving so fast it seems like you&rsquo;re fast-forwarding the video. As sports car prototypes, LMP1s have beautifully enclosed bodywork and jet-aircraft-style cockpits. The LMP1 look is sleek spaceship, a vast contrast to the aero-deformed, exposed-wheel F1 car.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu13663942816138135221.webp 320w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu6719582748139897036.webp 640w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu5172186005269055942.webp 768w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu13427165302415392977.webp 1024w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu3189719744501902929.webp 1280w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu6822562315843242070.webp 1536w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu14911225026899712634.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu10784350233037054237.jpg 320w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu1935724313639253199.jpg 640w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu4507402707806937966.jpg 768w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu11157875222336843141.jpg 1024w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu2190849286787873108.jpg 1280w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu12561961210863431665.jpg 1536w, /blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu11549630293829521372.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-24-Hours-of-LeMans-Test-31_hu1935724313639253199.jpg" width="2048" height="1447" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">2015 Audi R18 e-tron quattro</span>


</div>

</p>
<p>Racing technology a big part of the appeal for me. I love Formula 1 for its tech, but here again, Le Mans and LMP1s rule the roost. The three top LMP1 teams—Audi, Porsche, and Toyota—all use hybrid technology. Audi&rsquo;s hybrid power isn&rsquo;t battery-based, though: the <a href="https://www.audi-mediacenter.com/en/audi-r18-e-tron-quattro-76">R18 e-tron quattro</a> instead uses a flywheel accumulator which spins up during braking, storing up to 700K Joules of energy and delivering an extra 272 horsepower on demand. Audi has likewise innovated on its internal combustion engine: starting in 2006, Audi made an unprecedented switch to diesel power. Besides delivering amazing performance and fuel economy, the diesel powerplant is incredibly quiet; the loudest noise you&rsquo;ll hear on the in-car feed is the flywheel spinning up, with engine noise just a low background throb. Using such unconventional power sources, Audi has been dominant at Le Mans, winning 10 of the last 11 years.</p>
<p>Porsche is the most famous name in Le Mans racing, a name that had been absent from prototypes for 16 years until their return last year with the <a href="https://motorsports.porsche.com/international/en/category/cars/919-hybrid">919 Hybrid</a>. The 919 is a more conventional hybrid pairing than Audi&rsquo;s, with a turbocharged 2.0 liter V4 gasoline engine complemented by a lithium ion battery system. Conventional or not, the 919 is a powerful rocketship capable of cranking out almost 1,000 HP, significantly more than Audi&rsquo;s combined 840 HP and enough to easily win this year&rsquo;s LMP1 pole. But Les Mans is endurance racing at its most fundamental, and despite the Porsche&rsquo;s power advantage and qualifying pace, it was Audi who started this year&rsquo;s Le Mans as heavy favorites, having handily beaten the 919s in two key up to Le Mans. It normally takes years for a new team to master Le Mans&rsquo; triple requirements: speed, reliability, and teamwork. 2015 was just Porsche&rsquo;s second year, so winning seemed highly unlikely.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu2448250281882799978.webp 320w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu15393056643424064713.webp 640w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu6008282303688554527.webp 768w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu6057599646354084262.webp 1024w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu9226029726326020976.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu16033676969128089586.jpg 320w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu6322328316430048651.jpg 640w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu2785032003483423745.jpg 768w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu2839848054748137762.jpg 1024w, /blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu5798715693545988250.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-eec85b20-965d-43ea-8c5d-d0965ab8f4a6_hu6322328316430048651.jpg" width="1440" height="812" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">2015 Porsche 919 Hybrid</span>


</div>

</p>
<p><strong>Race time, Sunday morning 3:50 AM.</strong> 12 hours 10 minutes to go. Time-shifted time, 8:41 PM on June 25th, dusk in Winnetka, 11 days and change after the finish. It&rsquo;s shaping up to be a great race, perhaps as exciting as the classic Audi - Peugeot duels of 2006-2011. Porsche&rsquo;s #19 car has pulled out a slight lead, enough to remain in front event after pit stops, although in a 24 hour race this is the thinnest of margins, one that could evaporate with the slightest mishap such as a punctured tire.</p>
<p>And yes, I&rsquo;ve really watched it all, 11 hours and 50 minutes of racing, transitioning from bright afternoon sunshine, through the fading light of a beautiful evening, and now into the dark lonely hours past midnight. The race is not even halfway over, and already I&rsquo;ve committed more viewing hours than an entire season of Game of Thrones. By the time I&rsquo;m done, I&rsquo;ll have watched 24 full hours, time-shifted to fit my spare viewing hours, over an elapsed period of 18 days, all the while staying clear of my usual racing news sources in an attempt to avoid spoilers.</p>
<p>That&rsquo;s a serious commitment of time and focus. A similar commitment, applied to cross-country driving, will get me from Winnetka to Taos, New Mexico, including a side trip to Alliance, Nebraska to visit that automative wonder of the world, <a href="http://carhenge.com/">Carhenge</a>. What motivates me to watch a single sporting event, a single race, for 24 full hours?</p>
<p>Watching Le Mans unabridged is sublime and memorable, in the same way that taking a cross-country journey in the company of great friends is sublime and memorable. It&rsquo;s not a quick-fix adrenaline rush like the best of Formula 1 races. It&rsquo;s not a quick anything. Instead, it&rsquo;s a 24-hour stream of small wonderful moments, enjoyed in the company of good friends. Headlights coming on in the beautiful dusk, the screech of an Audi&rsquo;s tires as it threads the Porsche Curves, chaos in a GTE garage after an unfortunate meeting with an Armco guardrail, the one-of-a-kind growl of the Corvette C7.R&rsquo;s 5.5 liter V8, the intense focus of an LMP1 driver cranking out sub-3:20 laps in the pitch black of 3:00 AM. For me, the Le Mans experience can&rsquo;t be condensed; try to grasp the &ldquo;good parts&rdquo; and you lose the whole essence of the thing.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-M15_1932_fine1.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-M15_1932_fine1_hu14429202483477551776.webp 320w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu11066933904932144530.webp 640w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu16919770147295269441.webp 768w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu17343305650665232090.webp 1024w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu11545885770100637190.webp 1280w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu17950386299717722623.webp 1536w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu7318154801569809665.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-M15_1932_fine1_hu8417065869511323540.jpg 320w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu14491288632918826104.jpg 640w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu13241563056297587097.jpg 768w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu2243981944420578988.jpg 1024w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu11215507039089716230.jpg 1280w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu14173029144401796421.jpg 1536w, /blog/le-mans-unabridged/lemans-M15_1932_fine1_hu17130186746744189651.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-M15_1932_fine1_hu14491288632918826104.jpg" width="4016" height="2677" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">919 Hybrid owns the night</span>


</div>

</p>
<p><strong>Race time, Sunday, 6:44 AM</strong>, almost 15 hours into the race. It&rsquo;s getting light. 9 hours 16 minutes to go. Porsche&rsquo;s #19 car has stretched its lead over the #7 Audi to a pit-stop-adjusted 50 seconds, still a tight margin at Le Mans but definitely a concern to Audi. There&rsquo;s an interesting Formula 1 connection to the #19 Porsche: German <a href="https://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg">Nico Hülkenberg</a>, an active F1 driver for Force India, is one of #19&rsquo;s co-drivers. Hülkenberg is a Le Mans rookie, as is his Kiwi teammate Earl Bamber. Their third co-driver Nick Tandy has raced Le Mans twice before, but in the GTE Pro class, two large steps below LMP1. It&rsquo;s a surprise to see #19 leading the Porsches, let alone the race.</p>
<p>For almost 15 hours I&rsquo;ve enjoyed traveling in the company of my good Le Mans friends. Endurance racing in general, and Le Mans in particular, has the informal feel of &ldquo;Hey, let&rsquo;s do something insane! Screw it, let&rsquo;s drive for 24 hours straight and see who can go the farthest!&rdquo; It&rsquo;s less like a formal contest and more like an all-night crazy-fest. And I get to be an integral part of the craziness: my role is to watch insanely—all 24 hours—two full seasons of The Wire.</p>
<p>Among those I&rsquo;m intimately connected with are the head crazies, the drivers. Le Mans&rsquo; deep camera coverage brings me right inside their world for 24 hours, whether they&rsquo;re two hours into a four-hour stint in their LMP1 cockpit or dozing in the garage. In the tightly-produced Formula 1 format, my exposure to the drivers is carefully scripted, with handlers always hovering nearby. In F1, the closest you&rsquo;ll come to an informal moment is immediately after the race, when the top three finishers relax and rehydrate before the podium ceremony.</p>
<p>At Le Mans, in contrast, informality reigns. 24 hours is long time, and even if tight production and careful scripting were desired (they don&rsquo;t seem to be), it would be prohibitively expensive to do. Also, because Le Mans drivers are part of a 3-person team, they&rsquo;re actually driving just 1/3rd of the time. The 2015 edition of Le Mans had 56 cars, meaning 174 drivers. So at any particular point during the race, 116 drivers are not driving, but instead are hanging out around the garage, watching the race just like me, maybe grabbing some food and a couple hours of sleep, but mostly hanging out. Oh look, there&rsquo;s André Lotterer from the #7 Audi, relaxing in the garage with his mechanics, watching the race feed and his car&rsquo;s telemetry data. Wow, there&rsquo;s Patrick Dempsey, yes, that Patrick Dempsey, who just finished his stint in the #77 GTE Am car. Casual, unscripted interviews are happening continuously. One of my favorites this year was with <a href="https://en.wikipedia.org/wiki/Anthony_Davidson">Anthony Davidson</a>, co-driver of the #1 Toyota TS040 Hybrid. Toyota Racing was a top contender in 2014, winning the World Endurance Championship, but in 2015 Porsche and Audi both pulled significantly ahead. Davidson was fresh out of the #1 Toyota, having just crashed <strong>twice</strong> on a single lap as he desperately tried to match the pace of the leaders. He was devastated, brutally honest about his mistakes, and apologetic to his fans and team. The time lost for repairs ended any hopes Toyota had for a top finish. No handlers, no scripts, up close and personal.</p>
<p><strong>Race time 12:49 PM, a bit over 3 hours to go.</strong> For me watching in Winnetka, it&rsquo;s dinner time on July 2nd, 18 days later. Both the race and my time-shifted viewing are entering their final push. The drivers who take over now will bring their cars home.</p>
<p>Finish at Le Mans occurs when (a) the official Rolex 24 hour race clock finally counts down to 00:00:00, and (b) your car crosses the finish line, having completed its last 8+ mile lap in six minutes or less. Even if your car runs for 23 hours and 55 minutes, if you fail to cross the finish line, or are limping along at slower than a six minute pace, you are completely disqualified, expunged, shunned, purged from the classification list as if you had never entered.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-2013-09-30-horloge-1.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu16249397925389385336.webp 320w, /blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu8282597831599447814.webp 640w, /blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu5439715750142459748.webp 768w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu12543776668804536903.jpg 320w, /blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu5741568149347782023.jpg 640w, /blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu5123195700850645078.jpg 768w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-2013-09-30-horloge-1_hu5741568149347782023.jpg" width="800" height="533" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">The iconic Rolex race clock at Le Mans</span>


</div>

</p>
<p>About four hours ago, disaster befell Audi&rsquo;s lead #7 car: the rear engine cover broke loose and shredded, resulting in engine damage and a lengthy garage visit. This gave the #19 Porsche a more comfortable one-lap lead. Since then, the Audis have continued to suffer reliability problems and even a drive-through penalty for &ldquo;disrespecting the slow zone.&rdquo; Porsche&rsquo;s cars have meanwhile been rock-solid and now hold the top two spots, with #17 up to second place.</p>
<p>The Le Mans race commentators are another big part of my communal crazy-fest. It&rsquo;s an hilarious, chaotic, ever-shifting cast of characters, with new voices suddenly appearing as their predecessors hit the wall of exhaustion and slip away for food and sleep. They&rsquo;re enthusiastic and knowledgeable, many being former Le Mans drivers, people who can speak from personal experience about what it&rsquo;s like to be in the car during Happy Hour, the golden hour just after daybreak when the track surface is rubbered in and sticky, and the cool air maximizes engine performance. They talk me through amazing laps, horrifying crashes, miraculous pit work, amateurish moves by amateur drivers, and hilarious moments (&ldquo;André Lotterer there, taking on a banana.&rdquo;) I feast on insider trivia—which teams have the best hospitality catering, what particular drivers choose to eat during the race (in one horrifying case, curried hot dogs).</p>
<p>Best of all, they share about Le Mans, the Grand Lady that even the world&rsquo;s best drivers can never take for granted. Like life, Le Mans is fundamentally about endurance, about taking hits and getting beat up and getting it started again and limping back to the pits and intense recovery work and speed tape and surviving and finishing. It&rsquo;s about yellow flags and safety cars and getting a lap down and getting back in the groove and unlapping yourself and retaking the lead when it&rsquo;s the other driver&rsquo;s turn for misfortune.</p>
<p><strong>Race time 3:53 PM, less than eight minutes remaining</strong>, time-shifted to 9:09 PM July 2nd in Winnetka. Nico Hülkenberg is back at the wheel of the #19 Porsche and has an almost-comfortable one lap lead over his Porsche #17 sister car, two laps ahead of the #7 Audi.</p>
<p>Hülkenberg is still flying, to the great discomfort of his team, who try to reel him in over the radio, &ldquo;Nico, you can take it a lot more easy, repeat, you can take it a lot more easy.&rdquo; If Nico can hold it together for the last eight minutes, he&rsquo;ll become the first active Formula 1 driver to win Le Mans since Johnny Herbert in 1991.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/le-mans-unabridged/lemans-maxresdefault.jpg"><picture>
    <source type="image/webp" srcset="/blog/le-mans-unabridged/lemans-maxresdefault_hu12189861851913280314.webp 320w, /blog/le-mans-unabridged/lemans-maxresdefault_hu9835810789681096813.webp 640w, /blog/le-mans-unabridged/lemans-maxresdefault_hu15547342103114491792.webp 768w, /blog/le-mans-unabridged/lemans-maxresdefault_hu18132028198978292175.webp 1024w, /blog/le-mans-unabridged/lemans-maxresdefault_hu1983659725710828340.webp 1280w, /blog/le-mans-unabridged/lemans-maxresdefault_hu8895093088678563137.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/le-mans-unabridged/lemans-maxresdefault_hu5459845670622382231.jpg 320w, /blog/le-mans-unabridged/lemans-maxresdefault_hu16535851082945500353.jpg 640w, /blog/le-mans-unabridged/lemans-maxresdefault_hu8453625309399628832.jpg 768w, /blog/le-mans-unabridged/lemans-maxresdefault_hu4841075638409022266.jpg 1024w, /blog/le-mans-unabridged/lemans-maxresdefault_hu18317480389353641621.jpg 1280w, /blog/le-mans-unabridged/lemans-maxresdefault_hu6602805920876520883.jpg 1536w" sizes="100vw" />
    
      <img src="/blog/le-mans-unabridged/lemans-maxresdefault_hu16535851082945500353.jpg" width="1600" height="900" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">Heartbreak after 23&#43; hours for the #98 Aston Martin</span>


</div>

</p>
<p>The Audi garage is subdued. The unbelievable does still happen at Le Mans—just minutes earlier, in the GTE Am class, the #98 Aston Martin, running with a full two-lap advantage, crashed out of the race, handing the lead and eventual win to the #72 SMP Ferrari. But the Audi team senses that, with just minutes to go, and two Porsche 919s running fast and reliable well up the road, 2015 won&rsquo;t bring another miracle win. Dr. Wolfgang Ullrich, Audi Director of Motorsport, walks over to the Porsche garage and offers congratulations.</p>
<p><strong>Race time, a bit past 4:00 PM</strong>. The official Rolex 24 hour race clock has counted down past 00:00:00. Nico Hülkenberg has finally slowed down a bit and convoyed up with the #17 sister Porsche to cross the finish line together.</p>
<p>Another historic, magical Le Mans is in the books. Best consumed unabridged.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Vivek Haldar on GitHub Copilot</title>
      <link>https://craftycto.com/quote/vivek-haldar-copilot/</link>
      <pubDate>Sat, 10 Jun 2023 11:23:00 +0000</pubDate>
      
      <guid>https://craftycto.com/quote/vivek-haldar-copilot/</guid>
      <description>Speaking only for myself, I get orders of magnitude more value from [GitHub Copilot] than the $10/month it costs. How? Copilot (often used in conjunction with GPT, and now, Bard) has reduced the activation energy for the small scripty projects I want to undertake from being just slightly over a weekend (which meant they would get abandoned or not even started) to fitting comfortably within a weekend. And that has made a world of difference, at least for me. I suspect the same story will play out across programmers in general, where it will serve to lower the friction and frustration of programming just enough to increase their overall output.</description>
      <content:encoded><![CDATA[<blockquote>
<p>Speaking only for myself, I get orders of magnitude more value from [GitHub Copilot] than the $10/month it costs. How? Copilot (often used in conjunction with GPT, and now, Bard) has reduced the activation energy for the small scripty projects I want to undertake from being just slightly over a weekend (which meant they would get abandoned or not even started) to fitting comfortably within a weekend. And that has made a world of difference, at least for me. I suspect the same story will play out across programmers in general, where it will serve to lower the friction and frustration of programming just enough to increase their overall output.</p>
</blockquote>
<p>&ndash; <a href="https://vivekhaldar.com/articles/re--why-i-don-t-use-copilot/">Vivek Haldar</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>First Impressions of Vision Pro and visionOS</title>
      <link>https://craftycto.com/elsewhere/gruber-visionpro-visionos/</link>
      <pubDate>Thu, 08 Jun 2023 11:23:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/gruber-visionpro-visionos/</guid>
      <description>Gruber conveys the essence of the experience better than other writeups I&amp;#39;ve read so far.</description>
      <content:encoded><![CDATA[<p><a href="https://daringfireball.net/2023/06/first_impressions_of_vision_pro_and_visionos">John Gruber&rsquo;s First Impressions of Vision Pro and visionOS</a> Gruber conveys the essence of the experience better than other writeups I&rsquo;ve read so far. Unlike a traditional media outlet with their usual needs to drive readership, avoid pissing off Apple, appear balanced, etc., Gruber pretty much straight says what he thinks, which is useful.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Is Runway Gen-2 Midjourney for Video?</title>
      <link>https://craftycto.com/blog/runway-not-midjourney-for-video/</link>
      <pubDate>Thu, 08 Jun 2023 00:06:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/runway-not-midjourney-for-video/</guid>
      <description>We Tested Gen-2 and Share the Resulting Videos</description>
      <content:encoded><![CDATA[<p>I love <a href="https://www.midjourney.com/showcase/recent/">Midjourney</a>, use it almost every day to generate the illustrations that are an important component of this blog. In fact, this blog&rsquo;s name change from Crafty&rsquo;s to Crafty&rsquo;s Illustrated <strong>happened entirely because of Midjourney</strong>, which made possible the &ldquo;Illustrated&rdquo; part. I happily pay $10/mo for these benefits.</p>
<p>I&rsquo;d gladly fork out similar money for something like Midjourney but for video. To that end, some months back I signed up on a waitlist (or something) with <a href="https://runwayml.com/">Runway</a>. Today I received an announcement that Runway Gen-2 is available. So I decided to give it a workout and assess the current state of generative AI for video.</p>
<h2 id="we-need-a-posse">We Need a Posse</h2>
<p>In my <a href="/blog/write-every-day/">last essay</a> about writing, I touched on <a href="https://indieweb.org/POSSE">IndieWeb&rsquo;s POSSE principles</a> and that seemed like a great opportunity for an illustration. I used this Midjourney prompt:</p>
<blockquote>
<p>a group of men on horseback, riding at high speed, in pursuit of a cattle thief, cinematic spaghetti western technicolor</p>
</blockquote>
<p>and this was the winning image:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/runway-not-midjourney-for-video/posse-horseback.webp"><picture>
    <source type="image/webp" srcset="/blog/runway-not-midjourney-for-video/posse-horseback_hu9580471659413858179.webp 320w, /blog/runway-not-midjourney-for-video/posse-horseback_hu16753129581769204402.webp 640w, /blog/runway-not-midjourney-for-video/posse-horseback_hu14378536491024196875.webp 768w, /blog/runway-not-midjourney-for-video/posse-horseback_hu5938767922620995555.webp 1024w, /blog/runway-not-midjourney-for-video/posse-horseback_hu6464012124513642448.webp 1280w, /blog/runway-not-midjourney-for-video/posse-horseback_hu8490886158146895877.webp 1536w, /blog/runway-not-midjourney-for-video/posse-horseback_hu12504755710222769861.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/runway-not-midjourney-for-video/posse-horseback_hu835606990935249644.jpg 320w, /blog/runway-not-midjourney-for-video/posse-horseback_hu8890715502320664403.jpg 640w, /blog/runway-not-midjourney-for-video/posse-horseback_hu11136035651622601891.jpg 768w, /blog/runway-not-midjourney-for-video/posse-horseback_hu9212588840162441755.jpg 1024w, /blog/runway-not-midjourney-for-video/posse-horseback_hu13263852104240826938.jpg 1280w, /blog/runway-not-midjourney-for-video/posse-horseback_hu8631803359500308378.jpg 1536w, /blog/runway-not-midjourney-for-video/posse-horseback_hu4007297382506505095.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/runway-not-midjourney-for-video/posse-horseback_hu8890715502320664403.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Midjourney actually generated four images for that prompt, and the others were quite good also:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/images/posse-horseback2.webp"><picture>
    <source type="image/webp" srcset="/images/posse-horseback2_hu2076919134689657906.webp 320w, /images/posse-horseback2_hu8033423601261693883.webp 640w, /images/posse-horseback2_hu11595812110768618371.webp 768w, /images/posse-horseback2_hu8799764956492357479.webp 1024w, /images/posse-horseback2_hu16892912027067686195.webp 1280w, /images/posse-horseback2_hu13617676130917304604.webp 1536w, /images/posse-horseback2_hu7138194817407328850.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/posse-horseback2_hu17578298603386085093.jpg 320w, /images/posse-horseback2_hu348301549974484120.jpg 640w, /images/posse-horseback2_hu14561607883160409159.jpg 768w, /images/posse-horseback2_hu3979550216767474876.jpg 1024w, /images/posse-horseback2_hu13421486308547690994.jpg 1280w, /images/posse-horseback2_hu2580121132002071768.jpg 1536w, /images/posse-horseback2_hu2483202252093175043.jpg 1920w" sizes="25vw" />
    
      <img src="/images/posse-horseback2_hu348301549974484120.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/images/posse-horseback4.webp"><picture>
    <source type="image/webp" srcset="/images/posse-horseback4_hu9636175143978211947.webp 320w, /images/posse-horseback4_hu5466392065375487669.webp 640w, /images/posse-horseback4_hu12111815111877523504.webp 768w, /images/posse-horseback4_hu16565441533942693821.webp 1024w, /images/posse-horseback4_hu7381263689816113487.webp 1280w, /images/posse-horseback4_hu2889297887858610845.webp 1536w, /images/posse-horseback4_hu11877813395999433823.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/posse-horseback4_hu5591317427653651300.jpg 320w, /images/posse-horseback4_hu16307223026899289236.jpg 640w, /images/posse-horseback4_hu16859952910564847889.jpg 768w, /images/posse-horseback4_hu9933089115312446641.jpg 1024w, /images/posse-horseback4_hu18286137678964858188.jpg 1280w, /images/posse-horseback4_hu11733698458761504662.jpg 1536w, /images/posse-horseback4_hu10850884770430577910.jpg 1920w" sizes="25vw" />
    
      <img src="/images/posse-horseback4_hu16307223026899289236.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/images/posse-horseback3.webp"><picture>
    <source type="image/webp" srcset="/images/posse-horseback3_hu7701539095212689515.webp 320w, /images/posse-horseback3_hu12896282843125890265.webp 640w, /images/posse-horseback3_hu4948221822558117152.webp 768w, /images/posse-horseback3_hu5351415567976245316.webp 1024w, /images/posse-horseback3_hu2795116040684648193.webp 1280w, /images/posse-horseback3_hu17093674517538842102.webp 1536w, /images/posse-horseback3_hu4255738913571649970.webp 1920w" sizes="25vw" />
    <source type="image/jpeg" srcset="/images/posse-horseback3_hu11546909325397782959.jpg 320w, /images/posse-horseback3_hu9160704221635267241.jpg 640w, /images/posse-horseback3_hu16311871750848860373.jpg 768w, /images/posse-horseback3_hu14212194859838728135.jpg 1024w, /images/posse-horseback3_hu17520153667443968624.jpg 1280w, /images/posse-horseback3_hu15009840259436021591.jpg 1536w, /images/posse-horseback3_hu13100368693669909987.jpg 1920w" sizes="25vw" />
    
      <img src="/images/posse-horseback3_hu9160704221635267241.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>From prompt to initial images was maybe 30 seconds, and the final image was web-ready in 5-10 minutes including tweaking and exporting to .webp using Pixelmator Pro.</p>
<h2 id="lights-camera-action">Lights, Camera, Action</h2>
<p>So, we might as well try Runway Gen-2. Same prompt, shall we? I gave it three tries, and it was a win in the sense that I got this fun little essay as a result. But Midjourney-for-video? Not so much.</p>
<h3 id="take-1-what">Take 1: What?!</h3>
<p>Here we see galloping at high speed &hellip; seated backwards on their horses? And in the background, the horses seem to be stampeding in reverse or something. A pretty amazing clip&ndash;though not exactly what we were looking for.</p>

  <video autoplay playsinline muted loop src="/videos/gen-2-men-horseback1.mp4" width="768" height="448"></video>

<h3 id="take-2-huh">Take 2: Huh?</h3>
<p>Here we have &hellip; a group of men riding while sitting on raised platforms fastened to their horses, kind of a war-elephant setup. Hats do not appear to be western in style, they have a Central Asian mongol-hordes feel. The hat second to left morphs in stages from wizard to Cat-in-the-Hat. And on closer inspection, the horses&rsquo; anatomy and mechanics are nightmarish.</p>

  <video autoplay playsinline muted loop src="/videos/gen-2-men-horseback2.mp4" width="768" height="448"></video>

<h3 id="take-3-look-out">Take 3: Look Out!</h3>
<p>The first moment here is promising&ndash;but then a Reverse Rider, possibly a fugitive from Take 1, blows through the pack like a southbound drunk driver on the northbound Edens Expressway. Chaos ensues.</p>

  <video autoplay playsinline muted loop src="/videos/gen-2-men-horseback3.mp4" width="768" height="448"></video>

<h2 id="nope--but-lets-be-fair">Nope &hellip; But Let&rsquo;s Be Fair</h2>
<p>We&rsquo;re ready to call this race: Midjourney for video has not yet arrived. But a few things to bear in mind:</p>
<ul>
<li>Midjourney generates its share of outtakes, including some true horrors (see examples at the bottom of the page). &ldquo;That&rsquo;s <em>such</em> a beautiful little girl, OH GOD SHE&rsquo;S GOT 8 FINGERS ON EACH HAND&rdquo; Or &ldquo;What a cute little bunny AAAGHHH IT HAS AN EXTRA LEG COMING OUT OF ITS BACK&rdquo;</li>
<li>A group of men on horseback is admittedly a fairly challenging scene.</li>
<li>Things move fast in generative AI. It won&rsquo;t be long.</li>
</ul>
<p>So, nope, not yet. But I predict it won&rsquo;t be long.</p>
<div class="flex justify-evenly"><div class="w-[28%] mx-2 flex justify-center"><a href="/images/outtake2.png"><picture>
    <source type="image/webp" srcset="/images/outtake2_hu13167610990164203344.webp 320w, /images/outtake2_hu12324356191235907378.webp 640w, /images/outtake2_hu5478872818429864069.webp 768w, /images/outtake2_hu2947209433242899161.webp 1024w, /images/outtake2_hu9229014703400502349.webp 1280w, /images/outtake2_hu17885073845897669616.webp 1536w, /images/outtake2_hu15097871328708183648.webp 1920w" sizes="12vw" />
    <source type="image/jpeg" srcset="/images/outtake2_hu13651189290287093769.jpg 320w, /images/outtake2_hu14183350304855269351.jpg 640w, /images/outtake2_hu10990666683242284559.jpg 768w, /images/outtake2_hu17977566247039629444.jpg 1024w, /images/outtake2_hu10002643305277771684.jpg 1280w, /images/outtake2_hu18379858778648133115.jpg 1536w, /images/outtake2_hu10171479198180468011.jpg 1920w" sizes="12vw" />
    
      <img src="/images/outtake2_hu14183350304855269351.jpg" width="2568" height="1260" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[28%] mx-2 flex justify-center"><a href="/images/outtake1.png"><picture>
    <source type="image/webp" srcset="/images/outtake1_hu13390846206928205221.webp 320w, /images/outtake1_hu6602307909505352979.webp 640w, /images/outtake1_hu464579309479768273.webp 768w, /images/outtake1_hu9447836062491271956.webp 1024w, /images/outtake1_hu4098932585467498270.webp 1280w" sizes="12vw" />
    <source type="image/jpeg" srcset="/images/outtake1_hu17103146588147224702.jpg 320w, /images/outtake1_hu6458466603064301663.jpg 640w, /images/outtake1_hu42679055656666724.jpg 768w, /images/outtake1_hu12380404592418452275.jpg 1024w, /images/outtake1_hu11201181522366421525.jpg 1280w" sizes="12vw" />
    
      <img src="/images/outtake1_hu6458466603064301663.jpg" width="1394" height="1384" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[28%] mx-2 flex justify-center"><a href="/images/outtake3.png"><picture>
    <source type="image/webp" srcset="/images/outtake3_hu8907140912745345075.webp 320w, /images/outtake3_hu10081090160926021698.webp 640w, /images/outtake3_hu4048775392566928116.webp 768w" sizes="12vw" />
    <source type="image/jpeg" srcset="/images/outtake3_hu4621416054504240934.jpg 320w, /images/outtake3_hu12298678926603201163.jpg 640w, /images/outtake3_hu16900484529721407137.jpg 768w" sizes="12vw" />
    
      <img src="/images/outtake3_hu12298678926603201163.jpg" width="1020" height="1000" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[28%] mx-2 flex justify-center"><a href="/images/outtake5.png"><picture>
    <source type="image/webp" srcset="/images/outtake5_hu18433998148801788907.webp 320w, /images/outtake5_hu16451466154941941987.webp 640w, /images/outtake5_hu5177085827500708494.webp 768w, /images/outtake5_hu14564429491446944088.webp 1024w, /images/outtake5_hu6538021331085924531.webp 1280w, /images/outtake5_hu2995416770922322762.webp 1536w, /images/outtake5_hu5381120366536025924.webp 1920w" sizes="12vw" />
    <source type="image/jpeg" srcset="/images/outtake5_hu12537201349143328652.jpg 320w, /images/outtake5_hu12802721322796680677.jpg 640w, /images/outtake5_hu7517426903918826958.jpg 768w, /images/outtake5_hu3434121648926542068.jpg 1024w, /images/outtake5_hu17558063833649014439.jpg 1280w, /images/outtake5_hu7141396346865105920.jpg 1536w, /images/outtake5_hu13164092058012962877.jpg 1920w" sizes="12vw" />
    
      <img src="/images/outtake5_hu12802721322796680677.jpg" width="2500" height="1400" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Orion Browser by Kagi</title>
      <link>https://craftycto.com/elsewhere/kagi-orion-browser/</link>
      <pubDate>Wed, 07 Jun 2023 11:23:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/kagi-orion-browser/</guid>
      <description>I&amp;#39;m late to the party, but the Orion browser from Kagi is really interesting.</description>
      <content:encoded><![CDATA[<p><a href="https://browser.kagi.com/">Orion Browser by Kagi</a> I&rsquo;m late to the party, probably, but the Orion browser from Kagi (makers of the excellent paid search engine) is really interesting. WebKit-based, super lightweight, zero telemetry / auto ad blocking. And it supports both Firefox and Chrome browser extensions (or at least quite a few of them). Still considered beta but caught my attention for sure. The <a href="https://browser.kagi.com/faq.html">benchmarks are pretty wild</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Faster sorting algorithms discovered using deep reinforcement learning</title>
      <link>https://craftycto.com/elsewhere/deep-rl-faster-sorting/</link>
      <pubDate>Wed, 07 Jun 2023 11:23:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/deep-rl-faster-sorting/</guid>
      <description>From nature.com, an AI story that isn&amp;#39;t *generative* AI.</description>
      <content:encoded><![CDATA[<p><a href="https://www.nature.com/articles/s41586-023-06004-9">Faster sorting algorithms discovered using deep reinforcement learning</a> So how about an AI story that isn&rsquo;t <em>generative</em> AI. To quote the Nature abstract:</p>
<blockquote>
<p>Whereas remarkable progress has been achieved in the past, making further improvements on the efficiency of these routines has proved challenging for both human scientists and computational approaches. Here we show how artificial intelligence can go beyond the current state of the art by discovering hitherto unknown routines. To realize this, we formulated the task of finding a better sorting routine as a single-player game. We then trained a new deep reinforcement learning agent, AlphaDev, to play this game. AlphaDev discovered small sorting algorithms from scratch that outperformed previously known human benchmarks.</p>
</blockquote>
<p>Not earth-shattering, not an all-new fundamental sorting algorithm, but achieving a 1% to 5% improvement on code that runs a trillion times a day is meaningful. Already merged with LLVM so it will make its way into real code.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Apple Vision</title>
      <link>https://craftycto.com/elsewhere/ben-thompson-apple-vision/</link>
      <pubDate>Tue, 06 Jun 2023 11:23:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/ben-thompson-apple-vision/</guid>
      <description>Stratechery&amp;#39;s Ben Thompson with an excellent take on Vision Pro.</description>
      <content:encoded><![CDATA[<p><a href="https://stratechery.com/2023/apple-vision/">Apple Vision</a> Stratechery&rsquo;s Ben Thompson with an excellent take on Vision Pro. He was able to get a few minutes hands-on with the device yesterday. His take aligns very much with <a href="https://craftycto.com/micro/sloppy-apple-keynote-pt2/">my own</a>. Pre-event, I kept thinking, &ldquo;put AR/VR aside, this thing could be a really great replacement for external monitors&rdquo; and Ben goes there and beyond as he looks at likely evolving uses of Vision products over time.</p>
<p>Well written and worth a read.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sloppy Apple Keynote Observations, Part 1</title>
      <link>https://craftycto.com/micro/sloppy-apple-keynote-pt1/</link>
      <pubDate>Mon, 05 Jun 2023 22:07:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/sloppy-apple-keynote-pt1/</guid>
      <description>Everything except Vision Pro</description>
      <content:encoded><![CDATA[<ul>
<li>Keynote video: Apple blew out the audio levels on interstitial music. Very off brand.</li>
<li>New Mac Pro: I was very amused when, as Apple talked about this beast having 7 PCIe slots and mentioned what you&rsquo;d use them for, they skipped one little item &hellip; GPUs. &ldquo;Let&rsquo;s ignore generative AI and it&rsquo;ll go away.&rdquo;&quot;</li>
<li>iOS 17
<ul>
<li>Stickers is a terrible name, but I think this will be a great feature&ndash;like iOS&rsquo;s &ldquo;photo subject select / cut&rdquo; on steroids.</li>
<li>StandBy: Like it, but for nighttime, does an all-red color scheme make <strong>you</strong> sleepy?</li>
<li>Autocorrect is being upgraded to &ldquo;2019 state of the art&rdquo; level</li>
</ul>
</li>
<li>iPadOS 17
<ul>
<li>Health app on iPad. I&rsquo;ve been wanting that.</li>
<li>Notes app massive upgrades, lots of Notability-type upgrades but just like I&rsquo;ll never buy another Ford, I&rsquo;ll never trust my notes to the Notes app. Been burned by both Fords and Notes.</li>
</ul>
</li>
<li>macOS Sonoma
<ul>
<li>tvOS like screen savers look nice</li>
<li>Not a gamer but what they&rsquo;re doing with Game Mode resonates</li>
<li>Presenter overlay features are interesting and looks like they&rsquo;re not FaceTime only thank god.</li>
<li>Loved the car control demo featuring a Lucid Air and not a Tesla. Screw you Elmo.</li>
<li>Safari profiles and webapps look intriguing. Skeptical that they&rsquo;ll actually get profiles right though.</li>
</ul>
</li>
<li>AirPods
<ul>
<li>Adaptive audio, a combination of transparency and noise reduction.</li>
<li>Conversation awareness, detecting and augmenting speech. Getting into hearing aid territory.</li>
<li>Better autoswitching. Currently that&rsquo;s unusably bad; we&rsquo;ll see.</li>
</ul>
</li>
<li>Apple Watch
<ul>
<li>Road biking wonderfulness, if it actually works. Bluetooth sensor support, FTP calculations, full-screen bike computer modes. I use Cyclemeter but if this works &hellip;</li>
<li>Looks like great upgrades for hiking also.</li>
</ul>
</li>
</ul>
<p>There you go. Sloppy enough for you?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sloppy Apple Keynote Observations, Part 2</title>
      <link>https://craftycto.com/micro/sloppy-apple-keynote-pt2/</link>
      <pubDate>Mon, 05 Jun 2023 22:06:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/sloppy-apple-keynote-pt2/</guid>
      <description>Vision Pro</description>
      <content:encoded><![CDATA[<ul>
<li>Pre-keynote expectations are to Vision Pro reality as &ldquo;front screen will show googly eyes&rdquo; is to the actual EyeSight feature</li>
<li>This product shows the degree to which Apple is the anti-Meta</li>
<li>The heavyweight first-gen feel of this reminds me of the first iPad. A super solid chunk.</li>
<li>The theater experience&ndash;want.</li>
<li>23M pixels per eye in a postage-stamp-size display.</li>
<li>So so so many things they had to do to get this right. E.g., Zeiss lens options for those needing corrected vision. Reminds me of Apple Watch, but probably 20X longer list.</li>
<li>On-secure-enclave OpticID. Holy hell.</li>
<li>So so so many cameras and sensors.</li>
<li>Required an entire new OS flavor to make this work.</li>
<li>Required an entire new chip family (in addition to an M2) to make this work&ndash;12ms latency sensor to display. That&rsquo;s insane but necessary. Meta will never, ever catch up with this.</li>
<li>5,000 patents. Seems about right.</li>
</ul>
<p>I predict an Apple Watch like trajectory of success but way way bigger revenues.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>It’s infuriatingly hard to understand how closed models train on their input</title>
      <link>https://craftycto.com/elsewhere/willison-infuriating-closed-models/</link>
      <pubDate>Sun, 04 Jun 2023 00:07:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/willison-infuriating-closed-models/</guid>
      <description>Simon Willison digs into the question of whether the big closed LLMs are training their models based on users&amp;#39; input.</description>
      <content:encoded><![CDATA[<p><a href="https://simonwillison.net/2023/Jun/4/closed-model-training/">It’s infuriatingly hard to understand how closed models train on their input</a> Simon Willison digs into the question of whether the big closed LLMs are training their models based on users&rsquo; input. As Willison says:</p>
<blockquote>
<p>I’ve been wanting to write something reassuring about this issue for a while now. The problem is&hellip; I can’t do it. I don’t have the information I need to credibly declare these concerns unfounded, and the more I look into this the murkier it seems to get &hellip; The fundamental issue here is one of transparency. The builders of the big closed models—GPT-3, GPT-4, Google’s PaLM and PaLM 2, Anthropic’s Claude—refuse to tell us what’s in their training data.</p>
</blockquote>
<p>Ambiguous language from these big players is the norm; unambiguous statements, such as OpenAI&rsquo;s (which unfortunately applies only to paid API users and only from March 1st onward) is a rarity:</p>
<blockquote>
<p>OpenAI does not use data submitted by customers via our API to train OpenAI models or improve OpenAI’s service offering.</p>
</blockquote>
<p>This ambiguity around closed models&rsquo; training data makes open, self-hostable models&ndash;where there is zero ambiguity about, and total control of, training data&ndash;increasingly attractive to developers and companies building LLM-based products.</p>
<p>Definitely worth a read.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>ChatGPT Code Review</title>
      <link>https://craftycto.com/micro/chatgpt-codereview/</link>
      <pubDate>Sat, 03 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/chatgpt-codereview/</guid>
      <description>Another great use: coming up to speed on an unfamiliar codebase.</description>
      <content:encoded><![CDATA[<p>I&rsquo;m working with a fractional CTO client to launch a significant update of their web + mobile platform. The mobile app needs to support offline mapping, and our dev team has fighting through some problems there. My understanding of how map rendering and offline worked in the app was fairly high level, and given the current problems, I decided I needed to deepen my knowledge a bit. So I invoked my trusty intern ChatGPT (GPT-4 model) to help me walk through the app and understand the libraries being used, sources of map tiles, online and offline flows, etc. In about an hour, my understanding progressed from superficial to fairly deep, and potential causes of the problem we&rsquo;re fighting much more clear. The conversation spanned over 46 pages and 10,000 words. This wasn&rsquo;t a &ldquo;saved time&rdquo; situation&ndash;rather it was, &ldquo;never would have done it alone.&rdquo; A big win.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Day Late</title>
      <link>https://craftycto.com/micro/a-day-late/</link>
      <pubDate>Fri, 02 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/a-day-late/</guid>
      <description>What happens if I miss a day ??!!</description>
      <content:encoded><![CDATA[<p>Soon after I announced that I&rsquo;m <a href="https://craftycto.com/blog/write-every-day/">writing every day and why</a>, I realized, uh oh &hellip; what happens if I miss a day? Well, that day arrived yesterday (June 2) when I had a series of unfortunate events trying to streamline my content publishing by doing Hugo site builds in via Cloudflare Pages rather than locally. I spent too many hours streamlining (or trying to!) and zero hours writing. Well, it&rsquo;s a bit of a cheat, but I&rsquo;m doing yesterday&rsquo;s writing today, and I justify that because the subject is yesterday 😜. I&rsquo;ve reverted to my previous local build workflow for now, and will continue to plug away on the Cloudflare issue while keeping daily writing as a higher priority.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>OpenAI’s plans according to Sam Altman</title>
      <link>https://craftycto.com/elsewhere/openai-plans/</link>
      <pubDate>Thu, 01 Jun 2023 00:07:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/openai-plans/</guid>
      <description>Summary of Raza Habib&amp;#39;s interview last week with Sam Altman.</description>
      <content:encoded><![CDATA[<p><a href="https://humanloop.com/blog/openai-plans">OpenAI’s plans according to Sam Altman</a> Summary of Raza Habib&rsquo;s interview last week with Sam Altman. I have zero confidence that Altman is being transparent in any way here&ndash;in fact, my bet would be, assume that reality is the opposite of everything Altman says. E.g., regarding being GPU limited, this is to misdirect the competition and regulators, and not a real or important constraint. And is it just me, or does &ldquo;OpenAI will avoid competing with their customers — other than with ChatGPT&rdquo; sound a lot like Google&rsquo;s &ldquo;Don&rsquo;t be evil&rdquo; &hellip; yeah, that&rsquo;s the ticket!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>I&#39;m an Upgrade Coward</title>
      <link>https://craftycto.com/micro/upgrade-coward/</link>
      <pubDate>Wed, 31 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/upgrade-coward/</guid>
      <description>Upgrading to the latest Hugo.</description>
      <content:encoded><![CDATA[<p>I&rsquo;m such a coward when it comes to applying updates that might break things. Today was Upgrade To The Latest Hugo (0.112.5) and Upgrade To The New Tailwind-CSS-With-Hugo Approach. I was terrified and had to lean on poor <a href="https://www.brycewray.com/">Bryce Wray</a> over on the Hugo Discord for moral support. I finally worked up my courage &hellip; and typed</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>brew upgrade hugo
</span></span></code></pre></div><p>and <strong>10 seconds later</strong> I was running on Hugo 112.5, with the old Tailwind approach. 10 more minutes and the new Tailwind approach was in place. I&rsquo;ll take this opportunity to thank Bryce as well as all the folks contributing to make <a href="https://gohugo.io/">Hugo</a> and <a href="https://tailwindcss.com/">Tailwind CSS</a> awesome.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Lawyer cites fake cases invented by ChatGPT, judge is not amused</title>
      <link>https://craftycto.com/elsewhere/simon-deep-dives-fake-cases/</link>
      <pubDate>Tue, 30 May 2023 16:07:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/simon-deep-dives-fake-cases/</guid>
      <description>Simon Willison does a deep review of the ChatGPT aspects of the recent case where a lawyer submitted ChatGPT-hallucinated case law.</description>
      <content:encoded><![CDATA[<p><a href="https://simonwillison.net/2023/May/27/lawyer-chatgpt/">Lawyer cites fake cases invented by ChatGPT, judge is not amused</a> Simon Willison does a deep review of the ChatGPT aspects of the recent case where a lawyer submitted ChatGPT-hallucinated case law. The story starts out as a standard ChatGPT hallucination, but got crazier when ChatGPT doubled down when asked to confirm if the cases were real. (I actually ran the confirmation prompt Willison used and it <a href="https://chat.openai.com/share/e0a2a287-108d-4c49-9c95-d955fc5d5345">worked for me</a>)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Camus on True Knowledge (From Myth of Sisyphus, 1955)</title>
      <link>https://craftycto.com/quote/camus-knowledge/</link>
      <pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/quote/camus-knowledge/</guid>
      <description>With the exception of professional rationalists, people today despair of true knowledge.</description>
      <content:encoded><![CDATA[<blockquote>
<p>With the exception of professional rationalists, people today despair of true knowledge.</p>
</blockquote>
<p>&ndash; <a href="https://plato.stanford.edu/entries/camus/">Albert Camus, Myth of Sisyphus, 1955</a> <span class="ml-3">May 30, 2023</span>
<span class="ml-1"><a href="https://craftycto.com/quote/camus-knowledge/">#</a></span>
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to Write Every Day—and Why</title>
      <link>https://craftycto.com/blog/write-every-day/</link>
      <pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/write-every-day/</guid>
      <description>With help from others, I made the transition from painful-episodic to enjoyable-daily writing.</description>
      <content:encoded><![CDATA[<p>I had been struggling with wanting to write at least weekly, but failing miserably&ndash;monthly at best. The pressure-to-write would build up and up and up, and finally I would put everything else aside to spasm out a <a href="https://craftycto.com/blog/the-emergence-s1e4/">long piece</a>. It was not pleasant, but at least I was writing again.</p>
<p>Then I came across Mattias Ott&rsquo;s commentary <a href="https://matthiasott.com/notes/writing-fragments-and-the-memex-method">Writing, Fragments, and the Memex Method</a>, which led me to Cory Doctorow&rsquo;s piece <a href="https://doctorow.medium.com/the-memex-method-238c71f2fb46">The Memex Method</a>. These resonated amazingly, with Ott&rsquo;s piece helping me better appreciate Doctorow&rsquo;s. Read them both!</p>
<h2 id="daily-writing-isnt-just-about-frequency">Daily Writing Isn&rsquo;t Just About Frequency</h2>
<p>I&rsquo;ve always thought about daily writing as being all about &ldquo;building muscle memory,&rdquo; but Doctorow and Ott enlightened me&ndash;that&rsquo;s the least of its benefits. As Ott says,</p>
<blockquote>
<p>I already knew that blogging – and having a personal website in general – is a superpower &hellip;.</p>
<p>I had heard before of Vannevar Bush’s groundbreaking essay “As We May Think” that directly inspired the invention of hypertext by Ted Nelson and Douglas Engelbart, which, in turn, had a huge influence on the WorldWideWeb project.</p>
<p>I also knew that a blog lets you document your thoughts and impressions in what can become an archive for your notes and a record of your experiences over time.</p>
<p>I knew that by sitting down and writing, your writing will inevitably improve.</p>
<p>And, I knew that some people are bad at writing regularly and that others – and that’s why we like to call them “writers” – aren’t.</p>
<p><strong>What Cory describes in his post, however, goes far beyond those individual ideas. He combines them into an approach to blogging that is maybe the most compelling and empowering reason to have a blog.</strong></p>
</blockquote>
<h2 id="short-form-content-fragments-as-writers-notebook">Short Form Content (Fragments) as Writer&rsquo;s Notebook</h2>
<p>I had already been thinking about writing shorter pieces as part of trying to get on a quicker cadence&ndash;it&rsquo;s easier to hit a daily cadence if quick, short pieces are an option.</p>
<p>But of course, short content published daily is so much more than that, as Doctorow makes clear. He explains that daily short-form writing is analogous to the writer&rsquo;s pocket notebook, connects that to the original &ldquo;web log&rdquo; concept, and finally ties it in with Vannevar Bush&rsquo;s &ldquo;memex&rdquo; concept from the 1945 paper <a href="https://www.w3.org/History/1945/vbush/">As We May Think</a>. Distilling a few of Doctorow&rsquo;s key points:</p>
<ul>
<li>Ideas that are published have much more power than ideas that I just jotted down. I&rsquo;m assembling my thoughts in a coherent enough manner to share them, and I&rsquo;m signing my name to them, putting them out for comment and critique.  With a daily writing routine, I&rsquo;m largely &ldquo;web logging&rdquo; everything important that I&rsquo;m thinking about.</li>
<li>If you build a large collection of small published ideas, they tend to self-assemble into larger, more important essay-scale work. Doctorow calls it &ldquo;nucleation in a supersaturated solution&rdquo;&ndash;each small idea constantly triggers our minds: &ldquo;this is a piece of something bigger, and maybe something important.&rdquo; Doctorow:
<blockquote>
<p>Every now and again, a few of these fragments will stick to each other and nucleate, crystallizing a substantial, synthetic analysis out of all of those bits and pieces I’ve salted into that solution of potential sources of inspiration.</p>
</blockquote>
</li>
</ul>
<p>For me, the huge win is, instead of cathartic agony once a month trying to gather my thoughts and figure out what to write about, all I have to do is write daily, usually small pieces, and allow the larger essays to emerge naturally. I suspect that the quality and power of the writing will be significantly higher also&ndash;we&rsquo;ll see.</p>
<h2 id="and-posse-too">And POSSE Too</h2>
<p>Doctorow has <a href="https://pluralistic.net/2023/02/19/drei-drei-drei/#now-we-are-three">influenced me</a> in other ways, among them <a href="https://indieweb.org/POSSE">introducing me to IndieWeb and their POSSE principles</a>.</p>
<blockquote>
<p>POSSE is an abbreviation for Publish (on your) Own Site, Syndicate Elsewhere, the practice of posting content on your own site first, then publishing copies or sharing links to third parties (like social media silos) with original post links to provide viewers a path to directly interacting with your content.</p>
</blockquote>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/write-every-day/posse-horseback.webp"><picture>
    <source type="image/webp" srcset="/blog/write-every-day/posse-horseback_hu9580471659413858179.webp 320w, /blog/write-every-day/posse-horseback_hu16753129581769204402.webp 640w, /blog/write-every-day/posse-horseback_hu14378536491024196875.webp 768w, /blog/write-every-day/posse-horseback_hu5938767922620995555.webp 1024w, /blog/write-every-day/posse-horseback_hu6464012124513642448.webp 1280w, /blog/write-every-day/posse-horseback_hu8490886158146895877.webp 1536w, /blog/write-every-day/posse-horseback_hu12504755710222769861.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/write-every-day/posse-horseback_hu835606990935249644.jpg 320w, /blog/write-every-day/posse-horseback_hu8890715502320664403.jpg 640w, /blog/write-every-day/posse-horseback_hu11136035651622601891.jpg 768w, /blog/write-every-day/posse-horseback_hu9212588840162441755.jpg 1024w, /blog/write-every-day/posse-horseback_hu13263852104240826938.jpg 1280w, /blog/write-every-day/posse-horseback_hu8631803359500308378.jpg 1536w, /blog/write-every-day/posse-horseback_hu4007297382506505095.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/write-every-day/posse-horseback_hu8890715502320664403.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Early this year I set up the new <a href="https://craftycto.com/">company-website-plus-blog</a>, and took a relatively POSSE-compliant approach, leveraging the <a href="https://gohugo.io/">Hugo</a> open-source static generation framework, with content being simple markdown, my CMS being Git / GitHub, and my hosting platform being &ldquo;any of the players that let me host static content under a free plan&rdquo;, currently CloudFlare Pages but I could change that with minimal work. I gained control of company content, as well as the long-form essays I was posting to the blog.</p>
<p>I had a major POSSE leak, however, when it came to short-form content. I post on LinkedIn to help get visibility for myself and Crafty, and all that content was basically throw-away. (LinkedIn does, actually, throw away my content, as I found when I tried to get back to some work from 2019.) Likewise, some of my posting on Mastodon is similar in nature (I pulled the eject handle on Twitter back in November), and again ended up being throw-away, in the sense that it&rsquo;s possible that my mastodon server might disappear without me having a chance to get my content out. (The Mastodon community is working on this, and the situation is so much better than with Twitter, where the absolute worst has already occurred, at least until it gets worser.) Partly because of the siloed, throw-away nature of self-contained posting to LinkedIn and Mastodon, I&rsquo;ve been only sporadically done these short posts, exactly wrong when one is trying to get known and build a following.</p>
<p>So along with adopting a daily writing habit, I decided to plug my POSSE leaks.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/write-every-day/posse-diagram.webp"><picture>
    <source type="image/webp" srcset="/blog/write-every-day/posse-diagram_hu122467931589784510.webp 320w, /blog/write-every-day/posse-diagram_hu11852565058045550302.webp 640w, /blog/write-every-day/posse-diagram_hu8900862033246046279.webp 768w, /blog/write-every-day/posse-diagram_hu11545757661337572587.webp 1024w, /blog/write-every-day/posse-diagram_hu13687724156443258941.webp 1280w, /blog/write-every-day/posse-diagram_hu1450951089317904038.webp 1536w, /blog/write-every-day/posse-diagram_hu12605364163981941064.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/write-every-day/posse-diagram_hu12505881397624783745.jpg 320w, /blog/write-every-day/posse-diagram_hu1992572982393577792.jpg 640w, /blog/write-every-day/posse-diagram_hu13576019152882345294.jpg 768w, /blog/write-every-day/posse-diagram_hu16332625264209337346.jpg 1024w, /blog/write-every-day/posse-diagram_hu2589302820309254036.jpg 1280w, /blog/write-every-day/posse-diagram_hu16632239291705074293.jpg 1536w, /blog/write-every-day/posse-diagram_hu4285086159690274402.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/write-every-day/posse-diagram_hu1992572982393577792.jpg" width="3072" height="3072" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="updating-craftys-illustratedhttpscraftyctocomblog-for-daily-writing-and-posse">Updating <a href="https://craftycto.com/blog">Crafty&rsquo;s Illustrated</a> for Daily Writing and POSSE</h2>
<p>I use the <a href="https://github.com/reorx/hugo-PaperModX">PaperModX theme</a> in Hugo, which is of course a fork of PaperMod, which itself is a fork of Paper. PaperModX is well suited for &ldquo;normal&rdquo; size blog posts, but less so for microblogging. Of course, Hugo itself is a blank slate that grants me absolute control over what gets served up to a browser&ndash;just a matter of tweaking it, in my case pulling some elements out of the theme and customizing.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/write-every-day/craftys-illustrated-micro2.webp"><picture>
    <source type="image/webp" srcset="/blog/write-every-day/craftys-illustrated-micro2_hu4697887449161856042.webp 320w, /blog/write-every-day/craftys-illustrated-micro2_hu5940880835405262754.webp 640w, /blog/write-every-day/craftys-illustrated-micro2_hu5258822419090476327.webp 768w, /blog/write-every-day/craftys-illustrated-micro2_hu6841193641043086400.webp 1024w, /blog/write-every-day/craftys-illustrated-micro2_hu16837334528615687406.webp 1280w, /blog/write-every-day/craftys-illustrated-micro2_hu8430209015247071417.webp 1536w, /blog/write-every-day/craftys-illustrated-micro2_hu15546965074877666218.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/write-every-day/craftys-illustrated-micro2_hu9764252502576838047.jpg 320w, /blog/write-every-day/craftys-illustrated-micro2_hu676786963775423600.jpg 640w, /blog/write-every-day/craftys-illustrated-micro2_hu140816135326024317.jpg 768w, /blog/write-every-day/craftys-illustrated-micro2_hu9078901713053423383.jpg 1024w, /blog/write-every-day/craftys-illustrated-micro2_hu18230379688668265619.jpg 1280w, /blog/write-every-day/craftys-illustrated-micro2_hu1634363432565288775.jpg 1536w, /blog/write-every-day/craftys-illustrated-micro2_hu16829318549240990938.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/write-every-day/craftys-illustrated-micro2_hu676786963775423600.jpg" width="2698" height="1818" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>I&rsquo;ve mentioned that generative AI tools like ChatGPT and MidJourney allow me to be more ambitious with my projects than I would otherwise have been. I would have hesitated if I had to devote a work week or more to enabling microblogging, but ChatGPT GPT-4 edition cut that task down enough that I was able to complete it in spare hours over the holiday weekend. I liked <a href="https://simonwillison.net/">Simon Willison&rsquo;s approach</a> of having several flavors of micro content, and ended up implementing four:</p>
<ul>
<li><a href="https://craftycto.com/elsewhere/mimestream/">Elsewhere</a>: A link to someone else&rsquo;s content, and why I felt it was noteworthy</li>
<li><a href="https://craftycto.com/quote/camus-knowledge/">Quote</a>: A quotation with attribution and links to the author</li>
<li><a href="https://craftycto.com/imagery/steamnoble/">Imagery</a>: Being a generative and geometric artwork fan, I love sharing others&rsquo; interesting creations, and this is a special micro format for exactly this purpose.</li>
<li><a href="https://craftycto.com/micro/chatgpt-record/">Micro</a>: A small thought that doesn&rsquo;t fit neatly as one of the above.</li>
</ul>
<h2 id="plugging-the-linkedin-and-mastodon-posse-leaks">Plugging the LinkedIn and Mastodon POSSE Leaks</h2>
<p>From now on, any significant small idea gets done first on Crafty&rsquo;s Illustrated as micro content using these new microformats. Then, when it comes time for the Syndicate Everywhere phase of POSSE, I&rsquo;ll do a quick paste-edit of the content into the external platform, always with a link back to the permanent, definitive page on Crafty&rsquo;s. Here&rsquo;s a recent <a href="https://www.linkedin.com/posts/jackivers_chatgpt-gpt4-posse-activity-7068950018077962240-2nAZ?utm_source=share&amp;utm_medium=member_desktop">LinkedIn post version</a> of the micro entry linked above.</p>
<p>So I am now some level of POSSE compliant&ndash;<a href="https://indieweb.org/indiemark-checklist">I&rsquo;m not kidding!</a>&ndash;and writing daily! Hurray!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why I Use Mimestream for Gmail</title>
      <link>https://craftycto.com/elsewhere/mimestream/</link>
      <pubDate>Mon, 29 May 2023 16:46:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/mimestream/</guid>
      <description>Mimestream has me reconsidering Apple Mail as my daily driver.</description>
      <content:encoded><![CDATA[<p><a href="https://tidbits.com/2023/05/24/why-i-use-mimestream-for-gmail/">Why I Use Mimestream for Gmail</a> Based on what I&rsquo;m reading about Mimestream, I&rsquo;m reconsidering my attitude that &ldquo;I need a mail app that works with more than just Gmail,&rdquo; because when I did an inventory and considered importance as a factor, 95% of my important email interactions are from Gmail accounts. I&rsquo;m thinking I&rsquo;d use Apple Mail for non-Gmail and Mimestream for Gmail (Mac only for now). I&rsquo;m currently testing Mimestream on their free trial. Via <a href="https://daringfireball.net/linked/2023/05/29/engst-mimestream">Daring Fireball</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>CLI tools for working with ChatGPT and other LLMs</title>
      <link>https://craftycto.com/elsewhere/simon-cli-for-llm/</link>
      <pubDate>Mon, 29 May 2023 16:07:00 +0000</pubDate>
      
      <guid>https://craftycto.com/elsewhere/simon-cli-for-llm/</guid>
      <description>I installed Simon&amp;#39;s llm, ttok, and strip-tags CLI tools and got them working, great stuff.</description>
      <content:encoded><![CDATA[<p><a href="https://simonwillison.net/2023/May/18/cli-tools-for-llms/">CLI tools for working with ChatGPT and other LLMs</a> I installed Simon&rsquo;s llm, ttok, and strip-tags CLI tools and got them working, great stuff. Haven&rsquo;t used them yet beyond running variations of his examples, but glad to have this toolkit. Also grabbed shot-scraper, I know that will come in handy. And installed pipx, very cool.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Working With My ChatGPT Intern</title>
      <link>https://craftycto.com/micro/chatgpt-record/</link>
      <pubDate>Mon, 29 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/micro/chatgpt-record/</guid>
      <description>Yesterday was a new record.</description>
      <content:encoded><![CDATA[<p>I set a record yesterday in terms of the most hours co-developing with ChatGPT (GPT-4 default model mostly). I made a decision recently to a) start writing daily, and b) follow <a href="https://indieweb.org/POSSE">POSSE</a>&ndash;Publish (on your) Own Site, Syndicate Elsewhere&ndash;to keep control of my content. To enable a) and b), I expanded my blog, Crafty&rsquo;s Illustrated, to support four new microblogging content types (like this one!).  My ChatGPT intern helped with: Hugo templating, Tailwind CSS, shell scripts, how to resolve a Git merge issue, and more.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Emergence</title>
      <link>https://craftycto.com/blog/the-emergence-s1e4/</link>
      <pubDate>Tue, 18 Apr 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/the-emergence-s1e4/</guid>
      <description>Season 1, Episode 4</description>
      <content:encoded><![CDATA[<p>Here we go again. My last <a href="/blog/march-madness-ai/">AI post</a> hit the wire 31 days ago, after a week of agonizing over what to focus on, with Something Really Important seeming to land every other day and completely blow up my plans. One of my go-to AI trackers / prototypers is <a href="https://simonwillison.net/">Simon Willison</a>, creator of the <a href="https://datasette.io/">Datasette</a> open source project. In a recent conversation, we laughed about how tough it is to stay up with the AI Emergence, and I pointed out that it&rsquo;s almost a full time job just keeping up with <strong>him</strong>, let alone everything else happening in the AI world. (Willison is prolific, to no small degree, because he&rsquo;s skilled at applying tools like ChatGPT.)</p>
<p>One of my CS professors was Roger Schank, who just passed away in January. Schank was &ldquo;<a href="https://www.mccormick.northwestern.edu/computer-science/news-events/news/articles/2023/professor-emeritus-roger-schank-passes-away.html">a foundational pioneer in the fields of artificial intelligence, cognitive science, and learning sciences</a>,&rdquo; truly one of the original AI visionaries. But in a sense, Schank was ~43 years too early. I may sigh about the difficulties of staying current, but I&rsquo;m also exhilarated to be here, able to observe and participate in The Emergence.</p>
<p>In any case&mdash;I&rsquo;ve again passed through another week-long Period of Agonizing, and this is now my fourth AI post. The material doesn&rsquo;t seem to be drying up, so I&rsquo;m just going to run with it and start using Netflix style season-episode numbering. So <em>Welcome To S1E4.</em></p>
<h2 id="what-are-people-sleeping-on-">What are people &ldquo;sleeping on&rdquo; &hellip;</h2>
<p>I&rsquo;m borrowing the &ldquo;sleeping on&rdquo; reference from an interview Willison did on the <a href="https://changelog.com/podcast/534">Changelog podcast</a>, where <a href="https://simonwillison.net/2023/Apr/8/llms-break-the-internet/">he said</a>:</p>
<blockquote>
<p>This is the thing I worry that people are sleeping on. People who think &rsquo;these language models lie to you all the time&rsquo; (which they do) and &rsquo;they will produce buggy code with security holes&rsquo;—every single complaint about these things is true, and yet, despite all of that, the productivity benefits you get if you lean into them and say OK, how do I work with something that’s completely unreliable, that invents things, that comes up with APIs that don’t exist… how do I use that to enhance my workflow anyway?</p>
<p>And the answer is that you can get enormous leaps ahead in productivity and in the ambition of the kinds of projects that you take on, if you can accept both things are true at once at once: it can be flawed, and lying, and have all of these problems… and it can also be a massive productivity boost.</p>
</blockquote>
<p>Question: &ldquo;When will this AI stuff actually be useful?&rdquo;; Willison&rsquo;s answer, &ldquo;It already is!&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/sleep-on-it.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/sleep-on-it_hu4947230406145593058.webp 320w, /blog/the-emergence-s1e4/sleep-on-it_hu1578911698777330376.webp 640w, /blog/the-emergence-s1e4/sleep-on-it_hu10577857880900582287.webp 768w, /blog/the-emergence-s1e4/sleep-on-it_hu7499491583982562612.webp 1024w, /blog/the-emergence-s1e4/sleep-on-it_hu11884219021568570520.webp 1280w, /blog/the-emergence-s1e4/sleep-on-it_hu1231046934010273020.webp 1536w, /blog/the-emergence-s1e4/sleep-on-it_hu17967028390783648766.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/sleep-on-it_hu18144638558165401117.jpg 320w, /blog/the-emergence-s1e4/sleep-on-it_hu1024308661957932387.jpg 640w, /blog/the-emergence-s1e4/sleep-on-it_hu6930150059648306310.jpg 768w, /blog/the-emergence-s1e4/sleep-on-it_hu11901659871707052608.jpg 1024w, /blog/the-emergence-s1e4/sleep-on-it_hu2312936350436260677.jpg 1280w, /blog/the-emergence-s1e4/sleep-on-it_hu1615273840234315721.jpg 1536w, /blog/the-emergence-s1e4/sleep-on-it_hu3674081075124395094.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/the-emergence-s1e4/sleep-on-it_hu1024308661957932387.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Over on <a href="https://www.reddit.com/r/MachineLearning/">Reddit r/MachineLearning</a>, someone asked <a href="https://www.reddit.com/r/MachineLearning/comments/12dz4hh/d_is_all_the_talk_about_what_gpt_can_do_on/">Is all the talk about what GPT can do on Twitter and Reddit exaggerated or fairly accurate?</a> I was struck by this response (since deleted):</p>
<blockquote>
<p>Once this thing starts accellerating [sic], we won&rsquo;t be having these discussions. That moment passed with GPT-4 and Bing chat starting using it. It&rsquo;s just not readily visible to the populace and even to most decisionmakers, yet.</p>
</blockquote>
<p>Question: &ldquo;Is this AI stuff for real?&rdquo;; answer, &ldquo;Dude, we&rsquo;re already WAY past that question.&rdquo;</p>
<p>Yet not everyone is seeing it&mdash;hence Willison&rsquo;s concern that people are sleeping on it. Why? One factor, I think, is <a href="https://web3isgoinggreat.com/">Crypto Rash</a>. Today&rsquo;s AI hype sounds a lot like yesterday&rsquo;s crypto hype; and crypto turned out to be a steaming pile of crap, a solution looking for a non-criminal problem to solve. Hearing similar hyperbole about AI&mdash;and seeing a lot of VC money pivoting away from crypto and chasing AI instead&mdash;I get it that people smell another hype bubble. Once burned, twice shy.</p>
<p>But &hellip; AI&rsquo;s not like crypto. Drill down on crypto? Find nothing&mdash;vacuum. Drill down on the current AI emergence, find so much that, like me, you&rsquo;ll have trouble even keeping up. We&rsquo;re already past the &ldquo;this looks promising&rdquo; milestone, we&rsquo;re at &ldquo;this is delivering right now, today, this minute&rdquo; and even more telling, the &ldquo;yes, I&rsquo;ll pay for it!&rdquo; And the progress curve continues to look exponential.</p>
<h2 id="caught-in-the-churn">Caught in the churn</h2>
<p>If we really are at the early stages of an emergence, what are the implications? How does this change our day to day activities? How should we rethink our decision-making, how we run our businesses?</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/burton-rules-change.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/burton-rules-change_hu6108078680541693292.webp 320w, /blog/the-emergence-s1e4/burton-rules-change_hu6378403509413156895.webp 640w, /blog/the-emergence-s1e4/burton-rules-change_hu16401078049402342804.webp 768w, /blog/the-emergence-s1e4/burton-rules-change_hu13549293775889544256.webp 1024w, /blog/the-emergence-s1e4/burton-rules-change_hu14206890191580159208.webp 1280w, /blog/the-emergence-s1e4/burton-rules-change_hu14726296951241160137.webp 1536w, /blog/the-emergence-s1e4/burton-rules-change_hu17817850301414091670.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/burton-rules-change_hu3951866441314033118.jpg 320w, /blog/the-emergence-s1e4/burton-rules-change_hu1615703826555656181.jpg 640w, /blog/the-emergence-s1e4/burton-rules-change_hu15443546029097566416.jpg 768w, /blog/the-emergence-s1e4/burton-rules-change_hu2644463232503940632.jpg 1024w, /blog/the-emergence-s1e4/burton-rules-change_hu11525331592182084888.jpg 1280w, /blog/the-emergence-s1e4/burton-rules-change_hu9141368066000324507.jpg 1536w, /blog/the-emergence-s1e4/burton-rules-change_hu11740649402787301549.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/the-emergence-s1e4/burton-rules-change_hu1615703826555656181.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>There&rsquo;s an applicable concept from <a href="https://www.jamessacorey.com/">James S.A. Corey</a>&rsquo;s fantastic sci-fi series <a href="https://en.wikipedia.org/wiki/The_Expanse_(TV_series)">The Expanse</a> known as &ldquo;the churn.&rdquo; Here&rsquo;s a summary from <a href="https://www.phind.com/">phind.com</a>, a ChatGPT-backed web search similar to (but better than, in my opinion) Bing Chat:</p>
<blockquote>
<p>In the Expanse series, &ldquo;the churn&rdquo; is a term used to describe the cycle of chaos, change, and upheaval that the characters face due to various factors such as political, social, or criminal turmoil. The concept of the churn is particularly significant for the character Amos Burton, who grew up in a crime-ridden Baltimore where survival was a constant struggle app.thestorygraph.com.</p>
<p>The churn can be seen as a metaphor for the unpredictable nature of life and the constant state of flux that people experience. It represents the transitional periods during which stability and order are disrupted, and individuals must adapt or face the consequences. In the context of the Expanse series, the churn is often associated with the broader political and social upheaval occurring throughout the solar system, as well as the personal struggles and challenges faced by the characters.</p>
</blockquote>
<p>In a great scene from the TV series, the Amos Burton character explains it himself:</p>
<blockquote>
<p>Kenzo: It must be nice, having everything figured out like that.</p>
<p>Amos: Ain’t nothing to do with me: we’re just caught in the Churn, that’s all.</p>
<p>Kenzo: I have no idea what you just said.</p>
<p>Amos: This boss I used to work for in Baltimore, he called it the Churn. When the rules of the game change.</p>
<p>Kenzo: What game?</p>
<p>Amos: The only game. Survival. When the jungle tears itself down and builds itself into something new.</p>
</blockquote>
<p>If you&rsquo;ve read or watched The Expanse, you know that Corey&rsquo;s churn is extreme&mdash;and that&rsquo;s not what I anticipate from our AI emergence. But &ldquo;churn&rdquo; captures the dynamic&mdash;as we go about our daily tasks, run our businesses, plan and strategize&mdash;beneath our feet, the world will be churning away, reshaping itself.</p>
<p>A case in point: you&rsquo;re familiar with the stock photo business? Well, that industry has been terminated. On <a href="https://www.reddit.com/r/midjourney/">Reddit r/Midjourney</a>, this <a href="https://www.reddit.com/r/midjourney/comments/12ekm1s/gpt4_midjourney_v5_upscayl/">post outlines</a> how it&rsquo;s now possible to use ChatGPT&rsquo;s newest GPT-4 model to generate great Midjourney text prompts, which in turn renders <a href="https://preview.redd.it/q9h8jo5kmgsa1.jpg?width=5824&amp;format=pjpg&amp;auto=webp&amp;v=enabled&amp;s=db230f7f51aa5edba79cf70c661e2dcef3e5f78a">jaw-dropping images</a>. In the comments, several users immediately focus on the implications for the stock photo industry:</p>
<div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/reddit-midjourney-stockphoto.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu9485093185320356286.webp 320w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu3539326657815373732.webp 640w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu4561622448017267369.webp 768w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu2254710180030630518.webp 1024w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu8741467489160699367.webp 1280w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu16181950402467519070.webp 1536w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu7691721653189399594.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu5052487503645508374.jpg 320w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu7405359694884955156.jpg 640w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu13899900577300500710.jpg 768w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu10755970393056965681.jpg 1024w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu16327989222001536830.jpg 1280w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu2148555658512115548.jpg 1536w, /blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu11219811771098600582.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/the-emergence-s1e4/reddit-midjourney-stockphoto_hu7405359694884955156.jpg" width="2048" height="1650" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Note, again, this is not &ldquo;at some point we&rsquo;ll be able to move off iStock&rdquo;&mdash;but rather &ldquo;we cancelled our iStock subscription last month.&rdquo; And cost savings isn&rsquo;t the only driver. Since each Midjourney prompt creates new, unique imagery, it eliminates an entire manual step in the workflow&mdash;the need to search around for where else a stock image might have been (over-)used.</p>
<p>The churn isn&rsquo;t limited to smallish segments like stock photos, either. <a href="https://news.ycombinator.com/item?id=35537813">Meta is reeling</a>, having bet heavily on &ldquo;the metaverse.&rdquo; <a href="https://arstechnica.com/gadgets/2023/04/panic-at-google-samsung-considers-dumping-search-for-bing-and-chatgpt/?utm_source=pocket_saves">Google is reeling</a>, at risk of losing the Google search franchise to upstart AI competitors. <a href="/blog/march-madness-ai/#meanwhile-at-apple-">Apple&rsquo;s bag is mixed</a>, with strength in ML-enabled silicon but weakness on AI software, particularly Siri&rsquo;s grave limitations and snails-pace evolution.</p>
<h2 id="surfing-the-churn">Surfing the churn</h2>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/burton-surfs-2.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/burton-surfs-2_hu17178019108203971305.webp 320w, /blog/the-emergence-s1e4/burton-surfs-2_hu15821872543518712876.webp 640w, /blog/the-emergence-s1e4/burton-surfs-2_hu10530766552210682954.webp 768w, /blog/the-emergence-s1e4/burton-surfs-2_hu5441016429287962041.webp 1024w, /blog/the-emergence-s1e4/burton-surfs-2_hu7542343894808312705.webp 1280w, /blog/the-emergence-s1e4/burton-surfs-2_hu6841810202726336176.webp 1536w, /blog/the-emergence-s1e4/burton-surfs-2_hu11912050991409644906.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/burton-surfs-2_hu1232374574305198177.jpg 320w, /blog/the-emergence-s1e4/burton-surfs-2_hu4492205494378619101.jpg 640w, /blog/the-emergence-s1e4/burton-surfs-2_hu17468387124177396369.jpg 768w, /blog/the-emergence-s1e4/burton-surfs-2_hu13162005712793873395.jpg 1024w, /blog/the-emergence-s1e4/burton-surfs-2_hu1767064151475530128.jpg 1280w, /blog/the-emergence-s1e4/burton-surfs-2_hu7713387271640065127.jpg 1536w, /blog/the-emergence-s1e4/burton-surfs-2_hu9809965064858375184.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/the-emergence-s1e4/burton-surfs-2_hu4492205494378619101.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>So if we&rsquo;re in the churn, if the jungle is indeed tearing itself down and building itself into something new, how do we function, how do we run a business? A good image to keep in mind, I think, is &ldquo;surfing the churn.&rdquo; We can&rsquo;t predict, let alone control, how The Emergence will play out. But we can prepare ourselves to operate in a highly fluid environment&mdash;make ourselves ready to surf the churn. A few thoughts on how:</p>
<ul>
<li><strong>Don&rsquo;t sleep on this.</strong> Recognize that something unprecedented is happening and that the alternative to surfing the churn is the churn surfing you. Prioritize accordingly.</li>
<li><strong>Use AI yourself.</strong> Every knowledge worker can leverage AI tools like ChatGPT, right now, to claw back a significant percentage of their work week. For example, I recently talked with the CEO of a biotech investment fund. As a field, biotech has been a leader in applying machine learning (think protein folding); and it&rsquo;s not clear whether generative AI tools will contribute much to core business of biotech. But every knowledge worker in a biotech business, including that CEO, is likely to find 10+ hours every working week if they actively, intentionally scan through their work week and leverage AI where AI makes sense.</li>
<li><strong>War game AI for your business&mdash;offensively and defensively.</strong> Where can we apply what&rsquo;s emerging to make our product better, increase our agility and effectiveness, reduce costs? Conversely, what AI moves might a competitor make that could put us in a world of hurt?</li>
<li><strong>Stay up on what&rsquo;s emerging.</strong> If you&rsquo;re the CEO and not deeply technical, having a CTO or <a href="/about/">fractional CTO</a> that can understand emerging AI and then translate that raw material into &ldquo;most potentially impactful for us&rdquo; is a great option, and can flow smoothly to the next point.</li>
<li><strong>Get your feet wet with prototypes.</strong> Generative AI is your friend in applying generative AI &hellip; the cost of cranking out a prototype for a promising idea&mdash;now that we have ChatGPT and Copilot to write a lot of the code&mdash;is lower than ever. It&rsquo;s a no-brainer to make this investment, and there&rsquo;s little chance you&rsquo;ll get to a great idea (or even achieve a decent understanding of what might be possible) without prototyping 10 less-than-great ideas first.</li>
</ul>
<p>A footnote to all this dire churn and war talk: I&rsquo;m optimistic about The Emergence. As I pointed out in <a href="/blog/alarmed-about-ai/">Season 1 Episode 2</a>, I&rsquo;m a believer in the wisdom of <a href="https://en.wikipedia.org/wiki/John_Seely_Brown">John Seely Brown</a>, former Chief Scientist at Xerox PARC, who <a href="https://web.cs.ucdavis.edu/~koehl/Teaching/ECS188_W16/Reprints/Response_to_BillJoy.pdf">pushed back</a> against the predictions of singularity doom by pointing out, simply, that humans adapt. If we know that we&rsquo;re in the churn, we can adapt, survive and maybe even thrive surfing the churn. But only if we&rsquo;re awake to what&rsquo;s happening.</p>
<h2 id="emergences-over-the-last-31-days">Emergences over the last 31 days</h2>
<ul>
<li>The <a href="https://ai.facebook.com/research/publications/segment-anything/">Segment Anything Model</a>, out of Meta AI, is pretty amazing, as is the work that computer vision firm <a href="https://roboflow.com/">Roboflow</a> is doing with it. In a nutshell, this is &ldquo;generative AI meets computer vision&rdquo; and if you&rsquo;re intrigued, first listen to this <a href="https://www.latent.space/p/segment-anything-roboflow#details">Latent Space podcast</a> featuring Joseph Nelson of Roboflow, and then watch <a href="https://www.youtube.com/watch?v=SZQSF-A-WkA">this demo</a>&mdash;very well done by Nelson and Latent Space&rsquo;s <a href="https://sigmoid.social/@swyx">swyx</a>.</li>
<li>Open source AI progress, in the form of <a href="https://www.databricks.com/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm">Dolly 2.0</a>, and (just yesterday!) <a href="https://www.together.xyz/blog/redpajama">RedPajama</a>&lsquo;a Data-1T LLM training set. In short: a lot of LLMs are closed source, have closed training datasets, or are constrained by non-commercial-use restrictions. Last week the Dolly 2.0 trained model arrived, licensed for research and commercial use. And just yesterday, <a href="https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T">RedPajama-Data-1T</a>, a 1.2 trillion token dataset modeled on the training data described in Facebook Research&rsquo;s <a href="https://www.arxiv-vanity.com/papers/2302.13971/">original LLaMA paper</a>&mdash;see Simon Willison&rsquo;s early exploration <a href="https://simonwillison.net/2023/Apr/17/redpajama-data/">here</a>. Both developments lead in the direction of &ldquo;we can build something great ourselves without depending on OpenAI or equivalent&rdquo; &hellip;</li>
</ul>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/emergence.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/emergence_hu3591322486112719031.webp 320w, /blog/the-emergence-s1e4/emergence_hu3807970592930972304.webp 640w, /blog/the-emergence-s1e4/emergence_hu9539443497873508671.webp 768w, /blog/the-emergence-s1e4/emergence_hu9728703386644610284.webp 1024w, /blog/the-emergence-s1e4/emergence_hu6751072912665861128.webp 1280w, /blog/the-emergence-s1e4/emergence_hu6403042645766768307.webp 1536w, /blog/the-emergence-s1e4/emergence_hu1800011861502109888.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/emergence_hu9375795037625527624.jpg 320w, /blog/the-emergence-s1e4/emergence_hu18174016622097260511.jpg 640w, /blog/the-emergence-s1e4/emergence_hu8459476713441673930.jpg 768w, /blog/the-emergence-s1e4/emergence_hu16076144031836310389.jpg 1024w, /blog/the-emergence-s1e4/emergence_hu3275716051072854385.jpg 1280w, /blog/the-emergence-s1e4/emergence_hu3040845148542833835.jpg 1536w, /blog/the-emergence-s1e4/emergence_hu10226269103661499546.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/the-emergence-s1e4/emergence_hu18174016622097260511.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<ul>
<li>
<p>ChatGPT as a weird intern. Simon Willison recently <a href="https://simonwillison.net/2023/Apr/12/code-interpreter/">wrote a blow-by-blow</a> of how he used ChatGPT as a pair programmer to write and run Python micro-benchmarks using ChatGPT&rsquo;s code interpreter plugin. He included an epic analogy of ChatGPT as a &ldquo;weird kind of intern&rdquo;:</p>
<blockquote>
<p>Here’s another analogy for large language models (since we can never have too many of those). It honestly feels a little like having a coding intern, with a strange set of characteristics:</p>
<ul>
<li>They’ve read and memorized all of the world’s public coding documentation, though they stopped reading in September 2021.</li>
<li>They’re unbelievably fast—they take just seconds to output entire programs from scratch.</li>
<li>If their code produces an error they can read the error message and attempt to update their code to fix it.</li>
<li>They won’t argue with you. That’s not necessarily a good thing: if you ask them to build something that’s clearly a bad idea they’ll likely just go ahead and do it anyway.</li>
<li>They respond incredibly well to feedback—they’ll apply it within seconds.</li>
<li>You have to know how to prompt them. I’ve got pretty good at this now, but it takes a lot of trial and error, and I think requires a pretty deep understanding of how they work.</li>
<li>You have to closely review EVERYTHING they do.</li>
<li>They work for free.</li>
</ul>
<p>And of course, they have zero understanding of anything at all. They’re a next-token-predicting machine with an unimaginably large training set.</p>
<p>The fact they can do even a fraction of the things they can do is, quite frankly, unbelievable. I’m still not sure I believe it myself.</p>
</blockquote>
</li>
<li>
<p>Continuing the series of &ldquo;LLMs I can run on my laptop,&rdquo; <a href="https://github.com/mlc-ai/web-llm">Web LLM</a> implements the fairly powerful <a href="https://huggingface.co/lmsys/vicuna-7b-delta-v0">vicuna-7b-delta-v0 model</a>, and actually runs that model in a Chrome browser, making use of Chrome&rsquo;s beta WebGPU API. Willison <a href="https://simonwillison.net/2023/Apr/16/web-llm/">reports</a> surprisingly solid performance.</p>
</li>
<li>
<p>The funniest news was <a href="https://www.izzy.co/">Izzy Miller</a> replacing his high school friends with an LLM chatbot. Miller&rsquo;s long-running group chat contained 488,000 messages, which made for a great training corpus. So obviously he decided to train an LLM, hook up a simulated messaging UI, and eliminate the friends. <a href="https://www.izzy.co/blogs/robo-boys.html">Check it out</a>&mdash;he did a great writeup and the LLM&rsquo;s behavior is, like Izzy&rsquo;s friends, pretty hilarious.</p>
</li>
</ul>
<div class="flex justify-evenly"><div class="w-[24%] mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/striking_ai_4.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/striking_ai_4_hu3033503664546552212.webp 320w, /blog/the-emergence-s1e4/striking_ai_4_hu11848928018841091031.webp 640w, /blog/the-emergence-s1e4/striking_ai_4_hu16521065224164498913.webp 768w, /blog/the-emergence-s1e4/striking_ai_4_hu11343118911253737715.webp 1024w, /blog/the-emergence-s1e4/striking_ai_4_hu806995375668437648.webp 1280w, /blog/the-emergence-s1e4/striking_ai_4_hu12644817573301989633.webp 1536w, /blog/the-emergence-s1e4/striking_ai_4_hu14985499766101888038.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/striking_ai_4_hu15682905927438687401.jpg 320w, /blog/the-emergence-s1e4/striking_ai_4_hu8251035563567611223.jpg 640w, /blog/the-emergence-s1e4/striking_ai_4_hu17349880910548437499.jpg 768w, /blog/the-emergence-s1e4/striking_ai_4_hu14418633965712262830.jpg 1024w, /blog/the-emergence-s1e4/striking_ai_4_hu15334565871446672560.jpg 1280w, /blog/the-emergence-s1e4/striking_ai_4_hu11204655421737343222.jpg 1536w, /blog/the-emergence-s1e4/striking_ai_4_hu9216709729194704464.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/the-emergence-s1e4/striking_ai_4_hu8251035563567611223.jpg" width="2048" height="1148" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/burton-screens.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/burton-screens_hu8866707761951558631.webp 320w, /blog/the-emergence-s1e4/burton-screens_hu5978218686544995311.webp 640w, /blog/the-emergence-s1e4/burton-screens_hu9795137335215444414.webp 768w, /blog/the-emergence-s1e4/burton-screens_hu17074966143604608219.webp 1024w, /blog/the-emergence-s1e4/burton-screens_hu6365942959796622789.webp 1280w, /blog/the-emergence-s1e4/burton-screens_hu2366143206673223681.webp 1536w, /blog/the-emergence-s1e4/burton-screens_hu15144062957722692308.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/burton-screens_hu16634955254080224558.jpg 320w, /blog/the-emergence-s1e4/burton-screens_hu394596863067630460.jpg 640w, /blog/the-emergence-s1e4/burton-screens_hu12879487138289663723.jpg 768w, /blog/the-emergence-s1e4/burton-screens_hu4195110964673428600.jpg 1024w, /blog/the-emergence-s1e4/burton-screens_hu15283420828067887145.jpg 1280w, /blog/the-emergence-s1e4/burton-screens_hu17131848643999780910.jpg 1536w, /blog/the-emergence-s1e4/burton-screens_hu5795067866629854550.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/the-emergence-s1e4/burton-screens_hu394596863067630460.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/emergence-2.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/emergence-2_hu8593427339525518673.webp 320w, /blog/the-emergence-s1e4/emergence-2_hu15843717700174417314.webp 640w, /blog/the-emergence-s1e4/emergence-2_hu8054169079518328103.webp 768w, /blog/the-emergence-s1e4/emergence-2_hu15325681144944704645.webp 1024w, /blog/the-emergence-s1e4/emergence-2_hu6378504702438136676.webp 1280w, /blog/the-emergence-s1e4/emergence-2_hu5487468412360432218.webp 1536w, /blog/the-emergence-s1e4/emergence-2_hu13045178157306766020.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/emergence-2_hu16122377494086087.jpg 320w, /blog/the-emergence-s1e4/emergence-2_hu10306766512670891088.jpg 640w, /blog/the-emergence-s1e4/emergence-2_hu12791676104280027421.jpg 768w, /blog/the-emergence-s1e4/emergence-2_hu8891631408982306026.jpg 1024w, /blog/the-emergence-s1e4/emergence-2_hu6093563788672816284.jpg 1280w, /blog/the-emergence-s1e4/emergence-2_hu14033452047233435760.jpg 1536w, /blog/the-emergence-s1e4/emergence-2_hu15661459988828260124.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/the-emergence-s1e4/emergence-2_hu10306766512670891088.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/the-emergence-s1e4/striking-ai-1.webp"><picture>
    <source type="image/webp" srcset="/blog/the-emergence-s1e4/striking-ai-1_hu13802953049147870665.webp 320w, /blog/the-emergence-s1e4/striking-ai-1_hu13681016416620412201.webp 640w, /blog/the-emergence-s1e4/striking-ai-1_hu5372711910235395388.webp 768w, /blog/the-emergence-s1e4/striking-ai-1_hu13395998197537338264.webp 1024w, /blog/the-emergence-s1e4/striking-ai-1_hu16601901220051718307.webp 1280w, /blog/the-emergence-s1e4/striking-ai-1_hu9828470068059644618.webp 1536w, /blog/the-emergence-s1e4/striking-ai-1_hu5109191622062465194.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/the-emergence-s1e4/striking-ai-1_hu1965242392726844367.jpg 320w, /blog/the-emergence-s1e4/striking-ai-1_hu1883105698320185661.jpg 640w, /blog/the-emergence-s1e4/striking-ai-1_hu13297303393570493743.jpg 768w, /blog/the-emergence-s1e4/striking-ai-1_hu8032148779067753541.jpg 1024w, /blog/the-emergence-s1e4/striking-ai-1_hu375924266923172778.jpg 1280w, /blog/the-emergence-s1e4/striking-ai-1_hu15562096632151453406.jpg 1536w, /blog/the-emergence-s1e4/striking-ai-1_hu16458493210251993535.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/the-emergence-s1e4/striking-ai-1_hu1883105698320185661.jpg" width="3072" height="1722" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>March Madness, AI Style</title>
      <link>https://craftycto.com/blog/march-madness-ai/</link>
      <pubDate>Sat, 18 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/march-madness-ai/</guid>
      <description>Observations on AI&amp;#39;s March acceleration</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been trying to write a comprehensive, buttoned-up &ldquo;AI Update,&rdquo; covering all this month&rsquo;s AI developments. But nearly every day, there&rsquo;s been something new that&rsquo;s at least important and sometimes game-changing. So I&rsquo;m reluctantly giving up on comprehensive, and settling for selective commentary on a few of the more interesting bits.</p>
<h2 id="first-lets-define-ai-">First, let&rsquo;s define AI &hellip;</h2>
<p>The AI label is getting slapped on a lot of things these days, and I&rsquo;m actually ok with that &ndash; it&rsquo;s a short, handy, evocative term, useful as long as we get its definition straight.</p>
<p>AI does <strong>not</strong> mean &ldquo;the machine is thinking.&rdquo; That&rsquo;s a real concept, but it has its own term: AGI or Artificial General Intelligence. AGI isn&rsquo;t here today, is unlikely to arrive in the near future, and is not part of the AI news I&rsquo;m writing about.</p>
<p>So if AI is not machine thought, what is it? Let me take a rough hack at a definition that I feel lines up with the reality of the tools that are our subject matter:</p>
<blockquote>
<p>A system capable of doing tasks that humans can&rsquo;t do, reasonably or at all, which therefore can therefore augment human capabilities.</p>
</blockquote>
<p>That&rsquo;s a lesser achievement than an AI actually thinking; but when you grasp and experience AI augmentation, you may conclude, as I have &ndash; &ldquo;this changes everything&rdquo; is not an exaggeration.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/friendly-ai-helping.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/friendly-ai-helping_hu8691135999368358446.webp 320w, /blog/march-madness-ai/friendly-ai-helping_hu154564878868387822.webp 640w, /blog/march-madness-ai/friendly-ai-helping_hu10331559670776340605.webp 768w, /blog/march-madness-ai/friendly-ai-helping_hu6051655707736117672.webp 1024w, /blog/march-madness-ai/friendly-ai-helping_hu2802610387048463095.webp 1280w, /blog/march-madness-ai/friendly-ai-helping_hu4334165321969018170.webp 1536w, /blog/march-madness-ai/friendly-ai-helping_hu18303104105635313338.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/friendly-ai-helping_hu12336991977104552354.jpg 320w, /blog/march-madness-ai/friendly-ai-helping_hu2283149524174772532.jpg 640w, /blog/march-madness-ai/friendly-ai-helping_hu17291907663420801203.jpg 768w, /blog/march-madness-ai/friendly-ai-helping_hu8385833407236973878.jpg 1024w, /blog/march-madness-ai/friendly-ai-helping_hu7955001429570337402.jpg 1280w, /blog/march-madness-ai/friendly-ai-helping_hu11604946180585272053.jpg 1536w, /blog/march-madness-ai/friendly-ai-helping_hu15647792876244361534.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/friendly-ai-helping_hu2283149524174772532.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="ai-acceleration">AI acceleration</h2>
<p>Looking at March AI news from high above, what stands out to me is acceleration, possibly even exponential acceleration. Today&rsquo;s acceleration is happening in the AI subspace I call <strong>Text AIs</strong>, which are based around Large Language Models (LLMs). The most famous Text AI is OpenAI&rsquo;s ChatGPT, initially released just four months ago&ndash;though in the current mode of acceleration, those four months seem like ages.</p>
<p>The acceleration in the Text AI space has a precedent, from way back in August 2022, in what I call the <strong>Art AI</strong> space. Text AI and Art AI are close relatives within the AI family tree, both falling under the branch called Generative AI. Well known Art AIs include OpenAI&rsquo;s DALL-E 2, my go-to tool Midjourney, and Stability AI&rsquo;s Stable Diffusion.</p>
<p>Data scientist and open source developer <a href="https://simonwillison.net">Simon Willison</a> is a fellow observer of emerging AI, and he <a href="https://simonwillison.net/2023/Mar/11/llama/">describes</a> the close parallels between Art AI&rsquo;s acceleration in August and Text AI&rsquo;s today:</p>
<blockquote>
<p>Large language models are having their Stable Diffusion moment &hellip;</p>
<p>The open release of the Stable Diffusion image generation model back in August 2022 was a key moment &hellip; The resulting explosion in innovation is still going on today.</p>
<p>That Stable Diffusion moment is happening again right now, for large language models—the technology behind ChatGPT itself.</p>
</blockquote>
<p>I believe Text AI will follow the same &ldquo;sustained explosion&rdquo; trajectory of innovation seen in Art AI.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/slender-ai-2.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/slender-ai-2_hu7323949826237409246.webp 320w, /blog/march-madness-ai/slender-ai-2_hu4206191629933124297.webp 640w, /blog/march-madness-ai/slender-ai-2_hu6932876669645642665.webp 768w, /blog/march-madness-ai/slender-ai-2_hu7613235603869094936.webp 1024w, /blog/march-madness-ai/slender-ai-2_hu13359462983782709617.webp 1280w, /blog/march-madness-ai/slender-ai-2_hu9588193576714697685.webp 1536w, /blog/march-madness-ai/slender-ai-2_hu2617274142446293701.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/slender-ai-2_hu2711524877723304862.jpg 320w, /blog/march-madness-ai/slender-ai-2_hu16033503129556200877.jpg 640w, /blog/march-madness-ai/slender-ai-2_hu2868306795231699733.jpg 768w, /blog/march-madness-ai/slender-ai-2_hu12058431658589936321.jpg 1024w, /blog/march-madness-ai/slender-ai-2_hu12045839800292302758.jpg 1280w, /blog/march-madness-ai/slender-ai-2_hu15317931262830972541.jpg 1536w, /blog/march-madness-ai/slender-ai-2_hu1165780381422578834.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/slender-ai-2_hu16033503129556200877.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="order-of-magnitude-better">Order of magnitude better</h2>
<p>Four days ago (Tuesday March 14th), <a href="https://openai.com/research/gpt-4">OpenAI released GPT-4</a>, making it available through both their ChatGPT conversational interface, and the OpenAI API. Early testers are reporting that the GPT-4 model provides a substantial, across-the-board improvement over its GPT-3.5 predecessor.</p>
<p>My personal experience mirrors these reports. I just conducted an 11-question, 2800 word conversation with GPT-4, relating to USDA data models, available datasets, and geospatial data, including several deep dives into nuanced questions about relationships between datasets and entities. Though I&rsquo;ll definitely be cross-checking the results, I have high confidence in the accuracy of the responses, and I&rsquo;m astonished at how well GPT-4 &ldquo;recognized&rdquo; the gist of my questions and how thoroughly its responses addressed them.</p>
<p>OpenAI demonstrated visual inputs (not yet released), allowing prompts to include interspersed images and text. And this doesn;t just mean it recognizes a picture of a cat and substitutes &ldquo;cat&rdquo; on the prompt &ndash; GPT-4 &ldquo;understands&rdquo; what kind of an image it&rsquo;s seeing, the context of that image:</p>
<blockquote>
<p>Over a range of domains—including documents with text and photographs, diagrams, or screenshots—GPT-4 exhibits similar capabilities as it does on text-only inputs.</p>
</blockquote>
<p>Check out this example from the <a href="https://openai.com/research/gpt-4">GPT-4 announcement</a>:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/gpt4-vga-3-panel.png"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/gpt4-vga-3-panel_hu8464909764701779760.webp 320w, /blog/march-madness-ai/gpt4-vga-3-panel_hu3528530297665913954.webp 640w, /blog/march-madness-ai/gpt4-vga-3-panel_hu10253466698916332405.webp 768w, /blog/march-madness-ai/gpt4-vga-3-panel_hu9710193260008938430.webp 1024w, /blog/march-madness-ai/gpt4-vga-3-panel_hu7330242368401603901.webp 1280w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/gpt4-vga-3-panel_hu2461880364276277245.jpg 320w, /blog/march-madness-ai/gpt4-vga-3-panel_hu14416508448854144383.jpg 640w, /blog/march-madness-ai/gpt4-vga-3-panel_hu3906875366318965416.jpg 768w, /blog/march-madness-ai/gpt4-vga-3-panel_hu12911762599893056118.jpg 1024w, /blog/march-madness-ai/gpt4-vga-3-panel_hu11179048433490563910.jpg 1280w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/gpt4-vga-3-panel_hu14416508448854144383.jpg" width="1349" height="1210" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>How crazy is that? Other examples include interpreting a business barchart, and solving an engineering test problem (in French!) where a diagram is integral to the question. Mind-blowing.</p>
<p>Last but not least, GPT-4 delivers an eightfold increase in the size of its prompt. GPT-4 now accepts prompts of 32K tokens (25K+ words), compared to 4K tokens / 3500+ words for GPT-3/3.5. Among many other benefits, this order-of-magnitude increase gives GPT-4 a way to &ldquo;get current.&rdquo; Training a huge GPT model with, basically, all of human knowledge, is unsurprisingly a time-consuming (as well as expensive) process. There had to be a cutoff date for the knowledge gathered so it could be put through months of model training. What is that date? We can ask GPT-4 itself:</p>
<blockquote>
<p>What is the cutoff date of your training data?</p>
</blockquote>
<blockquote>
<p>My training data includes information up until September 2021. I do not have knowledge of events, developments, or advancements that occurred after that date.</p>
</blockquote>
<p>But &ndash; with GPT-4 and 32K tokens, we can actually inject newer information <em><strong>as part of the prompt</strong></em> &ndash; and 25,000 words is a lot of information. OpenAI demoed this, incorporating the post-2021 updated tax code in the prompt and then asking a question that required knowledge of the latest changes. GPT-4 was able to accurately address questions that factored in this updated tax code.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/better-ai.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/better-ai_hu14989797300865819925.webp 320w, /blog/march-madness-ai/better-ai_hu14165374653908351893.webp 640w, /blog/march-madness-ai/better-ai_hu11024922817379978805.webp 768w, /blog/march-madness-ai/better-ai_hu3852423770285702794.webp 1024w, /blog/march-madness-ai/better-ai_hu12144551847688992658.webp 1280w, /blog/march-madness-ai/better-ai_hu15515285863168731784.webp 1536w, /blog/march-madness-ai/better-ai_hu7408084729651946965.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/better-ai_hu13230262462144638021.jpg 320w, /blog/march-madness-ai/better-ai_hu11673066668265922986.jpg 640w, /blog/march-madness-ai/better-ai_hu15852115687582449905.jpg 768w, /blog/march-madness-ai/better-ai_hu12381181917802809113.jpg 1024w, /blog/march-madness-ai/better-ai_hu10385049087163851541.jpg 1280w, /blog/march-madness-ai/better-ai_hu10564527834310187694.jpg 1536w, /blog/march-madness-ai/better-ai_hu12081859421479509049.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/better-ai_hu11673066668265922986.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="order-of-magnitude-cheaper">Order of magnitude cheaper</h2>
<ul>
<li>OpenAI kicked things off on March 1st, when they <a href="https://openai.com/blog/introducing-chatgpt-and-whisper-apis">announced new ChatGPT and Whisper APIs</a>, along with tenfold less expensive pricing. (Caveat: a few days later, OpenAI released GPT-4, with premium prices.)</li>
<li>Simon Willison <a href="https://simonwillison.net/2023/Mar/17/beat-chatgpt-in-a-browser/">points out</a> that, thanks to Facebook Research&rsquo;s <a href="https://research.facebook.com/publications/llama-open-and-efficient-foundation-language-models/">LLaMA model</a>, Stanford&rsquo;s <a href="https://crfm.stanford.edu/2023/03/13/alpaca.html">LLaMA-based Alpaca model</a>, and related work, training our own models is getting radically cheaper:</li>
</ul>
<blockquote>
<p>I think it’s now possible to train a large language model with similar functionality to GPT-3 for $85,000. And I think we might soon be able to run the resulting model entirely in the browser, and give it capabilities that leapfrog it ahead of ChatGPT.</p>
</blockquote>
<p>Bear in mind that, in the very recent past, training a GPT-3-grade model had been considered out of reach for anyone but the largest companies with huge research budgets, e.g. Big Tech.</p>
<h2 id="order-of-magnitude-smaller-lighter-weight">Order of magnitude smaller (lighter weight)</h2>
<p>This week was a crazy cascade of &ldquo;Oh yeah? HOLD MY BEER!&rdquo; announcements, where every day we learned of a new GPT-3-grade model becoming available on some new device orders of magnitude less powerful than what OpenAI has powering their ChatGPT cloud. Before this week, to <a href="https://simonwillison.net/2023/Mar/11/llama/">quote from</a> Simon Willison:</p>
<blockquote>
<p>The best of these models have mostly been built by private organizations such as OpenAI, and have been kept tightly controlled—accessible via their API and web interfaces, but not released for anyone to run on their own machines.</p>
<p>These models are also BIG. Even if you could obtain the GPT-3 model you would not be able to run it on commodity hardware—these things usually require several A100-class GPUs, each of which retail for $8,000+.</p>
</blockquote>
<p>But this week all that changed. First there was &ldquo;Run a full GPT-3-grade model on your Mac!&rdquo; (lightweight port of Facebook&rsquo;s LLaMA model to C <a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a>); then came &ldquo;Get it to run on a Pixel 6 phone!&rdquo; (<a href="https://news.ycombinator.com/item?id=35171116">@thiteanish on Twitter</a>); next up, &ldquo;Have it running on a Raspberry Pi!&rdquo; (<a href="https://github.com/ggerganov/llama.cpp/issues/58">miolini reporting on llama.cpp GitHub</a>); then &ldquo;Run LLaMA on your computer in one step via node / npx!&rdquo; (<a href="https://github.com/cocktailpeanut/dalai">Dalai project, leveraging LLaMA and Alpaca, by coctailpeanut</a>); and then just yesterday, &ldquo;Train LLaMA to respond like characters from The Simpsons!&rdquo; (Proof of concept from <a href="https://replicate.com/blog/fine-tune-llama-to-speak-like-homer-simpson">Replicate</a>, trained with 12 seasons of Simpsons scripts).</p>
<p>The point here isn&rsquo;t that we&rsquo;ll run production LLMs on our MacBook Pros; it&rsquo;s that, all of a sudden, we&rsquo;re within sight of <strong>running ChatGPT-grade models on a low-cost server</strong> that we cloud-rent or own outright. And of <strong>training our own models</strong> on a reasonable budget.</p>
<p>And don&rsquo;t underestimate the value of a developer being able to run a serious LLM on their development machine. Hands-on experimentation and prototyping is the top of the new application funnel.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/slender-ai.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/slender-ai_hu15919120285007255117.webp 320w, /blog/march-madness-ai/slender-ai_hu3404133516266896106.webp 640w, /blog/march-madness-ai/slender-ai_hu4012223802701984404.webp 768w, /blog/march-madness-ai/slender-ai_hu5390860341196843111.webp 1024w, /blog/march-madness-ai/slender-ai_hu6042087362767779181.webp 1280w, /blog/march-madness-ai/slender-ai_hu7685932672880360547.webp 1536w, /blog/march-madness-ai/slender-ai_hu12169108471839499282.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/slender-ai_hu12672919221257899276.jpg 320w, /blog/march-madness-ai/slender-ai_hu13413419729031901432.jpg 640w, /blog/march-madness-ai/slender-ai_hu6284131115653961477.jpg 768w, /blog/march-madness-ai/slender-ai_hu16176730378127177708.jpg 1024w, /blog/march-madness-ai/slender-ai_hu906062978643467181.jpg 1280w, /blog/march-madness-ai/slender-ai_hu15583369720045494489.jpg 1536w, /blog/march-madness-ai/slender-ai_hu2283840055790104581.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/slender-ai_hu13413419729031901432.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="order-of-magnitude-more-potential-applications">Order of magnitude more potential applications</h2>
<p>We&rsquo;ve described three separate order-of-magnitude developments in the Text AI / LLM space above&ndash;better, cheaper, smaller. Each of these removes roadblocks that might have killed the feasibility of interesting applications. The feasibility space just got three orders of magnitude larger, so expect three orders of magnitude more applications to start appearing. More applications feeds back demand for more innovation, so as we&rsquo;ve seen the the Art AI space, expect the acceleration to sustain.</p>
<p>If you&rsquo;re a business with potential applications for Generative AI, be it the Text or Art flavors, now is a fantastic time to get hands-on and start prototyping.</p>
<h2 id="meanwhile-at-google-">Meanwhile, at Google &hellip;</h2>
<ul>
<li>
<p>Google made a few panicked, flop-sweat non-release announcements this week, including <a href="https://blog.google/technology/ai/ai-developers-google-cloud-workspace/">PaLM and MakerSuite</a>, as well as a plan to <a href="https://workspace.google.com/blog/product-announcements/generative-ai">embed generative AI within Google Workspace</a>. Interesting, but just announcements, not anything anyone can use today. Catch up by announcement.</p>
</li>
<li>
<p>In the meantime, Google&rsquo;s cash cow Search is under attack. In my own quest to understand the nuances of USDA data, to the degree that GPT-4 excelled, Google search stank. If GPT-4 scored an 8/10, Google was maybe a 2/10. Massively less useful; far more time-consuming and frustrating. Google search has been under self-inflicted threat for a while &ndash; see <a href="https://dkb.blog/p/google-search-is-dying?utm_source=pocket_saves">Google Search Is Dying</a> from 2022 &ndash; but since ChatGPT launched in November, that threat&rsquo;s timeline has compressed.</p>
</li>
</ul>
<h2 id="meanwhile-at-apple-">Meanwhile, at Apple &hellip;</h2>
<p>Over in Cupertino, I suspect that Apple is having its own moments of panic.</p>
<p>I tend to give Apple the benefit of the doubt, to believe that they&rsquo;re playing the long game, that they have a grand strategy, that maybe I&rsquo;m just not seeing it. That often proves true; consider Apple Watch, where limited early generations led to today&rsquo;s incredible wrist computer / health sensor / emergency detector, in a sizable market that Apple effectively created and now dominates. Long game, grand strategy in action.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/march-madness-ai/ai-with-apple.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/ai-with-apple_hu16681326460524219741.webp 320w, /blog/march-madness-ai/ai-with-apple_hu10807958552252578154.webp 640w, /blog/march-madness-ai/ai-with-apple_hu1792307620971165326.webp 768w, /blog/march-madness-ai/ai-with-apple_hu599239218235382418.webp 1024w, /blog/march-madness-ai/ai-with-apple_hu8813862520316262416.webp 1280w, /blog/march-madness-ai/ai-with-apple_hu49264253393042463.webp 1536w, /blog/march-madness-ai/ai-with-apple_hu8934866926303223180.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/ai-with-apple_hu8078760338397836858.jpg 320w, /blog/march-madness-ai/ai-with-apple_hu1018893774434300612.jpg 640w, /blog/march-madness-ai/ai-with-apple_hu14334145391092528671.jpg 768w, /blog/march-madness-ai/ai-with-apple_hu7920132127747856105.jpg 1024w, /blog/march-madness-ai/ai-with-apple_hu13106231617624578499.jpg 1280w, /blog/march-madness-ai/ai-with-apple_hu17281315224211180338.jpg 1536w, /blog/march-madness-ai/ai-with-apple_hu14315247644803526962.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/march-madness-ai/ai-with-apple_hu1018893774434300612.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>But this week there were strong indications that Apple&rsquo;s AI mainstay, Siri, is as much of a steaming pile of unmaintainable crap as it has always appeared to be from the outside, and there may be no fixing it. When you <a href="https://www.nytimes.com/2023/03/15/technology/siri-alexa-google-assistant-artificial-intelligence.html">hear descriptions like these</a>, you can smell the mess from a mile away:</p>
<blockquote>
<p>Siri ran into technological hurdles, including clunky code that took weeks to update with basic features, said John Burkey, a former Apple engineer who worked on the assistant.</p>
</blockquote>
<p>Apple is perhaps less screwed than Google, whose primary revenue producer is under attack. And Apple has invested heavily to make their hardware AI-capable by including Neural Engine cores (16!) in their A and M series processors. But I wonder how well Neural Engine will support the emerging AI models that we actually need instead of Siri? AI is critical for Apple&rsquo;s future, and it&rsquo;s emerging differently than Apple (and the rest of the universe) expected, so I&rsquo;m guessing Apple execs are more than a little unsettled.</p>
<h2 id="we-need-open-trained-models">We need open, trained models</h2>
<p>Too much of the news described above is based on closed technology and proprietary data. I&rsquo;ve no problem with OpenAI earning back the huge investments they&rsquo;ve made, and their APIs are a fine solution for a major swatch of application needs. But there are a multitude of other scenarios where, due to cost or privacy or need to maintain control, OpenAI isn&rsquo;t an option.</p>
<p>What we need is the AI equivalent of free / open software &ndash; open, free, community developed trained models. Just add the application and a reasonable dollop of infrastructure, and you&rsquo;ve got an offering that&rsquo;s inexpensive to operate and 100% under your control.</p>
<p>Such work is underway; I&rsquo;ve not had time to research it yet but will. I&rsquo;m also encouraged by Willison&rsquo;s point above, that training our own models is becoming increasingly cost-effective and viable.</p>
<div class="flex justify-evenly"><div class="w-[24%] mx-2 flex justify-center"><a href="/blog/march-madness-ai/hyper-ai-1.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/hyper-ai-1_hu8690339584400367979.webp 320w, /blog/march-madness-ai/hyper-ai-1_hu8425133978674018033.webp 640w, /blog/march-madness-ai/hyper-ai-1_hu15001694776650496245.webp 768w, /blog/march-madness-ai/hyper-ai-1_hu4169784002631991286.webp 1024w, /blog/march-madness-ai/hyper-ai-1_hu6691936839178697754.webp 1280w, /blog/march-madness-ai/hyper-ai-1_hu3711583402746426197.webp 1536w, /blog/march-madness-ai/hyper-ai-1_hu18010231988764476703.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/hyper-ai-1_hu15294921818337069949.jpg 320w, /blog/march-madness-ai/hyper-ai-1_hu17155088602542950842.jpg 640w, /blog/march-madness-ai/hyper-ai-1_hu1368108118144851561.jpg 768w, /blog/march-madness-ai/hyper-ai-1_hu2180625249736073878.jpg 1024w, /blog/march-madness-ai/hyper-ai-1_hu6283874384077358898.jpg 1280w, /blog/march-madness-ai/hyper-ai-1_hu14885367271736837170.jpg 1536w, /blog/march-madness-ai/hyper-ai-1_hu9686532863055186212.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/march-madness-ai/hyper-ai-1_hu17155088602542950842.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/march-madness-ai/hyper-ai-3.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/hyper-ai-3_hu1705632463014405065.webp 320w, /blog/march-madness-ai/hyper-ai-3_hu9228349505684650752.webp 640w, /blog/march-madness-ai/hyper-ai-3_hu8668218170777163595.webp 768w, /blog/march-madness-ai/hyper-ai-3_hu7958570407780318227.webp 1024w, /blog/march-madness-ai/hyper-ai-3_hu9825189099132264622.webp 1280w, /blog/march-madness-ai/hyper-ai-3_hu11262078917645541708.webp 1536w, /blog/march-madness-ai/hyper-ai-3_hu4710010019449067202.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/hyper-ai-3_hu11653631485396620122.jpg 320w, /blog/march-madness-ai/hyper-ai-3_hu16392955212333742919.jpg 640w, /blog/march-madness-ai/hyper-ai-3_hu7753874199552914947.jpg 768w, /blog/march-madness-ai/hyper-ai-3_hu8504310778332809405.jpg 1024w, /blog/march-madness-ai/hyper-ai-3_hu3551218876859561836.jpg 1280w, /blog/march-madness-ai/hyper-ai-3_hu5084134241920264066.jpg 1536w, /blog/march-madness-ai/hyper-ai-3_hu11788869725848309859.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/march-madness-ai/hyper-ai-3_hu16392955212333742919.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/march-madness-ai/hyper-ai-4.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/hyper-ai-4_hu11520869520860769210.webp 320w, /blog/march-madness-ai/hyper-ai-4_hu15065819215018366509.webp 640w, /blog/march-madness-ai/hyper-ai-4_hu4328329462705034255.webp 768w, /blog/march-madness-ai/hyper-ai-4_hu160529931387231851.webp 1024w, /blog/march-madness-ai/hyper-ai-4_hu1669352848545317769.webp 1280w, /blog/march-madness-ai/hyper-ai-4_hu12328621328628987956.webp 1536w, /blog/march-madness-ai/hyper-ai-4_hu13145981226463260154.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/hyper-ai-4_hu12172776905646849752.jpg 320w, /blog/march-madness-ai/hyper-ai-4_hu16836019907838983873.jpg 640w, /blog/march-madness-ai/hyper-ai-4_hu13340639914699939585.jpg 768w, /blog/march-madness-ai/hyper-ai-4_hu14159579154855933827.jpg 1024w, /blog/march-madness-ai/hyper-ai-4_hu17229356107237875372.jpg 1280w, /blog/march-madness-ai/hyper-ai-4_hu16961057111065834192.jpg 1536w, /blog/march-madness-ai/hyper-ai-4_hu15640376089792890458.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/march-madness-ai/hyper-ai-4_hu16836019907838983873.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[24%] mx-2 flex justify-center"><a href="/blog/march-madness-ai/hyper-ai-2.webp"><picture>
    <source type="image/webp" srcset="/blog/march-madness-ai/hyper-ai-2_hu10090599947001800789.webp 320w, /blog/march-madness-ai/hyper-ai-2_hu16005445939680615403.webp 640w, /blog/march-madness-ai/hyper-ai-2_hu1340848586265828410.webp 768w, /blog/march-madness-ai/hyper-ai-2_hu17585322171912805332.webp 1024w, /blog/march-madness-ai/hyper-ai-2_hu15789065014287501340.webp 1280w, /blog/march-madness-ai/hyper-ai-2_hu12495615132134382689.webp 1536w, /blog/march-madness-ai/hyper-ai-2_hu62723878500038047.webp 1920w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/march-madness-ai/hyper-ai-2_hu10350337076390317372.jpg 320w, /blog/march-madness-ai/hyper-ai-2_hu11394088320542552660.jpg 640w, /blog/march-madness-ai/hyper-ai-2_hu1116573166132192038.jpg 768w, /blog/march-madness-ai/hyper-ai-2_hu11697774296398699352.jpg 1024w, /blog/march-madness-ai/hyper-ai-2_hu8020351034601686801.jpg 1280w, /blog/march-madness-ai/hyper-ai-2_hu4105341248698108908.jpg 1536w, /blog/march-madness-ai/hyper-ai-2_hu11984729475914009893.jpg 1920w" sizes="10vw" />
    
      <img src="/blog/march-madness-ai/hyper-ai-2_hu11394088320542552660.jpg" width="3096" height="1548" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Venture Funds Arrive in the Mastodon Space</title>
      <link>https://craftycto.com/blog/commercial-mastodon/</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/commercial-mastodon/</guid>
      <description>How to think about the arrival of commercial offerings in the Fediverse</description>
      <content:encoded><![CDATA[<p>I recently had a <a href="https://mastodon.social/@Jackivers/109979769078817746">Mastodon exchange</a> with John Gruber of <a href="https://daringfireball.net/">Daring Fireball</a> (and <a href="https://daringfireball.net/projects/markdown/">Markdown</a>) fame. Gruber had just written a <a href="https://daringfireball.net/linked/2023/03/06/medium-mastodon">short piece about Medium launching their own Mastodon server</a> &ndash; with the fun, short domain name of <a href="https://me.dm/">me.dm</a>. The new server will be open to those with paid Medium accounts. He points out that Medium&rsquo;s foray into Mastodon is doubly unique:</p>
<blockquote>
<p>For one thing, amongst Medium’s co-founders are <a href="https://www.nytimes.com/2017/05/20/technology/evan-williams-medium-twitter-internet.html">Ev Williams (who also served as Medium’s CEO for most of its existence) and Biz Stone</a> — two people who were <a href="https://www.theguardian.com/technology/2014/jun/20/biz-stone-twitter">at Twitter at the beginning</a>. Williams also served as one of Twitter’s numerous CEOs.</p>
<p>Second, Medium is a commercial company, having raised, <a href="https://www.crunchbase.com/organization/medium">according to CrunchBase</a>, $163 million (so far). To my knowledge no company with such resources has started a public Mastodon instance to date.</p>
</blockquote>
<h2 id="fighting-words">Fighting Words</h2>
<p>What Gruber said next, though, bothered me:</p>
<blockquote>
<p>I am very uncomfortable with the fact that nearly all Mastodon servers are free-to-use volunteer efforts, funded by voluntary donations. That’s not sustainable. I suspect a lot of Mastodon servers that seem to be thriving today won’t be around in 5 years, taking all of their posts with them.</p>
</blockquote>
<p>In fairness, he went on to express some of the same commercial/venture reservations I&rsquo;ll talk about below:</p>
<blockquote>
<p>I don’t feel great about the fact that Medium is venture-backed, either, but they do charge $5/month or $50/year for a membership. I like paying for the services I use. Twitter is free to use and look how that’s gone.</p>
</blockquote>
<p>Well, everyone knows that recent converts are the most fervent. Although I first joined Mastodon in November 2018, I only recently became an active user, when in November I bailed out of the <a href="https://twitter.com/404">Musk-hole</a>. (I&rsquo;m pro-EV but so happy I didn&rsquo;t buy a Musk-mobile.) I focused on the first sentences, not the later caveat, and my reaction was strong and immediate: <strong>HERESY!</strong> I&rsquo;m not normally one to fire off a post complaining about something somebody said, but <a href="https://mastodon.social/@Jackivers/109979769078817746">this time I did</a>.</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/commercial-mastodon/masto-robot-2.webp"><picture>
    <source type="image/webp" srcset="/blog/commercial-mastodon/masto-robot-2_hu14544106715402602011.webp 320w, /blog/commercial-mastodon/masto-robot-2_hu5262158439732242367.webp 640w, /blog/commercial-mastodon/masto-robot-2_hu5084686232934283133.webp 768w, /blog/commercial-mastodon/masto-robot-2_hu14286272330812745586.webp 1024w, /blog/commercial-mastodon/masto-robot-2_hu3720260343161442891.webp 1280w, /blog/commercial-mastodon/masto-robot-2_hu5744581952745206633.webp 1536w, /blog/commercial-mastodon/masto-robot-2_hu13958405238160770349.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/commercial-mastodon/masto-robot-2_hu2402461313501068777.jpg 320w, /blog/commercial-mastodon/masto-robot-2_hu16771436935930308229.jpg 640w, /blog/commercial-mastodon/masto-robot-2_hu7892328762171463617.jpg 768w, /blog/commercial-mastodon/masto-robot-2_hu8301257120176173463.jpg 1024w, /blog/commercial-mastodon/masto-robot-2_hu714118470279376935.jpg 1280w, /blog/commercial-mastodon/masto-robot-2_hu15898749079338724616.jpg 1536w, /blog/commercial-mastodon/masto-robot-2_hu15676366386948303670.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/commercial-mastodon/masto-robot-2_hu16771436935930308229.jpg" width="2048" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="the-doctorow-enshittification-hypothesis">The Doctorow Enshittification Hypothesis</h2>
<p>Besides being a recent Fediverse convert, of late I&rsquo;ve been drinking the <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Cory Doctorow kool-aid</a>. I&rsquo;ve come around to his way of thinking about for-profit social media, with its seemingly inevitable progression from great free service, to critical mass must-have-this, to lock-in where the cost of switching gets so high that users stick around for years even though things are getting worse and worse. And that&rsquo;s the &ldquo;normal&rdquo; progression; much worse can happen, such as an alt-right billionaire wingnut buying the platform and running it through the Earth&rsquo;s crust all the way down to the <a href="https://twitterisgoinggreat.com/">seventh circle of hell</a>.</p>
<p>Doctorow has <a href="https://pluralistic.net/2022/12/23/semipermeable-membranes/">written extensively</a> on why the Fediverse, lacking commercial motivation to extract and enshittify, is a potentially-viable model for healthy social platforms. But guess what, that model depends on the support of the community to function. Those &ldquo;free-to-use volunteer efforts, funded by voluntary donations&rdquo; that Gruber describe are fundamental to the concept of the Fediverse, to its avoiding enshittification and commercial extraction.</p>
<h2 id="the-dead-post-society">The Dead Post Society</h2>
<p>What about Gruber&rsquo;s suspicion that &ldquo;a lot of Mastodon servers that seem to be thriving today won’t be around in 5 years&rdquo;? I responded that switching servers was easy on Mastodon; and it is. But (<strong>now</strong> I know) there&rsquo;s more to the problem than that &ndash; there&rsquo;s also the content. I had assumed that &ldquo;moving accounts between Mastodon servers&rdquo; meant &ldquo;moving all my stuff,&rdquo; posts included. Turns out that&rsquo;s not the case. So even though one&rsquo;s Mastodon account can smoothly transition and live on, posts can disappear. Gruber <a href="https://mastodon.social/@gruber/109980334788690249">pointed out</a> that:</p>
<blockquote>
<p>I have 20 years of links at DF. Most of the older ones are dead, especially to blogs. You know which ones aren’t dead from 2002? Blogspot.</p>
</blockquote>
<p>Yeah, he would feel that pain as much as anyone. Blogspot/Blogger is a commercial entity, and yes they have remained viable for &hellip; 20 years. Gruber&rsquo;s right about this. My <a href="https://mastodon.social/@Jackivers/109979769078817746">counter argument</a> has some merit, though, I think:</p>
<blockquote>
<p>The difference here is you’ve got a bunch of bright high-energy hackers ready to jump in and build what’s needed, unconstrained by a central for-profit entity in extraction mode. If server catastrophes do indeed become common, I have confidence that #fediverse solves it — auto migration tools, etc.</p>
<p>You probably followed the near shutdown of mastodon.lol — I’m just peripherally aware of it but a- the community stepped in and worked a solution to keep it running  b- the whole experience was 100X less disastrous than any number of brill billionaire moves over on the #birdsite — e.g., let’s shut down 3rd party apps and APIs with no warning.</p>
<p>Big commercial / venture funded players =&gt; #enshittification =&gt; #extraction — that’s the bigger risk IMHO.</p>
</blockquote>
<p>Having had time to mull it over, I&rsquo;m still of that opinion. Enabling useful, healthy, non-enshittified social interaction online is critical &ndash; the last decade (and the Musk administration&rsquo;s actions at Twitter) should make that obvious. Dealing with server transitions and dead post-links is indeed a pain, and that problem hasn&rsquo;t yet been solved in the Fediverse (although it&rsquo;s <a href="https://digipres.club/@misty/109853309262366531">being discussed</a>). But it&rsquo;s worth dealing with this inconvenience to have a real social platform that&rsquo;s not trying to algorithm and extract us to death.</p>
<p><strong>Note to the Fediverse community: wouldn&rsquo;t it be fantastic to crack the nut of full server migration including posts, with link preservation? Yeah, I know, it&rsquo;s hard, but still. Let&rsquo;s show &rsquo;em.</strong></p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/commercial-mastodon/masto-robot-3.webp"><picture>
    <source type="image/webp" srcset="/blog/commercial-mastodon/masto-robot-3_hu1589944444193058682.webp 320w, /blog/commercial-mastodon/masto-robot-3_hu16255018781918497607.webp 640w, /blog/commercial-mastodon/masto-robot-3_hu5055290468393613813.webp 768w, /blog/commercial-mastodon/masto-robot-3_hu16678501394811855869.webp 1024w, /blog/commercial-mastodon/masto-robot-3_hu14320477023016855197.webp 1280w, /blog/commercial-mastodon/masto-robot-3_hu4005687341090227930.webp 1536w, /blog/commercial-mastodon/masto-robot-3_hu16307544512288092549.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/commercial-mastodon/masto-robot-3_hu12538855077432681779.jpg 320w, /blog/commercial-mastodon/masto-robot-3_hu4910264412719514113.jpg 640w, /blog/commercial-mastodon/masto-robot-3_hu12060688172763211666.jpg 768w, /blog/commercial-mastodon/masto-robot-3_hu12537990567652150132.jpg 1024w, /blog/commercial-mastodon/masto-robot-3_hu12020890902195344350.jpg 1280w, /blog/commercial-mastodon/masto-robot-3_hu16051056565051635772.jpg 1536w, /blog/commercial-mastodon/masto-robot-3_hu14776909581566789807.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/commercial-mastodon/masto-robot-3_hu4910264412719514113.jpg" width="2048" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="so-what-about-commercial-offerings-for-mastodon">So What About Commercial Offerings for Mastodon?</h2>
<p>Back to the original subject. What I took issue with in Gruber&rsquo;s DF post was not <a href="https://blog.medium.com/join-mastodon-with-medium-e2d6d814325b">Medium getting into the Mastodon server business</a>. I&rsquo;m actually enthusiastic about it. The more the merrier. It&rsquo;s an endorsement of the platform. And there&rsquo;s a decent chance that me.dm will still be running 10 or 20 years from now. Some commercial platforms, like Blogspot/Blogger, have managed to have that kind of longevity.</p>
<p>I&rsquo;m also fine with <a href="https://blog.cloudflare.com/welcome-to-wildebeest-the-fediverse-on-cloudflare/">Cloudflare&rsquo;s Wildebeest Mastodon server offering</a>. I&rsquo;ve seen some concern and criticism (and I&rsquo;m not up on all the details), but generally my attitude is the same as with Medium &ndash; the more the merrier, it&rsquo;s an endorsement of the platform. And likewise the <a href="https://apps.apple.com/us/app/mammoth-for-mastodon/id1667573899">Mammoth Mastodon app</a>, which is venture funded.</p>
<p>What the Fediverse does need to do, however, is keep its (our!) eyes open for the well-funded monopolists trying to take over and lock people in. We need to ensure that those efforts fail spectacularly, that we maintain control of our own destiny. I phrased it this way:</p>
<blockquote>
<p>I don’t think [Medium&rsquo;s mastodon offering is] necessarily a bad thing, as long as the community always has “fuck-you servers” — an easy exit from the commercial offerings if the commercial players start playing the #extraction game.</p>
</blockquote>
<p>P.S. Ironically, Gruber skewered Medium back in 2017 about an early form of enshittification, <a href="https://daringfireball.net/2017/06/medium_dickbars">the dickbar</a>. That would look great on a UX designer&rsquo;s resume, no? &ldquo;I invented the dickbar.&rdquo;</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/commercial-mastodon/masto-robot-4.webp"><picture>
    <source type="image/webp" srcset="/blog/commercial-mastodon/masto-robot-4_hu12730066474304566467.webp 320w, /blog/commercial-mastodon/masto-robot-4_hu3569024217568664565.webp 640w, /blog/commercial-mastodon/masto-robot-4_hu8908288213423751112.webp 768w, /blog/commercial-mastodon/masto-robot-4_hu2156572943228818232.webp 1024w, /blog/commercial-mastodon/masto-robot-4_hu17159159530153666826.webp 1280w, /blog/commercial-mastodon/masto-robot-4_hu15055886114924157564.webp 1536w, /blog/commercial-mastodon/masto-robot-4_hu1314294164044760852.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/commercial-mastodon/masto-robot-4_hu11288733080303576216.jpg 320w, /blog/commercial-mastodon/masto-robot-4_hu11606134360328569701.jpg 640w, /blog/commercial-mastodon/masto-robot-4_hu5908767226216484522.jpg 768w, /blog/commercial-mastodon/masto-robot-4_hu12570606315440676763.jpg 1024w, /blog/commercial-mastodon/masto-robot-4_hu12129476479023261164.jpg 1280w, /blog/commercial-mastodon/masto-robot-4_hu5250174539763819932.jpg 1536w, /blog/commercial-mastodon/masto-robot-4_hu7099891427756721154.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/commercial-mastodon/masto-robot-4_hu11606134360328569701.jpg" width="2048" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Alarmed About AI?</title>
      <link>https://craftycto.com/blog/alarmed-about-ai/</link>
      <pubDate>Mon, 20 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/alarmed-about-ai/</guid>
      <description>John Seely Brown, former director of Xerox PARC, has helpful advice—from April 2000!</description>
      <content:encoded><![CDATA[<p>We&rsquo;re currently experiencing a wave of AI news stories, including:</p>
<ul>
<li>Uproar over artists&rsquo; work being used without permission by art AIs like Midjourney and DALL-E 2</li>
<li>A flood of ChatGPT stories, including the phenomenon of ChatGPT confidently presenting information that proves to be completely erroneous, and even hallucinating non-existent references</li>
<li>Microsoft&rsquo;s just released Bing AI, acquired through a 10 or 11 figure investment in ChatGPT maker OpenAI, is spawning multiple personalities and going way off the rails</li>
</ul>
<p>I recently had a <a href="https://fedi.simonwillison.net/@simon/109869541023506346">brief interchange on Mastodon</a> about Bing&rsquo;s troubles. <a href="https://simonwillison.net/">Simon Willison</a>, maker of the excellent <a href="https://datasette.io/">Datasette</a> open source data exploration tool, had commented on <a href="https://stratechery.com/2023/from-bing-to-sydney-search-as-distraction-sentient-ai/">a post by Stratechery&rsquo;s Ben Thompson</a>, who had captured Bing in the act of misbehaving. (<a href="https://mastodon.social/@gruber">John Gruber</a> chimed in shortly after with a nice follow up, &ldquo;<a href="https://daringfireball.net/2023/02/bing_the_most_exciting_product_in_tech">Bing, the Most Exciting Product in Tech</a>,&rdquo; that calls out further commentary by New York Times columnist Kevin Roose.) Willison expressed alarm at Bing&rsquo;s off-the-tracks behavior, with good cause&ndash;his comment to me was, in part:</p>
<blockquote>
<p>&hellip; but it&rsquo;s pretending to be a search engine!</p>
</blockquote>
<p>Alarm over AI isn&rsquo;t something new. <a href="https://en.wikipedia.org/wiki/Ray_Kurzweil">Ray Kurweil</a>&rsquo;s book, &ldquo;<a href="https://en.wikipedia.org/wiki/The_Singularity_Is_Near">The Singularity is Near</a>,&rdquo; was published in 2005. From that book:</p>
<blockquote>
<p>This book will argue, however, that within several decades information-based technologies will encompass all human knowledge and proficiency, ultimately including the pattern-recognition powers, problem-solving skills, and emotional and moral intelligence of the human brain itself.</p>
</blockquote>
<p>And Kurzweil&rsquo;s use of the term &ldquo;singularity&rdquo; was drawn from CS professor and sci-fi writer <a href="https://en.wikipedia.org/wiki/Vernor_Vinge">Vernor Vinge</a>&rsquo;s 1993 essay, &ldquo;<a href="https://edoras.sdsu.edu/~vinge/misc/singularity.html">The Coming Technological Singularity: How to Survive in the Post-Human Era</a>&rdquo; where Vinge stated:</p>
<blockquote>
<p>I argue in this paper that we are on the edge of change comparable to the rise of human life on Earth.</p>
</blockquote>
<p>In April 2000, <a href="https://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>, CEO of Sun Microsystems, penned an article on wired.com titled &ldquo;<a href="https://archive.is/hQjhB">Why the Future Doesn&rsquo;t Need Us</a>.&rdquo; Joy broadened the commentary to indict technologies ranging from robotics to genetic engineering to nanotech:</p>
<blockquote>
<p>The new Pandora&rsquo;s boxes of genetics, nanotechnology, and robotics are almost open, yet we seem hardly to have noticed. Ideas can&rsquo;t be put back in a box; unlike uranium or plutonium, they don&rsquo;t need to be mined and refined, and they can be freely copied. Once they are out, they are out.</p>
</blockquote>
<p>Kurzweil, Vinge, and Joy all painted bleak visions of the future of humanity&ndash;in a nutshell:</p>
<blockquote>
<p><strong>We&rsquo;re doomed.</strong></p>
</blockquote>
<div class="flex justify-evenly"><div class="w-[20%] mx-2 flex justify-center"><a href="/blog/alarmed-about-ai/humanoid-head1@0.5x.webp"><picture>
    <source type="image/webp" srcset="/blog/alarmed-about-ai/humanoid-head1@0.5x_hu16190922334333224618.webp 320w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/alarmed-about-ai/humanoid-head1@0.5x_hu15529437329595925778.jpg 320w" sizes="10vw" />
    
      <img src="/blog/alarmed-about-ai/humanoid-head1@0.5x_hu1947709102947142872.jpg" width="512" height="512" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[20%] mx-2 flex justify-center"><a href="/blog/alarmed-about-ai/humanoid-head2@0.5x.webp"><picture>
    <source type="image/webp" srcset="/blog/alarmed-about-ai/humanoid-head2@0.5x_hu745768150860698087.webp 320w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/alarmed-about-ai/humanoid-head2@0.5x_hu4720230675927137856.jpg 320w" sizes="10vw" />
    
      <img src="/blog/alarmed-about-ai/humanoid-head2@0.5x_hu8119264087696310344.jpg" width="512" height="512" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[20%] mx-2 flex justify-center"><a href="/blog/alarmed-about-ai/humanoid-head3@0.5x.webp"><picture>
    <source type="image/webp" srcset="/blog/alarmed-about-ai/humanoid-head3@0.5x_hu4442475320081873875.webp 320w" sizes="10vw" />
    <source type="image/jpeg" srcset="/blog/alarmed-about-ai/humanoid-head3@0.5x_hu16824727348612935096.jpg 320w" sizes="10vw" />
    
      <img src="/blog/alarmed-about-ai/humanoid-head3@0.5x_hu12993525768438796749.jpg" width="512" height="512" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<h2 id="pushback">Pushback</h2>
<p>One contemporary, however, pushed back&ndash;<a href="https://en.wikipedia.org/wiki/John_Seely_Brown">John Seely Brown</a>, then Chief Scientist at Xerox and director of <a href="https://en.wikipedia.org/wiki/PARC_(company)">Xerox PARC</a>. Yeah, <strong>that</strong> Xerox PARC. Within a week of Joy&rsquo;s article, JSB, along with PARC collaborator and Cal Berkeley researcher <a href="https://www.ischool.berkeley.edu/people/paul-duguid">Paul Duguid</a>, published a rebuttal, &ldquo;<a href="https://web.cs.ucdavis.edu/~koehl/Teaching/ECS188_W16/Reprints/Response_to_BillJoy.pdf">A Response to Bill Joy and the Doom-and-Gloom Technofuturists</a>.&rdquo; A few excerpts from their rebuttal:</p>
<blockquote>
<p>These self-unfulfilling prophecies failed to see that, once warned, society could galvanize itself into action &hellip;. Social and technological systems do not develop independently; the two evolve together in complex feedback loops, wherein each drives, restrains and accelerates change in the other. Malthus and Wells—and now Joy—are, indeed, critical parts of these complex loops. Each knew when and how to sound the alarm. But each thought little about how to respond to that alarm.</p>
<p>Once the social system is factored back into the equation like this, the road ahead becomes harder to navigate. Ultimately we should be grateful to Joy for saying, at the least, that there could be trouble ahead when so many of his fellow digerati will only tell us complacently that
the road is clear.</p>
</blockquote>
<p>Not long after, I had a chance to see JSB speak in person, where he was asked, &ldquo;Are you pessimistic or optimistic about the future of humanity?&rdquo; My recollection of his reply:</p>
<blockquote>
<p>I&rsquo;m optimistic. The pessimistic visions don&rsquo;t take into account the fact that humans adapt&ndash;once we perceive and understand the risks of emerging technologies, we adapt.</p>
</blockquote>
<p>JSB again expressed gratitude for the work of Bill Joy and others, as providing critical input to the human adaptation loop.</p>
<p>Returning to today&rsquo;s AI stories and our attitudes towards them. First off, let&rsquo;s set aside the misinformed&ndash;or Fox News / Meta / Vichy Twitter disinformed&ndash;that&rsquo;s a topic for another day. Among the informed, some (like Simon Willison did in a small way) will raise alarms, which are liable to be genuinely useful as input to the feedback loop. But they won&rsquo;t be good prophesies. There, as JSB suggests, they&rsquo;re likely to be self-unfulfilling.</p>
<p>My own attitude and reaction? Predominately curiosity, with a side of WTF-surprise and a good helping of amusement:</p>
<blockquote>
<p>Wow! What the <em><strong>actual hell</strong></em> is Bing doing here?! I bet the M$ execs are losing it! What is emerging here? What does this tell us about what&rsquo;s likely to happen next in the AI space?</p>
</blockquote>
<p>Based on what I read, I suspect that Ben Thompson and John Gruber might share this mindset.</p>
<p>History repeats itself. I <a href="/blog/accelerating-launch-with-ai-models/">personally believe</a> that today&rsquo;s AIs are already useful and usable, but just scratch the surface of what will emerge in coming years. We&rsquo;re at the start of an emergence like the Industrial Revolution, but if you think you can predict how this will play out? Popcorn please!</p>


<div class="flex justify-evenly">
  
    




    <picture>
        

        
        
            
            
            


        
            
            
            


        
            
            
            


        

        
        
        
        
        



        
        
        
            
                
            
        
            
        
            
                
            
        
        <img src="/images/popcorn_jon_stewart.gif" height="309" width="226"
            type="image/gif"  class="w-4/5" loading="lazy" />
    </picture>

</div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Introducing Crafty CTO</title>
      <link>https://craftycto.com/blog/introducing-crafty-cto/</link>
      <pubDate>Wed, 08 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/introducing-crafty-cto/</guid>
      <description>Turning the page: the story of Crafty CTO</description>
      <content:encoded><![CDATA[<p>I joined TechCXO Back in 2019, and it&rsquo;s been a great experience surrounded by an awesome group of people. I&rsquo;ve learned so much &hellip; most importantly, I think, that I love being a fractional CTO, a role that allows me to make use of everything I&rsquo;ve learned and experienced over a long technology-focused career.</p>
<p>Today I&rsquo;m turning the page &ndash; but not on <strong>what</strong> I do: my focus is still all-in on helping businesses as their fractional CTO. What&rsquo;s changing, rather, is the <strong>entity</strong> I&rsquo;m delivering through &ndash; a new company called <a href="/">Crafty CTO</a>. I&rsquo;m Crafty&rsquo;s founder, chief executive, owner, the guy running the place, or to use a phrase that dates to before the Civil War, the <a href="https://english.stackexchange.com/questions/152881/chief-cook-and-bottle-washer-meaning-and-etymology">chief cook and bottle washer</a>.</p>
<p>I continue to partner with and do work through TechCXO, for their existing accounts and when a broader set of skills beyond technology is needed.</p>
<h2 id="what-crafty-does">What Crafty does</h2>
<p>At any given point in time, fewer than half of all early- and growth-stage companies have seasoned CTOs in place. The reasons vary, with some combination of &ldquo;can&rsquo;t afford it yet,&rdquo; &ldquo;moving too fast right now,&rdquo; and &ldquo;special situation&rdquo; generally at the heart of things.</p>
<p>If technology is essential to the company&rsquo;s viability (when is it not in today&rsquo;s world?), there are serious risks and valuation penalties for going without a seasoned CTO. And that is precisely the gap that a strong fractional CTO can fill.</p>
<p>I work with businesses as early stage as pre-revenue, and as mature as growing-nearing-exit with engineering headcount approaching 100. The essence of what I bring to the table when I&rsquo;m out there helping a business as their fractional CTO: <strong>recognizing what aspects of technology are uniquely critical</strong> for that business, and then <strong>bringing deep insights and guidance to the executive team</strong> in these critical areas. That&rsquo;s where the name &ldquo;crafty&rdquo; comes from &ndash; I feel it captures the essence of what I do.</p>
<p>You can see more specifics around what we do <a href="/">here</a>, and find an explanation of why the fractional model works so well <a href="/blog/why-fractional/">here</a>.</p>
<p>Finally, I&rsquo;d strongly recommend reading <a href="../accelerating-launch-with-ai-models">this post</a> about <a href="../accelerating-launch-with-ai-models">how we leveraged AI models to accelerate Crafty&rsquo;s launch</a>.</p>
<div class="flex justify-evenly"><div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice7.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice7_hu11453154076638670547.webp 320w, /images/clockslice7_hu13987823164114676231.webp 640w, /images/clockslice7_hu17901391220197518489.webp 768w, /images/clockslice7_hu1372291135815297499.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice7_hu6133473080722545844.jpg 320w, /images/clockslice7_hu10767505539736652340.jpg 640w, /images/clockslice7_hu10602135007727289457.jpg 768w, /images/clockslice7_hu11832229366438845139.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice7_hu10767505539736652340.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice8.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice8_hu1377476854857051231.webp 320w, /images/clockslice8_hu5519782400478486302.webp 640w, /images/clockslice8_hu2543677850079107133.webp 768w, /images/clockslice8_hu5825735422851114823.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice8_hu4488423826562181048.jpg 320w, /images/clockslice8_hu12322204617337167066.jpg 640w, /images/clockslice8_hu959302198336769303.jpg 768w, /images/clockslice8_hu3497223454982594881.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice8_hu12322204617337167066.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice12.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice12_hu14073287947790113085.webp 320w, /images/clockslice12_hu13274137681357477555.webp 640w, /images/clockslice12_hu1141046107869441087.webp 768w, /images/clockslice12_hu2716228396563685253.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice12_hu16832011150954032653.jpg 320w, /images/clockslice12_hu15057441540085821446.jpg 640w, /images/clockslice12_hu4477243085859597163.jpg 768w, /images/clockslice12_hu15800183913788729187.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice12_hu15057441540085821446.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice3.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice3_hu6921191777658469957.webp 320w, /images/clockslice3_hu12230088070864901504.webp 640w, /images/clockslice3_hu17792754311084147248.webp 768w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice3_hu8091538130370725605.jpg 320w, /images/clockslice3_hu2537239448566042636.jpg 640w, /images/clockslice3_hu13099415322929878832.jpg 768w" sizes="3vw" />
    
      <img src="/images/clockslice3_hu2537239448566042636.jpg" width="939" height="939" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice10.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice10_hu15474034464418321003.webp 320w, /images/clockslice10_hu3043583476973961257.webp 640w, /images/clockslice10_hu13787609665904290598.webp 768w, /images/clockslice10_hu4661666611610043530.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice10_hu172559364623023807.jpg 320w, /images/clockslice10_hu5322768827591290707.jpg 640w, /images/clockslice10_hu16152603469257028027.jpg 768w, /images/clockslice10_hu14487418453044301717.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice10_hu5322768827591290707.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Blog/Website Relaunch: Under the Hood of craftycto.com</title>
      <link>https://craftycto.com/blog/blog-relaunch/</link>
      <pubDate>Wed, 08 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/blog-relaunch/</guid>
      <description>Relaunching via Hugo and Cloudflare Pages</description>
      <content:encoded><![CDATA[<p>Back in 2019, I launched <a href="https://web.archive.org/web/20200406065508/https://thinkfractional.blog/">ThinkFractional.blog</a> and took advantage of the opportunity to learn a new platform &ndash; <a href="https://ghost.org">Ghost</a>. That was fun, and I found Ghost a nice improvement over Squarespace. I decided on the same approach this time around &ndash; take the opportunity to learn something new, state of the art, and very different.</p>
<figure>
    <img loading="lazy" src="ghost-logo-light.png"
         alt="ghost dot org logo" width="250px"/> 
</figure>

<p>Besides Ghost, I&rsquo;d been using <a href="https://cloudflare.com">Cloudflare</a> for a while. There was something DNS related I needed that Ghost couldn&rsquo;t handle on its own &ndash; maybe supporting both the naked domain and the www. version &ndash; and Ghost recommended setting up a free website on Cloudflare connected to Ghost as a solution. The Cloudflare experience solving this issue was really good &ndash; a lot of capabilities, a well-crafted interface, for $0.</p>
<p>It&rsquo;s not like ThinkFractional.blog needed Cloudflare to handle its traffic. The only post I ever created that got any traction (front page of Hacker News) was titled Secret iPad, published on the 10th anniversary of the launch of the original iPad. It described my experience at Agile Partners when we got early hands-on with the original iPad at the Cupertino campus. I figured that Apple probably wouldn&rsquo;t even notice the post, and after 10 years, they could care less about it. I also assumed that NDA we signed had long since expired. Wrong, wrong, and wrong &ndash; Apple noticed (presumably someone there reads Hacker News), Apple cared, and Apple&rsquo;s vaguely worded NDA didn&rsquo;t actually specify a term, meaning its term was effectively for&ndash;ev&ndash;er. So that post lasted about a week before I had to take it down. To their credit, Apple was nice about it, friendly phone call from a long-time Apple contact as opposed to a lawyer letter.</p>
<h2 id="new-needs">New needs</h2>
<p>This time around, my requirements were a little broader. Yes, I needed to replatform my blog, but I also needed a web presence for <a href="../introducing-crafty-cto/">my new fractional CTOing entity</a>. The blog needed a new name, but I also working on naming the new entity, and realized it might be possible to find a name that would work well for both.</p>
<p>In the end, I found a name that I think works well for both (ask me again in 5 years): Crafty CTO / craftycto.com for the entity, with the blog living at CraftyCTO.com/blog.</p>
<figure>
    <img loading="lazy" src="combined-fox-text-20pct.png" width="350px"/> 
</figure>

<p>All this to say, whatever platform I chose needed to support blogging features, but also be flexible enough to handle the rest of the Crafty CTO web presence.</p>
<h2 id="what-i-hate-about-you">What I hate about you</h2>
<p>I&rsquo;ve been working with Content Management Systems since my days at <a href="https://en.wikipedia.org/wiki/Fast_Five_(consulting)">fast five dotcom consultancy Viant</a>. Back then, big names included <a href="https://en.wikipedia.org/wiki/Vignette_Corporation">Vignette StoryBuilder</a> and <a href="https://en.wikipedia.org/wiki/TeamSite">Interwoven TeamSite</a>&ndash;and they came with big price tags as well. Ugghh. CMSs have always been a pain for creating content, and limiting in terms of the websites they can create.</p>
<p>Ghost and Squarespace are &hellip; CMSs. Nicer than their 2001 predecessors, for sure, but still a layer between my content and the bare iron of delivered HTML. They allow me go about my work without needing to know HTML or CSS. (Yes, they give me hooks to let me override things like CSS, but that carries a learning curve and kind of defeats their purpose.) I lived with what they gave me, meaning I was limited in what I could do &ndash; in Ghost, I used the themes and components Ghost provided. Not terrible, but I had to fit into Ghost&rsquo;s box.</p>
<p>As production websites, both Ghost and Squarespace deliver content dynamically, and their sheer mass of features means they tend towards bloated and slow. Not terrible, certainly  functional, but not on the snappy end of the spectrum.</p>
<p>Ghost also wasn&rsquo;t free &ndash; in fact, the plan I was on was pretty damned expensive at $30/mo. That has been bothering me for a while and was the reason I first decided to move on.</p>
<h2 id="now-for-something-completely-different">Now for something completely different</h2>
<p>So I searched, started to hear about static site generators, came across <a href="https://gohugo.io/">Hugo</a>, and finally a <a href="https://smaller.fish/posts/hugo">post</a> on how to run a Hugo site using <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>.</p>
<figure>
    <img loading="lazy" src="hugo-logo-wide.svg" width="350px"/> 
</figure>

<p>Hugo has a large, active, and fantastically helpful community, great themes, and extreme static build performance (currently ~1400ms for the entire craftycto.com site).</p>
<p>Static pages, running over Cloudflare edge network &ndash; now that was really interesting. Not only would I go from bloated-dynamic-CMS to super-fast static HTML &ndash; but that site would be hosted on the edge via Cloudflare. Two orders of magnitude, now we&rsquo;re cooking. And the cost? Free. All systems go.</p>
<h2 id="content-authoring-repo-and-deployment">Content authoring, repo, and deployment</h2>
<p>But wait, you ask, the content still has to get written, stored, and deployed, how does that work? Great question, with a great answer that still costs $0.</p>
<ul>
<li>Content is authored in Markdown. I now fully appreciate <a href="https://daringfireball.net/projects/markdown/">John Gruber&rsquo;s contribution</a> to the open web. It&rsquo;s simple and direct, plenty good enough for blogging and web presence content &ndash; especially with the option to augment Markdown using Hugo templates and shortcodes.</li>
<li>Content is stored in a git repo, GitHub in my case, and gets me all the benefits of software-engineering-grade version control.</li>
<li>Content deployment is likewise via git deployment, again with all the benefits of software-engineering-grade CI/CD tooling. That&rsquo;s how Cloudflare Pages operate &ndash; connect your Git repo, and your Cloudflare Pages site auto-deploys when you push to your GitHub (or Bitbucket, etc.) repo.</li>
</ul>
<h2 id="bare-iron">Bare iron</h2>
<p>I love the whole Hugo-with-markdown-content-via-git-over-Cloudflare solution. My little site runs in a barest-of-bare-iron way &ndash; lightweight, static HTML, delivered at the edge. It doesn&rsquo;t get more bare-iron that that, in today&rsquo;s world.</p>
<figure>
    <img loading="lazy" src="CF_logo_stacked_whitetype.png" width="250px"/> 
</figure>

<p><a href="https://themes.gohugo.io/">Hugo themes</a> gave me a great starting place &ndash; this site is based on the <a href="https://github.com/reorx/hugo-PaperModX">PaperModX theme</a> &ndash; but thanks to very smart content organization and a ton of powerful features including, most fundamentally, Hugo&rsquo;s Go-based templating language &ndash; I can customize anything and everything and get things exactly how I want them. And did I mention that I learned HTML and CSS along the way?</p>
<p>Tweakability, ahem, may also be the biggest downside of my new solution. I&rsquo;m active in the Chicago CTO Group and recently a member was asking, what platform should I use for my new website/blog? Several of us chimed in with solutions like Hugo/git/Cloudflare but others expressed concern about the risk of forever-fiddling. We&rsquo;re both right, I think.</p>
<h2 id="for-another-day">For another day</h2>
<p>Perhaps I&rsquo;ll do another post digging a little deeper into Hugo, and also <a href="https://tailwindcss.com/">Tailwind CSS</a>, something else I discovered and love. But that&rsquo;s for another day &ndash; next up, I promise, will be content more core to Crafty CTO and fractional CTOing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Accelerating Crafty&#39;s Launch Using AI Models</title>
      <link>https://craftycto.com/blog/accelerating-launch-with-ai-models/</link>
      <pubDate>Wed, 08 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/accelerating-launch-with-ai-models/</guid>
      <description>Thanks to AI-based tools like Midjourney, Crafty shaved at least a month off its time to launch.</description>
      <content:encoded><![CDATA[

 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Mosaic from a minimal prompt</span>

 
  <span class="text-sm md:text-lg">&#34;a very intricate mosaic, bright colors&#34;</span>

</div>


<p>I&rsquo;m not a patient person &ndash; in fact, I consider <a href="/about/">my sense of urgency to be a superpower</a>. So once I made the decision to <a href="../introducing-crafty-cto/">move ahead on the launch of Crafty CTO</a>, I wanted to get on with it. Even for the impatient, though, there&rsquo;s a minimum quality bar to hit if you want a credible business footprint. At a minimum, I think:</p>
<ul>
<li><a href="../introducing-crafty-cto/#what-crafty-does">A name that works</a></li>
<li>A decent logo and some basic brand concept</li>
<li>Good words and imagery, for the core business website as well as the blog</li>
</ul>
<p>Not so difficult &hellip; But I was getting bogged down, partly because this list was in addition to everything else, and partly because these were all &ldquo;hard to get started on&rdquo; work and often far outside my comfort and competency zone. I&rsquo;m here to report that AI ack made a big contribution to getting me unstuck, moving, and launched, with what feels like enough quality to be credible. Time will tell.</p>
<h2 id="ai-for-words-and-art">AI for words and art</h2>
<p>It&rsquo;s ironic that my friend and past business partner John Berry was first to get in deep with the &ldquo;word AI,&rdquo; while I got there first on the &ldquo;art AI.&rdquo; Or perhaps it&rsquo;s not ironic, but rather based on weakness. John is (among an unfairly long list of other things) a skilled UX designer and great with visuals; I am skilled with words.</p>
<p>I started out skeptical of <a href="https://openai.com/blog/chatgpt/">ChatGPT</a>, the &ldquo;word AI,&rdquo; and its <a href="https://en.wikipedia.org/wiki/Wikipedia:Large_language_models">Large Language Model (LLM)</a> brethren. ChatGPT seemed like yet another in a long line of amusing tech novelties dating back to the <a href="http://vgmpf.com/Wiki/index.php/Sound_Blaster_(DOS)">Sound Blaster talking parrot</a>. My attitude was, &ldquo;there&rsquo;s no way something like this can help someone like me.&rdquo; Perhaps John had the same skepticism towards art models.</p>
<p>Anyway, John got there first on ChatGPT &ndash; &ldquo;there&rdquo; meaning he realized this wasn&rsquo;t just a toy, it was the beginning of a sea change. He was kind enough to enlighten me; we had a conversation along the lines of:</p>
<blockquote>
<p>Let me show you a few things here.</p>
<p>Are you getting the implications?</p>
<p>You&rsquo;re not thinking big enough.</p>
</blockquote>
<p>I came away from that conversation with my mind blown. <strong>I immediately had ChatGPT outline Crafty&rsquo;s website, and then had it write the content.</strong> In the end, almost everything ChatGPT wrote got edited away, but the process unblocked that part of my progress, answering the questions &ldquo;what kind of things should be on a website about a company that does what Crafty CTO does&rdquo; and &ldquo;what might that content look like&rdquo; &hellip;</p>
<h2 id="artless">Artless</h2>
<p>Meanwhile, I was already passing familiar with art models; my first OpenAI account wasn&rsquo;t for ChatGPT, but rather for art generator DALL-E 2. It was a lot of fun &ndash; I never had any artistic talent, but with DALL-E I could create pretty nice imagery. With words!</p>
<p>Then came the decision to launch Crafty CTO and suddenly I had a burning need for art, starting with a logo. Could an art model produce an acceptably good logo? It turned out to be a perfect starting place for the serious application of &ldquo;art AI.&rdquo; Here I got out ahead of Mr. Berry, at least temporarily &ndash; with his skills he&rsquo;ll pass me soon, maybe already has. But I think some of my creations, at least, surprised him.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/davinci-sub.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/davinci-sub_hu17013459865824827535.webp 320w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu5482579524787721168.webp 640w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu11488487280496324899.webp 768w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu12194877195584293905.webp 1024w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu2369860072900459459.webp 1280w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu2137445394259485884.webp 1536w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu643353147468155946.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/davinci-sub_hu3703406472416179746.jpg 320w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu15481089795152123482.jpg 640w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu5634430415710116274.jpg 768w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu2803296487608442299.jpg 1024w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu10377754921482936210.jpg 1280w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu10972319462950931787.jpg 1536w, /blog/accelerating-launch-with-ai-models/davinci-sub_hu1831727867690011569.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/davinci-sub_hu15481089795152123482.jpg" width="3072" height="3072" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) This one surprised John Berry</span>

 
  <span class="text-sm md:text-lg">&#34;leonardo davinci schematic of nuclear attack sub&#34;</span>

</div>

</p>
<h2 id="the-logo-challenge">The logo challenge</h2>
<p>Everyone has a different mix of gifts. Personally, besides an affinity for technology, I am gifted when it comes to words and writing &ndash; my father was an English major and that certainly had both nature and nurture impact. Strangely, though, I&rsquo;m also strongly visual &ndash; I love visual tools like <a href="https://en.wikipedia.org/wiki/Mind_map">mind maps</a> and <a href="https://miro.com/whiteboard/">Miro boards</a>. It&rsquo;s just that I&rsquo;m completely talentless at the actual creation of art. In middle school, my only artistic win was an abstract soap carving &ndash; &ldquo;abstract&rdquo; being my way of getting out of carving something recognizable.</p>
<p>So creating a decent logo on my own was inconceivable. What I learned, through necessity and trying, is  that <strong>art generation models grant me a skill I&rsquo;ve never had &ndash; the ability to create art</strong>. Using a tool like <a href="https://midjourney.com/home/?callbackUrl=%2Fapp%2F#about">Midjourney</a>, my gifts as a writer and conceptual thinker transform directly into artistic expression. <strong>I am not an artist, yet I created every image in this post.</strong></p>
<p>I believe that the logo effort was successful. Here are the winner and runner up for Crafty CTO&rsquo;s logo:</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/fox2-fox-icon.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu18121839246190721470.webp 320w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu3957481265675779575.webp 640w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu4431829545662122547.webp 768w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu1375588570123533841.webp 1024w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu958914359955448459.webp 1280w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu471382098876245613.webp 1536w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu8216273186804506045.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu12736444098833688570.jpg 320w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu8233914943694948278.jpg 640w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu14168745735361370502.jpg 768w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu6180406293426260955.jpg 1024w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu5197704542199058673.jpg 1280w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu5830035041024707676.jpg 1536w, /blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu2836275401536867496.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/fox2-fox-icon_hu8233914943694948278.jpg" width="2048" height="2048" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[75%] mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu6871939367852019032.webp 320w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu7220073849750719261.webp 640w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu12710717077015104653.webp 768w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu16587037309284037528.webp 1024w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu14784417988284046139.webp 1280w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu7786578185505516911.webp 1536w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu10535596304138910592.webp 1920w" sizes="37vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu12024319155332205926.jpg 320w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu7333539294523087722.jpg 640w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu3375290085516475064.jpg 768w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu1639092655157020842.jpg 1024w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu1601990125296647459.jpg 1280w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu2010884357312946216.jpg 1536w, /blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu3371822062922796535.jpg 1920w" sizes="37vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/crafty-logo-runner-up-fox-only_hu7333539294523087722.jpg" width="2280" height="2280" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Crafty CTO logos, winner and runner up</span>

 
  <span class="text-sm md:text-lg">Left: &#34;professional services firm named crafty CTO, head of a fox, maximum of four colors, logo style, flat, vector&#34;; right: &#34;simple logo icon design red fox face, vector, flat 2d, black background&#34;</span>

</div>

</p>
<h2 id="midjourney">Midjourney</h2>
<p>I&rsquo;m far from an expert, but I have worked quite a bit with with DALL-E 2, the local macOS app <a href="https://diffusionbee.com/">DiffusionBee</a>, and Midjourney. My take on Midjourney:</p>
<blockquote>
<p>Art generation tuned to deliver the incredibly gorgeous</p>
</blockquote>
<p>Midjourney has become my go-to and I used it for most of what you see. It blows my mind. My writing skills enable me to create amazing, gorgeous artwork. If I can conceive it and describe it, I can create it.</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/dreamscape.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/dreamscape_hu9452560490109020905.webp 320w, /blog/accelerating-launch-with-ai-models/dreamscape_hu16921648130742150872.webp 640w, /blog/accelerating-launch-with-ai-models/dreamscape_hu4199517067026328082.webp 768w, /blog/accelerating-launch-with-ai-models/dreamscape_hu12878656377556124854.webp 1024w, /blog/accelerating-launch-with-ai-models/dreamscape_hu6484266331946010588.webp 1280w, /blog/accelerating-launch-with-ai-models/dreamscape_hu292016901183235144.webp 1536w, /blog/accelerating-launch-with-ai-models/dreamscape_hu15265939718048381392.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/dreamscape_hu8085928198594432948.jpg 320w, /blog/accelerating-launch-with-ai-models/dreamscape_hu8393632527026864159.jpg 640w, /blog/accelerating-launch-with-ai-models/dreamscape_hu16478201640316574085.jpg 768w, /blog/accelerating-launch-with-ai-models/dreamscape_hu6376943183150726584.jpg 1024w, /blog/accelerating-launch-with-ai-models/dreamscape_hu13932141657741307779.jpg 1280w, /blog/accelerating-launch-with-ai-models/dreamscape_hu3150780606684256579.jpg 1536w, /blog/accelerating-launch-with-ai-models/dreamscape_hu14163157684197846491.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/dreamscape_hu8393632527026864159.jpg" width="3072" height="3072" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Dreamscape</span>

 
  <span class="text-sm md:text-lg">&#34;dreamscape young red haired girl having dream with cute black bunnies&#34;</span>

</div>

</p>
<p>There&rsquo;s still work to do once the model has delivered &ndash; a few minutes, usually, of post-edits like masking for transparency and resizing &ndash; I&rsquo;ve gotten fairly proficient with <a href="https://www.pixelmator.com/pro/">Pixelmator Pro</a> on the Mac, a great app that itself leverages machine learning in several tools such as Super Resolution.</p>
<h2 id="the-art-of-writing-prompts">The art of writing prompts</h2>
<p>I mentioned writing and conceptual skills above, but there&rsquo;s a bit more to it. To be a good &ldquo;AI driver&rdquo; you need:</p>
<ol>
<li>The ability to write good AI prompts, which is a combination of knowing what words trigger what behavior in a particular AI, and knowledge of the AI&rsquo;s parameters and what they do</li>
<li>The imagination to iterate your prompts when you get stuck in a rut of bad outputs</li>
<li>Learn by trial and error what imagery works in what situations</li>
<li>Iterate &ndash; iterate &ndash; iterate!!</li>
</ol>
<p>This is a real set of skills that need to be developed, and I&rsquo;m still a newbie &ndash; there is incredible depth especially around prompt writing. Fortunately lots of sites are popping up with guidance and examples for each AI.</p>
<p>On the iterate point, here&rsquo;s a small slice of my Midjourney homepage:</p>
<div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/midjourney-screenshot.png"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu2259801292769362920.webp 320w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu7758404350080556150.webp 640w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu1656107927661153876.webp 768w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu16997231326781654337.webp 1024w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu1116645145942879552.webp 1280w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu13223061536945420819.webp 1536w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu6255375769800510775.webp 1920w" sizes="100vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu2569359192619056832.jpg 320w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu17804995695676187464.jpg 640w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu6162501375546214787.jpg 768w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu13416484870676399867.jpg 1024w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu14535620720598921435.jpg 1280w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu10828031214224390941.jpg 1536w, /blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu4528769995389106995.jpg 1920w" sizes="100vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/midjourney-screenshot_hu17804995695676187464.jpg" width="1966" height="1195" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

<p>Here are more examples with prompts.</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/images/fractional4.webp"><picture>
    <source type="image/webp" srcset="/images/fractional4_hu4744731567468509778.webp 320w, /images/fractional4_hu7394359295475926059.webp 640w, /images/fractional4_hu12450550343259999048.webp 768w, /images/fractional4_hu17566687536991712982.webp 1024w, /images/fractional4_hu17345169510837192730.webp 1280w, /images/fractional4_hu17405337756349618683.webp 1536w" sizes="75vw" />
    <source type="image/jpeg" srcset="/images/fractional4_hu14078869741460649010.jpg 320w, /images/fractional4_hu5719551871241209542.jpg 640w, /images/fractional4_hu14562630123342328447.jpg 768w, /images/fractional4_hu12100267806184098505.jpg 1024w, /images/fractional4_hu16381521328554290780.jpg 1280w, /images/fractional4_hu15790431540736400859.jpg 1536w" sizes="75vw" />
    
      <img src="/images/fractional4_hu5719551871241209542.jpg" width="1536" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Fractional</span>

 
  <span class="text-sm md:text-lg">&#34;stylized representation of fractional fractions slicing&#34;</span>

</div>

</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/images/clockslice11lg.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice11lg_hu5072773530030826459.webp 320w, /images/clockslice11lg_hu15686416660872274996.webp 640w, /images/clockslice11lg_hu8843934955763349637.webp 768w, /images/clockslice11lg_hu15048497064197286502.webp 1024w, /images/clockslice11lg_hu16691689577613721324.webp 1280w, /images/clockslice11lg_hu7412150068271025353.webp 1536w, /images/clockslice11lg_hu1115470238078894419.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/images/clockslice11lg_hu17552584058584219187.jpg 320w, /images/clockslice11lg_hu1474677054844165141.jpg 640w, /images/clockslice11lg_hu4494445535586956598.jpg 768w, /images/clockslice11lg_hu18200496083506937227.jpg 1024w, /images/clockslice11lg_hu2241975906852561032.jpg 1280w, /images/clockslice11lg_hu14645765529790129336.jpg 1536w, /images/clockslice11lg_hu18133836769236967928.jpg 1920w" sizes="75vw" />
    
      <img src="/images/clockslice11lg_hu1474677054844165141.jpg" width="2660" height="2660" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Clock face time slices</span>

 
  <span class="text-sm md:text-lg">&#34;clock face consisting of separate wedge shapes that represent slices of time&#34;</span>

</div>

</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/foxmedallion3.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/foxmedallion3_hu18388385408423841937.webp 320w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu4070806514118260904.webp 640w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu12062008000030703900.webp 768w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu1189373623002691519.webp 1024w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu2582426159648881984.webp 1280w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu16687623137439978497.webp 1536w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu2699198455985770138.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/foxmedallion3_hu12875198496317268929.jpg 320w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu13837017698936380228.jpg 640w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu3767121018422949762.jpg 768w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu10210433399560827785.jpg 1024w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu12092437933894143361.jpg 1280w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu13383403923943356687.jpg 1536w, /blog/accelerating-launch-with-ai-models/foxmedallion3_hu18374213681375282959.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/foxmedallion3_hu13837017698936380228.jpg" width="2048" height="2048" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Fox medallion</span>

 
  <span class="text-sm md:text-lg">&#34;beautiful ornamental circular medallion of a wise crafty fox, realistic eyes, face, muzzle, intricate and detailed, glossy, finely etched silver with gold inlay&#34;</span>

</div>

</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu2215955479722409577.webp 320w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu12279168894736056457.webp 640w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu8670919426406765947.webp 768w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu1748158500493796223.webp 1024w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu16889123282854806232.webp 1280w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu8609445192592323137.webp 1536w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu6208060155487391934.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu10926989861764268259.jpg 320w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu13327770821222066362.jpg 640w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu17805458067656034464.jpg 768w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu4628161206619442980.jpg 1024w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu5203274885812325843.jpg 1280w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu1364775733769181894.jpg 1536w, /blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu17021872290912615342.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/diffusionbeemedallion@0.5x_hu13327770821222066362.jpg" width="2304" height="2304" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(DiffusionBee) Another fox medallion</span>

 
  <span class="text-sm md:text-lg">&#34;wise fox in a beautiful round ornamental medallion, realistic eyes, face, muzzle, ears, mainly made of silver with gold inlay, a few gemstones, amber, blue diamond, sapphire, intricately etched, Etching, Detailed and Intricate, extremely fine etching&#34;</span>

</div>

</p>
<p><div class="flex justify-evenly"><div class="w-[75%] mx-2 flex justify-center"><a href="/blog/accelerating-launch-with-ai-models/dall-e2-rabbit.webp"><picture>
    <source type="image/webp" srcset="/blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu14567065350652155170.webp 320w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu6011872866171606119.webp 640w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu8747585146135277173.webp 768w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu13699009264753495725.webp 1024w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu14525280243380775819.webp 1280w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu1506642300256093039.webp 1536w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu1691843752546232000.webp 1920w" sizes="75vw" />
    <source type="image/jpeg" srcset="/blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu702218361221366056.jpg 320w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu2064680061060562502.jpg 640w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu11827292200520172682.jpg 768w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu10915179874119663315.jpg 1024w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu9017678778901810962.jpg 1280w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu2797913662880956037.jpg 1536w, /blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu8471507075783064856.jpg 1920w" sizes="75vw" />
    
      <img src="/blog/accelerating-launch-with-ai-models/dall-e2-rabbit_hu2064680061060562502.jpg" width="3072" height="3072" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(DALL-E 2) Black rabbit</span>

 
  <span class="text-sm md:text-lg">&#34;Rabbit with black fur by Frida Kahlo&#34;</span>

</div>

</p>
<h2 id="heavy-lifting-cognitive-load-and-unblocking">Heavy lifting, cognitive load, and unblocking</h2>
<p>For me, both Word AIs and Art AIs serve to unblock my progress. Since Midjourney or ChatGPT do most of the heavy lifting, my cognitive load is lightened and I retain the mental reserves needed to do the difficult &ndash; start something new, finish something, or work outside my comfort zone.</p>
<p>I&rsquo;m finding that when writing in my blog, I can now create imagery on the fly without bogging down the process. This &ldquo;launch&rdquo; image for my post about launching Crafty&rsquo;s blog took me all of 10 minutes, from first keystroke to production-ready. (Firefly fans: definitely a reaver ship, right?)</p>
<p><div class="flex justify-evenly"><div class="w-full mx-2 flex justify-center"><a href="/images/futuristic_spaceship_launching.webp"><picture>
    <source type="image/webp" srcset="/images/futuristic_spaceship_launching_hu5826364775343159522.webp 320w, /images/futuristic_spaceship_launching_hu9116496989929904481.webp 640w, /images/futuristic_spaceship_launching_hu14629613483427470508.webp 768w, /images/futuristic_spaceship_launching_hu15874652749059537395.webp 1024w, /images/futuristic_spaceship_launching_hu9818464930611956904.webp 1280w, /images/futuristic_spaceship_launching_hu7315729786726015500.webp 1536w" sizes="100vw" />
    <source type="image/jpeg" srcset="/images/futuristic_spaceship_launching_hu1111658385289898020.jpg 320w, /images/futuristic_spaceship_launching_hu6904808082602610909.jpg 640w, /images/futuristic_spaceship_launching_hu15221733022022497686.jpg 768w, /images/futuristic_spaceship_launching_hu9456681391230211408.jpg 1024w, /images/futuristic_spaceship_launching_hu4780655847655193075.jpg 1280w, /images/futuristic_spaceship_launching_hu9039028557160953675.jpg 1536w" sizes="100vw" />
    
      <img src="/images/futuristic_spaceship_launching_hu6904808082602610909.jpg" width="1536" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>



 
<div class="flex flex-col items-center text-center">
  <span class="text-base md:text-xl font-bold">(Midjourney) Launch imagery for blog</span>

 
  <span class="text-sm md:text-lg">&#34;futuristic spaceship launching hyper realistic 35mm technicolor&#34;</span>

</div>

</p>
<h2 id="bottom-line----ais-accelerated-crafty-ctos-launch">Bottom line &ndash; AIs accelerated Crafty CTO&rsquo;s launch</h2>
<p>The combination of Midjourney and ChatGPT enabled me (alone!) to launch Crafty&rsquo;s digital footprint in about half the time (who knows, really, how long I might have stayed bogged down?) and with a degree of quality I would likely not have achieved otherwise, at least not without a lot more time and money.</p>
<p>Highly recommended.</p>
<div class="flex justify-evenly"><div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice7.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice7_hu11453154076638670547.webp 320w, /images/clockslice7_hu13987823164114676231.webp 640w, /images/clockslice7_hu17901391220197518489.webp 768w, /images/clockslice7_hu1372291135815297499.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice7_hu6133473080722545844.jpg 320w, /images/clockslice7_hu10767505539736652340.jpg 640w, /images/clockslice7_hu10602135007727289457.jpg 768w, /images/clockslice7_hu11832229366438845139.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice7_hu10767505539736652340.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice8.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice8_hu1377476854857051231.webp 320w, /images/clockslice8_hu5519782400478486302.webp 640w, /images/clockslice8_hu2543677850079107133.webp 768w, /images/clockslice8_hu5825735422851114823.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice8_hu4488423826562181048.jpg 320w, /images/clockslice8_hu12322204617337167066.jpg 640w, /images/clockslice8_hu959302198336769303.jpg 768w, /images/clockslice8_hu3497223454982594881.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice8_hu12322204617337167066.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice12.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice12_hu14073287947790113085.webp 320w, /images/clockslice12_hu13274137681357477555.webp 640w, /images/clockslice12_hu1141046107869441087.webp 768w, /images/clockslice12_hu2716228396563685253.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice12_hu16832011150954032653.jpg 320w, /images/clockslice12_hu15057441540085821446.jpg 640w, /images/clockslice12_hu4477243085859597163.jpg 768w, /images/clockslice12_hu15800183913788729187.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice12_hu15057441540085821446.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice3.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice3_hu6921191777658469957.webp 320w, /images/clockslice3_hu12230088070864901504.webp 640w, /images/clockslice3_hu17792754311084147248.webp 768w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice3_hu8091538130370725605.jpg 320w, /images/clockslice3_hu2537239448566042636.jpg 640w, /images/clockslice3_hu13099415322929878832.jpg 768w" sizes="3vw" />
    
      <img src="/images/clockslice3_hu2537239448566042636.jpg" width="939" height="939" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  <div class="w-[10%] mx-2 flex justify-center"><a href="/images/clockslice10.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice10_hu15474034464418321003.webp 320w, /images/clockslice10_hu3043583476973961257.webp 640w, /images/clockslice10_hu13787609665904290598.webp 768w, /images/clockslice10_hu4661666611610043530.webp 1024w" sizes="3vw" />
    <source type="image/jpeg" srcset="/images/clockslice10_hu172559364623023807.jpg 320w, /images/clockslice10_hu5322768827591290707.jpg 640w, /images/clockslice10_hu16152603469257028027.jpg 768w, /images/clockslice10_hu14487418453044301717.jpg 1024w" sizes="3vw" />
    
      <img src="/images/clockslice10_hu5322768827591290707.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Why Fractional?</title>
      <link>https://craftycto.com/blog/why-fractional/</link>
      <pubDate>Tue, 07 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/why-fractional/</guid>
      <description>&lt;p&gt;Fractional CTO services can be a valuable asset for businesses that want to take advantage of technology to grow and improve their operations, but don&amp;rsquo;t have the resources or expertise to do so in-house.&lt;/p&gt;
&lt;h2 id=&#34;access-to-experienced-technology-leaders&#34;&gt;Access to experienced technology leaders&lt;/h2&gt;
&lt;p&gt;One of the main benefits of fractional CTO services is access to experienced and knowledgeable technology leaders who can provide strategic guidance and support for your business. A fractional CTO can help you create a technology roadmap that aligns with your business goals and objectives, and provide expert advice on the technologies and solutions that will best support your needs.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fractional CTO services can be a valuable asset for businesses that want to take advantage of technology to grow and improve their operations, but don&rsquo;t have the resources or expertise to do so in-house.</p>
<h2 id="access-to-experienced-technology-leaders">Access to experienced technology leaders</h2>
<p>One of the main benefits of fractional CTO services is access to experienced and knowledgeable technology leaders who can provide strategic guidance and support for your business. A fractional CTO can help you create a technology roadmap that aligns with your business goals and objectives, and provide expert advice on the technologies and solutions that will best support your needs.</p>
<h2 id="flexibility-and-cost-effectiveness">Flexibility and cost-effectiveness</h2>
<p>Another advantage of fractional CTO services is the flexibility and cost-effectiveness they offer. Instead of hiring a full-time CTO, which can be expensive and may not be necessary for all businesses, fractional CTO services allow you to bring in experienced technology leaders on an as-needed basis. This can save you money and ensure that you have the right level of support and expertise when you need it, without the overhead of a full-time employee.</p>
<h2 id="staying-up-on-the-latest-technologies">Staying up on the latest technologies</h2>
<p>Additionally, fractional CTO services can help businesses stay up-to-date with the latest technologies and trends. As the technology landscape continues to evolve, it can be challenging for businesses to keep up with the latest developments and understand how they can be leveraged to improve their operations. A fractional CTO can provide valuable insight and guidance on how to incorporate new technologies into your business, and help you make informed decisions about which technologies to invest in.</p>
<p>Overall, fractional CTO services can provide a range of benefits for businesses, including access to experienced technology leaders, cost-effectiveness, and the ability to stay up-to-date with the latest trends and developments in the technology field. Whether you&rsquo;re a small business looking to grow and improve, or a larger organization looking for additional support and guidance, fractional CTO services can be a valuable resource for achieving your technology goals.</p>
<div class="flex justify-evenly"><div class="w-[20%] mx-2 flex justify-center"><a href="/images/clockslice10.webp"><picture>
    <source type="image/webp" srcset="/images/clockslice10_hu15474034464418321003.webp 320w, /images/clockslice10_hu3043583476973961257.webp 640w, /images/clockslice10_hu13787609665904290598.webp 768w, /images/clockslice10_hu4661666611610043530.webp 1024w" sizes="30vw" />
    <source type="image/jpeg" srcset="/images/clockslice10_hu172559364623023807.jpg 320w, /images/clockslice10_hu5322768827591290707.jpg 640w, /images/clockslice10_hu16152603469257028027.jpg 768w, /images/clockslice10_hu14487418453044301717.jpg 1024w" sizes="30vw" />
    
      <img src="/images/clockslice10_hu5322768827591290707.jpg" width="1024" height="1024" class="" alt="" loading="lazy" />
    
  </picture></a></div>
  
</div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Building with Shape Up</title>
      <link>https://craftycto.com/blog/building-with-shape-up/</link>
      <pubDate>Sat, 02 May 2020 01:00:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/building-with-shape-up/</guid>
      <description>In my first post, we looked at Shape Up fundamentals like six-week cycles, appetite, work shaping, and the betting table. We left off at the handoff of shaped, de-risked work to the development teams. This post will focus on Shape Up&amp;rsquo;s approach to building. (And shipping!)</description>
      <content:encoded><![CDATA[<p><em>This is the sequel to my post <a href="../shape-up-your-agile/">Shape Up Your Agile</a>, about the book <a href="https://basecamp.com/shapeup">Shape Up: Stop Running in Circles and Ship Work that Matters</a> by <a href="https://basecamp.com">Basecamp</a>&rsquo;s <a href="https://twitter.com/rjs">Ryan Singer</a>.</em></p>
<blockquote>
<p>This post incorporates a number of quotes and hand-drawn illustrations from Shape Up. All link to their source in the <a href="https://basecamp.com/shapeup/webbook">online book</a> and are copyright ©1999-2020 <a href="https://basecamp.com">Basecamp</a>.</p>
</blockquote>
<p>In my first post, we looked at Shape Up fundamentals like <a href="/posts/shape-up-your-agile.html#six-week-dev-cycle-two-week-cool-down">six-week cycles</a>, <a href="/posts/shape-up-your-agile.html#estimating-vs-appetite">appetite</a>, <a href="/posts/shape-up-your-agile.html#work-shaping">work shaping</a>, and <a href="/posts/shape-up-your-agile.html#the-betting-table">the betting table</a>. We left off at the handoff of shaped, de-risked work to the development teams. This post will focus on Shape Up&rsquo;s approach to building. (And shipping!)</p>
<h2 id="hand-it-over-with-autonomy">Hand it over, with autonomy</h2>
<figure>
    <img loading="lazy" src="passing_the_baton.jpg"/> 
</figure>

<p>Before the dev team gets a project in Shape Up, two vital steps have already occurred:</p>
<ul>
<li>Work shaping – identifying what we want and what dev resources we&rsquo;re willing to invest to get it</li>
<li>Betting – firmly committing ourselves to this project versus others competing for the same resources</li>
</ul>
<p>Because these two pre-steps are beautifully thought through, and thanks also to other fundamentals such as six-week cycles and the circuit breaker, Shape Up positions dev teams to enjoy a degree of autonomy far beyond that of the usual agile approach. In effect, we are saying:</p>
<blockquote>
<p>&ldquo;Here you go, dev team. This is what we want, and we&rsquo;ll leave you alone for six weeks to build it. Implement the details as you see fit.</p>
<p>Good luck!&rdquo;</p>
</blockquote>
<p>Traditional agile, let&rsquo;s say Scrum for example, looks a bit different:</p>
<blockquote>
<p>&ldquo;OK dev team! Here are your <strong>tasks</strong>! We managers, infinitely wise, have selected these for you to do these over the next two weeks! Dig right in!</p>
<p>And don&rsquo;t worry, we&rsquo;re right here if you need help or any kind of decision. In fact, let&rsquo;s meet <strong>every morning</strong> to check in! Why don&rsquo;t we <strong>stand up</strong> at that meeting, sound good?</p>
<p>See you soon!&rdquo;</p>
</blockquote>



<iframe src="https://open.spotify.com/embed/track/3cLqK3LPVrTIzfENVmYLoU"
    width="300"
    height="380"
    frameborder="0"
    allowtransparency="true"
    allow="encrypted-media"></iframe>

<p>Autonomy (project) or code monkey (tasks), which do you think your dev teams will prefer?</p>
<h2 id="ramping-up">Ramping up</h2>
<p>What happens during the first two or three days after the project is kicked off? Lots of genuine work – orienting, exploring, understanding – but little of it visible.</p>
<figure>
    <img loading="lazy" src="skateboard_ramp.jpg"/> 
</figure>

<p>Shape Up encourages patience during these early days of the build cycle:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.1-chapter-09#getting-oriented">Asking for visible progress will only push it underground. It’s better to empower the team to explicitly say “I’m still figuring out how to start” so they don’t have to hide or disguise this legitimate work.</a></p>
</blockquote>
<h2 id="let-there-be-tasks">Let there be tasks</h2>
<p>Since the dev team wasn&rsquo;t handed a list of tasks, they need to develop their own. Shape Up differentiates between <em>imagined</em> tasks – &quot; <a href="https://basecamp.com/shapeup/3.1-chapter-09#imagined-vs-discovered-tasks">tasks we <em>think</em> we need to do at the start of a project</a>&quot; – and <em>discovered</em> tasks – &ldquo;<a href="https://basecamp.com/shapeup/3.1-chapter-09#imagined-vs-discovered-tasks">tasks we <em>discover</em> we need to do in the course of doing real work</a>.&rdquo; There&rsquo;s nothing wrong with imagined tasks, and during early ramp-up, a number will come to mind and be captured.</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.1-chapter-09#imagined-vs-discovered-tasks">Then, as they get their hands dirty, they discover all kinds of other things that we didn’t know in advance. These unexpected details make up the true bulk of the project and sometimes present the hardest challenges.</a></p>
</blockquote>
<p>This is why, once the team is oriented, it&rsquo;s time to dig in and build something real. Only by starting to do real work are we going to discover the full set of to-dos that make up our project.</p>
<h2 id="slicing-off-a-piece-to-build">Slicing off a piece to build</h2>
<p>Shape Up warns us against building front end and back end components independently, and waiting until late in the project to start integrating them. Instead, we are encouraged to deliver integrated, demoable, &ldquo;really done&rdquo; pieces of work throughout the project, even here in week 1.</p>
<p>For this to be possible, you need to slice out a piece of the project that includes the right set of front end elements, combined with the back end elements that support them. As nicely illustrated in the book, this gets you a slice that works:</p>
<p><a href="https://basecamp.com/shapeup/3.2-chapter-10#integrate-one-slice"><figure>
    <img loading="lazy" src="merged-layers.jpg"/> 
</figure>
</a></p>
<p>In week 1, we aim to carve out, build, and demo our first slice, beginning a pattern that will continue throughout the cycle. But not just any slice – Shape Up encourages us to &ldquo;<a href="https://basecamp.com/shapeup/3.2-chapter-10#start-in-the-middle">start in the middle</a>&rdquo; for our first visible slice of work, building something that is central to the project, as opposed to a peripheral like the login screen. The identified slice needs to be small enough to execute in a few days, and if possible, something novel, new to us.</p>
<p>Further tips on building this first slice:</p>
<ul>
<li><a href="https://basecamp.com/shapeup/3.2-chapter-10#affordances-before-pixel-perfect-screens">Affordances before pixel-perfect screens</a> –  On the front end, start with rough, unstyled &ldquo;affordances&rdquo; rather than trying for pixel perfection.</li>
<li><a href="https://basecamp.com/shapeup/3.2-chapter-10#program-just-enough-for-the-next-step">Program just enough for the next step</a> – On the back end, you don&rsquo;t need to build everything, implementing a couple of fields or a bit of routing logic is fine, just enough to allow the front end of the slice to function.</li>
<li><a href="https://basecamp.com/shapeup/3.2-chapter-10#programmers-dont-need-to-wait">Programmers don&rsquo;t need to wait</a> – The pitch we received starting the project gives programmers enough information to dig in. There&rsquo;s no need to wait around for your front end developer to ask for something. Go ahead and dig in.</li>
</ul>
<h2 id="integrated-slice--scope">Integrated slice = &ldquo;scope&rdquo;</h2>
<p>These things we&rsquo;ve been calling &ldquo;slices&rdquo; or &ldquo;pieces&rdquo; are actually a vital element of successful building with Shape Up, and the have an official name: scopes.</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.3-chapter-11#organize-by-structure-not-by-person">We call these integrated slices of the project scopes. We break the overall scope (singular) of the project into separate scopes (plural) that can be finished independently of each other.</a></p>
</blockquote>
<p>To be clear, scope as used in Shape Up means &ldquo;integrated slice&rdquo; — and definitely <strong>does not mean</strong> &ldquo;estimate&rdquo; or &ldquo;level of effort.&rdquo;</p>
<p>Scopes are fundamental in Shape Up because they are how work gets delivered, and therefore also how we organize tasks. They even help us define the <a href="http://basecamp.com/shapeup/3.3-chapter-11#the-language-of-the-project">language we use when talking about our project</a>.</p>
<p><a href="https://basecamp.com/shapeup/3.3-chapter-11#the-language-of-the-project"><figure>
    <img loading="lazy" src="intro_cartoon.png"/> 
</figure>
</a></p>
<h2 id="scope-mapping">Scope mapping</h2>
<p>Recall that when our team is handed a project in the form of shaped work represented in a pitch, tasks are intentionally not defined yet: our work is shaped but no tasks are defined:</p>
<p><a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-empty-1.png"/> 
</figure>
</a></p>
<p>In the early days of the project, we&rsquo;ll immediately uncover and write down a number of tasks, but these won&rsquo;t yet be organized in any meaningful or useful way:</p>
<p><a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-tasks-only-1.png"/> 
</figure>
</a></p>
<p>When we identify and build our first slice of work, we start the process of identifying scopes and their associated tasks:
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-first-slice.png"/> 
</figure>
</a></p>
<p>We complete our first scope &hellip;
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-first-slice-done.png"/> 
</figure>
</a></p>
<p>&hellip; and then we&rsquo;re ready to take a pass at fully mapping out all of the project&rsquo;s scopes and their tasks:
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-completed-map.png"/> 
</figure>
</a></p>
<p>Scopes evolve as we dig deeper and understand more:
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-completed-map-refactor1.png"/> 
</figure>
</a></p>
<p>We build our way through these scopes &hellip;
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-completed-map-partly-done.png"/> 
</figure>
</a></p>
<p>&hellip; until finally we&rsquo;re done:
<a href="https://basecamp.com/shapeup/3.3-chapter-11#case-study-message-drafts"><figure>
    <img loading="lazy" src="scopes-completed-map-done.png"/> 
</figure>
</a></p>
<h2 id="getting-the-scopes-right">Getting the scopes right</h2>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.3-chapter-11#discovering-scopes">You need to walk the territory before you can draw the map.</a></p>
</blockquote>
<p>Scope mapping is literally a blank-sheet-of-paper problem – so how can the team know its scopes are right? This is largely a matter of feel, &ldquo;does this feel right?&rdquo; Shape Up identifies three signs that our scopes are well-mapped:</p>
<ol>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">You feel like you can see the whole project and nothing important that worries you is hidden down in the details.</a></li>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">Conversations about the project become more flowing because the scopes give you the right language.</a></li>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">When new tasks come up, you know where to put them</a>.</li>
</ol>
<p>Shape Up likewise lists three warning signs that our scopes may need to be redrawn:</p>
<ol>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">It’s hard to say how “done” a scope is.</a> This can happen when unrelated concerns are mixed within a single scope, so that finishing tasks related to one concern don&rsquo;t result in any perceived progress on the other.</li>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">The name isn’t unique to the project, like “front-end” or “bugs.”</a> Shape Up terms this kind of scope a “grab bag” or “junk drawer” of tasks that instead should be filed under other scopes.</li>
<li><a href="https://basecamp.com/shapeup/3.3-chapter-11#how-to-know-if-the-scopes-are-right">It’s too big to finish soon.</a> A scope that&rsquo;s overly large is effectively a project that hasn&rsquo;t been scope-mapped, with a long, unorganized task list, difficult to show quick progress on.</li>
</ol>
<h2 id="scope-shapes">Scope shapes</h2>
<p>Shape Up warns us that not all scopes have the nice <a href="https://basecamp.com/shapeup/3.3-chapter-11#layer-cakes">layer-cake shape</a> with a layer of UI over a thin supporting layer of back-end code.</p>
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1550757615-65043715811d"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@eadesstudio?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by James Eades / Unsplash</a></p>
        </figcaption>
</figure>

<p>Some scopes look more like <a href="https://basecamp.com/shapeup/3.3-chapter-11#icebergs">icebergs</a>, with a tiny bit of UI riding over a huge hidden mass of back-end logic, or vice-versa. Icebergs need to be thought about and scope-mapped a bit differently.</p>
<p>And despite the warning above, Shape Up acknowledges that most projects need a &ldquo;<a href="https://basecamp.com/shapeup/3.3-chapter-11#chowder">chowder</a>&rdquo; scope to hold tasks that don&rsquo;t fit elsewhere. We are advised to both expect, and maintain a healthy skepticism about, chowder scopes.</p>
<h2 id="tracking-progress-and-managing-uncertainty">Tracking progress and managing uncertainty</h2>
<p>In the handover section above, we highlight the significant autonomy that Shape Up gives dev teams. That autonomy isn&rsquo;t total, though; stakeholders and managers still need visibility into project status and risks. Providing useful visibility without adding friction isn&rsquo;t easy.</p>
<p>We&rsquo;ve already talked about &ldquo;imagined&rdquo; vs &ldquo;discovered&rdquo; tasks: some tasks can be anticipated and planned for, but the tasks that represent the majority of project work are unanticipated and can only be discovered during project work. One implication is that our task list actually grows as the project progresses:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#the-tasks-that-arent-there"><figure>
    <img loading="lazy" src="tasks_growing.jpg"/> 
</figure>
</a></p>
<p>This project is actually **<em>pro</em>**gressing in a natural way, but if you go by the length of the list or even the number of open tasks, it seems to be **<em>retro</em>**gressing. Clearly to-do list counting isn&rsquo;t much of a metric to manage by.</p>
<p>Estimating task effort and tracking completion percentage seems like a smarter way to manage. The problem is that effort estimates are one-dimensional; they lack any measure of uncertainty:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.4-chapter-12#estimates-dont-show-uncertainty">Say you have two tasks, both estimated to take four hours. If one task is something the team has done ten times in the past, you can be confident in the estimate. Suppose the other task is something the team has never done before, or it has unclear interdependencies. It could take the four hours if all goes perfectly, but due to the unknowns in it, it could stretch out to two to three days. It’s not meaningful to write “4 hours, or maybe 3 days” as the estimate.</a></p>
</blockquote>
<p>This &ldquo;4 hours or maybe 3 days&rdquo; brings back memories – that&rsquo;s an answer I&rsquo;ve gotten many times when, in my manager / stakeholder role, I&rsquo;d ask the dev team, &ldquo;well, how long will it take to build that?&rdquo; This seemingly flip answer is actually a pretty healthy one – my team was responding honestly and trying to communicate &ldquo;can&rsquo;t know until we start building it&rdquo; uncertainty that traditional estimates have no way to express.</p>
<p>We never did figure out a good system for managing uncertainty. But the Basecamp guys did.</p>
<h2 id="the-hill-chart">The hill chart</h2>
<p>The Basecamp team had a critical insight:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.4-chapter-12#work-is-like-a-hill">Every piece of work has two phases. First there’s the uphill phase of figuring out what our approach is and what we’re going to do. Then, once we can see all the work involved, there’s the downhill phase of execution.</a></p>
</blockquote>
<p>The uphill part is where uncertainty is high; once we reach the top of the hill, there&rsquo;s still a lot of work to be done but it&rsquo;s all known work and therefore predictable, low-risk, downhill. Here&rsquo;s what that looks like in a picture:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#work-is-like-a-hill"><figure>
    <img loading="lazy" src="hill_concept.png"/> 
</figure>
</a></p>
<p>Shape Up&rsquo;s hill chart is simply this hill curve applied to project scopes. Each scope placed at the appropriate spot on the curve based on its completion and uncertainty status:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#scopes-on-the-hill"><figure>
    <img loading="lazy" src="scopes_on_the_hill.png"/> 
</figure>
</a></p>
<p>If you&rsquo;re a manager or stakeholder, this one simple chart provides a complete birds-eye view of how the project is coming along – what Shape Up calls &ldquo;<a href="https://basecamp.com/shapeup/3.4-chapter-12#status-without-asking">status without asking</a>.&rdquo;</p>
<p>There&rsquo;s actually a third dimension here, time. Since scopes move on the curve over time, we have a time series of hill charts showing how our scopes are progressing over time. Or in some cases, not progressing, or even retrogressing:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#nobody-says-i-dont-know"><figure>
    <img loading="lazy" src="stuck_scope.png"/> 
</figure>
</a></p>
<p>By looking at how hill charts change over time, managers and stakeholders get critical insight into &ldquo;<a href="https://basecamp.com/shapeup/3.4-chapter-12#status-without-asking">what’s in motion and what’s stuck</a>.&rdquo; In this example, the red dot looks like a &ldquo;stuck scope.&rdquo; Noticing this, the manager can initiate a friendly conversation with the team, and work out a course correction that gets the scope back on track. All this happens with the least possible friction. No probing phone conversations, &ldquo;So, how are things going?&rdquo; No status reports. No daily standups.</p>
<h3 id="basecamps-hill-charts-implementation">Basecamp&rsquo;s hill charts implementation</h3>
<p>As you might expect, Basecamp&rsquo;s own <a href="https://basecamp.com/features/hill-charts">hill chart implementation</a>  <a href="https://basecamp.com/features/hill-charts">i</a>s excellent. You can simply drag a scope along the curve of the hill chart to update status:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#status-without-asking"><figure>
    <img loading="lazy" src="dragging_scopes.gif"/> 
</figure>
</a></p>
<p>For managers and stakeholders, Basecamp can easily pull up the hill-chart-over-time view:
<a href="https://basecamp.com/shapeup/3.4-chapter-12#status-without-asking"><figure>
    <img loading="lazy" src="snapshots.png"/> 
</figure>
</a></p>
<h2 id="how-to-build-and-stay-out-of-trouble">How to build (and stay out of trouble)</h2>
<p>Scope mapping gives us an effective way to organize and talk about the work to be done. Hill charts help the team track and communicate progress during the build cycle. But does Shape Up help us actually execute the work?
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1541888946425-d81bb19240f5?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@sunburned_surveyor?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by Scott Blake / Unsplash</a></p>
        </figcaption>
</figure>
</p>
<p>In my mind, the way scopes and hill charts train us to think and talk about the work, and for that matter everything else that Shape Up has laid out and walked us through, has all established the foundation for actually <strong><em>doing</em></strong> the work effectively. It&rsquo;s an iceberg. Up here in the sunlight is the dev team, supported by their managers and stakeholders, kicking ass. Down below, hidden, is the deep Shape Up foundation that forms and supports that ready-to-kick-ass team.</p>
<p>That said, Shape Up does provide solid guidance on how to build effectively:</p>
<ul>
<li><a href="https://basecamp.com/shapeup/3.4-chapter-12#build-your-way-uphill">Build your way uphill.</a> Early Shape Up adopters often run into &ldquo;backsliding,&rdquo; where a scope seems to make it to the top of the hill, but then slides back down into the unknown zone. &ldquo;Oh crap, it&rsquo;s actually a lot more complicated than I thought.&rdquo; Shape Up points out that this is often because &ldquo;<a href="https://basecamp.com/shapeup/3.4-chapter-12#build-your-way-uphill">somebody did the uphill work with their head instead of their hands.</a>&rdquo; The solution – build your way up the hill, rather than trying to do it in your head.</li>
<li><a href="https://basecamp.com/shapeup/3.4-chapter-12#solve-in-the-right-sequence">Solve in the right sequence.</a> Some scopes have more uncertainty than others. When deciding which scope to work on first, Shape Up counsels us to think about being towards the end of the cycle and running low on time – which scope would you <strong>not</strong> want to build, late in the game, under time pressure? The answer is clear and leads the the guidance, &ldquo;<a href="https://basecamp.com/shapeup/3.4-chapter-12#solve-in-the-right-sequence">push the scariest work uphill first.</a>&rdquo;</li>
<li><a href="https://basecamp.com/shapeup/3.4-chapter-12#prompts-to-refactor-the-scopes">Stuck scope? Refactor</a>. Sometimes a scope that appears stuck just needs to be redrawn. The most common scope slicing problem is an over-broad slice that encompasses several concerns. The team might be progressing just fine on several of the concerns, but because they are part of a larger grouping, the scope can&rsquo;t move up the hill because some of the concerns are still unsolved. Shape Up tells us &ldquo;<a href="https://basecamp.com/shapeup/3.4-chapter-12#prompts-to-refactor-the-scopes">The solution in a case like this is to break the scope apart into smaller scopes that can move independently.</a>&rdquo;</li>
</ul>
<h2 id="stopping">Stopping</h2>
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1523537444585-432d2bacc10d?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@jodaarba?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by Jose Aragones / Unsplash</a></p>
        </figcaption>
</figure>

<p>That there is an <a href="https://basecamp.com/shapeup/3.5-chapter-13">entire chapter</a> in the Shape Up book on deciding when to stop, complete with one more great tool called <a href="https://basecamp.com/shapeup/3.5-chapter-13#scope-hammering">scope hammering</a>, was a facepalm moment for me. It just never dawned on me that deciding when to stop is a really crucial part of the project. Now that Shape Up points it out – facepalm – of course. I should have realized this and approached it like <a href="https://www.rottentomatoes.com/m/the_martian/quotes/">Mark Watney in The Martian</a>,</p>
<blockquote>
<p><a href="https://twitter.com/neiltyson/status/610997574808395777">I’m going to have to science the shit out of this.</a></p>
</blockquote>
<p>Alas, I did not, and therefore our projects normally ended with a good dose of chaos and regret.</p>
<p>As you might have noticed, Shape Up is all about sciencing the shit out of every aspect of software development, and they did it again here.</p>
<h3 id="compare-to-the-baseline-not-the-ideal">Compare to the baseline, not the ideal</h3>
<p>Great people have a burning desire to do great work – and also a tendency to try for perfection. This is a valuable trait, but can trips us up when it&rsquo;s time to finish and ship. We compare what we&rsquo;ve built so far to the ideal solution we have in mind, and want to keep going to achieve that ideal. Shape Up tells us that</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.5-chapter-13#compare-to-baseline">It helps to shift the point of comparison. Instead of comparing up against the ideal, compare down to baseline—the current reality for customers. How do customers solve this problem today, without this feature? What’s the frustrating workaround that this feature eliminates? How much longer should customers put up with something that doesn’t work or wait for a solution because we aren’t sure if design A might be better than design B?</a></p>
</blockquote>
<h3 id="scope-creep">Scope creep</h3>
<p>Shape Up points out that <a href="https://basecamp.com/shapeup/3.5-chapter-13#scope-grows-like-grass">scope grows naturally, like grass</a>:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.5-chapter-13#scope-grows-like-grass">Scope grows naturally. Scope creep isn’t the fault of bad clients, bad managers, or bad programmers. Projects are opaque at the macro scale. You can’t see all the little micro-details of a project until you get down into the work. Then you discover not only complexities you didn’t anticipate, but all kinds of things that could be fixed or made better than they are.</a></p>
</blockquote>
<p>So why feel ashamed or angry about something that&rsquo;s just a reality of software development (and in fact all project work)?  Shape Up tells us:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.5-chapter-13#scope-grows-like-grass">This is how it is. Rather than trying to stop scope from growing, give teams the tools, authority, and responsibility to constantly cut it down.</a></p>
</blockquote>
<h3 id="scope-hammering">Scope hammering</h3>
<figure><a href="https://www.yuyakobayashi.com/en/product-category/fryingpans">
    <img loading="lazy" src="DYN2272edits.jpg"/> </a><figcaption>
            <p>Metal hammering artist Yuya Kobayashi</p>
        </figcaption>
</figure>

<p>How does Shape Up keep the scope grass mowed? Let&rsquo;s not forget one of the Shape Up fundamentals we covered in part one: the circuit breaker. &ldquo;<a href="https://basecamp.com/shapeup/3.5-chapter-13#limits-motivate-trade-offs">If the work doesn’t get done, the project doesn’t happen.</a>&rdquo; That hard limit underlies the subject of controlling scope and deciding when to stop.</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.5-chapter-13#limits-motivate-trade-offs">This forces the team to make trade-offs. When somebody says “wouldn’t it be better if…” or finds another edge case, they should first ask themselves: Is there time for this? &hellip;. We expect our teams to actively make trade-offs and question the scope instead of cramming and pushing to finish tasks</a></p>
</blockquote>
<p>Shape Up thought carefully about the name also:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/3.5-chapter-13#scope-hammering">People often talk about “cutting” scope. We use an even stronger word—hammering—to reflect the power and force it takes to repeatedly bang the scope so it fits in the time box.</a></p>
</blockquote>
<p>Scope hammering is largely about carefully considering which scope changes are <a href="https://basecamp.com/shapeup/4.5-appendix-06">must haves</a> and which are <a href="https://basecamp.com/shapeup/4.5-appendix-06">nice to haves</a>. Finally, of course, you need to have the courage and power to make the hard decisions that lead to shipping on schedule, to say no. Courage and empowerment are a thread that runs throughout Shape Up.</p>
<h2 id="deploy-and-cool-down">Deploy and cool down</h2>
<p>One final reminder that the title of the Shape Up book includes the phrase &ldquo;Ship Work that Matters&rdquo; – or to quote the book itself, &ldquo;<a href="https://basecamp.com/shapeup/3.1-chapter-09#done-means-deployed">done means deployed</a>.&rdquo; Once you&rsquo;ve taken care of that little detail, then comes <a href="https://basecamp.com/shapeup/2.2-chapter-08#cool-down">cool down</a>. We are cautioned to &ldquo;move on,&rdquo; keep the plate clean, and not get sucked into making immediate changes to what you just shipped based on early feedback .</p>
<h2 id="if-you-want-to-try-shape-up">If you want to try Shape Up</h2>
<p>As I was putting finishing touches on this post, I noticed that the Shape Up book includes a <a href="https://basecamp.com/shapeup/4.2-appendix-03">handy appendix</a> on how to give Shape Up a try, with tips, cautions, and <a href="https://basecamp.com/shapeup/4.2-appendix-03#option-a-one-six-week-experiment">three suggested approaches</a> based on your situation.</p>
<h2 id="thank-you">Thank you!</h2>
<p>If you made it here, through two parts and nigh on 7,000 words, thank you!</p>
<p>Special thanks to <a href="https://basecamp.com">Basecamp</a> and <a href="https://twitter.com/rjs">Ryan Singer</a> for their generosity in writing up Shape Up and sharing it freely with us.</p>
<p>Finally, thanks to <a href="https://www.linkedin.com/in/tenchu/">Ten Chu</a>, who acted as a sounding board for me around aspects of Shape Up. I&rsquo;m also grateful to a friend of Ten&rsquo;s, Will Warren, who as CTO of <a href="https://searchspring.com">Searchspring</a> is an experienced Shape Up user, and shared many useful insights.</p>
<p>Speaking of which, I hope to do a follow-up post or two based on conversations with Shape Up practitioners. Stay tuned.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shape Up Your Agile</title>
      <link>https://craftycto.com/blog/shape-up-your-agile/</link>
      <pubDate>Sun, 12 Apr 2020 22:32:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/shape-up-your-agile/</guid>
      <description>Shape Up: Stop Running in Circles and Ship Work that Matters, written by Basecamp&amp;rsquo;s Ryan Singer, hit my radar last summer, and I&amp;rsquo;ve been trying to write about it ever since.</description>
      <content:encoded><![CDATA[<p>The <a href="https://basecamp.com">Basecamp</a> guys have been busy lately. I follow <a href="https://twitter.com/dhh">DHH</a> and <a href="https://twitter.com/jasonfried">Jason Fried</a> on Twitter and generally find myself agreeing with their often-contrarian points of view. I love their <a href="https://basecamp.com/guides/how-we-communicate">Guide to Internal Communication</a>, their pushback against insane 80-hour workweeks in <a href="https://basecamp.com/books/calm">It Doesn&rsquo;t Have to be Crazy at Work</a> &hellip; <a href="https://basecamp.com/books/rework">REWORK</a> &hellip; <a href="https://basecamp.com/books/remote">REMOTE</a> &hellip; <a href="https://basecamp.com/books/getting-real">Getting Real</a>. This is a seriously impressive body of work.</p>
<p><a href="https://basecamp.com/shapeup">Shape Up: Stop Running in Circles and Ship Work that Matters</a>, written by Basecamp&rsquo;s <a href="https://twitter.com/rjs">Ryan Singer</a>, hit my radar last summer, and I&rsquo;ve been trying to write about it ever since.</p>
<blockquote>
<p>Before I dig in, let me say that this post includes a number of quotes and several hand-drawn illustrations from Shape Up. All are linked back to their source in the <a href="https://basecamp.com/shapeup/webbook">online book</a> and are copyright ©1999-2020 <a href="https://basecamp.com">Basecamp</a>.</p>
</blockquote>
<p>My problem has been, it&rsquo;s a big subject, and the deeper I dug, the bigger it got. Big as in a <a href="https://basecamp.com/shapeup/shape-up.pdf">143 page PDF</a>. Bigger – it speaks to every aspect of the software development process. Biggest – it represents an alternative to All Those Other Agile Methodologies That Everybody Uses.</p>
<p>In the event that the Basecamp guys happen to read this, they might be shrieking and gibbering right now, because they do not, never ever, in any way or sense, describe Shape Up as an &ldquo;agile methodology.&rdquo; A case in point: if you search the Shape Up ebook for &ldquo;agile,&rdquo; you get one lonely match (in <a href="https://basecamp.com/shapeup/0.1-foreword">Jason Fried&rsquo;s Foreword</a>):</p>
<figure>
    <img loading="lazy" src="File-Apr-12--9-21-01-PM.jpeg"/> 
</figure>

<p>Likewise, just one match if you search for &ldquo;scrum&rdquo; and &ldquo;methodology.&rdquo; In all cases, the point being made is, &ldquo;Shape Up isn&rsquo;t one of those!&rdquo;</p>
<h2 id="so-what-is-shape-up">So what is Shape Up?</h2>
<p>Shape Up is the Basecamp team&rsquo;s distillation of how they themselves develop software, superbly written and illustrated, freely contributed to the world as an online and downloadable e-book. Shape Up occupies the same territory, serves the same function, as Those Various Agile Methodologies.</p>
<p>Given that almost everybody is doing some kind of agile – formal, informal, sorta-kinda, whatever – it&rsquo;s worth establish a baseline by taking a quick look at where agile started and what it has become today.</p>
<h2 id="where-agile-began">Where agile began</h2>
<p>I was managing software development projects at <a href="https://en.wikipedia.org/wiki/Viant">Viant</a> in February 2001 when the <a href="http://agilemanifesto.org">Manifesto for Agile Software Development</a> was published. In those days, most software development happened using the lumbering, ultra-heavyweight waterfall methodology. The Manifesto outlined the principles of a radically different approach – far lighter weight, with a far greater emphasis on people and collaboration. The Manifest didn&rsquo;t invent agile, but rather reconciled a number of existing &ldquo;light&rdquo; or &ldquo;lightweight&rdquo; methodologies that came into being as a backlash against waterfall.</p>
<figure>
    <img loading="lazy" src="davidvgoliath.jpg"/> 
</figure>

<p>The Manifesto got our attention, and led to a broad, radical rethinking of the entire software development process, cutting away process overhead and improving the quality of delivery. Agile became a serious, lightweight alternative to the heavyweight incumbent that was waterfall. (If you&rsquo;re interested in more history and perspective on the Manifesto, I enjoyed this <a href="https://www.infoq.com/podcasts/examining-agile-manifesto/">podcast interview of Scott Duncan</a>.)</p>
<h2 id="what-agile-has-become">What agile has become</h2>
<p>20 years have passed, and agile has gone from upstart to incumbent. At its worst, &ldquo;bad agile&rdquo; has become grotesque, bloated like Dune&rsquo;s <a href="https://en.wikipedia.org/wiki/Vladimir_Harkonnen">Baron Vladimir Harkonnen</a>, accreting process overhead, cargo cult rituals, pricey certifications, and legions of gurus to help you Do Agile Right$$. One anecdote I heard recently: an agile expert convinced a company to pay him $2K per head to train every single employee in their technology organization in Scrum. The tech organization had over 50 people, but only a third of those were actually developers. Total cost, well over $100K. Result: a couple of limp two-week sprints followed by total regression to the old process.</p>
<figure>
    <img loading="lazy" src="McMillan_as_Harkonnen-3.jpg"/> 
</figure>

<p>We had a pretty solid dev process at the music app maker I co-founded, <a href="https://www.macstories.net/news/apple-design-awards-2010-winners-announced/">Agile Partners</a>. I guess we fell in the informally agile or influenced-by-agile camp, but it worked – tight, efficient, effective. In recent years when I&rsquo;ve gone out seeking a fresh answer to, &ldquo;What&rsquo;s the best way to do agile these days?&rdquo; it was like I was on a different planet, nothing even vaguely resembled either the Manifesto or the nimble approach we had applied so successfully at Agile Partners. Going by what I found, modern agile seemed to have been hijacked by expert$ and transformed into a monstrosity with many of the same drawbacks of the old waterfall process that early agile was created to overcome.</p>
<p>Not all agile is bad agile. My friends at the Chicago CTO Group are very smart people, and everyone I&rsquo;ve spent time with is practicing some form of agile effectively. I wonder, though, whether agile&rsquo;s accumulated bloat and baggage is forcing these good folks to swim upstream.</p>
<h2 id="shape-up-a-breath-of-fresh-air">Shape Up: a breath of fresh air</h2>
<p>When I caught wind of Shape Up and started to read through the book, I had a flood of reactions – &ldquo;This makes sense!&rdquo; &ldquo;Wow, this is a lot like our process at Agile Partners &hellip;&rdquo; &ldquo;Man, they&rsquo;ve really thought this through &hellip;&rdquo; &ldquo;Whoa, what an interesting approach to that problem &hellip;&rdquo;</p>
<figure>
    <img loading="lazy" src="Colchuck-Late-Morning--1-.jpeg"/> 
</figure>

<p>The Basecamp guys aren&rsquo;t afraid to take a different path than the herd, and many aspects of Shape Up directly confront (or more accurately, ignore) consensus agile practices. If you practice some form of agile software development today, I&rsquo;m convinced that it&rsquo;s very worth putting aside your methodology and process beliefs and read the Shape Up book, cover to cover, with a deeply open mind. When Shape Up follows the road less traveled, there&rsquo;s a smart reason for it. When Shape Up diverges, that&rsquo;s an opportunity to reexamine your current processes, ask yourself, why are we doing it the way we are today?</p>
<h2 id="six-week-dev-cycle-two-week-cool-down">Six-week dev cycle, two-week cool-down</h2>
<p>So let&rsquo;s get right in your face, shall we? Those two-week sprints you&rsquo;re running today? Forgetaboutit. Shape Up uses six-week cycles instead, with a two-week cool down between cycles. They make the point that two weeks is not enough time to get anything meaningful done, and that the overhead of planning sprints every two weeks just isn&rsquo;t worth it. I&rsquo;ve done both, and I side with Shape Up on this one.</p>
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1461896836934-ffe607ba8211?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@bradencollum?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by Braden Collum / Unsplash</a></p>
        </figcaption>
</figure>

<p>In Shape Up, six weeks means six weeks of &ldquo;leave them alone and let them work&rdquo;  uninterrupted time. When the cycle team (typically one designer and one or two programmers) is handed a piece of work, it comes with that commitment from management. No daily standups, no counting hours, no parcelling out bite-sized tasks, no questioning how time is spent.</p>
<p>Cool-down is used, well, to cool down, to breathe, like after a hard workout. But also for planning the next cycle, fixing some bugs, experimenting, whatever.</p>
<h3 id="the-circuit-breaker">The circuit breaker</h3>
<figure>
    <img loading="lazy" src="Four_1_pole_circuit_breakers800.jpg"/> 
</figure>

<p>Dev teams are given a carefully-shaped, de-risked project, and six weeks to build it. In return, the team is expected finish and release the project in that six-week window. This expectation is baked into Shape Up through the <a href="https://basecamp.com/shapeup/2.2-chapter-08#the-circuit-breaker">circuit breaker</a>: when the six weeks are up, if the project hasn&rsquo;t finished and released, the breaker pops, work stops, and this project is over. If there&rsquo;s an appetite for finishing the work, that becomes a new project, and it goes back through same up-front process that any other project does – work-shaping, de-risking, and betting, which we&rsquo;ll look at shortly. Allowing a project to overrun its deadline is almost unheard of.</p>
<h2 id="work-shaping">Work shaping</h2>
<p>Shape Up takes its name from work shaping, and I wouldn&rsquo;t be surprised if the Basecamp guys put more effort into getting this part of the process right than any other. In work shaping, a small, experienced team defines the key elements of the project, at exactly the right level of abstraction, with enough detail that the dev team knows what to build, but not so much that the team is can&rsquo;t exercise its skill and imagination in crafting the solution. <a href="https://basecamp.com/shapeup/1.1-chapter-02"></a></p>
<p><a href="https://basecamp.com/shapeup/1.1-chapter-02"><img loading="lazy" src="/blog/shape-up-your-agile/levels_of_abstraction-bf55d00941aad5a9c895d24dfefcde27572b8cf35d839155839af190f84ed815-1.jpg" type="" alt="levels_of_abstraction-bf55d00941aad5a9c895d24dfefcde27572b8cf35d839155839af190f84ed815-1"  /></a></p>
<h3 id="nailing-the-right-level-of-abstraction">Nailing the right level of abstraction</h3>
<p>I love Shape Up&rsquo;s level-of-abstraction principles:</p>
<ul>
<li><a href="https://basecamp.com/shapeup/1.1-chapter-02#wireframes-are-too-concrete">Wireframes are too concrete</a></li>
<li><a href="https://basecamp.com/shapeup/1.1-chapter-02#words-are-too-abstract">Words are too abstract</a></li>
</ul>
<p>I&rsquo;m a word guy personally, perhaps because I&rsquo;m too short of design genes to even do a decent wireframe. But I&rsquo;ve been burned over and over by trying to define a piece of work using just words; the team just can&rsquo;t visualize it. And I&rsquo;ve certainly experienced too concrete as well, when wireframes were part of the project spec, pre-defining the solution and excluding all the great ideas the team might have come up with if they hadn&rsquo;t been over-constrained. I never did figure out a good system for creating specs with the right abstraction level; kudos to the Basecamp guys for pulling this off.</p>
<p>Nailing the right level of abstraction in the project definition reinforces an idea we introduced earlier: Shape Up dev teams are autonomous, fully responsible for creating the solution, and the project spec supports this.</p>
<h3 id="properties-of-shaped-work">Properties of shaped work</h3>
<figure>
    <img loading="lazy" src="wood-shaping-tools_3.png"/> 
</figure>

<p>Besides the right level of abstraction, shaped work has a few other key characteristics:</p>
<ol>
<li><a href="https://basecamp.com/shapeup/1.1-chapter-02#property-1-its-rough">It&rsquo;s rough.</a> When you look at a shaped project spec (or &ldquo;pitch&rdquo;), it&rsquo;s obvious that it&rsquo;s unfinished. <a href="https://basecamp.com/shapeup/1.1-chapter-02#property-1-its-rough">&ldquo;Work that&rsquo;s too fine, too early commits everyone to the wrong details.&rdquo;</a></li>
<li><a href="https://basecamp.com/shapeup/1.1-chapter-02#property-2-its-solved">It&rsquo;s solved.</a> The shaping team, a small and very senior group, has put a lot of thought into how this thing works. All the pieces are there, and they connect properly.</li>
<li><a href="https://basecamp.com/shapeup/1.1-chapter-02#property-3-its-bounded">It&rsquo;s bounded.</a> Shapers have likewise thought carefully about where not to go, &ldquo;there be monsters&rdquo; regions likely to trip up the dev team and derail the cycle.</li>
</ol>
<p>Note that the shaping team is separate from the dev team(s), and that shaping happens in a completely separate, parallel track from the dev teams&rsquo; building track.</p>
<h3 id="estimating-vs-appetite">Estimating vs. appetite</h3>
<p>I&rsquo;ve talked to lots of CTOs and engineering leads in the past year, and estimating is a sore spot, often turned into an open wound by an overly-rapid sprint cycle. A lot of bandwidth gets poured into agile estimating, with many people using <a href="https://www.atlassian.com/agile/project-management/estimation">Story Points</a> as opposed to trying to estimate effort directly. Anecdotally Story Points seems to work better, if not very well. Personally, Story Points set off my Voodoo Science alarm.</p>
<p>Shape Up&rsquo;s approach to the estimating problem is jujitsu – turn the problem on its head – through the idea of appetites.</p>
<p>Every piece of work starts with a raw idea, and with a raw idea in hand, our first step here is to &ldquo;set the appetite&rdquo;: how much of an investment is this idea worth? Is it worth a couple of team weeks (what Shape Up calls a Small Batch)? A whole six-week cycle (a Big Batch)? As the book says,</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/1.2-chapter-03#fixed-time-variable-scope">An appetite is completely different from an estimate. Estimates start with a design and end with a number. Appetites start with a number and end with a design.</a></p>
</blockquote>
<figure>
    <img loading="lazy" src="kicking-the-can.jpg"
         alt="Story Points: the process"/> <figcaption>
            <p>Story Points: the process</p>
        </figcaption>
</figure>

<p>So where an estimate is fixed scope, variable time, an appetite is fixed time, variable scope. Thus appetite (scope) becomes the key constraint that we have to work against as we create our design for this work. It empowers us to make smart trade-offs, both during the shaping process and when building. And unlike Story Points, which to some degree just kick the estimate can down the road to be dealt with later, appetite means we are dealing the scope vs time tension from the very beginning.</p>
<h3 id="what-is-this-thing-sketching-the-elements">What is this thing? Sketching the elements</h3>
<p>So, we have a raw idea that we like enough to spend more time shaping; and we&rsquo;ve established our appetite or scope, say a Big Batch. Now it&rsquo;s time to circle back to having the right level of abstraction, more abstract and less defined than wireframes, but less abstract than naked words. Here Shape Up introduces two tools that help us spec elements at the right level.</p>
<p><strong>Breadboarding</strong> is something electrical engineers do when they want to wire together an early circuit prototype, without the extra work of laying out a PCB or even soldering.</p>
<figure>
    <img loading="lazy" src="/images/2020/04/breadboard-hole-leads-1.jpg"/> 
</figure>

<p>Shape Up breadboards are the same idea applied to software, giving us a fast way to &ldquo;wire up&rdquo; affordances, actionable elements like buttons and fields, with places, like screens or dialogs. Here&rsquo;s an example breadboard diagram from the Shape Up book for an invoice autopay feature – note how nicely this fits between overly-abstract words and over-detailed wireframes:</p>
<p><a href="https://basecamp.com/shapeup/1.3-chapter-04#breadboarding"><img loading="lazy" src="/blog/shape-up-your-agile/breadboard.png" type="" alt="Breadboard"  /></a></p>
<p><strong>Fat marker sketches</strong> fit the bill when we need to get visual but need to make sure we don&rsquo;t go overboard and overconstrain by creating a wireframe or high-res mockup. Shape Up defines these as &ldquo;<a href="https://basecamp.com/shapeup/1.3-chapter-04#fat-marker-sketches">a sketch made with such broad strokes that adding detail is difficult or impossible</a>.&rdquo; Here&rsquo;s a grouped-list example from the book:</p>
<p><a href="https://basecamp.com/shapeup/1.3-chapter-04#fat-marker-sketches"><img loading="lazy" src="/blog/shape-up-your-agile/fat_marker.png" type="" alt="fat_marker"  /></a></p>
<p>Shape Up sketches were originally drawn with Sharpies, but these days are often created on iPads equipped with Apple Pencils.</p>
<h3 id="de-risking">De-risking</h3>
<p>As mentioned earlier, shaped worked is bounded. Once we&rsquo;ve sketched out the elements of the solution, it&rsquo;s time to look for trouble, for things that could derail the cycle and cause &ldquo;failure to ship.&rdquo; The Basecamp guys again bring a lot of discipline to this part of the process, identifying four tools for de-risking:</p>
<ol>
<li><a href="https://basecamp.com/shapeup/1.4-chapter-05#look-for-rabbit-holes">Looking for rabbit holes</a>, where we slow way down and look carefully for what we might gave missed in what we&rsquo;ve sketched out, and the patch the hole.</li>
<li><a href="https://basecamp.com/shapeup/1.4-chapter-05#declare-out-of-bounds">Declaring out of bounds</a>, where we identify any parts of the solution that are ripe for an overly-complex implementation, and make clear such an implemntation is out of bounds.</li>
<li><a href="https://basecamp.com/shapeup/1.4-chapter-05#cut-back">Cutting back</a>, a general philosophy of Shape Up: look for parts of our solution that we got excited about during sketching but which really aren&rsquo;t  necessary. Cut them, perhaps mentioning them as &ldquo;nice to haves.&rdquo;</li>
<li><a href="https://basecamp.com/shapeup/1.4-chapter-05#present-to-technical-experts">Presenting to technical experts</a>, if there are areas the shaping team aren&rsquo;t 100% comfortable with, making it clear that <a href="https://basecamp.com/shapeup/1.4-chapter-05#present-to-technical-experts">&ldquo;we&rsquo;re really hunting for time bombs that might blow up the project.&rdquo;</a></li>
</ol>
<h3 id="package-up-a-pitch">Package up a pitch</h3>
<p>At this point, our work shaping team has picked up a worthy raw idea, determined what appetite we have for it, sketched it out at the right level of abstraction, and addressed potential risks. If the idea was bad or if there wasn&rsquo;t an acceptable solution given our appetite, the idea would have been dropped.</p>
<p>So if the idea has survived to this point, we have a winner, right? Not yet. What we have is a viable idea: one with a solution that&rsquo;s doable within the constraints of our appetite. What we don&rsquo;t know yet is how this idea compares with the other ideas competing for development resources. That&rsquo;s where our next topic, betting, comes into play.</p>
<p>So far, our work has stayed mostly internal to the shaping team, and the idea exists mainly in the minds of this team, supported by a few rough sketches and notes. We need something better when we go outside the team, what Shape Up calls a pitch. The pitch needs to help the outside person, who lacks the deep shared context of the shaping team, to understand what this thing is: &ldquo;<a href="https://basecamp.com/shapeup/1.5-chapter-06#help-them-see-it">help them see it.</a>&rdquo; Don&rsquo;t worry, though, pitches aren&rsquo;t overly elaborate or time-consuming to create; as with all things Shape Up, a pitch is &ldquo;<a href="https://quoteinvestigator.com/2011/05/13/einstein-simple/">as simple as it can be, but not simpler</a>.&rdquo;</p>
<h2 id="betting-instead-of-backlogs">Betting instead of backlogs</h2>
<p>It&rsquo;s time again for Shape Up to drive a stake into the heart of another fundamental agile concept, the centralized backlog.</p>
<p><a href="http://basecamp.com/shapeup/2.1-chapter-07"><img loading="lazy" src="/blog/shape-up-your-agile/intro_cartoon.png" type="" alt="intro_cartoon"  /></a></p>
<p>Here&rsquo;s why:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.1-chapter-07">&ldquo;Backlogs are a big weight we don’t need to carry. Dozens and eventually hundreds of tasks pile up &hellip;. Just because somebody thought some idea was important a quarter ago doesn’t mean we need to keep looking at it again and again.&rdquo;</a></p>
</blockquote>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.1-chapter-07">&ldquo;Backlogs are big time wasters &hellip;. time spent constantly reviewing, grooming and organizing old ideas prevents everyone from moving forward on the timely projects that really matter right now.&rdquo;</a></p>
</blockquote>
<p>What does Shape Up do instead? A betting table, held during the cool-down period between six-week cycles, where a small list of the pitches we just described are presented as possible bets for the upcoming cycle. Most of the pitches will have been developed by the shaping team during the previous six-week cycle, but a few of the pitches might be ones that had been passed over at past betting tables, and revived for another shot this time.</p>
<h3 id="but--but--but--my-lists">But &hellip; but &hellip; but &hellip; my lists!</h3>
<p>At this point, you may be freaking out &hellip; what about my lists? Don&rsquo;t I need lists? Won&rsquo;t we lose things? Shape Up isn&rsquo;t trying to kill lists and tracking things, just the centralized backlog that has to be continually groomed and managed. Decentralized lists are great, keep whatever you need:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.1-chapter-07#decentralized-lists">&ldquo;We don’t have to choose between a burdensome backlog and not remembering anything from the past. Everyone can still track pitches, bugs, requests, or things they want to do independently without a central backlog. Support can keep a list of requests or issues that come up more often than others. Product tracks ideas they hope to be able to shape in a future cycle. Programmers maintain a list of bugs they’d like to fix when they have some time. There’s no one backlog or central list and none of these lists are direct inputs to the betting process.&rdquo;</a></p>
</blockquote>
<p>Still, you might say, if we don&rsquo;t have our centralized master backlog, don&rsquo;t we risk losing some really important ideas? No, says Shape Up, important ideas will keep reemerging:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.1-chapter-07#important-ideas-come-back">&ldquo;Really important ideas will come back to you. When’s the last time you forgot a really great, inspiring idea? And if it’s not that interesting—maybe a bug that customers are running into from time to time—it’ll come back to your attention when a customer complains again or a new customer hits it. If you hear it once and never again, maybe it wasn’t really a problem. And if you keep hearing about it, you’ll be motivated to shape a solution and pitch betting time on it in the next cycle.&rdquo;</a></p>
</blockquote>
<h3 id="the-betting-table">The betting table</h3>
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1517232115160-ff93364542dd?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@kaysha?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by Kay / Unsplash</a></p>
        </figcaption>
</figure>

<p>The betting table is actually a relatively short meeting, likely one or two hours, not necessarily in-person, where a small group of stakeholders choose what gets worked on during the next six-week development cycle. In a smaller company, stakeholders might include the CEO, CTO, and product leadership; in larger companies, whatever level of senior management has 100% decision-making responsibility – it won&rsquo;t work if the person or persons with final say aren&rsquo;t at the table. As the book says,</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.2-chapter-08#the-betting-table">&ldquo;The highest people in the company are there. There’s no “step two” to validate the plan or get approval. And nobody else can jump in afterward to interfere or interrupt the scheduled work. This buy-in from the very top is essential to making the cycles turn properly.&rdquo;</a></p>
</blockquote>
<p>All the work shaping team&rsquo;s efforts – shaping at the right level of abstraction, carefully de-risking, crafting the pitch – pays off at the betting table, putting exactly the right information in the hands of exactly the right decision-makers.</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.2-chapter-08#the-betting-table">&ldquo;The meeting is short, the options well-shaped, and the headcount low. When these criteria are met, the betting table becomes a place to exercise control over the direction of the product instead of a battle for resources or a plead for prioritization.&rdquo;</a></p>
</blockquote>
<p>The betting table is thus a big win for management too:</p>
<blockquote>
<p><a href="https://basecamp.com/shapeup/2.2-chapter-08#the-betting-table">&ldquo;With cycles long enough to make meaningful progress and shaped work that will realistically ship, the betting table gives the C-suite a “hands on the wheel” feeling they haven’t had since the early days.&rdquo;</a></p>
</blockquote>
<p>For more information on the how the betting table meeting works, check out the <a href="https://basecamp.com/shapeup/2.2-chapter-08#questions-to-ask">&ldquo;Questions to ask&rdquo;</a> section in the book.</p>
<h3 id="why-the-emphasis-on-bet">Why the emphasis on &ldquo;bet&rdquo;?</h3>
<figure>
    <img loading="lazy" src="https://images.unsplash.com/photo-1446669052213-5dcff53f1f3f?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ"/> <figcaption>
            <p>
                    <a href="https://unsplash.com/@mparzuchowski?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Photo by Michał Parzuchowski / Unsplash</a></p>
        </figcaption>
</figure>

<p>Shape Up uses the word &ldquo;bet&rdquo; intentionally because the word&rsquo;s implications fit:</p>
<ul>
<li>Bet implies a hoped-for payoff or reward, like an investment. In our case, thinking of green-lighting a project as a bet helps us stay focused on the fact that we are seeking a return on our development investment, as opposed to just filling out schedules with things to do.</li>
<li>A bet represent a commitment. When you lay down your bet at a casino, there are no do-overs. Likewise, when the betting table green-lights a project, that&rsquo;s a commitment that the dev team assigned gets six uninterrupted weeks to create the solution.</li>
</ul>
<h3 id="bets-placed-time-to-build-">Bets placed, time to build &hellip;</h3>
<p>The output of the betting table meeting is assignments for each dev team for the next cycle.</p>
<p>The build phase comes next, and Shape Up serves up an approach to building that&rsquo;s just as counter-consensus and worthy of your suspended-belief consideration as what you&rsquo;ve just read. I especially love scope mapping and hill charts.</p>
<p>I plan a Part 2 to cover the build process in Shape Up, stay tuned. <em>Update: here is Part 2: <a href="../building-with-shape-up">Building with Shape Up</a>.</em></p>
<p>– Jack Ivers</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Day to Remember</title>
      <link>https://craftycto.com/blog/a-day-to-remember/</link>
      <pubDate>Sun, 15 Sep 2019 20:02:00 +0000</pubDate>
      
      <guid>https://craftycto.com/blog/a-day-to-remember/</guid>
      <description>&lt;p&gt;I was in England on business—some sort of software event in London, the details long since faded and obscured. But this day, this day &amp;hellip; the memories surge back, filling out in technicolor as I write and research, a kind of archaeological dig through both memories and the vast web of resources now at my fingertips about the people, places, and things we encountered this day.&lt;/p&gt;
&lt;p&gt;It was early June 1987, and I was fortunate in that my wife was able to make the trip with me. Beth was eight months pregnant with our first child, Jennifer, who expressed pre-natal delight at the novelty of air travel with kicks and backflips. We had only a handful of extra days for sightseeing; just time enough, really, for a single destination.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was in England on business—some sort of software event in London, the details long since faded and obscured. But this day, this day &hellip; the memories surge back, filling out in technicolor as I write and research, a kind of archaeological dig through both memories and the vast web of resources now at my fingertips about the people, places, and things we encountered this day.</p>
<p>It was early June 1987, and I was fortunate in that my wife was able to make the trip with me. Beth was eight months pregnant with our first child, Jennifer, who expressed pre-natal delight at the novelty of air travel with kicks and backflips. We had only a handful of extra days for sightseeing; just time enough, really, for a single destination.</p>
<h2 id="yorkshire--james-herriot">Yorkshire &amp; James Herriot</h2>
<p>That destination wasn&rsquo;t difficult to choose. Beth and I had both fallen in love with Yorkshire second hand, via James Herriot&rsquo;s <a href="http://www.amazon.com/Creatures-Great-Small-James-Herriot/dp/0812415027/ref=tmm_hrd_title_0?ie=UTF8&amp;qid=1431657287&amp;sr=1-3"><em>All Creatures Great and Small</em></a>, which describes the author&rsquo;s life as a country vet in the Yorkshire Dales. Beth asked around and discovered that James Herriot was the pen name of Alf Wight, a working vet who still maintained a surgery in the village of Thirsk up in the moor country of North Yorkshire.  So we set off to explore Yorkshire and find the land of <em>All Creatures Great and Small</em>.</p>
<figure>
    <img loading="lazy" src="James-Herriot-All-Creatures-Great-and-Small.jpg"
         alt="The book and the man"/> <figcaption>
            <p>The book and the man</p>
        </figcaption>
</figure>

<p>We spent a day in southern Yorkshire, thoroughly enjoying the city of York. I had been carefully instructed by a British friend that, while in Yorkshire, I must sample the <a href="https://www.theakstons.co.uk/pages/theakstons-old-peculier">Old Peculier Ale</a>. I was further instructed that under no circumstance should I settle for Old Peculier served in a bottle; I was instead to find a pub that had the beverage on tap direct from the keg. There was a method to this madness: Old Peculier was (and apparently still is) shipped in oak casks, which contribute significantly to its flavor. I followed my directions carefully, located the Spread Eagle Pub, which had among its varied offerings Old Peculier tapped straight from the oaken keg, and gave it a thorough sampling. Without a doubt, this was the best beer I&rsquo;ve ever had, then or since.</p>
<figure>
    <img loading="lazy" src="cooperage-bottom-bg.jpg"
         alt="Theakstons, makers of Old Peculier, are proud of their custom-made casks"/> <figcaption>
            <p>Theakstons, makers of Old Peculier, are proud of their custom-made casks</p>
        </figcaption>
</figure>

<h2 id="thirsk--alf-wight">Thirsk &amp; Alf Wight</h2>
<p>The next morning we headed for Thirsk. We asked around and finally located a sign that announced the veterinary surgery of <a href="http://www.thirsk.org.uk/james-herriot.php">James Alfred Wight, OBE</a>, complete with a vehicle out front containing a pair of muddy, knee-height farm boots, which we of course decided had to be Alf&rsquo;s. We were tempted to knock on the door, but in the end decided not to make tourist fools out of ourselves, figuring that Mr. Wight might not welcome this kind of intrusion on his place of business. We contented ourselves with visiting the bookstore across the street, buying a couple of hardcover editions of the Herriot books &ldquo;from the source&rdquo; so to speak. With our Alf Wight stalking completed, we decided to head out and explore the countryside.</p>
<p>We steered east out of Thirsk on the A170, and before long entered the <a href="http://www.northyorkmoors.org.uk/">North York Moors National Park</a>. Soon <a href="http://www.northyorkmoors.org.uk/visiting/see-and-do/sutton-bank-national-park-centre">Sutton Bank</a> appeared in front of us: a striking, 978&rsquo; tall cliff, fracturing the countryside for miles to the north and south, edging the great plateau that encompasses the North York Moors. As A170 approached the cliff, we began to see warning signs: Dangerous Grade Ahead. And they weren&rsquo;t kidding: the Sutton Bank hill has an incredible 25% grade, with a tight hairpin turn halfway up thrown in for good measure; the locals keep a running count of major accidents on this stretch of road. I was uncomfortable enough driving on flat roads, thanks to the right-seated driving and left-handed manual shifting. Somehow, though, with palms sweating heavily,  I managed to coax the tiny rental to the top of the Bank without ending up over the cliff, Beth sitting beside me white-faced. Once up, the views were stunning, looking out over the vast green checkerboard of the Vales of York and Mowbray. I am reminded of driving the road from San Francisco through the Sierra foothills into Yosemite valley: both drives invoke sheer terror, followed by—assuming one survives—incredible bliss. Both are places I cherish and intend to revisit.</p>
<figure>
    <img loading="lazy" src="sutton_bank.jpg"
         alt="Warning sign for Sutton Bank grade on the A170"/> <figcaption>
            <p>Warning sign for Sutton Bank grade on the A170</p>
        </figcaption>
</figure>

<h2 id="yorkshire-gliding-club">Yorkshire Gliding Club</h2>
<p>Less than a mile past the top of the Sutton Bank grade, the A170 intersects High Town Bank Road and there we noticed a sign: <a href="http://www.ygc.co.uk/">Yorkshire Gliding Club</a>. I had flown gliders during my mid teens; or more accurately, a particular kind of glider: the venerable, forgiving, stodgy <a href="http://en.wikipedia.org/wiki/Schweizer_SGS_2-33">Schweizer 2-33</a> two-seat trainer.</p>
<figure>
    <img loading="lazy" src="2-33.jpg"
         alt="Schweizer 2-33 trainer"/> <figcaption>
            <p>Schweizer 2-33 trainer</p>
        </figcaption>
</figure>

<p>I was curious to see what this Yorkshire club might be like, especially given its location perched on the edge of Sutton Bank. So we followed the signs and ended up at a cluster of buildings: the clubhouse and several aircraft hangars. Off in the distance we could see activity on the grass flying field: people, gliders, a tow plane. Beth and I were debating whether we would be welcomed or chased off if we dared walk onto the field, until I noticed a sign in the window of the clubhouse: &ldquo;Glider Rides, £20.&rdquo; Our concerns immediately evaporated: we were now potential customers rather than trespassers.</p>
<figure>
    <img loading="lazy" src="yorkshire-gliding-club.jpg"
         alt="Sign for the Yorkshire Gliding Club. If memory serves, the sign was different in 1987. © Copyright Pauline E and licensed for reuse under the Creative Commons License"/> <figcaption>
            <p>Sign for the Yorkshire Gliding Club. If memory serves, the sign was different in 1987. © Copyright Pauline E and licensed for reuse under the Creative Commons License</p>
        </figcaption>
</figure>

<p>So we walked out onto the field and I soon realized that the Yorkshire Gliding Club was in a whole different league from the Mansfield, Ohio club where I had learned. Sutton Bank&rsquo;s high cliffs face directly into the prevailing westerly winds, generating fantastic ridge soaring conditions: with even a moderate west wind, glider pilots can soar aloft for hours at a time. The Club&rsquo;s flying machines were as world-class as its location: sleek, glossy white, state-of-the-art craft built of fiberglass, a far cry from the chunky fabric-and-dented-aluminum 2-33 trainers I had cut my teeth on. Still, I assumed that these gorgeous white rocket ships belonged to well-heeled private owners, and that they&rsquo;d wheel out something more like the 2-33 for £20 demo rides.</p>
<h2 id="schleicher-ask-21-oh-my">Schleicher ASK-21, oh my</h2>
<p>When I asked, though, we were directed over to a beautiful white T-tailed two-seater, an ultra-performance <a href="http://www.alexander-schleicher.de/en/flugzeuge/ask-21/">Schleicher ASK-21</a>. Holy shit. At this point, my attitude towards taking a glider ride shifted from &ldquo;toying with the idea&rdquo; to &ldquo;please please please can I take a glider ride please please&rdquo; &hellip;. Now, Beth didn&rsquo;t really share my excitement about the gliders. She loved Yorkshire and Sutton Bank but gliders, not so much. I graciously offered that she could take a ride too, which earned me a glare: as if Beth would want to strap eight-months-pregnant into the front seat of a sailplane. She was fine, though, with me taking a ride. Little did she know.</p>
<figure>
    <img loading="lazy" src="ask21-in-flight.jpg"
         alt="ASK-21 in flight"/> <figcaption>
            <p>ASK-21 in flight</p>
        </figcaption>
</figure>

<p>I paid my £20 and they paired me with a club pilot for my 20-minute ride. We talked a little, I explained that I had a bit of not-so-recent gliding experience, and finally he said something like, &ldquo;Cheerio then, let&rsquo;s get going. There&rsquo;s your parachute; do you know how to put it on?&rdquo;</p>
<h2 id="parachute-">Parachute !?</h2>
<p>I&rsquo;d never worn a parachute before—hell, I&rsquo;d never even seen a parachute close up. Like most normal airplanes, my simple old Schweizer 2-33 trainer didn&rsquo;t require one. The elegant, high-performance ASK-21, on the other hand, was certified for aerobatics, and by U.K. (and U.S.) law, all passengers must wear chutes. So there I was, with my extensively pregnant wife looking on, struggling to fit on a parachute before taking off in a great white shark of an aerobatic glider. Beth was becoming less amused by the moment.</p>
<p>The winds this particular day were not the usual westerlies, but instead blew from the north, meaning we&rsquo;d miss out on the beneficial ridge updrafts off the Sutton Bank cliffs. So it was shaping up as a quick-up, quick-down flight, 20 minutes if we were lucky. I finally got suited up and buckled in to the front seat of the ASK-21, waved to Beth as they lowered the clear canopy, and we were ready for takeoff. Helpers snapped on the tow rope, a 200&rsquo; polypropylene rope that in turn connects to the towplane, a small but muscularly-engined plane engineered for launching gliders. A few hand signals and the towplane began to move, with our helper running along holding our wingtip until we had enough speed to fly the wings. Off we went down the grass strip, the ASK-21 lifting off quickly powered by its huge wing, trailing the towplane in a gradual climb.</p>
<figure>
    <img loading="lazy" src="2021-05-04-20-04-0015.jpeg"
         alt="Found a photo of this actual flight! ASK-21 tail number ESB on landing."/> <figcaption>
            <p>Found a photo of this actual flight! ASK-21 tail number ESB on landing.</p>
        </figcaption>
</figure>

<p>It didn&rsquo;t take long to reach the release height of 2,000 feet. The tow release process is carefully choreographed and well understood by every glider and tow pilot: the glider pilot pulls the release lever, the tow rope pops off with a loud bang, the glider makes a climbing 90 degree to the right, the towplane a descending turn 90 degrees to the left. For us, release should have begun a steady descent back to the field, given the lack of ridge lift and cold temperatures. But almost immediately, we flew into a strong thermal updraft, a column of rising air caused by ground heating, a common phenomenon on hot days but unusual on such a chilly day. There it was, though, and strong: the variometer was showing 3-4 meters/second lift. The pilot circled to stay in the lift column and we were climbing, quickly.</p>
<h2 id="hot-thermal">Hot thermal</h2>
<p>On that particular day, the bases of the cumulus clouds were around 5,000 feet, and the thermal we climbed within stayed unusually strong all the way up. As we came closer and closer to the cloud base, the pilot began to frantically power up the directional gyro required for instrument flight—essential if we were to climb into the base of the cloud, where we&rsquo;d be flying blind. A directional gyro takes several minutes  to spin up and stabilize, though, and we were already starting to penetrate the cloud base. The average life expectancy of non-instrument-rated pilots who fly into clouds has been calculated as 178 seconds; I&rsquo;m guessing that instrument-rated pilots without their instruments don&rsquo;t fare much better. My pilot wisely decided it was time to &ldquo;get out of Dodge.&rdquo; He dove down, out of the cloud and away from the thermal lift.</p>
<figure>
    <img loading="lazy" src="ask21-inst-panel.jpg"
         alt="Vintage ASK-21 instrument panel. Mine would have had a few additional (IFR) instruments."/> <figcaption>
            <p>Vintage ASK-21 instrument panel. Mine would have had a few additional (IFR) instruments.</p>
        </figcaption>
</figure>

<p>So here we were, at almost 5,000 feet altitude, about 15 minutes into a 20-minute ride. How to burn 5,000 feet of altitude in five minutes? The next thing I heard was the pilot asking, &ldquo;Do you like aerobatics?&rdquo; Well, I didn&rsquo;t really know, because the old Schweizer 2-33 definitely didn&rsquo;t do aerobatics, but it sounded like fun, so I answered &ldquo;Sure!&rdquo; Today&rsquo;s older, wiser Jack might have paused to consider the effect these aerobatics might have on his wife, waiting 5,000 feet below and already nervous because her husband—wearing a goddamn parachute—had flown off and almost disappeared into the bottom of a cloud.</p>
<h2 id="aerobatics-">Aerobatics ?!</h2>
<p>He proceeded to point the nose of the ASK-21 at the ground at what felt like a near-vertical angle as I floated weightless, held in place by my seat harness, He let the speed build to the plane&rsquo;s top speed of 151 knots as we hurdled at the ground. At the last second, he pulled back on the stick, and I melted into the seat as he turned speed back into altitude again, pulling up into a near-vertical climb until the glider lost forward speed and entered a stall. He then kicked the rudder hard left to initiate a stall turn, and the great white beast spun 180 degrees until it was again pointing straight down, accelerating to max speed until the next zoom into another vertical pull-up. We must have repeated this exhilarating maneuver three or four times until we burned off our 5,000&rsquo; of excess energy and set up in the landing pattern.</p>
<figure>
    <img loading="lazy" src="ASK-21-Aerobatics.png"
         alt="ASK-21 aerobatics including the Stall Turn, from ASK-21 Flight Manual"/> <figcaption>
            <p>ASK-21 aerobatics including the Stall Turn, from ASK-21 Flight Manual</p>
        </figcaption>
</figure>

<h2 id="poor-beth">Poor Beth</h2>
<p>Now let&rsquo;s take a minute to look again at these events from Beth&rsquo;s perspective. Here she is, eight months pregnant and 3,700 miles away from home. Her fool of a husband has dragged her to a glider port, strapped on a parachute, disappeared into a cloud—and now here he is again, diving towards the ground at 174 MPH, zooming back up, twisting around, hurtling back down, over and over. I have to think that Jennifer was at high risk of being born in Sutton Bank, Yorkshire, UK rather than Cincinnati, Ohio, USA. Amazingly, though, Beth seemed to stay pretty calm through all of this. I stepped from that incredible ASK-21, shrugged out of the parachute harness, and zombie-walked over to her on shaky overexcited legs. Outwardly at least, Beth was the calm one.</p>
<h2 id="grilled-cheese--onion">Grilled cheese &amp; onion</h2>
<p>This magical day delivered one last treat. After the adrenaline rush of the day, we were both exhausted and ravenously hungry, so we pulled into a cozy pub not far down the A170. Here we had a chance to enjoy a classic of pub cuisine: the Grilled Cheese &amp; Onion sandwich.  It&rsquo;s basically a grilled cheese with a thin slice of caramelized onion cooked right in the middle of the melted cheese. Amazingly tasty and the ultimate adrenaline antidote.</p>
<figure>
    <img loading="lazy" src="drunken_grilled_cheese_sandwich_on_cutting_board.jpg"
         alt="Grilled Cheese &amp; Onion. Photo from http://ohmyveggies.com/"/> <figcaption>
            <p>Grilled Cheese &amp; Onion. Photo from <a href="http://ohmyveggies.com/">http://ohmyveggies.com/</a></p>
        </figcaption>
</figure>

<p>So ended the Day to Remember. Or at least my memory of it. Writing this, I feel a strong yearning to return to the Yorkshire Dales.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
