<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI &#8211; About Things | A Hans Scharler Blog</title>
	<atom:link href="https://nothans.com/category/ai/feed" rel="self" type="application/rss+xml" />
	<link>https://nothans.com</link>
	<description>Life, Comedy, Games, Tech, Marketing, and Community</description>
	<lastBuildDate>Sun, 27 Sep 2026 15:26:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/cropped-settings.png?fit=32%2C32&#038;ssl=1</url>
	<title>AI &#8211; About Things | A Hans Scharler Blog</title>
	<link>https://nothans.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">114568856</site>	<item>
		<title>DFS Fantasy Football Optimization (Agentic AI + MATLAB Optimization Toolbox)</title>
		<link>https://nothans.com/dfs-fantasy-football-optimization-agentic-ai-matlab-optimization-toolbox</link>
					<comments>https://nothans.com/dfs-fantasy-football-optimization-agentic-ai-matlab-optimization-toolbox#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sun, 27 Sep 2026 15:26:13 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[fantasy football]]></category>
		<category><![CDATA[matlab]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5732</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Four seasons ago I wrote a post about <a href="https://nothans.com/win-at-dfs-by-optimizing-your-fantasy-football-lineups">winning (or doing better) at daily fantasy football with MATLAB</a>. The pitch was simple: DFS is an optimization problem wearing a jersey, so let the Optimization Toolbox pick your lineup. Sixty lines of MATLAB, one salary cap, one answer.</p>



<p class="wp-block-paragraph">That post still works, and the script still runs. But it taught the wrong objective for half the contests people play. And it assumed the person running it was you, pasting code into a Live Script. Both of those changed, so I rebuilt the thing.</p>



<p class="wp-block-paragraph">The repo is the same one: <a href="https://github.com/nothans/dfs-optimizer">github.com/nothans/dfs-optimizer</a>. It now has a function library, an app for exploring the options, a test suite, and a section for coding agents. In 2026 the &#8220;user&#8221; of a tool like this is as likely to be Claude Code or OpenAI Codex with a MATLAB session open as it is to be a human with a mouse. This post is the new tutorial.</p>



<h2 id="what-the-2022-script-got-right-and-what-it-got-wrong" class="wp-block-heading">What the 2022 script got right, and what it got wrong</h2>



<p class="wp-block-paragraph">The 2022 model was one binary variable per player and a handful of linear constraints: one QB, one defense, two to three running backs, three to four receivers, one to two tight ends, nine players total, salary under the cap. Maximize projected points. That is still the core, and the new code returns the identical lineup on the same data. There is a test that proves it.</p>



<p class="wp-block-paragraph">What it got wrong is subtler. &#8220;Maximize projected points&#8221; is the correct objective for a <strong>cash game</strong>, a 50/50 or a double-up, where you&#8217;re paid if you finish in the top half. You want the highest floor, and the highest projection is a decent proxy.</p>



<p class="wp-block-paragraph">It&#8217;s the wrong objective for a <strong>tournament</strong> (a GPP, guaranteed prize pool), where a few thousand entries compete for a top-heavy payout and the winner needs a top-1% finish. In a tournament, the highest-projected lineup is the lineup everyone else has too. You want ceiling and you want to be different. That means correlated players (a QB and his receiver score on the same plays), lower-owned players (so a hit separates you from the field), and more than one lineup.</p>



<h2 id="get-the-data" class="wp-block-heading">Get the data</h2>



<p class="wp-block-paragraph">The projections still come from <a href="https://www.dailyfantasyfuel.com/nfl/projections/">Daily Fantasy Fuel</a>. Pick the DraftKings or FanDuel tab, clear any filters, let the whole table load, then click <strong>Download CSV</strong> and save the file. The button exports the rows on screen, so a filtered view gives you a filtered file. The header looks like this:</p>



<pre class="wp-block-code"><code>first_name, last_name, position, injury_status, week, game_date, slate, team, opp,
spread, over_under, implied_team_score, salary, L5_dvp_rank, L5_fppg_avg,
L10_fppg_avg, szn_fppg_avg, ppg_projection, value_projection, ownership_projection</code></pre>



<p class="wp-block-paragraph">That last column matters. Projected ownership is what makes the tournament levers work, and the 2022 post ignored it.</p>



<p class="wp-block-paragraph">You don&#8217;t need to import the file by hand anymore. The loader reads it directly, drops anyone marked out, and keeps every original column:</p>



<pre class="wp-block-code"><code>players = dfs.loadProjections("DFF_NFL_cheatsheet.csv");</code></pre>



<p class="wp-block-paragraph">If you don&#8217;t have a download handy, the repo ships a synthetic 13-game slate in the same header, with made-up names, so every example below runs as-is, and you&#8217;ll meet a few of those names again before this is over.</p>



<h2 id="the-app-in-five-clicks" class="wp-block-heading">The app, in five clicks</h2>



<p class="wp-block-paragraph">Open MATLAB in the repo folder (or click the <strong>Open in MATLAB Online</strong> badge on the README) and run:</p>



<pre class="wp-block-code"><code>DFSOptimizerApp</code></pre>



<p class="wp-block-paragraph">It opens on the sample slate. Levers on the left, results on the right.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="750" height="469" data-attachment-id="5725" data-permalink="https://nothans.com/01-app-opens-on-sample-slate" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="01-app-opens-on-sample-slate" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5725" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/01-app-opens-on-sample-slate.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph"><strong>Click one: the Cash game preset, then Optimize.</strong> This is the 2022 script with a face. One lineup, maximum projection, no stacking, ownership ignored. On the sample slate it lands at 176.4 projected points and a summed ownership of 192%, which is a polite way of saying &#8220;everyone has these players.&#8221;</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" decoding="async" width="750" height="469" data-attachment-id="5726" data-permalink="https://nothans.com/02-cash-lineup" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="02-cash-lineup" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5726" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/02-cash-lineup.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph"><strong>Click two: the Tournament preset, then Optimize.</strong> Now the sidebar asks for a QB stack (one receiver or tight end from the QB&#8217;s own team), a bring-back (one skill player from the opponent), and no defense against your own QB. It also wants a small penalty on projected ownership and twenty lineups, where nobody appears in more than half and every pair differs by at least three players. A progress bar counts them off, about a quarter second each.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" decoding="async" width="750" height="469" data-attachment-id="5727" data-permalink="https://nothans.com/03-gpp-portfolio" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="03-gpp-portfolio" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5727" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/03-gpp-portfolio.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph">Click any row to see the roster. The summed ownership drops into the 70 to 150 range and the QB column shows the portfolio spreading across three or four quarterbacks instead of one.</p>



<p class="wp-block-paragraph"><strong>Click three: lock and exclude.</strong> The Player pool tab is the whole slate with two checkbox columns. Tick <strong>Lock</strong> on a player you believe in and <strong>Exclude</strong> on one you don&#8217;t, and every solve from then on honors it.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="469" data-attachment-id="5728" data-permalink="https://nothans.com/04-lock-and-exclude" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="04-lock-and-exclude" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude-1024x640.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5728" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/04-lock-and-exclude.png?w=1280&amp;ssl=1 1280w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph"><strong>Click four: Exposure.</strong> This is the chart I wanted in 2022 and didn&#8217;t have. Your exposure per player across the twenty lineups, next to the field&#8217;s projected ownership. The gap is leverage. A player you have at 40% who the field has at 2% is where a tournament gets won or lost.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="469" data-attachment-id="5729" data-permalink="https://nothans.com/05-exposure-vs-field" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="05-exposure-vs-field" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5729" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/05-exposure-vs-field.png?w=1280&amp;ssl=1 1280w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph"><strong>Click five: Simulate.</strong> A projection is a mean, not a promise. The Monte Carlo tab draws fifty (or five hundred) noisy versions of the projections, re-solves the lineup for each one, and counts who made it. A player who&#8217;s optimal in 60% of the draws is a play. A player who&#8217;s optimal only at the exact point estimate is a coin flip with a good agent.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="469" data-attachment-id="5730" data-permalink="https://nothans.com/06-monte-carlo" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?fit=1280%2C800&amp;ssl=1" data-orig-size="1280,800" data-comments-opened="0" data-image-title="06-monte-carlo" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?fit=750%2C469&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?resize=750%2C469&#038;ssl=1" alt="" class="wp-image-5730" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?resize=1024%2C640&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?resize=750%2C469&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/06-monte-carlo.png?w=1280&amp;ssl=1 1280w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph">There&#8217;s a sixth button, <strong>Copy as code</strong>, and it&#8217;s the one I use most. It writes your current sidebar as a function call and puts it on the clipboard, so a session in the app turns into a script you can rerun next week:</p>



<pre class="wp-block-code"><code>players = dfs.loadProjections("data/sample_DFF_NFL.csv");
&#91;lineups, summary, exposure] = dfs.generateLineups(players, 20, ...
    Site="DraftKings", SalaryCap=50000, OwnershipWeight=0.05, StackSize=1, BringBack=1, ...
    AvoidQBvsDST=true, MaxExposure=0.5, MinUnique=3, Randomness=0.1, Seed=1);</code></pre>



<h2 id="the-levers-one-constraint-each" class="wp-block-heading">The levers, one constraint each</h2>



<p class="wp-block-paragraph">The app is a thin layer over a package called <code>+dfs</code>, and every lever is a name-value option on <code>dfs.optimizeLineup</code>. Each one is a single linear constraint on the same binary variables the 2022 script used. Plain words first, then the code, lever by lever.</p>



<p class="wp-block-paragraph"><strong>Stack.</strong> For every quarterback in the pool, &#8220;the number of his own receivers and tight ends you pick is at least k times whether you picked him.&#8221; When you don&#8217;t pick him the right side is zero and the constraint sleeps. When you do, it demands k partners. No big-M tricks, one row per QB.</p>



<pre class="wp-block-code"><code>L = dfs.optimizeLineup(players, StackSize=2);</code></pre>



<p class="wp-block-paragraph"><strong>Bring-back.</strong> The same shape, aimed at the opponent&#8217;s skill players. It bets on a shootout.</p>



<pre class="wp-block-code"><code>L = dfs.optimizeLineup(players, StackSize=1, BringBack=1);</code></pre>



<p class="wp-block-paragraph"><strong>No QB against your own defense.</strong> A pairwise exclusion: QB plus the opposing defense is at most one. Your defense scores when his offense fails. Do not root against yourself.</p>



<pre class="wp-block-code"><code>L = dfs.optimizeLineup(players, AvoidQBvsDST=true);</code></pre>



<p class="wp-block-paragraph"><strong>Ownership penalty.</strong> Instead of maximizing projection, maximize projection minus lambda times projected ownership. On the sample slate, a lambda of 0.05 with a two-man game stack gives up 3.8 points and sheds 23 points of summed ownership.</p>



<pre class="wp-block-code"><code>&#91;L, info] = dfs.optimizeLineup(players, OwnershipWeight=0.05);</code></pre>



<p class="wp-block-paragraph"><strong>Exposure and uniqueness.</strong> When you build twenty lineups in a row, each new solve gets two extra rules: players at their exposure cap sit out, and &#8220;the overlap with every earlier lineup is at most nine minus u players.&#8221;</p>



<pre class="wp-block-code"><code>&#91;lineups, summary, exposure] = dfs.generateLineups(players, 20, MaxExposure=0.4, MinUnique=3);</code></pre>



<p class="wp-block-paragraph"><strong>FanDuel.</strong> Different cap, a four-per-team limit, three-team minimum. One word.</p>



<pre class="wp-block-code"><code>L = dfs.optimizeLineup(players, Site="FanDuel");</code></pre>



<p class="wp-block-paragraph">If you like your math in one block, this is the whole model:</p>



<pre class="wp-block-code"><code>maximize    sum_i (p_i - lambda * o_i) x_i
subject to  sum_i x_i = 9
            1 QB, 1 DST, 2-3 RB, 3-4 WR, 1-2 TE
            sum_i s_i x_i &lt;= cap
            players from at least 2 games            (DraftKings)
            at most 4 per team, at least 3 teams     (FanDuel)
            partners of QB q  &gt;= k * x_q             (stack)
            opponents of QB q &gt;= b * x_q             (bring-back)
            x_q + DST facing q &lt;= 1                  (no QB vs DST)
            overlap with earlier lineup &lt;= 9 - u     (uniqueness)
            x_i in {0, 1}</code></pre>



<p class="wp-block-paragraph">The FLEX spot isn&#8217;t a variable. It&#8217;s the slack between each position&#8217;s base count and its maximum, pinned by the total of nine. That trick was in the 2022 script and it&#8217;s still the reason the model stays at one variable per player.</p>



<p class="wp-block-paragraph">The academic version, stacking constraints included, is Hunter, Vielma and Zaman&#8217;s <a href="https://arxiv.org/abs/1604.01455">&#8220;Picking Winners in Daily Fantasy Sports Using Integer Programming&#8221;</a> from MIT. The levers above are the practical subset every serious optimizer ends up with.</p>



<h2 id="trust-then-verify" class="wp-block-heading">Trust, then verify</h2>



<p class="wp-block-paragraph">Two things happen after every solve, and both are new.</p>



<p class="wp-block-paragraph">First, the code checks the solver&#8217;s exit flag and refuses to hand you a lineup the solver didn&#8217;t actually finish. Second, the lineup goes through <code>dfs.validateLineup</code>, a function that knows nothing about the solver. It counts positions, adds salary, checks the games and teams, and complains in plain English if anything is off. If the solver and the validator ever disagree, you get an error, not a lineup.</p>



<p class="wp-block-paragraph">There are 22 tests. The one I care about most feeds the same slate to the 2022 formulation and the new one and asserts they return the same players and the same 176.4 points. The model got a lot of new rules, but the old answer didn&#8217;t move.</p>



<h2 id="the-other-user-a-coding-agent" class="wp-block-heading">The other user: a coding agent</h2>



<p class="wp-block-paragraph">MathWorks ships the <a href="https://github.com/matlab/matlab-agentic-toolkit">MATLAB Agentic Toolkit</a>. It does two things. It installs the MATLAB MCP Server, which gives a coding agent (Claude Code, GitHub Copilot, Codex, Gemini CLI, Amp) a live MATLAB session it can run code in, lint with, and test through. And it installs skills: curated MathWorks knowledge so the agent writes idiomatic MATLAB and stops inventing toolbox functions.</p>



<p class="wp-block-paragraph">I used two of those skills to build the refresh. <code>matlab-solve-optimization</code> is where &#8220;check the exit flag, then validate independently&#8221; comes from. <code>matlab-build-app</code> is where the app&#8217;s layout comes from (it calls the sidebar-plus-display shape an Explorer, and it&#8217;s right). The skills read like design documents from someone who has built a lot of MATLAB apps and solved a lot of optimization problems, which is what they are.</p>



<p class="wp-block-paragraph">Setting it up takes three steps:</p>



<ol class="wp-block-list">
<li>Download <a href="https://github.com/matlab/simulink-agentic-toolkit/releases/latest/download/agenticToolkitInstaller.mltbx">agenticToolkitInstaller.mltbx</a>, open it in MATLAB, and run <code>setupAgenticToolkit("install")</code>. Pick the skill groups you want; for this repo that&#8217;s Math and Optimization, MATLAB App Building, and MATLAB Core. (The installer is shared with the Simulink Agentic Toolkit, which is why the download lives in that repo&#8217;s releases.)</li>



<li>In MATLAB, run <code>shareMATLABSession()</code> so the agent works in the session you can see.</li>



<li>Open the repo in your agent. There&#8217;s an <code>AGENTS.md</code> (and a <code>CLAUDE.md</code> for Claude Code) that gives it the map, the rules for changes, and prompts that work.</li>
</ol>



<p class="wp-block-paragraph">Then you stop clicking and start asking. This is a real exchange from my session, with the agent driving MATLAB through the MCP server:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Me:</strong> Load the sample slate, build 20 DraftKings tournament lineups with a 2-man stack, 40% max exposure and 3 unique players per pair, and tell me the five players where my exposure is furthest above projected ownership.</p>



<p class="wp-block-paragraph"><strong>Agent:</strong> Built 20 lineups (164.2 to 173.1 projected points, summed ownership 106% to 187%). Your biggest leverage plays:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Name</th><th>Pos</th><th>Team</th><th>Exposure</th><th>Field</th><th>Leverage</th></tr></thead><tbody><tr><td>Nico Ironwood</td><td>WR</td><td>IND</td><td>40%</td><td>1.7%</td><td>+38.3</td></tr><tr><td>Cameron Quillon</td><td>WR</td><td>DEN</td><td>40%</td><td>7.5%</td><td>+32.5</td></tr><tr><td>Gideon Okafor</td><td>WR</td><td>LAR</td><td>40%</td><td>7.7%</td><td>+32.3</td></tr><tr><td>Elliot Ashcombe</td><td>TE</td><td>MIA</td><td>40%</td><td>8.7%</td><td>+31.3</td></tr><tr><td>Xavi Fenwick</td><td>WR</td><td>NO</td><td>40%</td><td>11.7%</td><td>+28.3</td></tr></tbody></table></figure>
</blockquote>



<p class="wp-block-paragraph">The names are fake because the slate is synthetic. The workflow isn&#8217;t. The agent called <code>dfs.generateLineups</code>, sorted the exposure table by leverage, and showed me the top five. Then I asked it to add a rule I had been meaning to write for a year (cap the players from any one game), and it added the constraint, a validator clause, and a test, ran the suite, and reported 23 of 23.</p>



<p class="wp-block-paragraph">The README&#8217;s &#8220;getting started&#8221; section used to be steps for a person. Now the useful section is a list of prompts, each of which is a claim the agent can check by running the code.</p>



<h2 id="the-caveats-because-its-still-football" class="wp-block-heading">The caveats, because it&#8217;s still football</h2>



<p class="wp-block-paragraph">Projections are still projections. The optimizer is only as good as the numbers you feed it, and the numbers are a mean over a game that hasn&#8217;t happened.</p>



<p class="wp-block-paragraph">The Monte Carlo view uses per-position volatility guesses (quarterbacks are steadier than tight ends, defenses are chaos) that I picked, not measured. They&#8217;re labeled as working values in the code. Replace them with your own standard deviations if you have them; the simulator will use a <code>StdDev</code> column if it finds one.</p>



<p class="wp-block-paragraph">The stacking wisdom is what the DFS sites and the MIT paper agree on, but the correlation numbers you see quoted around the internet are site-reported, not something I verified. Treat the levers as structure, not as guarantees.</p>



<p class="wp-block-paragraph">And the sample slate&#8217;s players don&#8217;t exist. Please do not roster Nico Ironwood.</p>



<h2 id="go-build-one" class="wp-block-heading">Go build one</h2>



<p class="wp-block-paragraph">The code is MIT-licensed at <a href="https://github.com/nothans/dfs-optimizer">github.com/nothans/dfs-optimizer</a> and on <a href="https://www.mathworks.com/matlabcentral/fileexchange/117835-dfs-fantasy-football-lineup-optimizer">MATLAB File Exchange</a>. The <a href="https://nothans.com/win-at-dfs-by-optimizing-your-fantasy-football-lineups">2022 post</a> is still there if you want to optimize a lineup.</p>



<p class="wp-block-paragraph">Download a slate, run the Tournament preset, look at the exposure chart, and then argue with it. Let me know what your lineup looked like, and send a pull request if you teach it a new trick.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/dfs-fantasy-football-optimization-agentic-ai-matlab-optimization-toolbox/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5732</post-id>	</item>
		<item>
		<title>My Name is Jev: Meet the New Type of AI Model</title>
		<link>https://nothans.com/my-name-is-jev-meet-the-new-type-of-ai-model</link>
					<comments>https://nothans.com/my-name-is-jev-meet-the-new-type-of-ai-model#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Thu, 24 Sep 2026 11:53:07 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[classifier]]></category>
		<category><![CDATA[Jev]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5717</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This week I asked an AI model 1,140 questions. It answered all of them in 2.3 seconds. The bill was two and a half cents.</p>



<p class="wp-block-paragraph">It did not write a single word back.</p>



<p class="wp-block-paragraph">That&#8217;s Jev, and I think it&#8217;s one of the more interesting models to show up this year.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="512" height="512" data-attachment-id="5718" data-permalink="https://nothans.com/my-name-is-jev-meet-the-new-type-of-ai-model/image-150" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?fit=512%2C512&amp;ssl=1" data-orig-size="512,512" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?fit=512%2C512&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?resize=512%2C512&#038;ssl=1" alt="A &quot;My name is Jeff&quot; meme that reads &quot;My name is Jev&quot;" class="wp-image-5718" style="width:402px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?w=512&amp;ssl=1 512w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image-1.png?resize=300%2C300&amp;ssl=1 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>
</div>


<p class="wp-block-paragraph">Yes, I made the meme. Jev couldn&#8217;t say that line if it tried. You&#8217;d have to ask it a yes/no question.</p>



<h2 id="what-jev-is" class="wp-block-heading">What Jev is</h2>



<p class="wp-block-paragraph">Jev comes from TypeSafe, a San Francisco lab that came out of stealth on September 15. OpenRouter added it three days later as <code>typesafe/jev-1.13</code>, so if you have an OpenRouter key, you already have Jev.</p>



<p class="wp-block-paragraph">Every frontier lab has spent the last two years teaching models to think longer. TypeSafe went the other way. Jev reads whatever you hand it and answers one of three kinds of question, using only the options you give it.</p>



<ul class="wp-block-list">
<li><strong>Noul:</strong> yes or no, as a probability.</li>



<li><strong>Choice:</strong> pick one of up to 255 options you describe.</li>



<li><strong>Score:</strong> place it on a scale you define, &#8220;Can wait&#8221; to &#8220;Blocking revenue right now.&#8221;</li>
</ul>



<p class="wp-block-paragraph">Every answer comes back with probabilities. No prose to parse, no JSON that&#8217;s almost JSON, no invented option. It&#8217;s an if-statement that understands English.</p>



<p class="wp-block-paragraph">It&#8217;s also cheap: $0.042 per million input tokens, and output is free. My first call, three questions about one support ticket, came back in 0.6 seconds and cost $0.000017.</p>



<h2 id="where-it-fits" class="wp-block-heading">Where it fits</h2>



<p class="wp-block-paragraph">Most decisions inside software aren&#8217;t essays. They&#8217;re &#8220;which team gets this ticket,&#8221; &#8220;is this safe to run,&#8221; &#8220;is this spam,&#8221; &#8220;which of these 40 things matters.&#8221; We&#8217;ve been paying a chatbot to write a paragraph so we could regex one word out of it.</p>



<ul class="wp-block-list">
<li><strong>Routing and triage.</strong> Tickets, emails, alerts, pull requests. Pick the queue, score the urgency.</li>



<li><strong>Gating agents.</strong> Before an agent issues a refund or runs a command, ask three yes/no questions. At 0.9 or higher, go. At 0.1 or lower, stop. In between, a human looks. OpenRouter published exactly this recipe.</li>



<li><strong>Checking an LLM&#8217;s homework.</strong> Did the answer stick to the source, or make something up? Ship the supported ones, escalate the rest.</li>



<li><strong>Sorting big piles.</strong> Thousands of documents, one question each, ranked by probability.</li>



<li><strong>Picking instead of writing.</strong> Pull the candidate dates or amounts out with a regex, then let Jev choose the right one.</li>
</ul>



<p class="wp-block-paragraph">The probabilities are the part I didn&#8217;t expect to love. When the model is unsure, it says so, and you fix things by moving a threshold, not rewriting a prompt.</p>



<h2 id="what-i-built-with-it" class="wp-block-heading">What I built with it</h2>



<p class="wp-block-paragraph">My research repo has 1,140 items in it: voice briefs, news digests, insights, bets, trend signals, blog drafts. I built a thing called Sieve that asks Jev the same question about every one of them and ranks the answers. &#8220;Talk-ready.&#8221; &#8220;Evidence against my community thesis.&#8221; &#8220;Feeds chapter two of the book.&#8221; &#8220;A hands-on build that could be demoed live at a developer meetup.&#8221; (My CABLE 82 talk came back first, at 95%. Correct.)</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="538" data-attachment-id="5722" data-permalink="https://nothans.com/sieve-ask" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?fit=1200%2C860&amp;ssl=1" data-orig-size="1200,860" data-comments-opened="0" data-image-title="sieve-ask" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?fit=750%2C538&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?resize=750%2C538&#038;ssl=1" alt="" class="wp-image-5722" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?resize=1024%2C734&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?resize=300%2C215&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?resize=768%2C550&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?resize=750%2C538&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-ask.png?w=1200&amp;ssl=1 1200w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph">Then I checked it against my own filing. I&#8217;d already sorted every insight and trend signal into swimlanes by hand, so I stripped the labels and asked Jev to do it. Overall it agreed with me about 8 times in 10. When it said it was confident, 9 times in 10. When it was unsure, it was close to a coin flip, and it told me so.</p>



<h2 id="sieve-is-open-source" class="wp-block-heading">Sieve is open source</h2>



<p class="wp-block-paragraph">I split Sieve into the engine and my stuff, and put the engine on GitHub: <a href="https://github.com/nothans/sieve">github.com/nothans/sieve</a>. MIT licensed, just Node, no dependencies. Point it at any folder of Markdown, describe what counts as an item and which questions you care about in one config file, and it sifts the whole pile from the command line or a little web UI. My research notes and my config stay on my machine.</p>



<p class="wp-block-paragraph">It ships with two demos: a made-up research notebook, and all 313 of Aesop&#8217;s fables. Ask the fables for &#8220;a trick that backfires on the trickster&#8221; and it reads every one of them in 1.4 seconds for about a third of a cent.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="538" data-attachment-id="5721" data-permalink="https://nothans.com/sieve-aesop-moral" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?fit=1200%2C860&amp;ssl=1" data-orig-size="1200,860" data-comments-opened="0" data-image-title="sieve-aesop-moral" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?fit=750%2C538&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?resize=750%2C538&#038;ssl=1" alt="" class="wp-image-5721" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?resize=1024%2C734&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?resize=300%2C215&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?resize=768%2C550&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?resize=750%2C538&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/sieve-aesop-moral.png?w=1200&amp;ssl=1 1200w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph">The Moral preset files every fable under its moral. The Dog and the Shadow came back 100% greed, which seems fair to the dog.</p>



<p class="wp-block-paragraph">The repo also carries the Jev command-line tool on its own, so any script or agent can grab a typed answer when it needs one.</p>



<h2 id="what-tripped-me-up" class="wp-block-heading">What tripped me up</h2>



<p class="wp-block-paragraph">Jev reads literally. Really literally. &#8220;Projects I could demo live on stage&#8221; ranked a Google product launch first, because Jev has no idea who &#8220;I&#8221; is. &#8220;Is this evidence against my thesis&#8221; came back as a shrug on everything. Asking for the concrete thing instead (&#8220;does this report a community that did fine without human trust?&#8221;) fixed it. TypeSafe documents all of this: no math, no counting, no date comparisons, and adversarial text can push it around. It also can&#8217;t tell you <em>why</em>, so you get a number and no reason.</p>



<p class="wp-block-paragraph">The idea is already loose, too. Six open-source clones showed up within about 48 hours, at least one of them running on a single gaming GPU. What got copied is the shape: state in, typed questions in, probabilities out. I think that shape sticks around, whoever ends up serving it.</p>



<h2 id="creative-uses-i-want-to-try" class="wp-block-heading">Creative uses I want to try</h2>



<ul class="wp-block-list">
<li><strong>Board game bots.</strong> A playtest bot that picks its move from the legal moves, with a persona written in the question.</li>



<li><strong>A notification bouncer.</strong> One yes/no before anything pings my phone: &#8220;Is this urgent enough to interrupt someone at dinner?&#8221; (Not &#8220;would I want this.&#8221; Jev doesn&#8217;t know who I am.)</li>



<li><strong>CABLE 82 tonight.</strong> Score every headline on &#8220;cozy Friday night viewing&#8221; and let the 1982 cable channel build its own lineup.</li>



<li><strong>Moderation with the thresholds in public.</strong> Every post gets the same small set of typed judgments, and members can see, and vote on, the numbers that decide what happens.</li>



<li><strong>A code review tripwire.</strong> &#8220;Does this diff touch authentication or payments?&#8221; before an agent is allowed to merge.</li>



<li><strong>Alt text that checks itself.</strong> Does this description actually say what the chart shows?</li>



<li><strong>Spreadsheet columns that think.</strong> Add a column called &#8220;urgency,&#8221; type what it means, fill 300 rows in seconds.</li>



<li><strong>Training its own replacement.</strong> Label a big pile of examples with Jev, then train a tiny local model on the labels.</li>
</ul>



<p class="wp-block-paragraph">It&#8217;s the first AI model I&#8217;ve met that&#8217;s better at listening than talking.</p>



<p class="wp-block-paragraph">I know a few people like that. Not many.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/my-name-is-jev-meet-the-new-type-of-ai-model/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5717</post-id>	</item>
		<item>
		<title>Use AI to Help You Create the Fantasy Football League Winning Team Name</title>
		<link>https://nothans.com/use-ai-to-help-you-create-the-fantasy-football-league-winning-team-name</link>
					<comments>https://nothans.com/use-ai-to-help-you-create-the-fantasy-football-league-winning-team-name#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 08 Aug 2026 18:27:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[fantasy football]]></category>
		<category><![CDATA[Prompt Engineering]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5565</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Draft season is here again, and your team still needs a name that beats &#8220;Team Smith.&#8221; I first wrote on how to use <a href="https://nothans.com/use-chatgpt-to-generate-the-perfect-fantasy-football-team-name">ChatGPT for fantasy football team names</a> back in 2023, then enhanced it with a <a href="https://nothans.com/ai-fantasy-football-name-generator-tutorial-and-prompt-templates">custom GPT</a> in 2024. Since then the AI tools have gotten better and the method has gotten simpler, so this is the updated version for the 2026 season. The templates below still work in any of the major AI chatbots.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="600" data-attachment-id="5571" data-permalink="https://nothans.com/use-ai-to-help-you-create-the-fantasy-football-league-winning-team-name/image-145" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="Fantast football team name champion" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5571" style="width:538px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-1.png?w=2000&amp;ssl=1 2000w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<h2 id="what-you-need" class="wp-block-heading">What you need</h2>



<p class="wp-block-paragraph">Any of the big three AI chatbots, all of which have free tiers:</p>



<ul class="wp-block-list">
<li><a href="https://chatgpt.com">ChatGPT</a></li>



<li><a href="https://claude.ai">Claude</a></li>



<li><a href="https://gemini.google.com">Gemini</a></li>
</ul>



<p class="wp-block-paragraph">They&#8217;re all good at this. Wordplay, puns, and pop-culture mashups are the kind of thing these models genuinely enjoy (if models can enjoy things).</p>



<p class="wp-block-paragraph">The original version of this tutorial pointed to a custom GPT I built for exactly this job. You don&#8217;t need it anymore. You don&#8217;t need a name-generator website either. The base models got good enough that the wrapper became the long way around, and a plain chat with a decent prompt beats both.</p>



<h2 id="the-method" class="wp-block-heading">The method</h2>



<p class="wp-block-paragraph">The 2024 version had a warm-up step where you told the AI your objective and asked it to respond OKAY before sending the real prompt. You can skip that now; the models don&#8217;t need to be eased into anything anymore. Everything goes in one prompt, and the whole method is three steps:</p>



<ol class="wp-block-list">
<li>Open a new chat in ChatGPT, Claude, or Gemini.</li>



<li>Pick a prompt template below, replace the [BRACKETED] words, and send it.</li>



<li>When a direction makes you grin, ask for more: &#8220;give me 10 more like #3&#8221; works exactly like you&#8217;d hope.</li>
</ol>



<h2 id="the-20-prompt-templates" class="wp-block-heading">The 20 prompt templates</h2>



<ol class="wp-block-list">
<li>Generate 5 funny fantasy football team names based on [PLAYER NAME]&#8217;s name or playing style.</li>



<li>Create 5 clever fantasy football team names inspired by the [TEAM NAME] and their history or current roster.</li>



<li>Come up with 5 witty fantasy football team names centered around [POSITION] players.</li>



<li>Blend NFL references with [MOVIE/TV SHOW/BOOK] to create 5 unique fantasy football team names.</li>



<li>Generate 5 punny fantasy football team names using football terminology and common phrases.</li>



<li>Create 5 alliterative fantasy football team names starting with the letter [LETTER].</li>



<li>Combine [CITY/STATE] references with football terms to make 5 locally-themed fantasy team names.</li>



<li>Generate 5 playful trash-talking fantasy football team names that imply dominating the competition.</li>



<li>Create 5 fantasy football team names that blend [PROFESSION] terminology with football references.</li>



<li>Come up with 5 fantasy football team names that incorporate [HOLIDAY/SEASON] themes.</li>



<li>Generate 5 appetizing fantasy football team names that combine [FOOD] with player names or football terms.</li>



<li>Create 5 fantasy football team names that blend [MUSIC GENRE/ARTIST] references with NFL players or teams.</li>



<li>Combine names of [HISTORICAL ERA] figures with football terminology to create 5 unique team names.</li>



<li>Generate 5 epic fantasy football team names inspired by [MYTHOLOGY] and NFL players or terms.</li>



<li>Create 5 geeky fantasy football team names that combine [SCIENTIFIC FIELD/TECH COMPANY] with NFL references.</li>



<li>Come up with 5 colorful fantasy football team names incorporating [COLOR] and player names or football terms.</li>



<li>Generate 5 wild fantasy football team names that blend [ANIMAL SPECIES] characteristics with NFL players or terms.</li>



<li>Create 5 electrifying fantasy football team names inspired by [WEATHER EVENT] and football references.</li>



<li>Blend elements from [FICTIONAL WORLD/UNIVERSE] with NFL references to create 5 fantastical fantasy football team names.</li>



<li>Generate 5 multi-sport fantasy football team names that combine NFL references with terms from [OTHER SPORT].</li>
</ol>



<h2 id="an-example" class="wp-block-heading">An example</h2>



<p class="wp-block-paragraph">My go-to demo is template #4: &#8220;Blend NFL references with Deadpool to create 5 unique fantasy football team names.&#8221; The best result it ever gave me is still&nbsp;<strong>Mercs with a Mouthguard</strong>, riffing on Deadpool being the Merc with a Mouth in the comics. That one made the jump to a real league.</p>



<h2 id="the-new-trick-make-it-about-your-league" class="wp-block-heading">The new trick: make it about your league</h2>



<p class="wp-block-paragraph">This is the part that didn&#8217;t exist in the original tutorial. A name-generator website hands everyone the same list. The AI can work with your league specifically. Paste in your context along with the template:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Here are the other team names in my league: [PASTE THE LIST]. I finished [YOUR FINISH] last season, and I just drafted [YOUR KEY PLAYERS]. Generate 5 fantasy football team names that fit this league and gently roast my rivals.</p>
</blockquote>



<p class="wp-block-paragraph">Names that reference your buddy&#8217;s decade-long championship drought hit different than anything a template can produce. This also works for the sadder traditions: ask for last-place punishment team names and it delivers those too.</p>



<h2 id="bonus-generate-a-logo" class="wp-block-heading">Bonus: generate a logo</h2>



<p class="wp-block-paragraph">In 2024 this step required a separate image tool. Now ChatGPT and Gemini generate images right in the chat, so once you&#8217;ve picked your name, keep going:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Create a fantasy football team logo for &#8220;[YOUR TEAM NAME]&#8221;: bold, cartoon mascot style, sized for a league avatar.</p>
</blockquote>



<p class="wp-block-paragraph">Ask for two or three style variations and pick the one that looks best at thumbnail size, because that&#8217;s the only size your league will ever see it.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5570" data-permalink="https://nothans.com/use-ai-to-help-you-create-the-fantasy-football-league-winning-team-name/image-144" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?fit=2048%2C2048&amp;ssl=1" data-orig-size="2048,2048" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5570" style="width:528px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=1024%2C1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?resize=1320%2C1320&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image.png?w=2048&amp;ssl=1 2048w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Kittle Shop of Horrors</figcaption></figure>
</div>


<p class="wp-block-paragraph">The name is the only part of your season you have full control over&#8230;</p>



<h2 id="appendix-100-names-that-survived-the-cull" class="wp-block-heading">Appendix: 100 names that survived the cull</h2>



<p class="wp-block-paragraph">One more thing, since the whole post is about the method: I ran it on itself. A few hundred generated names across ten different template directions, then a hard cull of anything that sounded like it shipped with a default league. These 100 survived, each with the recipe behind it so you can find your player or your favorite reference. Steal freely; your league never has to know.</p>



<h3 id="quarterback-puns" class="wp-block-heading">Quarterback puns</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>1</td><td>Stroud Nine</td><td>C.J. Stroud + cloud nine</td></tr><tr><td>2</td><td>The Lamartian</td><td>Lamar Jackson + The Martian</td></tr><tr><td>3</td><td>Allentown Abbey</td><td>Josh Allen + Downton Abbey, with a nod to Billy Joel&#8217;s &#8220;Allentown&#8221;</td></tr><tr><td>4</td><td>Jayden and the Argonauts</td><td>Jayden Daniels + Jason and the Argonauts</td></tr><tr><td>5</td><td>Love in the Time of Blitzes</td><td>Jordan Love + Love in the Time of Cholera</td></tr><tr><td>6</td><td>Maye December</td><td>Drake Maye + a May-December romance</td></tr><tr><td>7</td><td>Purdy Little Liars</td><td>Brock Purdy + Pretty Little Liars</td></tr><tr><td>8</td><td>The Burrow Identity</td><td>Joe Burrow + The Bourne Identity</td></tr><tr><td>9</td><td>Taking the Season Goff</td><td>Jared Goff + taking the season off</td></tr><tr><td>10</td><td>Herbie Fully Loaded</td><td>Justin Herbert + Herbie: Fully Loaded</td></tr></tbody></table></figure>



<h3 id="running-back-puns" class="wp-block-heading">Running back puns</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>11</td><td>Gibbs Free Energy</td><td>Jahmyr Gibbs + Gibbs free energy, the thermodynamics term</td></tr><tr><td>12</td><td>Saquontum of Solace</td><td>Saquon Barkley + Quantum of Solace, the James Bond movie</td></tr><tr><td>13</td><td>Grand Theft Achane</td><td>De&#8217;Von Achane + Grand Theft Auto</td></tr><tr><td>14</td><td>Jeanty in a Bottle</td><td>Ashton Jeanty + Christina Aguilera&#8217;s &#8220;Genie in a Bottle&#8221;</td></tr><tr><td>15</td><td>Derrick and the Dominos</td><td>Derrick Henry + Derek and the Dominos, Eric Clapton&#8217;s band</td></tr><tr><td>16</td><td>Breece Witherspoon</td><td>Breece Hall + Reese Witherspoon</td></tr><tr><td>17</td><td>Bucky Irving Berlin</td><td>Bucky Irving + the songwriter Irving Berlin</td></tr><tr><td>18</td><td>Too Many Cooks</td><td>James Cook + the Adult Swim sketch</td></tr><tr><td>19</td><td>Pacheco de Mayo</td><td>Isiah Pacheco + Cinco de Mayo</td></tr><tr><td>20</td><td>The Jonathan Taylor Thomases</td><td>Jonathan Taylor + Jonathan Taylor Thomas of Home Improvement</td></tr></tbody></table></figure>



<h3 id="pass-catcher-puns" class="wp-block-heading">Pass catcher puns</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>21</td><td>Chase Sapphire Preferred</td><td>Ja&#8217;Marr Chase + the Chase credit card</td></tr><tr><td>22</td><td>CeeDee-ROM</td><td>CeeDee Lamb + CD-ROM</td></tr><tr><td>23</td><td>Amon-Ra Ra Rasputin</td><td>Amon-Ra St. Brown + Boney M.&#8217;s &#8220;Rasputin&#8221;</td></tr><tr><td>24</td><td>Puka Face</td><td>Puka Nacua + Lady Gaga&#8217;s &#8220;Poker Face&#8221;</td></tr><tr><td>25</td><td>Rome-ing Charges</td><td>Rome Odunze + roaming charges</td></tr><tr><td>26</td><td>Nabers Say Never</td><td>Malik Nabers + never say never</td></tr><tr><td>27</td><td>Zay Flowers for Algernon</td><td>Zay Flowers + the novel Flowers for Algernon</td></tr><tr><td>28</td><td>The Marvin Harrison Jr. Mints</td><td>Marvin Harrison Jr. + Junior Mints</td></tr><tr><td>29</td><td>McBride of Frankenstein</td><td>Trey McBride + Bride of Frankenstein</td></tr><tr><td>30</td><td>Kittle Shop of Horrors</td><td>George Kittle + Little Shop of Horrors</td></tr></tbody></table></figure>



<h3 id="movie-and-tv-mashups" class="wp-block-heading">Movie and TV mashups</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>31</td><td>My Outie Drafted This Team</td><td>Severance</td></tr><tr><td>32</td><td>Only Murders in the End Zone</td><td>Only Murders in the Building</td></tr><tr><td>33</td><td>Dead Roster Reckoning</td><td>Mission: Impossible &#8211; Dead Reckoning</td></tr><tr><td>34</td><td>Everything Everywhere All at 1PM</td><td>Everything Everywhere All at Once + the Sunday 1PM kickoff window</td></tr><tr><td>35</td><td>Lisan al-Gridiron</td><td>Dune&#8217;s Lisan al-Gaib</td></tr><tr><td>36</td><td>The Bear (Not the Team)</td><td>The Bear + the Chicago Bears</td></tr><tr><td>37</td><td>Baba Yaga&#8217;s Bench</td><td>John Wick</td></tr><tr><td>38</td><td>White Lotus Waiver Pool</td><td>The White Lotus</td></tr><tr><td>39</td><td>One Way Out (of Last Place)</td><td>Andor</td></tr><tr><td>40</td><td>Boar on the Floor</td><td>Succession</td></tr></tbody></table></figure>



<h3 id="music-mashups" class="wp-block-heading">Music mashups</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>41</td><td>Fleetwood Sack</td><td>Fleetwood Mac + the quarterback sack</td></tr><tr><td>42</td><td>Protect Ya Blindside</td><td>Wu-Tang Clan&#8217;s &#8220;Protect Ya Neck&#8221; + the blind side</td></tr><tr><td>43</td><td>They Not Like Us (0-5)</td><td>Kendrick Lamar&#8217;s &#8220;Not Like Us&#8221; + an honest record</td></tr><tr><td>44</td><td>Pink Pony Punt Club</td><td>Chappell Roan&#8217;s &#8220;Pink Pony Club&#8221;</td></tr><tr><td>45</td><td>Drake London Calling</td><td>Drake London + The Clash&#8217;s &#8220;London Calling&#8221;</td></tr><tr><td>46</td><td>Mo Yards Mo Problems</td><td>The Notorious B.I.G.&#8217;s &#8220;Mo Money Mo Problems&#8221;</td></tr><tr><td>47</td><td>Certified Bye-Week Boy</td><td>Drake&#8217;s Certified Lover Boy</td></tr><tr><td>48</td><td>Heartbreak Hotel: Week 17</td><td>Elvis + fantasy championship week</td></tr><tr><td>49</td><td>Bijan and the Jets</td><td>Bijan Robinson + Elton John&#8217;s &#8220;Bennie and the Jets&#8221;</td></tr><tr><td>50</td><td>Total Eclipse of the Depth Chart</td><td>Bonnie Tyler&#8217;s &#8220;Total Eclipse of the Heart&#8221;</td></tr></tbody></table></figure>



<h3 id="science-and-tech" class="wp-block-heading">Science and tech</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>51</td><td>Schrödinger&#8217;s Kicker</td><td>Schrödinger&#8217;s cat; he&#8217;s good and bad until you check the box score</td></tr><tr><td>52</td><td>The Higgins Boson</td><td>Tee Higgins + the Higgs boson</td></tr><tr><td>53</td><td>A.J. Brownian Motion</td><td>A.J. Brown + Brownian motion</td></tr><tr><td>54</td><td>Regression to the Meanest</td><td>regression to the mean, the stats concept</td></tr><tr><td>55</td><td>DROP TABLE Opponents;</td><td>the SQL injection joke, via xkcd&#8217;s Little Bobby Tables</td></tr><tr><td>56</td><td>sudo Win Championship</td><td>the Linux sudo command</td></tr><tr><td>57</td><td>404: Running Game Not Found</td><td>the HTTP 404 error</td></tr><tr><td>58</td><td>Monte Carlo Mock Draft</td><td>Monte Carlo simulations</td></tr><tr><td>59</td><td>Small Sample Size Kings</td><td>the analyst&#8217;s favorite caveat</td></tr><tr><td>60</td><td>Left on Read Option</td><td>left on read + the read option</td></tr></tbody></table></figure>



<h3 id="aiera-names" class="wp-block-heading">AI-era names</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>61</td><td>Vibe Drafted</td><td>vibe coding, but for your roster</td></tr><tr><td>62</td><td>Context Window Shoppers</td><td>an LLM&#8217;s context window + window shopping</td></tr><tr><td>63</td><td>Token Limit Exceeded</td><td>what the chatbot says when you paste your whole league history</td></tr><tr><td>64</td><td>Trust Me, I&#8217;m an LLM</td><td>large language model confidence</td></tr><tr><td>65</td><td>The Hallucinated Rankings</td><td>AI hallucinations</td></tr><tr><td>66</td><td>Fine-Tuned Machine</td><td>model fine-tuning + a finely tuned machine</td></tr><tr><td>67</td><td>Prompt and Circumstance</td><td>&#8220;Pomp and Circumstance,&#8221; the graduation march</td></tr><tr><td>68</td><td>My Chatbot Picked This Name</td><td>full transparency</td></tr><tr><td>69</td><td>The Overfitters</td><td>overfitting, machine learning&#8217;s classic mistake</td></tr><tr><td>70</td><td>Deep Learning, Shallow Bench</td><td>deep learning + a thin roster</td></tr></tbody></table></figure>



<h3 id="myth-history-and-literature" class="wp-block-heading">Myth, history, and literature</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>71</td><td>Sisyphus: This Is My Year</td><td>the boulder, the hill, your annual optimism</td></tr><tr><td>72</td><td>Achilles&#8217; Hamstring</td><td>Achilles&#8217; heel, relocated to where football careers actually end</td></tr><tr><td>73</td><td>Et Tu, Kicker?</td><td>Julius Caesar&#8217;s &#8220;Et tu, Brute?&#8221; + the kicker who loses your week</td></tr><tr><td>74</td><td>The Byzantine Umpires</td><td>the Byzantine Empire + the umpire, a real football official</td></tr><tr><td>75</td><td>DeVonta&#8217;s Inferno</td><td>DeVonta Smith + Dante&#8217;s Inferno</td></tr><tr><td>76</td><td>Icarus on the Waiver Wire</td><td>Icarus, flying too close to a hot pickup</td></tr><tr><td>77</td><td>The Oracle Said Start Him</td><td>the Oracle of Delphi + start/sit advice</td></tr><tr><td>78</td><td>Loki&#8217;s Practice Squad</td><td>Norse mythology&#8217;s trickster</td></tr><tr><td>79</td><td>Caesar&#8217;s Salary Cap</td><td>Julius Caesar + Caesar salad + the cap</td></tr><tr><td>80</td><td>The Canterbury Tailgates</td><td>The Canterbury Tales</td></tr></tbody></table></figure>



<h3 id="group-chat-trash-talk" class="wp-block-heading">Group chat trash talk</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>81</td><td>12 Men in the Group Chat</td><td>the 12-men-on-the-field penalty + your league&#8217;s group chat</td></tr><tr><td>82</td><td>Per My Last Email, I Won</td><td>corporate passive aggression</td></tr><tr><td>83</td><td>My Bench Outscored You</td><td>the deepest cut in fantasy</td></tr><tr><td>84</td><td>Championship Window Shoppers</td><td>a closing championship window + window shopping</td></tr><tr><td>85</td><td>The Autodraft Andys</td><td>missing your own draft</td></tr><tr><td>86</td><td>Emotional Support Kicker</td><td>emotional support animals</td></tr><tr><td>87</td><td>Bye Week Felicia</td><td>&#8220;Bye, Felicia&#8221; from Friday</td></tr><tr><td>88</td><td>The Airing of Grievances</td><td>Festivus, from Seinfeld</td></tr><tr><td>89</td><td>Projected to Lose by 2</td><td>the projection that haunts every Monday night</td></tr><tr><td>90</td><td>Commissioner&#8217;s Least Favorite</td><td>a badge of honor</td></tr></tbody></table></figure>



<h3 id="deep-cuts-and-current-events" class="wp-block-heading">Deep cuts and current events</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>#</th><th>Team name</th><th>How it came to be</th></tr></thead><tbody><tr><td>91</td><td>Tush Push Truthers</td><td>the Eagles&#8217; tush push and the annual ban debate</td></tr><tr><td>92</td><td>Buffering Since Kickoff</td><td>streaming-era NFL, Netflix Christmas games included</td></tr><tr><td>93</td><td>Training for the 2028 Olympics</td><td>flag football debuts at the LA 2028 Games</td></tr><tr><td>94</td><td>The Platypus Package</td><td>if the Wildcat formation exists, why not</td></tr><tr><td>95</td><td>Cheetahs Never Prosper</td><td>cheaters never prosper + Tyreek Hill&#8217;s cheetah persona</td></tr><tr><td>96</td><td>The Snow Game Romantics</td><td>people who think every December game should look like a snow globe</td></tr><tr><td>97</td><td>Travis Hunter Gatherers</td><td>Travis Hunter, who plays both ways + hunter-gatherers</td></tr><tr><td>98</td><td>Zero RB Zealots</td><td>the Zero RB draft strategy</td></tr><tr><td>99</td><td>Full-Court Press Coverage</td><td>basketball&#8217;s full-court press + press coverage</td></tr><tr><td>100</td><td>Low &amp; Slow Offense</td><td>barbecue methodology applied to clock management</td></tr></tbody></table></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/use-ai-to-help-you-create-the-fantasy-football-league-winning-team-name/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5565</post-id>	</item>
		<item>
		<title>Abode 101: A Practical Project to Learn the Open Knowledge Format (OKF)</title>
		<link>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf</link>
					<comments>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sun, 28 Jun 2026 17:14:36 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[abode101]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[okf]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5457</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://www.youtube.com/watch?v=gYMh5LDbtw8" target="_blank" rel=" noreferrer noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5459" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-for-your-house-abode101" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?fit=2048%2C2048&amp;ssl=1" data-orig-size="2048,2048" data-comments-opened="0" data-image-title="Google OKF for your house abode101" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5459" style="width:556px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1024%2C1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1320%2C1320&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?w=2048&amp;ssl=1 2048w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">Google OKF for Your House</figcaption></figure>
</div>


<p class="wp-block-paragraph">I was standing in the hardware store holding a dead coin cell, squinting at it, trying to remember if the Lutron dimmer in my hallway takes a CR2032 or one of the other fourteen round silver batteries that all look exactly the same. So I guessed. I bought two of the wrong one. Classic.</p>



<p class="wp-block-paragraph">Here is the thing about a house. You slowly learn a thousand tiny facts about it. The vent sizes. The filter part numbers. The spa was installed in some year you&#8217;ll never remember. The good info is scattered across manuals in a junk drawer, an email from the installer, a photo of a model plate you took and never looked at again. By the time you actually need a fact, it&#8217;s gone.</p>



<p class="wp-block-paragraph">I finally fixed it. Not with an app. With a folder.</p>



<h2 id="the-idea-i-borrowed" class="wp-block-heading">The idea I borrowed</h2>



<p class="wp-block-paragraph">Earlier this year Andrej Karpathy posted a little pattern he called an &#8220;LLM wiki.&#8221; Instead of the usual retrieval setup where you chop documents into chunks and stuff them in a vector database, you just keep a folder of Markdown files that the AI itself writes and maintains. The model builds the connections once, when it learns something, instead of re-deriving them every single time you ask. The internet looked at it and went &#8220;wait, it&#8217;s just a folder? why did we ever do the other thing.&#8221;</p>



<p class="wp-block-paragraph">Then Google Cloud made it official. On June 12 they published the&nbsp;<a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md">Open Knowledge Format</a>, or OKF. It&#8217;s a tiny, vendor-neutral spec: a directory of Markdown files, one concept per file, a bit of YAML at the top, an index, links between them. No database. No SDK. Readable by a human and by any agent. That&#8217;s the whole thing.</p>



<p class="wp-block-paragraph">So I pointed it at my house. The project is called Abode 101.</p>



<h2 id="what-i-actually-built" class="wp-block-heading">What I actually built</h2>



<p class="wp-block-paragraph"><a href="https://github.com/nothans/abode101" target="_blank" rel="noreferrer noopener">Abode 101</a> is an OKF folder about my home. There&#8217;s a file for the Lutron dimmer, one for the swim spa, one for the HVAC vents, one for the smoke alarms. There&#8217;s an <code>index.md</code> the AI reads first so it knows where to look. To use it, I don&#8217;t open an app. I just talk to it in Claude Code.</p>



<pre class="wp-block-code"><code>you ▸ what's the battery for the Lutron dimmer?
abode ▸ Panasonic CR2032, per the install guide (page 10).</code></pre>



<p class="wp-block-paragraph">That&#8217;s the fact I drove to the store without. Now it&#8217;s one question away, and it tells me where it got the answer.</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/gYMh5LDbtw8?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div><figcaption class="wp-element-caption">Abode101 Explainer Video</figcaption></figure>



<p class="wp-block-paragraph">But a folder of files just sitting there is a filing cabinet. The magic is in two things the bare spec leaves out.</p>



<h2 id="thing-one-the-loop" class="wp-block-heading">Thing one: the loop</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="572" height="1024" data-attachment-id="5460" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-loop" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?fit=1429%2C2560&amp;ssl=1" data-orig-size="1429,2560" data-comments-opened="0" data-image-title="okf loop" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?fit=572%2C1024&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop.png?resize=572%2C1024&#038;ssl=1" alt="" class="wp-image-5460" style="width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=572%2C1024&amp;ssl=1 572w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=167%2C300&amp;ssl=1 167w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=768%2C1376&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=857%2C1536&amp;ssl=1 857w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=1143%2C2048&amp;ssl=1 1143w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=750%2C1344&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=1320%2C2365&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?w=1429&amp;ssl=1 1429w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>
</div>


<p class="wp-block-paragraph">OKF standardizes the files. It says nothing about keeping them fresh. Karpathy&#8217;s original idea had the AI do the maintaining, and that&#8217;s the part I cared about most, so I built it back in as a set of playbooks.</p>



<p class="wp-block-paragraph">I capture a thing by telling it &#8220;I bought X,&#8221; or by dropping a manual, a receipt, or a photo of a label into an inbox folder. It reads whatever I throw at it, pulls out the real specs, and files them. Then overnight it does the boring homework I never do. It looks up the filter I just bought, finds the replacement part, figures out how often it needs changing, and adds a reminder. I wake up and my house knows more than it did when I went to bed.</p>



<h2 id="thing-two-it-refuses-to-guess" class="wp-block-heading">Thing two: it refuses to guess</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="572" height="1024" data-attachment-id="5458" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-battery" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?fit=1429%2C2560&amp;ssl=1" data-orig-size="1429,2560" data-comments-opened="0" data-image-title="okf battery answer" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?fit=572%2C1024&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery.png?resize=572%2C1024&#038;ssl=1" alt="" class="wp-image-5458" style="width:474px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=572%2C1024&amp;ssl=1 572w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=167%2C300&amp;ssl=1 167w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=768%2C1376&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=857%2C1536&amp;ssl=1 857w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=1143%2C2048&amp;ssl=1 1143w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=750%2C1344&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=1320%2C2365&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?w=1429&amp;ssl=1 1429w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>
</div>


<p class="wp-block-paragraph">This is the part I&#8217;m proud of. Every exact fact carries its source and a confidence level. A battery type from the manufacturer&#8217;s manual is &#8220;verified&#8221; and it gets cited. A spec from a random Amazon listing is &#8220;reported&#8221; and ranked lower. And when I ask something it doesn&#8217;t actually know, it says so.</p>



<pre class="wp-block-code"><code>you ▸ what size is the kitchen toe-kick vent?
abode ▸ Not recorded. It's marked TODO, needs measuring. I won't guess.</code></pre>



<p class="wp-block-paragraph">An AI that says &#8220;I don&#8217;t know&#8221; instead of inventing a confident wrong number. For house facts, where the wrong answer means a second trip to the store or a part that doesn&#8217;t fit, that refusal is the feature.</p>



<p class="wp-block-paragraph">I ran a little eval suite over it to make sure. Twenty-one questions, answered cold. It got the exact facts right, with sources, and on the three questions it shouldn&#8217;t know, it refused all three. That&#8217;s the behavior I want from something I&#8217;m going to trust with my house.</p>



<h2 id="why-a-folder-beats-an-app" class="wp-block-heading">Why a folder beats an app</h2>



<p class="wp-block-paragraph">I could have built a slick app with a database. I&#8217;m glad I didn&#8217;t. The folder is portable, it diffs in version control, it works with any model, and I own it. There&#8217;s no service to shut down, no export button I&#8217;ll go hunting for in five years. When the next better model comes out, I point it at the same folder and it just works. Try that with your smart-home app from 2014.</p>



<h2 id="get-it" class="wp-block-heading">Get it</h2>



<p class="wp-block-paragraph">I open-sourced the framework. The structure, the agent instructions, the playbooks, even the eval harness are all in the repo. My actual house data stays on my machine, gitignored, because you do not need to know my spa&#8217;s gallon count. You fork it and fill it with your own home.</p>



<p class="wp-block-paragraph"><strong>→&nbsp;<a href="https://github.com/nothans/abode101">github.com/nothans/abode101</a></strong></p>



<p class="wp-block-paragraph">Go give your house a memory. And maybe check what battery your dimmer takes before you drive to the store. Just a thought&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5457</post-id>	</item>
		<item>
		<title>Create the &#8220;Best Agent Skill&#8221; with SkillOpt from Microsoft Research</title>
		<link>https://nothans.com/create-the-best-agent-skill-with-skillopt-from-microsoft-research</link>
					<comments>https://nothans.com/create-the-best-agent-skill-with-skillopt-from-microsoft-research#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 01:15:49 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Agent Skills]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[Microsoft Research]]></category>
		<category><![CDATA[OpenAI]]></category>
		<category><![CDATA[SkillOpt]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5447</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">For two years the move was simple: pick a better model. Then the models got good, and stayed good, and the gaps between them got boring. So the interesting lever is the other thing you hand the agent now. The skill file.</p>



<p class="wp-block-paragraph">Microsoft Research just shipped a tool called <a href="https://github.com/microsoft/SkillOpt">SkillOpt</a> that takes that idea literally.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.</p>
</blockquote>



<p class="wp-block-paragraph">It treats the skill markdown you hand an agent (the instructions, the system prompt, the SKILL.md) as trainable state. It runs epochs. It has a batch size. It has a learning rate. It just never touches the model weights. The weights stay frozen behind the API. The thing that gets trained is the text.</p>



<p class="wp-block-paragraph">The loop is short. Run the agent on a batch of tasks. Score each one. A second model reads the failures and proposes small edits to the skill file. Keep an edit only if it improves a held-out score. Repeat. What you get at the end is a&nbsp;<code>best_skill.md</code>&nbsp;you drop in front of the same unchanged model.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://github.com/microsoft/SkillOpt"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5448" data-permalink="https://nothans.com/create-the-best-agent-skill-with-skillopt-from-microsoft-research/image-108" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?fit=750%2C750&amp;ssl=1" data-orig-size="750,750" data-comments-opened="0" data-image-title="SkillOpt from Microsoft Research" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5448" style="width:504px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?w=750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/image.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">Microsoft Research <a href="https://github.com/microsoft/SkillOpt">SkillOpt</a></figcaption></figure>
</div>


<p class="wp-block-paragraph">I wanted to see it actually work, so I gave it a job&#8230;</p>



<h2 id="the-setup" class="wp-block-heading">The setup</h2>



<p class="wp-block-paragraph">I had OpenAI Codex do the writing. The task: take a paragraph stuffed with AI slop and clean it up. The skill it started from was short:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Improve the passage so it reads a little better. Keep the meaning and roughly the length.</p>
</blockquote>



<p class="wp-block-paragraph">No mention of slop. No list of banned words. Nothing to go on.</p>



<p class="wp-block-paragraph">The verifier was the part that mattered. I wrote a dumb little counter that scans the output for the tells (the canned phrases, the em-dashes) and returns how many are left. Fewer is better. That is the whole eval. Objective, cheap, no judgment calls.</p>



<p class="wp-block-paragraph">Then I let SkillOpt run.</p>



<h2 id="what-it-wrote" class="wp-block-heading">What it wrote</h2>



<p class="wp-block-paragraph">The seed turned into a thirty-line deslop skill. SkillOpt wrote it.</p>



<p class="wp-block-paragraph">It worked out, on its own, that &#8220;remove AI slop&#8221; is a removal constraint and not a tone nudge. It named the exact phrases that kept leaking through (&#8220;let&#8217;s dive in,&#8221; &#8220;have you ever wondered,&#8221; &#8220;it&#8217;s worth noting,&#8221; &#8220;furthermore,&#8221; &#8220;in conclusion,&#8221; &#8220;great question&#8221;). It flagged em-dashes. And it caught the sneaky failure mode I never told it about: the model dodging a banned word by swapping in a synonym. That one became its own rule, the last line of the file:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Before answering, do a quick scan to ensure none of the original flagged words remain, including close synonyms you may have introduced.</p>
</blockquote>



<p class="wp-block-paragraph">The score went from passing half the held-out passages to passing all of them. The skill it wrote is one I would actually keep.</p>



<h2 id="the-part-worth-keeping" class="wp-block-heading">The part worth keeping</h2>



<p class="wp-block-paragraph">The optimizer is the easy part.</p>



<p class="wp-block-paragraph">I went in assuming the clever bit was the model proposing edits. It isn&#8217;t. The clever bit is the verifier. Give SkillOpt a score and nothing else and it does nothing. I tried that first. It saw the failures, shrugged, and changed not a single line, because &#8220;you got a 0.6&#8221; tells it nothing about what to fix. The run that worked was the one where the verifier also said which words leaked. Same model, same loop. The difference was the signal.</p>



<p class="wp-block-paragraph">So the rule of thumb is less &#8220;use the self-improving optimizer&#8221; and more: can you score this cheaply, and can you tell it why it failed. If yes, the skill mostly writes itself. If no, there is nothing to train and the fancy loop sits there idle.</p>



<p class="wp-block-paragraph">That is also the catch, and it is the same catch hiding under every self-improving-agent demo. A slop counter is a clean verifier. Most of what you do in a day is not. &#8220;Was this brief any good.&#8221; &#8220;Did this post land.&#8221; No cheap score, no training. The optimizer was never the bottleneck. The verifier is.</p>



<p class="wp-block-paragraph">So build the verifier first. Get that right and the skill mostly writes itself.</p>



<h2 id="bonus-a-taste-of-running-it" class="wp-block-heading">Bonus: a taste of running it</h2>



<p class="wp-block-paragraph">The repo is&nbsp;<a href="https://github.com/microsoft/SkillOpt">github.com/microsoft/SkillOpt</a>. MIT licensed, Python.</p>



<p class="wp-block-paragraph">Get it:</p>



<pre class="wp-block-code"><code>pip install skillopt
# or, to poke at the internals:
git clone https://github.com/microsoft/SkillOpt &amp;&amp; cd SkillOpt &amp;&amp; pip install -e .</code></pre>



<p class="wp-block-paragraph">The mental model is one small folder per task. A loader that hands over your examples, a rollout that runs your agent and scores it, and a seed skill to start from. SkillOpt&#8217;s whole job is to grow that seed.</p>



<p class="wp-block-paragraph">The config reads like a training run, on purpose:</p>



<pre class="wp-block-code"><code>train:
  num_epochs: 4
  batch_size: 40
optimizer:
  learning_rate: 4        # max edits to the skill per step
  lr_scheduler: cosine
evaluation:
  use_gate: true          # keep an edit only if it beats the held-out score
model:
  optimizer: gpt-5.4      # the model that proposes the edits</code></pre>



<p class="wp-block-paragraph">Then it is one command:</p>



<pre class="wp-block-code"><code>python scripts/train.py --config configs/yourtask/default.yaml</code></pre>



<p class="wp-block-paragraph">The only part that is really on you is the scoring. Your rollout returns, per task, a pass/fail and a number between 0 and 1:</p>



<pre class="wp-block-code"><code>return {"id": task_id, "hard": passed, "soft": fraction_correct}</code></pre>



<p class="wp-block-paragraph">That is the whole contract. Give it tasks, a way to score them, and a skill to start from. It runs the epochs.</p>



<p class="wp-block-paragraph">One side note: keep the tasks hard enough that the agent fails some of them. If it aces everything on the seed skill, there is nothing to learn and SkillOpt politely does nothing. Ask me how I know.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/create-the-best-agent-skill-with-skillopt-from-microsoft-research/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5447</post-id>	</item>
		<item>
		<title>What I Learned from Garry Tan and gstack</title>
		<link>https://nothans.com/what-i-learned-from-garry-tan-and-gstack</link>
					<comments>https://nothans.com/what-i-learned-from-garry-tan-and-gstack#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 06 Jun 2026 15:28:44 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Writing]]></category>
		<category><![CDATA[Agent Skills]]></category>
		<category><![CDATA[agents]]></category>
		<category><![CDATA[Garry Tan]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5438</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Garry Tan, the guy who runs Y Combinator, just open-sourced a toolkit called <a href="https://github.com/garrytan/gstack">gstack</a>. It runs on top of Claude Code and turns it into a virtual engineering team. Twenty-three specialized skills, eight power tools, each one playing a role you&#8217;d normally have to hire for. A CEO that rethinks your product. An engineering manager that locks down the architecture. A designer that catches AI slop. A QA lead that drives a real browser and files bugs against you.</p>



<p class="wp-block-paragraph">I read through it expecting to roll my eyes. Instead I sat there nodding, because I&#8217;d accidentally built a tiny version of the same thing for this blog.</p>



<h2 id="the-pitch" class="wp-block-heading">The pitch</h2>



<p class="wp-block-paragraph">gstack&#8217;s whole argument is that solo builders don&#8217;t lose to big teams because they&#8217;re worse engineers. They lose because they skip process. One person at a keyboard, prompting Claude into existence one vibe at a time, eventually ships something that works. Until it doesn&#8217;t. No review. No second opinion. No one asking &#8220;wait, should we even build this?&#8221;</p>



<p class="wp-block-paragraph">So gstack bakes the process in. Every skill is a slash command, and each command plays a role in a pipeline:</p>



<p class="wp-block-paragraph"><strong>Think → Plan → Build → Review → Test → Ship → Reflect</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="500" data-attachment-id="5437" data-permalink="https://nothans.com/gstack-overview-infographic" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?fit=1536%2C1024&amp;ssl=1" data-orig-size="1536,1024" data-comments-opened="0" data-image-title="gstack-overview-infographic" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?fit=750%2C500&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=750%2C500&#038;ssl=1" alt="gstack: seven stages from Think to Reflect, with roles like CEO, Designer, Eng Manager, QA, Security, and Release mapped underneath." class="wp-image-5437" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=1024%2C683&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=750%2C500&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=420%2C280&amp;ssl=1 420w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?resize=1320%2C880&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/gstack-overview-infographic.png?w=1536&amp;ssl=1 1536w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">gsta</figcaption></figure>
</div>


<p class="wp-block-paragraph">You start a project with&nbsp;<code>/office-hours</code>, which hits you with six forcing questions before you write a line of code. Then&nbsp;<code>/plan-ceo-review</code>&nbsp;challenges your scope.&nbsp;<code>/plan-eng-review</code>&nbsp;draws the data-flow diagrams and enumerates the edge cases. You build.&nbsp;<code>/review</code>&nbsp;does a staff-engineer pass and auto-fixes the obvious stuff.&nbsp;<code>/qa</code>&nbsp;opens an actual Chromium browser, clicks through your app, finds bugs, and writes a regression test for each one it fixes.&nbsp;<code>/ship</code>&nbsp;runs the suite and opens the PR.</p>



<p class="wp-block-paragraph">Each stage feeds the next. The CEO&#8217;s decisions constrain the engineer. The engineer&#8217;s plan constrains the build. Nothing happens in a vacuum. That&#8217;s exactly the part solo work gets wrong.</p>



<p class="wp-block-paragraph">There&#8217;s a whole security wing too. A&nbsp;<code>/cso</code>&nbsp;skill that runs OWASP Top 10 and STRIDE threat modeling. A sidebar Claude that watches for prompt injection. A&nbsp;<code>/careful</code>&nbsp;mode that warns you before&nbsp;<code>rm -rf</code>&nbsp;ruins your afternoon. It&#8217;s a lot. The point isn&#8217;t that you use all of it. The point is that the roles exist, named and on call.</p>



<h2 id="why-this-looked-familiar" class="wp-block-heading">Why this looked familiar</h2>



<p class="wp-block-paragraph">Here&#8217;s the thing. I don&#8217;t ship code through a blog. I ship words. But the moment I saw that pipeline I recognized it, because the posts you&#8217;re reading go through the same kind of relay.</p>



<p class="wp-block-paragraph">When I write here, an idea doesn&#8217;t go straight from my head to WordPress. It moves through stages, and each stage has one job:</p>



<ul class="wp-block-list">
<li><strong>Research</strong> does the digging and writes up a structured report. Pitch, key facts, angle, the competition check.</li>



<li><strong>Refine</strong> tightens the structure and pacing without touching the voice.</li>



<li><strong>De-slop</strong> strips out the AI tells. The em-dashes, the &#8220;it&#8217;s not just X, it&#8217;s Y,&#8221; the forced enthusiasm, the closer that tries to sound profound.</li>



<li><strong>Voice</strong> rewrites it to sound like me. Short sentences. Plain words. No throat-clearing.</li>



<li><strong>Format</strong> turns it into clean WordPress blocks.</li>
</ul>



<p class="wp-block-paragraph">Each one hands off to the next. Same shape as gstack. A CEO who reframes the product is doing what my research stage does for a post. A designer who catches AI slop is, almost word for word, my de-slop pass. Garry Tan built an org chart for shipping software. I built a smaller one for shipping writing, and I didn&#8217;t even notice the resemblance until his showed up.</p>



<p class="wp-block-paragraph">I&#8217;m not claiming I invented anything. The idea is in the water. Once you spend enough time working alongside an agent, you stop treating it like one genius who does everything and start treating it like a team you have to manage. You give each role a narrow job and a clean handoff. That&#8217;s not a trick. It&#8217;s just how good teams have always worked, now running in a terminal.</p>



<h2 id="the-number-everyones-going-to-argue-about" class="wp-block-heading">The number everyone&#8217;s going to argue about</h2>



<p class="wp-block-paragraph">gstack ships with a doc making a bold claim: Garry measured his own output and found he&#8217;s writing about 810 times more code per day than he did back in 2013 when he was coding part-time around a day job. Eleven thousand logical lines a day across his first 108 days.</p>



<p class="wp-block-paragraph">Your skepticism alarm should be going off. So was his. He concedes up front that lines of code is a garbage quality metric. His own line: measuring programming progress by lines of code is like measuring aircraft-building progress by weight. So he deflates the number hard. Strips comments and blanks, applies a 2x penalty for AI being verbose and defensive, and lands at something like 5,700 lines a day. Still a wild figure. Still self-reported, so take it with salt.</p>



<p class="wp-block-paragraph">But the interesting claim isn&#8217;t the speed. It&#8217;s the quality holding steady while the speed goes up. A 2 percent revert rate, right in line with the open-source baseline. Two thousand-plus automated tests with CI. A 95 percent success rate across 305,000 skill runs. His actual thesis is buried under the headline number:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Testing at multiple levels is what makes AI-assisted coding actually work.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">That one I believe without reservation, because it&#8217;s the same thing the pipeline is really about. The process isn&#8217;t there to make the agent faster. It&#8217;s there to catch the agent when it&#8217;s confidently wrong, which it will be, several times a day. Every stage is a checkpoint, a chance for something to get caught before it ships. The payoff isn&#8217;t speed, it&#8217;s fewer mistakes reaching the end.</p>



<h2 id="what-i-did-with-it" class="wp-block-heading">What I did with it</h2>



<p class="wp-block-paragraph">I&#8217;m not installing the whole thing. gstack is TypeScript and Bun and Playwright, built for shipping web apps, and Windows is a second-class citizen in it. Not my stack. Not my use case.</p>



<p class="wp-block-paragraph">So I stole the front of it instead. The skill I keep coming back to is&nbsp;<code>/office-hours</code>: six forcing questions you have to answer before you&#8217;re allowed to build anything. Who is this for. What&#8217;s the sharpest version of it. What are you quietly avoiding. It&#8217;s a CEO review for an idea that doesn&#8217;t exist yet.</p>



<p class="wp-block-paragraph">That maps straight onto the worst part of blogging, which is deciding what&#8217;s even worth writing. So I pointed it at this blog. Before a topic earns a draft, I run it through the same kind of interrogation in Claude Code. What&#8217;s the one sentence. Who already wrote it better. What&#8217;s the angle only I have. Why now. Most ideas die right there, which is the point. The ones that live show up to the draft stage already knowing what they are.</p>



<p class="wp-block-paragraph">This post is one of them. gstack was the raw idea. The forcing questions are what turned &#8220;gstack exists, that&#8217;s neat&#8221; into something with an angle worth your time. The tool I borrowed from is the tool that helped me write about borrowing from it.</p>



<p class="wp-block-paragraph">So here&#8217;s what you should know today. gstack is out there, it&#8217;s free, and even if you never run a line of it, the shape is worth stealing. Garry Tan built that discipline for code. I run a lighter version of it on words. You can point it at whatever you make. The pipeline is the product. The agent&#8217;s just the labor.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/what-i-learned-from-garry-tan-and-gstack/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5438</post-id>	</item>
		<item>
		<title>AI Agents for Hardware Engineering</title>
		<link>https://nothans.com/ai-agents-for-hardware-engineering</link>
					<comments>https://nothans.com/ai-agents-for-hardware-engineering#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Fri, 22 May 2026 21:59:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Simulink]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5431</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">There&#8217;s a belief going around that you can prompt your way to anything. Hand the AI a problem, walk away, come back to working code.</p>



<p class="wp-block-paragraph">Fine for a side-project web app. Does not work for an inverted pendulum spinning on your desk.</p>



<h2 id="the-pit-and-the-pendulum" class="wp-block-heading">The Pit and the Pendulum</h2>



<p class="wp-block-paragraph">MathWorks just published a <a href="https://www.youtube.com/watch?v=-G4H2DmhR28">Tech Talk by Brian Douglas</a>. It is worth watching if you build hardware.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/-G4H2DmhR28?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p class="wp-block-paragraph">The setup is a Quanser cube servo with an inverted pendulum, a Raspberry Pi running the controller, and a coding agent wired into Simulink through the <a href="https://github.com/matlab/simulink-agentic-toolkit">Simulink Agentic Toolkit</a>. The agent&#8217;s job is to swing the pendulum up and balance it.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5433" data-permalink="https://nothans.com/ai-agents-for-hardware-engineering/image-107" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?fit=1024%2C1024&amp;ssl=1" data-orig-size="1024,1024" data-comments-opened="0" data-image-title="AI Agents for Hardware Engineering, Simulink Agentic Toolkit" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5433" style="width:559px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption"><a href="https://github.com/matlab/simulink-agentic-toolkit">Simulink Agentic Toolkit</a></figcaption></figure>
</div>


<p class="wp-block-paragraph">Balancing an inverted pendulum is a classic control problem because it&#8217;s unstable by nature. Get the math wrong and the pendulum falls. Get the code wrong and a 12V motor jerks the cube into something it shouldn&#8217;t.</p>



<h2 id="what-happens-if-you-just-prompt-it" class="wp-block-heading">What Happens If You Just Prompt It</h2>



<p class="wp-block-paragraph">The tempting move is the one most of us have done with web apps. Open a chat, describe the system, ask for the code. One prompt, big blob, ship it.</p>



<p class="wp-block-paragraph">The MathWorks engineers walk through why that falls apart for hardware:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;If you rely on AI to generate code directly, that process is much less structured&#8230; it&#8217;s often unclear exactly how or why a particular implementation was created, making it harder to trust and verify.&#8221;</p>



<p class="wp-block-paragraph">Brian Douglas</p>
</blockquote>



<p class="wp-block-paragraph">Hardware is unforgiving. You can&#8217;t roll back a destroyed motor with a git revert. When a physical system fails, you need to know which assumption broke, which equation got the wrong constant, which sample rate the controller is actually running at. A black box of generated C code doesn&#8217;t tell you any of that.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;You don&#8217;t want to let your AI agent skip parts of your engineering workflow. That&#8217;s how you can get yourself into trouble with a final product that doesn&#8217;t meet your objective or worse, is just purely unsafe.&#8221;</p>



<p class="wp-block-paragraph">Brian Douglas</p>
</blockquote>



<h2 id="the-workflow-is-the-script" class="wp-block-heading">The Workflow Is the Script</h2>



<p class="wp-block-paragraph">The answer is to keep the AI inside the workflow engineers already trust: Model-Based Design. The agent doesn&#8217;t replace the workflow. It runs each step inside it, faster.</p>



<p class="wp-block-paragraph"><strong>Define quantifiable requirements.</strong>&nbsp;Before any code, the human and the AI agree on what success looks like. Spin-up speed. Wobble limits. The 12V motor constraint. These targets become the benchmarks for verification later.</p>



<p class="wp-block-paragraph"><strong>Use a trusted model.</strong>&nbsp;Instead of letting the AI invent a custom physics engine, the workflow points it at an existing Simulink model. The agent runs linearization through the Simulink Agentic Toolkit and reports the system&#8217;s poles back to the human. The math comes from validated tools, not from a language model freestyling differential equations.</p>



<p class="wp-block-paragraph"><strong>Use a trusted controller.</strong>&nbsp;Same logic. The agent is told to use the MPC Toolbox. Model Predictive Control has decades of theory behind it and a deterministic implementation. If something looks wrong, you can tune it manually. You&#8217;re not debugging an optimizer the AI invented on the fly.</p>



<p class="wp-block-paragraph"><strong>Verify in layers.</strong>&nbsp;Three stages before the code touches hardware:</p>



<ul class="wp-block-list">
<li><strong>MIL</strong> (Model-in-the-Loop): the controller runs against the theoretical model</li>



<li><strong>SIL</strong> (Software-in-the-Loop): the generated embedded C code runs on a computer, behaving exactly like the simulation</li>



<li><strong>PIL</strong> (Processor-in-the-Loop): the C code runs on the actual target Raspberry Pi</li>
</ul>



<p class="wp-block-paragraph">Each layer catches different bugs. Skip one and you&#8217;ll catch that bug on hardware instead.</p>



<p class="wp-block-paragraph"><strong>Deploy and iterate.</strong>&nbsp;Only after layered verification does the code go on the real pendulum.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Instead of asking an agent to solve your problem however it wants, you tell it to follow an engineering workflow that you understand.&#8221;</p>



<p class="wp-block-paragraph">Brian Douglas</p>
</blockquote>



<p class="wp-block-paragraph">The AI executes. The human directs.</p>



<h2 id="the-hardware-truth" class="wp-block-heading">The Hardware Truth</h2>



<p class="wp-block-paragraph">Here&#8217;s the part of the video I liked best. They ran the verified controller on the real pendulum and it didn&#8217;t quite work. The physical hardware behaved differently from the model.</p>



<p class="wp-block-paragraph">This is what the vibe-coding fantasy ignores. Reality disagrees with simulation, especially the first time. You will need to iterate. The thing that matters is whether you can.</p>



<p class="wp-block-paragraph">Because the team followed the workflow, they could. The model was traceable. The requirements were quantifiable. The controller was inspectable. They used the AI to update the physics model, ran it back through MIL, SIL, and PIL, and tried again. No starting over.</p>



<p class="wp-block-paragraph">The workflow doesn&#8217;t promise perfect code on the first pass. It promises code you can fix.</p>



<h2 id="the-director-pattern" class="wp-block-heading">The Director Pattern</h2>



<p class="wp-block-paragraph">A few months <a href="https://nothans.com/the-matlab-engineering-super-stack" data-type="link" data-id="https://nothans.com/the-matlab-engineering-super-stack">ago</a>, I wrote about Seth DeLand&#8217;s framing of agentic AI for engineers. The headline idea: you&#8217;re not being replaced, you&#8217;re being promoted. The engineer becomes the one who defines the problem, sets the constraints, and shapes the space where the AI works.</p>



<p class="wp-block-paragraph">The MathWorks Tech Talk is what that looks like in hardware. The AI isn&#8217;t the engineer. It&#8217;s the agent. You&#8217;re the director.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Agentic AI is powerful, but for engineering, the value comes from how you use it. You get the speed and productivity benefits of AI without sacrificing trust, safety, or understanding.&#8221;</p>



<p class="wp-block-paragraph">Brian Douglas</p>
</blockquote>



<p class="wp-block-paragraph">You don&#8217;t get speed and safety together by handing the AI a prompt and crossing your fingers. You get there by keeping the workflow you trust and letting the agent move faster inside it.</p>



<p class="wp-block-paragraph">Speed without losing safety. Productivity without losing traceability.</p>



<p class="wp-block-paragraph">For software, vibe coding is mostly fine. The blast radius is a wasted afternoon.</p>



<p class="wp-block-paragraph">For hardware, the blast radius is a sparking motor and a pendulum on the floor.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/ai-agents-for-hardware-engineering/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5431</post-id>	</item>
		<item>
		<title>ChatGPT Images 2.0 (gpt-image-2) API Tutorial</title>
		<link>https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial</link>
					<comments>https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 13:26:34 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[ChatGPT Images]]></category>
		<category><![CDATA[GenAI]]></category>
		<category><![CDATA[Generative AI]]></category>
		<category><![CDATA[Generative AI Art]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5412</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have opinions about image generation APIs, and almost none of them are flattering. Every release until now has been a slightly-better pixel machine wrapped in the same three-preset UI. Pick 1024&#215;1024, 1536&#215;1024, or 1024&#215;1536. Cross your fingers on the text. Regenerate if anything looks like soup.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="500" data-attachment-id="5413" data-permalink="https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial/image-105" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?fit=1536%2C1024&amp;ssl=1" data-orig-size="1536,1024" data-comments-opened="0" data-image-title="Tutorial lede, generated with gpt-image-2 itself at 1536&amp;#215;1024." data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?fit=750%2C500&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=750%2C500&#038;ssl=1" alt="GPT-IMAGE-2 tutorial lede, NotHans Blue to Teal Cyan typography on dark charcoal with a grid of thumbnail icons" class="wp-image-5413" style="width:535px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=1024%2C683&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=750%2C500&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=420%2C280&amp;ssl=1 420w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?resize=1320%2C880&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image-1.png?w=1536&amp;ssl=1 1536w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Tutorial lede, generated with gpt-image-2 itself at 1536&#215;1024.</figcaption></figure>
</div>


<p class="wp-block-paragraph">OpenAI shipped&nbsp;<code>gpt-image-2</code>&nbsp;on April 21, 2026, and it is the first image model that actually belongs in a production pipeline. Not because the pictures are prettier. Because the API finally does the things I kept wanting the old one to do.</p>



<h2 id="what-actually-changed" class="wp-block-heading">What actually changed</h2>



<p class="wp-block-paragraph">Three things, and you can ignore the rest of the announcement.</p>



<p class="wp-block-paragraph"><strong>It reads and writes legible text.</strong>&nbsp;OpenAI claims ~99% accuracy on typography, including CJK and right-to-left scripts. That is a big deal if you have ever tried to generate a product label or a slide deck header and gotten cursed runes back. The old model was a pixel painter. The new one is a pixel painter that can spell.</p>



<p class="wp-block-paragraph"><strong>It thinks before it draws.</strong>&nbsp;There is a reasoning pass baked into the model now, a &#8220;think about the scene, then render&#8221; step. You do not have to configure it. You do not pay a thinking-mode surcharge on the standard API call. It just converges faster. Prompts I used to iterate on three or four times now land on the first or second try.</p>



<p class="wp-block-paragraph"><strong>It edits images.</strong>&nbsp;Real editing, not &#8220;here&#8217;s a new image that vaguely resembles your old one.&#8221; You pass in a picture and a description of what you want changed, and the rest stays put. This is the capability that makes it worth wiring into a pipeline.</p>



<h2 id="the-minimum-viable-call" class="wp-block-heading">The minimum viable call</h2>



<p class="wp-block-paragraph">If you have Node 20+ and an OpenAI API key, this is the whole thing:</p>



<pre class="wp-block-code"><code>curl https://api.openai.com/v1/images/generations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2",
    "prompt": "A cinematic 4K landscape of an AI data center at twilight",
    "size": "1536x1024",
    "quality": "high"
  }'</code></pre>



<p class="wp-block-paragraph">You get back base64 image data in&nbsp;<code>data[0].b64_json</code>. Write it to a file. Done.</p>



<p class="wp-block-paragraph">One thing that tripped me up: do not send&nbsp;<code>response_format</code>. The docs say it is not supported, and they mean it. The API rejects the request with HTTP 400. All responses come back base64 only. If you want URLs, host them yourself.</p>



<h2 id="the-edit-endpoint-is-the-real-unlock" class="wp-block-heading">The edit endpoint is the real unlock</h2>



<p class="wp-block-paragraph">Here is the image I generated first, a photorealistic 4K data center at twilight:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="422" data-attachment-id="5414" data-permalink="https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial/4k-original" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?fit=2560%2C1440&amp;ssl=1" data-orig-size="2560,1440" data-comments-opened="0" data-image-title="4k-original" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?fit=750%2C422&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original.png?resize=750%2C422&#038;ssl=1" alt="Photorealistic AI data center at twilight with rows of glowing blue server racks receding to a vanishing point, original generation from gpt-image-2" class="wp-image-5414" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=1536%2C864&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=2048%2C1152&amp;ssl=1 2048w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=750%2C422&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=480%2C270&amp;ssl=1 480w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?resize=1320%2C743&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-original-scaled.png?w=2250&amp;ssl=1 2250w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">Now here is the same image after a single edit call: &#8220;replace the twilight clouds above the servers with a dramatic aurora borealis, ribbons of emerald green, magenta, and electric teal. Keep everything else unchanged.&#8221;</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="500" data-attachment-id="5415" data-permalink="https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial/4k-edited-with-aurora" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?fit=1536%2C1024&amp;ssl=1" data-orig-size="1536,1024" data-comments-opened="0" data-image-title="4k-edited-with-aurora" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?fit=750%2C500&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=750%2C500&#038;ssl=1" alt="The same AI data center scene after a gpt-image-2 edit call added a green and magenta aurora borealis to the sky, everything else preserved&quot;/&gt;<figcaption class=&quot;wp-element-caption&quot;&gt;The same scene after one gpt-image-2 edit call. No mask. Only the sky changed." class="wp-image-5415" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=1024%2C683&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=750%2C500&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=420%2C280&amp;ssl=1 420w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?resize=1320%2C880&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/4k-edited-with-aurora.png?w=1536&amp;ssl=1 1536w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">No mask. No Photoshop. The server racks are in the same positions. The orange horizon is preserved. The blue light trails between the racks still flow toward the vanishing point. Only the sky changed.</p>



<p class="wp-block-paragraph">Try doing that with gpt-image-1. You cannot. The&nbsp;<code>/v1/images/edits</code>&nbsp;endpoint existed before, but the results it gave you were not the kind of thing you shipped to production. This is the feature I was waiting for.</p>



<p class="wp-block-paragraph">The endpoint accepts multiple reference images, which you address inside the prompt as &#8220;image 1&#8221; and &#8220;image 2&#8221; for compositing. Style transfer, product placement, character relocation, all one API call.</p>



<h2 id="three-creative-moves-the-marketing-post-does-not-tell-you-about" class="wp-block-heading">Three creative moves the marketing post does not tell you about</h2>



<p class="wp-block-paragraph"><strong>Aspect ratios no one else gives you.</strong>&nbsp;The preset list is short, but&nbsp;<code>size</code>&nbsp;accepts custom values. Both dimensions must be multiples of 16, max edge 3840, aspect ratio up to 3:1, and total pixels between 655,360 and 8,294,400. That range covers Twitter cards at 1200&#215;628, Instagram stories at 1080&#215;1920, blog heroes at 1920&#215;1080, and full 4K landscapes at 3840&#215;2160. No cropping, no upscaling, no extra tooling.</p>



<p class="wp-block-paragraph">One caveat the docs hide: anything above 2,560&#215;1,440 is officially &#8220;experimental.&#8221; It works. I generated a 4K image for this post. But OpenAI is not promising SLA on it yet, so budget for occasional failures in production.</p>



<p class="wp-block-paragraph"><strong>Batch consistency.</strong>&nbsp;The&nbsp;<code>n</code>&nbsp;parameter goes up to 8, and the model keeps characters and objects consistent across the set. For a product shot or a children&#8217;s book page, one call gives you eight variations that actually share visual DNA. Eight variations at medium quality costs about thirty cents. That is a lot cheaper than eight separate prompt-engineering sessions.</p>



<p class="wp-block-paragraph"><strong>Reasoning as a debugging tool.</strong>&nbsp;Because the model thinks before drawing, iteration feels different. Vague prompts still produce vague images, but specific prompts land harder. I stopped writing six-paragraph mega-prompts and started writing three-sentence scene descriptions with hex colors and composition direction. The output got better.</p>



<h2 id="gotchas" class="wp-block-heading">Gotchas</h2>



<p class="wp-block-paragraph">Things I wish the docs had told me louder:</p>



<ul class="wp-block-list">
<li><strong>No transparent backgrounds.</strong> If you need a PNG with alpha for icon work, you still reach for <code>gpt-image-1</code>. Route by use case.</li>



<li><strong>Masks are prompt-guided, not pixel-exact.</strong> If you are coming from Stable Diffusion, this will feel wrong. The mask tells the model which region to focus on. The model decides how to blend.</li>



<li><strong>C2PA watermarks are on by default.</strong> Every image ships with provenance metadata. Useful for trust, relevant if you were hoping to redistribute without attribution.</li>



<li><strong>Streaming partials cost extra.</strong> Each <code>partial_images</code> frame adds 100 output tokens. Fine for prototyping a UI. Expensive at scale.</li>



<li><strong>Pricing is per token.</strong> $8 per million input tokens, $30 per million output tokens, with the usual caching discount. A medium 1024&#215;1024 lands around four cents. A high-quality 4K lands near eighty cents. The calculator on the docs page will save you some math.</li>
</ul>



<h2 id="where-to-take-it" class="wp-block-heading">Where to take it</h2>



<p class="wp-block-paragraph">If you are already using image generation in an app, switching is low-risk. Change the model string, drop&nbsp;<code>response_format</code>&nbsp;if you were sending it, and audit for transparent-background assumptions. Your latency will drop. Your text will be legible.</p>



<p class="wp-block-paragraph">If you are not using image generation in an app, the editing endpoint is the reason to start. Every product that has ever wanted &#8220;make this photo match our brand&#8221; can now do it with three lines of code.</p>



<p class="wp-block-paragraph">I rebuilt my cartoon pipeline around the new editing flow in about an afternoon. The first draft of this post was going to be a benchmark comparison. Then I looked at the aurora edit and realized there was nothing to benchmark. Either your tool can do it or it cannot.</p>



<p class="wp-block-paragraph"><code>gpt-image-2</code>&nbsp;can.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/chatgpt-images-2-0-gpt-image-2-api-tutorial/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5412</post-id>	</item>
		<item>
		<title>The Next GitHub Won&#8217;t Be GitHub</title>
		<link>https://nothans.com/the-next-github-wont-be-github</link>
					<comments>https://nothans.com/the-next-github-wont-be-github#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 14 Apr 2026 22:35:12 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Agentic Web]]></category>
		<category><![CDATA[github]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5403</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Scott Chacon cofounded GitHub. He wrote the book on Git. Literally.&nbsp;<em>Pro Git</em>&nbsp;has been the default resource for a decade. If anyone has earned the right to say &#8220;this is fine,&#8221; it&#8217;s him.</p>



<p class="wp-block-paragraph">He didn&#8217;t say that. He left and started building something else.</p>



<p class="wp-block-paragraph">GitButler raised $17 million to rethink version control from scratch. When the person who built the cathedral starts drawing blueprints for something new, you should probably look at the blueprints.</p>



<p class="wp-block-paragraph">In a recent interview with a16z, Chacon laid out the problem in terms that made me stop scrolling. GitHub was designed for humans. Specifically, for humans working at human speed. And that assumption is baked into everything.</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/vJiCnQeYLho?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<h2 id="the-pull-request-was-built-for-people" class="wp-block-heading">The Pull Request Was Built for People</h2>



<p class="wp-block-paragraph">Here&#8217;s the deal with pull requests. They assume someone will read them.</p>



<p class="wp-block-paragraph">You open a PR. A teammate gets a notification. Maybe today, maybe tomorrow. They click through, scan the diff, leave a comment or two, approve it, and you merge. The whole cycle takes hours or days. Sometimes weeks if the reviewer is busy or the PR is big enough to trigger &#8220;I&#8217;ll get to it later&#8221; energy.</p>



<p class="wp-block-paragraph">This works when your team is five humans shipping a few PRs a day. It even works at scale, if the scale is more humans. GitHub handled that part beautifully. Issues, reviews, discussions, profiles, stars. The social layer that made open source collaboration feel natural.</p>



<p class="wp-block-paragraph">But pull requests were never designed for a teammate that generates 200 of them before lunch.</p>



<h2 id="what-happens-at-a-thousand-prs-per-week" class="wp-block-heading">What Happens at a Thousand PRs Per Week</h2>



<p class="wp-block-paragraph">Stripe merged over a thousand agent-generated pull requests in a single week. Let that number sit for a second.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5404" data-permalink="https://nothans.com/the-next-github-wont-be-github/image-104" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?fit=1024%2C1024&amp;ssl=1" data-orig-size="1024,1024" data-comments-opened="0" data-image-title="What Happens at a Thousand PRs Per Week" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5404" style="width:646px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/04/image.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">A thousand PRs. In one week. From AI agents.</p>



<p class="wp-block-paragraph">Now picture yourself as the human on that team. Your GitHub notification count doesn&#8217;t just go up. It becomes meaningless. The PR queue isn&#8217;t a todo list anymore. It&#8217;s a firehose pointed at your inbox.</p>



<p class="wp-block-paragraph">Code review breaks first. Be honest: when you do code review, do you really read every line? Chacon asked this same question in the interview and the answer is what everyone already knows. Not always. Not even close. At a thousand PRs per week, &#8220;cursory glance&#8221; becomes &#8220;triage by title.&#8221; You&#8217;re not reviewing code. You&#8217;re reviewing your faith in the system that generated it.</p>



<p class="wp-block-paragraph">Commit history breaks next. Git log becomes a wall of &#8220;fix: update component&#8221; and &#8220;refactor: apply suggestion&#8221; with no narrative thread. The story of how your codebase evolved disappears under a flood of mechanical changes.&nbsp;<code>git blame</code>&nbsp;points to an agent. The context that used to live in commit messages evaporates.</p>



<p class="wp-block-paragraph">Notifications break last, because they were already broken. But now they&#8217;re broken at scale. The signal-to-noise ratio doesn&#8217;t degrade gracefully. It collapses.</p>



<p class="wp-block-paragraph">Chacon put it simply in the interview: the whole model assumes human-speed collaboration. When you introduce participants that work at machine speed, the model doesn&#8217;t bend. It shatters.</p>



<h2 id="the-pull-request-is-the-wrong-unit" class="wp-block-heading">The Pull Request Is the Wrong Unit</h2>



<p class="wp-block-paragraph">Here&#8217;s the question I keep coming back to: what replaces the pull request?</p>



<p class="wp-block-paragraph">Not &#8220;how do we make pull requests better for agents.&#8221; That&#8217;s the wrong question. That&#8217;s like asking how to make horse-drawn carriages faster when someone just showed you an engine.</p>



<p class="wp-block-paragraph">The pull request is a unit of collaboration designed around a specific workflow. One person makes changes. Another person reviews those changes. They discuss. They merge. It&#8217;s turn-based. It&#8217;s sequential. It&#8217;s fundamentally a conversation between two humans about a diff.</p>



<p class="wp-block-paragraph">When the &#8220;person&#8221; making changes is twelve agents working in parallel, and they&#8217;re generating changes faster than any human can read them, the conversation model doesn&#8217;t apply. You don&#8217;t need a better conversation. You need a different unit of work.</p>



<p class="wp-block-paragraph">Chacon&#8217;s answer at GitButler is interesting. They built what he calls a &#8220;mega-merge&#8221; system where multiple branches coexist in a single working directory. Agents can see what other agents are doing in real time. Conflicts surface before they happen, not after someone tries to merge.</p>



<p class="wp-block-paragraph">That&#8217;s a version control answer. But the platform question is bigger. What does the server-side look like? What does collaboration look like when most of the participants aren&#8217;t human?</p>



<h2 id="what-the-next-platform-actually-needs" class="wp-block-heading">What the Next Platform Actually Needs</h2>



<p class="wp-block-paragraph">I don&#8217;t know what the next GitHub looks like. Nobody does. But I can see the shape of the requirements from here.</p>



<p class="wp-block-paragraph"><strong>Real-time conflict detection, not post-merge.</strong>&nbsp;GitHub tells you about conflicts when you try to merge. By then, someone (or some agent) has already done the work. In a world with twelve agents writing code simultaneously, you need to know about conflicts as they form. Not after.</p>



<p class="wp-block-paragraph"><strong>Agent provenance.</strong>&nbsp;Which agent wrote this code? What prompt generated it? What was the reasoning chain? Right now, the best you get is a commit message that says &#8220;Generated by Claude&#8221; or &#8220;Co-authored-by: Copilot.&#8221; That&#8217;s like listing &#8220;computer&#8221; as the author. You need the full trail: the intent, the context, the decision points.</p>



<p class="wp-block-paragraph"><strong>Review at the intent level, not the diff level.</strong>&nbsp;Humans shouldn&#8217;t be reading thousand-line diffs generated by agents. They should be reviewing the&nbsp;<em>intent</em>: &#8220;I asked the agent to refactor the auth module to use JWT instead of session tokens.&#8221; Did it do that? Did it break anything? Let another agent verify the diff. The human reviews the goal.</p>



<p class="wp-block-paragraph"><strong>Trust scores on commits.</strong>&nbsp;Not every change carries the same risk. A CSS color change and a database migration are not equal. The platform should know this. Flag the high-risk changes for human review. Let the low-risk ones flow through with automated verification.</p>



<p class="wp-block-paragraph"><strong>Parallel visibility.</strong>&nbsp;If three agents are working on the same codebase, each one should know what the others are doing. Not through pull requests after the fact. In real time. This is what GitButler&#8217;s mega-merge is trying to solve at the local level, but it needs to exist at the platform level too.</p>



<p class="wp-block-paragraph">None of this looks like a pull request queue. It looks more like air traffic control. Multiple things moving at once, a human watching the board, stepping in when something looks wrong.</p>



<h2 id="the-builders-question" class="wp-block-heading">The Builder&#8217;s Question</h2>



<p class="wp-block-paragraph">GitHub won because it made one thing simple: collaborating on code with other humans. The entire product was built around that idea. It worked brilliantly for twenty years.</p>



<p class="wp-block-paragraph">The next platform will win by making a different thing simple: collaborating on code with a mixed team of humans and agents. That&#8217;s a different design problem. The social features that made GitHub great (profiles, stars, discussions, PR reviews) were designed for people who have attention spans, opinions, and feelings. Agents have none of those.</p>



<p class="wp-block-paragraph">Chacon said something in the interview that stuck with me. He said the constraint isn&#8217;t &#8220;can we produce the code&#8221; anymore. It&#8217;s &#8220;can we agree on what we want.&#8221; The bottleneck moved from implementation to communication. From typing to thinking.</p>



<p class="wp-block-paragraph">If that&#8217;s true, the next collaboration platform isn&#8217;t optimized for code review. It&#8217;s optimized for intent. For specification. For making sure twelve agents and three humans are all building the same thing.</p>



<p class="wp-block-paragraph">I don&#8217;t know who builds it. Maybe GitButler expands into the server side. Maybe someone we haven&#8217;t heard of yet starts from scratch. Maybe GitHub pivots faster than Chacon expects.</p>



<p class="wp-block-paragraph">But I&#8217;m pretty sure of one thing. When it arrives, it won&#8217;t look like a pull request queue.</p>



<p class="wp-block-paragraph">It&#8217;ll look like something we don&#8217;t have a name for yet.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/the-next-github-wont-be-github/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5403</post-id>	</item>
		<item>
		<title>Own Yourself: Anthropic Leaks Claude Mythos</title>
		<link>https://nothans.com/own-yourself-anthropic-leaks-claude-mythos</link>
					<comments>https://nothans.com/own-yourself-anthropic-leaks-claude-mythos#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Fri, 27 Mar 2026 19:43:18 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5384</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I use Claude every day. I write code with it. I build engineered systems with it. I brainstorm with it. I built half this blog with it. I&#8217;m a fan.</p>



<p class="wp-block-paragraph">So when I say that Anthropic just had one of the funniest self-owns in AI history, I&#8217;m saying it with genuine affection.</p>



<h2 id="what-happened" class="wp-block-heading">What Happened</h2>



<p class="wp-block-paragraph">On March 26, 2026, security researchers Roy Paz of LayerX Security and Alexandre Pauwels of the University of Cambridge found nearly 3,000 unpublished Anthropic documents sitting in a publicly accessible, unencrypted data store. Draft blog posts. Internal documents. Details about an unreleased model that the company hadn&#8217;t announced yet.</p>



<p class="wp-block-paragraph">The root cause? Anthropic&#8217;s content management system was configured to make all uploaded assets public by default. Unless someone manually toggled a setting to &#8220;private,&#8221; everything was searchable by anyone with basic technical knowledge.</p>



<p class="wp-block-paragraph">Fortune broke the story. Anthropic locked it down. But by then, everyone had already seen the surprise party decorations.</p>



<p class="wp-block-paragraph">Among the exposed drafts was a blog post describing a new model called Claude Mythos.&nbsp;<a href="https://fortune.com/2026/03/26/anthropic-says-testing-mythos-powerful-new-ai-model-after-data-leak-reveals-its-existence-step-change-in-capabilities/">Anthropic has since confirmed the model is real</a>, telling Fortune it represents &#8220;a step change&#8221; in performance and is &#8220;the most capable we&#8217;ve built to date.&#8221; A small group of early access customers is already testing it.</p>



<h2 id="meet-mythos" class="wp-block-heading">Meet Mythos</h2>



<p class="wp-block-paragraph">The leaked documents describe Mythos (internal codename &#8220;Capybara&#8221;) as a new tier of model above Opus.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5385" data-permalink="https://nothans.com/own-yourself-anthropic-leaks-claude-mythos/mythos-infographic" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?fit=1500%2C1500&amp;ssl=1" data-orig-size="1500,1500" data-comments-opened="0" data-image-title="claude mythos infographic" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5385" style="width:707px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=1024%2C1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?resize=1320%2C1320&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/mythos-infographic.png?w=1500&amp;ssl=1 1500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">Compared to Claude Opus 4.6, which only recently topped Terminal-Bench 2.0 at 65.4%, the leaked draft claims Capybara achieves &#8220;dramatically higher scores&#8221; on tests of software coding, academic reasoning, and cybersecurity.</p>



<p class="wp-block-paragraph">No specific benchmark numbers have been released. &#8220;Dramatically higher&#8221; is doing a lot of work in that sentence. But the framing is clear: Anthropic considers this a generational jump, not an incremental one.</p>



<p class="wp-block-paragraph">The model is also expensive. Anthropic acknowledged in the draft that Mythos is &#8220;very expensive for us to serve, and will be very expensive for our customers to use.&#8221; They&#8217;re working to make it more efficient before any general release.</p>



<h2 id="the-cybersecurity-paradox" class="wp-block-heading">The Cybersecurity Paradox</h2>



<p class="wp-block-paragraph">One of the leaked drafts describes Mythos as &#8220;currently far ahead of any other AI model in cyber capabilities.&#8221; It warns that the model could &#8220;exploit vulnerabilities in ways that far outpace the efforts of defenders.&#8221; Mythos can apparently find and exploit software vulnerabilities at a speed and scale that current cybersecurity tools can&#8217;t match.</p>



<p class="wp-block-paragraph">You have to appreciate the comedy here. An AI company built a model so powerful at finding security holes that they&#8217;re worried about releasing it. And the reason we know this is because they left their own security holes wide open.</p>



<p class="wp-block-paragraph">They built a model that finds vulnerabilities faster than defenders can patch them. Then they stored the announcement in a system where the default setting was &#8220;public.&#8221; The model finds flaws. The company forgot to check its own.</p>



<p class="wp-block-paragraph">Wall Street, meanwhile, was not laughing. Cybersecurity stocks dropped hard on March 27. The iShares Cybersecurity ETF fell 3%. CrowdStrike and Palo Alto Networks dropped 7%. Tenable cratered nearly 11%. Okta and Netskope fell more than 6% each. The fear isn&#8217;t just about Mythos specifically. It&#8217;s about what happens when an AI model can automate threat detection and response at scale, commoditizing the products that cybersecurity companies charge premium prices for.</p>



<h2 id="defenders-first" class="wp-block-heading">Defenders First</h2>



<p class="wp-block-paragraph">Anthropic&#8217;s release plan for Mythos is new. Instead of the usual approach (announce model, launch API, post benchmarks, collect revenue), they plan to release Mythos first to cyber defense organizations before making it broadly available.</p>



<p class="wp-block-paragraph">The logic makes sense on paper. If the model is as good at finding exploits as the leaked docs suggest, you want the defenders to have it before the attackers do. Give the good guys a head start.</p>



<p class="wp-block-paragraph">But I have questions.</p>



<p class="wp-block-paragraph">What counts as a &#8220;cyber defense organization&#8221;? Government agencies? The Pentagon? CrowdStrike? A startup with &#8220;cyber&#8221; in the name? The criteria matter. And Anthropic hasn&#8217;t shared them, because they hadn&#8217;t planned to share any of this yet.</p>



<p class="wp-block-paragraph">There&#8217;s also a part of me that wonders if this is partly great marketing. Telling the world &#8220;our model is too powerful for general release&#8221; is a very effective way to generate demand. Nothing sells like exclusivity.</p>



<p class="wp-block-paragraph">This isn&#8217;t the first time a frontier model got a staggered release. OpenAI gave the US government early access to GPT-4. But Anthropic is making the security framing explicit and central. That&#8217;s new.</p>



<h2 id="safety-as-a-brand" class="wp-block-heading">Safety as a Brand</h2>



<p class="wp-block-paragraph">Anthropic was founded in 2021 by former OpenAI researchers who left because they wanted to focus more on AI safety. That origin story is central to their identity. They&#8217;re not just an AI company. They&#8217;re the safety-first AI company. It&#8217;s in the pitch deck. It&#8217;s in every press release. It&#8217;s in the name of their alignment research.</p>



<p class="wp-block-paragraph">The thing about building your brand around safety is that people notice when you trip over your own shoelaces. Alignment research is important. Constitutional AI is interesting work. But if your CMS is set to &#8220;public by default&#8221; and nobody catches it until a security researcher at Cambridge finds your secret model in a public bucket, people are going to have some fun with that.</p>



<p class="wp-block-paragraph">This wasn&#8217;t a sophisticated attack. Nobody hacked anything. The documents were just there, sitting in the open, waiting to be found. A misconfigured toggle. &#8220;Human error,&#8221; Anthropic called it. Which, honestly, is relatable. Every engineer has shipped something with a default they forgot to change. It just usually doesn&#8217;t end up in Fortune.</p>



<p class="wp-block-paragraph">I don&#8217;t doubt that Anthropic cares about safety. I think they do. But there&#8217;s a growing gap between &#8220;philosophical safety&#8221; (how do we align superintelligent systems) and &#8220;operational safety&#8221; (how do we not leave 3,000 confidential documents in a public database). You need both. The second one is less glamorous, but it&#8217;s the one that actually tripped them up this week.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5389" data-permalink="https://nothans.com/own-yourself-anthropic-leaks-claude-mythos/image-103" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?fit=2048%2C2048&amp;ssl=1" data-orig-size="2048,2048" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=750%2C750&#038;ssl=1" alt="Claude Mythos Capybara Terminator Skynet Cartoon from NotHans.com" class="wp-image-5389" style="width:493px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=1024%2C1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?resize=1320%2C1320&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/image-9.png?w=2048&amp;ssl=1 2048w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">I&#8217;m still a fan. I&#8217;m still going to use Claude tomorrow. But I will admit there&#8217;s something poetic about a company that warns its own model could be a cybersecurity nightmare, getting undone by a CMS default setting. You couldn&#8217;t write it better if you tried.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/own-yourself-anthropic-leaks-claude-mythos/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5384</post-id>	</item>
	</channel>
</rss>
