<?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>About Things | A Hans Scharler Blog</title>
	<atom:link href="https://nothans.com/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>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>The Random Screw Bin: A Love Story.</title>
		<link>https://nothans.com/the-random-screw-bin-a-love-story</link>
					<comments>https://nothans.com/the-random-screw-bin-a-love-story#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 22 Sep 2026 15:50:28 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[makers]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[screw bin]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5701</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have a bin. Clear plastic, no label, lives on a shelf in the workshop. It&#8217;s full of screws.</p>



<p class="wp-block-paragraph">Not a set of screws. Not an organized assortment with little labeled drawers. A bin. Machine screws, wood screws, hex nuts, nylon washers, lock washers, standoffs, springs, a couple of red and black binding posts, one rubber foot from something I no longer own, and a half-crushed box of wire nails from the hardware store in the town where I grew up.</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="960" data-attachment-id="5702" data-permalink="https://nothans.com/the-random-screw-bin-a-love-story/image-149" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?fit=1318%2C1687&amp;ssl=1" data-orig-size="1318,1687" data-comments-opened="0" data-image-title="The Random Screw Bin" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?fit=750%2C960&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=750%2C960&#038;ssl=1" alt="The Random Screw Bin" class="wp-image-5702" style="width:532px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=800%2C1024&amp;ssl=1 800w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=234%2C300&amp;ssl=1 234w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=768%2C983&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=1200%2C1536&amp;ssl=1 1200w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?resize=750%2C960&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/image.png?w=1318&amp;ssl=1 1318w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">The Random Screw Bin</figcaption></figure>
</div>


<p class="wp-block-paragraph">Every piece in there came off something. That&#8217;s the rule of the bin. Nothing goes in new. It goes in when a project ends, when a gadget dies, when I take something apart to see how it works and it doesn&#8217;t go back together the same way (which is most of the time, right).</p>



<h2 id="how-it-started" class="wp-block-heading">How It Started</h2>



<p class="wp-block-paragraph">I didn&#8217;t decide to start a screw bin. It happened. It started small. You&#8217;re cleaning up after a project and there are four leftover screws on the bench and you can&#8217;t throw them out because they&#8217;re perfectly good screws. So you put them in a cup. Then the cup gets full and you move them to a bag. Then the bag rips, and you buy a bin.</p>



<p class="wp-block-paragraph">That was decades ago. I know it was decades because that box of wire nails is 25 years old. I bought it at the hardware store where I grew up, and it has been riding along ever since.</p>



<p class="wp-block-paragraph">The binding posts are from a bench power supply project. The nylon standoffs are from a stack of circuit boards I built during the ioBridge days. Some of the tiny machine screws came out of hard drives that stopped spinning a long time ago. Every layer is a different era. It&#8217;s a core sample of my hobbies.</p>



<h2 id="it-has-survived-many-moves" class="wp-block-heading">It Has Survived Many Moves</h2>



<p class="wp-block-paragraph">Here&#8217;s the part that gets me. That bin has survived several moves. Different houses, different states, a couple of trucks. Every time we packed, there was a moment where someone (usually me) held the bin up and asked the question: do we really need to move a box of random screws across state lines?</p>



<p class="wp-block-paragraph">And every time, the bin got in the truck.</p>



<p class="wp-block-paragraph">Not because I had a plan for it. Because throwing it out felt like throwing out a tool. A weird tool that only works one time in fifty.</p>



<p class="wp-block-paragraph">Now my bag of parallel port cables for my printer and ZIP drives didn&#8217;t survive.</p>



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



<p class="wp-block-paragraph">Working on a pinball machine, I needed the perfect screw and bracket. I spent a half hour digging through the bin, partially remembering I had something like what I was thinking. Then, I found it. It was exhilarating.</p>



<p class="wp-block-paragraph">This has happened more than once. A washer. A bolt for a part I didn&#8217;t even know I needed until I needed it. A standoff with the exact thread for a board I was mounting. A nut that fit the one bolt I had left. Every save felt like winning a tiny lottery I had been buying tickets for over decades.</p>



<p class="wp-block-paragraph">I also never took the time to properly acknowledge the random screw bin. This is my love letter and my attempt to correct the record.</p>



<h2 id="start-yours" class="wp-block-heading">Start Yours</h2>



<p class="wp-block-paragraph">If you build things, start a bin. Today. Any container. Put the leftover screws in it instead of the trash. Don&#8217;t sort it, don&#8217;t label it, and don&#8217;t judge it. A coffee can? Start small&#8230; An Altoids box. Just have fun with it.</p>



<p class="wp-block-paragraph">In ten years, at 9 PM, one screw short, you&#8217;ll be glad it exists. And, you can tell your partner, see, I was right to keep this bin!</p>



<p class="wp-block-paragraph">And when you move, it goes in the truck. And your kids&#8217; kids will be puzzled when they find it. What was grandpa doing with one giant locking washer? Then, they will start one with the gregs of yours, and thank you when they blog using a brain implant. I am certain blogging will survive Web 4.0.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/the-random-screw-bin-a-love-story/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5701</post-id>	</item>
		<item>
		<title>CABLE 82 Project Update: Run Your Own Cable Network with New Channels</title>
		<link>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels</link>
					<comments>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 01 Sep 2026 16:20:26 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[TV]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5685</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">CABLE 82 started as one channel: a 1982-style community bulletin board on a Raspberry Pi, broadcast over RF to a 1987 Magnavox. With my latest GitHub release,&nbsp;<a href="https://github.com/nothans/cable-82/releases/tag/v0.2.0">v0.2.0, &#8220;The dial&#8221;</a>, the CABLE 82 project becomes a cable network. And, you set the programming.</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="5696" data-permalink="https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels/cable-82" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="Run Your Own Cable Network with the CABLE 82 project" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5696" style="width:535px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?w=2000&amp;ssl=1 2000w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


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



<ul class="wp-block-list">
<li><strong>Video channels.</strong>&nbsp;Drop video files in a folder and point a channel at it. My folder of 90s commercials is now channel 2, for example.</li>



<li><strong>A broadcast clock.</strong>&nbsp;Channels air whether you&#8217;re watching or not. Tune away, tune back, and you land mid-program.</li>



<li><strong>Scheduled hours.</strong>&nbsp;Cartoons can keep Saturday-morning hours. Off the air, the channel shows a test card with the resume time, color bars, or static.</li>



<li><strong>A tuner.</strong>&nbsp;Change channels with arrow keys, a USB gamepad, or an HTTP request. Every change cuts through a moment of tuner static and shows a channel banner.</li>



<li><strong>A demo channel.</strong>&nbsp;<code>node channels/fetch-demo-channel.js</code>&nbsp;downloads eight public-domain films from the Internet Archive&#8217;s Prelinger collection. Duck and Cover, Design for Dreaming, One Got Fat. A working channel in one command.</li>



<li><strong>The control room.</strong>&nbsp;A Channels panel with a folder picker, a schedule editor, and a week grid of your on-air windows.</li>
</ul>



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



<p class="wp-block-paragraph">A normal media player has a play state: what&#8217;s playing, where you paused, what&#8217;s next. A cable channel has none of that. Its position is a pure function of the wall clock: given the playlist and the time of day, the channel knows exactly what should be on the air and how far into it we are.</p>



<p class="wp-block-paragraph">That means there is nothing to save and nothing to resume. Tune to channel 2 at 9:14 and you join a commercial already in progress, like TV that doesn&#8217;t wait for you. </p>



<h2 id="i-changed-channels-with-an-atari-joystick" class="wp-block-heading">I changed channels with an Atari joystick</h2>



<p class="wp-block-paragraph">The tuner reads NES-style D-pad buttons and the analog axis, so when I plugged in a single-button Atari USB stick, up and down worked on the first try. A 1977-style controller changing channels on a 1987 television driven by a modern Raspberry Pi. The input doesn&#8217;t care what you use: anything that can press a key, close a GPIO pin, or POST to&nbsp;<code>/api/tune</code>&nbsp;is a remote control.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="CABLE 82 -- Run Your Own Cable Network from a Raspberry Pi!  #raspberrypi #crt" width="563" height="1000" src="https://www.youtube.com/embed/E5Xh6JH8H08?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">My CABLE 82 network has a channel dedicated to 80s commercials, 90s commercials, retro movies, Beavis and Butthead, music videos, Transformers, Saturday morning cartoons, and the community bulletin board. I have been busy copying old VHS tapes to MP4.</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/KROAE0mn7vo?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="thermals" class="wp-block-heading">Thermals</h2>



<p class="wp-block-paragraph">Software video decode is the hardest this Pi has ever worked. The bulletin board alone kept the 3 B+ in the high 50s C; continuous video holds it in the low 60s. That trips the 3 B+&#8217;s soft temperature cap at 60 C (<code>vcgencmd get_throttled</code>&nbsp;reports&nbsp;<code>0x80008</code>), which is the chip protecting itself by design &#8211; not a power problem, and the picture doesn&#8217;t care.</p>



<p class="wp-block-paragraph">Passive cooling has been fine, but a network that broadcasts around the clock earns a fan. I&#8217;m looking at a&nbsp;<a href="https://www.amazon.com/gp/product/B0B79JHSFW?tag=nothans">Raspberry Pi 3 case with a fan and heatsinks</a>. It also comes with a 3A supply with a power switch, but don&#8217;t use the power switch. Send a proper shutdown signal to the Raspberry Pi. Older Pi&#8217;s can corrupt the SD card.</p>



<h2 id="get-the-latest-cable-82-release" class="wp-block-heading">Get the latest CABLE 82 release</h2>



<pre class="wp-block-code"><code>git clone https://github.com/nothans/cable-82
cd cable-82
node server.js</code></pre>



<p class="wp-block-paragraph">Open the address it prints and you&#8217;re on the air with channel 82, the community bulletin board. Run the demo channel fetcher, add it in the control room, and you have a network. </p>



<p class="wp-block-paragraph">The repo is at&nbsp;<a href="https://github.com/nothans/cable-82">github.com/nothans/cable-82</a>. The original&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">build story</a>&nbsp;and the&nbsp;<a href="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv">step-by-step tutorial</a>&nbsp;cover the build from a blank SD card to a cable network of your own.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5685</post-id>	</item>
		<item>
		<title>CABLE 82 TV Channel Build Tutorial (Rasbperry Pi 3 B+ and Old CRT TV)</title>
		<link>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv</link>
					<comments>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 19:40:30 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5604</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Last month I published&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">CABLE 82</a>, a recreation of the 1982 cable community bulletin board channel that runs on a Raspberry Pi and an old CRT. That post covered the software and the shape of the hardware. Then a reader with a Pi 3 B+ hit &#8220;localhost refused to connect,&#8221; we went back and forth in the comments, and I realized I had never written down the whole build. I will take you from a blank SD card to a glowing tube.</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="5682" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/image-148" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="CABLE 82 Dialed In on a Magnavox TV from 1987" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5682" style="width:540px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?w=2000&amp;ssl=1 2000w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">CABLE 82 Dialed In on a Magnavox TV from 1987</figcaption></figure>
</div>


<p class="wp-block-paragraph">The TV is a Magnavox portable from Facebook Marketplace, a Perfect View from August 1987, the kind with a handle on top, a rod antenna, and a 12V jack so you could watch it in the car.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="395" height="431" data-attachment-id="5658" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-marketplace-listing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" data-orig-size="395,431" data-comments-opened="0" data-image-title="Magnavox marketplace listing" data-image-description="" data-image-caption="&lt;p&gt;The Marketplace listing: a black Magnavox portable CRT showing static&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=395%2C431&#038;ssl=1" alt="The Marketplace listing: a black Magnavox portable CRT showing static" class="wp-image-5658" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?w=395&amp;ssl=1 395w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=275%2C300&amp;ssl=1 275w" sizes="auto, (max-width: 395px) 100vw, 395px" /></figure>
</div>


<p class="wp-block-paragraph">The Pi is a 3 Model B+, the same board the reader had.</p>



<h2 id="the-false-start-the-original-2012-pi" class="wp-block-heading">The false start: the original 2012 Pi</h2>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="697" height="544" data-attachment-id="5672" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-model-b-and-debian6-sd-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" data-orig-size="697,544" data-comments-opened="0" data-image-title="Pi model b and debian6 sd card" data-image-description="" data-image-caption="&lt;p&gt;The original Raspberry Pi Model B from 2012 with the element14 &amp;#8220;Debian 6 for Linux&amp;#8221; SD card it shipped with&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=697%2C544&#038;ssl=1" alt="The original Raspberry Pi Model B from 2012 with the element14 &quot;Debian 6 for Linux&quot; SD card it shipped with" class="wp-image-5672" style="width:523px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?w=697&amp;ssl=1 697w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=300%2C234&amp;ssl=1 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>
</div>


<p class="wp-block-paragraph">My first instinct was to do this on the least capable Pi in the house: the original Model B, board marked &#8220;(c)2011.12&#8221;, with the 4GB &#8220;Debian 6 for Linux&#8221; card it came with. Raspberry Pi OS still supports it, which is remarkable for a 2012 computer, and Node.js 20 installs from&nbsp;<code>apt</code>. The server half of CABLE 82 would run fine.</p>



<p class="wp-block-paragraph">The TV half would not. The original Pi&#8217;s chip is ARMv6, and no current browser runs on it. Raspberry Pi dropped Chromium for ARMv6 in 2023; on the current OS it prints &#8220;This hardware doesn&#8217;t support NEON SIMD extensions&#8221; and quits. Firefox is built for ARMv7 and dies the same way. The one engine left is WebKit, with no JavaScript JIT, on a 700MHz core. I looked at that path for a while&#8230; and decided the tutorial should be about the channel, not about heroics.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="728" height="509" data-attachment-id="5657" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-3b-plus-and-16gb-microsd-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" data-orig-size="728,509" data-comments-opened="0" data-image-title="Pi 3b plus and 16gb microsd" data-image-description="" data-image-caption="&lt;p&gt;The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=728%2C509&#038;ssl=1" alt="The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel" class="wp-image-5657" style="width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?w=728&amp;ssl=1 728w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=300%2C210&amp;ssl=1 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure>
</div>


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



<ul class="wp-block-list">
<li>Raspberry Pi 3 Model B+&nbsp;(or any Pi 2 or newer; a Pi 4 is a fine choice too).</li>



<li>16GB or larger microSD card.&nbsp;Mine is a SanDisk Ultra PLUS 16GB.</li>



<li>Micro-USB power supply, 5V at 2.5A. The 3 B+ is the last micro-USB Pi.</li>



<li>A network connection<strong>.</strong>&nbsp;Ethernet is simplest for the first boot; the 3 B+ also has Wi-Fi.</li>



<li>4:3 CRT with a coax antenna input.&nbsp;Almost every tube TV has one, which is why this is the path that works for everybody. Mine has nothing else: one F connector marked EXT ANT and a switch to pick it over the built-in rod antenna.</li>



<li><a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, the little box that turns HDMI into channel 3 or 4 on the antenna input, plus a short coax cable. Mine is an &#8220;HDM61&#8221; unit; the same design is sold under a dozen brand names.</li>



<li>Another computer to flash the card and to SSH into the Pi (needs to be on the same network as the Raspberry Pi).</li>
</ul>



<h2 id="step-1-put-the-os-on-the-card" class="wp-block-heading">Step 1: Put the OS on the card</h2>



<h3 id="which-image-and-why" class="wp-block-heading">Which image, and why</h3>



<p class="wp-block-paragraph"><strong>Raspberry Pi OS (64-bit), the desktop edition.</strong>&nbsp;It is the image Raspberry Pi&#8217;s own kiosk tutorial tells you to use, and there are two practical reasons to follow that advice on a 3 B+:</p>



<ol class="wp-block-list">
<li>Chromium is the browser that will show the channel, and the 64-bit build is the one that has been solid on Pi 3 boards (the 32-bit build had a will-not-start bug on the Pi 3 as recently as this summer).</li>



<li>Node.js 22 from NodeSource is 64-bit only now; their installer refuses 32-bit outright.</li>
</ol>



<p class="wp-block-paragraph">The image is a 1.3GB download and takes about 6GB on the card, so 16GB leaves plenty of room.</p>



<h3 id="flash-it-with-raspberry-pi-imager" class="wp-block-heading">Flash it with Raspberry Pi Imager</h3>



<p class="wp-block-paragraph">Raspberry Pi Imager is the right tool here, and not balenaEtcher or&nbsp;<code>dd</code>, because it can bake the hostname, your user, and SSH into the card before the Pi ever boots. That is what makes the headless setup work. Install it from&nbsp;<a href="https://www.raspberrypi.com/software/">raspberrypi.com/software</a>, put the card in your computer, and walk the steps down the left side.</p>



<p class="wp-block-paragraph"><strong>Device: Raspberry Pi 3.</strong>&nbsp;This filters the OS list to images that run on the 3 family (A+, B, B+, and Compute Module 3).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5656" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-device-raspberry-pi-3-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager device raspberry pi 3" data-image-description="" data-image-caption="&lt;p&gt;Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=682%2C482&#038;ssl=1" alt="Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected" class="wp-image-5656" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>OS: Raspberry Pi OS (64-bit).</strong>&nbsp;The top entry, marked Recommended. Not the 32-bit one and not the &#8220;Legacy&#8221; one; Legacy is the older Bookworm release.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5659" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-os-raspberry-pi-os-64-bit-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager os raspberry pi os 64 bit" data-image-description="" data-image-caption="&lt;p&gt;Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18" class="wp-image-5659" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>Storage: the SD card.</strong>&nbsp;Imager hides your system drives by default, so the only thing in the list should be the card. Mine shows up as a 14.8GB &#8220;Generic MassStorageClass USB Device&#8221; because it is in a USB reader; a 16GB card really is about 14.8GB once you count the way computers count.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5662" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-storage-16gb-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager storage 16gb card" data-image-description="" data-image-caption="&lt;p&gt;Imager Storage step showing the 14.8GB USB card reader mounted as I:\&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Storage step showing the 14.8GB USB card reader mounted as I:\" class="wp-image-5662" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>Customisation.</strong>&nbsp;This is the part Etcher cannot do, and the reason the Pi will come up on the network with no screen attached.</p>



<ul class="wp-block-list">
<li><strong>Hostname:</strong>&nbsp;<code>cable82</code>. That gives you&nbsp;<code>cable82.local</code>&nbsp;later, so you never have to go looking for an IP address.</li>



<li><strong>Localisation:</strong>&nbsp;your time zone and keyboard layout. The clock on the channel runs off the Pi&#8217;s time zone, so get this right.</li>



<li><strong>User:</strong>&nbsp;a username and password you will remember. You will type them into SSH in a few minutes.</li>



<li><strong>Wi-Fi:</strong>&nbsp;your network name and password. I set it even though the Pi would be on Ethernet for the build; it means the finished TV can live anywhere in the house.</li>



<li><strong>Remote access:</strong>&nbsp;<strong>enable SSH</strong>, password authentication. I also left Raspberry Pi Connect on, which gives you a browser-based remote shell to the Pi from anywhere, handy for a TV that lives in a corner.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5660" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-hostname-cable82-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager hostname cable82" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation: hostname set to cable82&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation: hostname set to cable82" class="wp-image-5660" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5663" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-ssh-enabled-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager ssh enabled" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation, Remote access: Enable SSH on, password authentication&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation, Remote access: Enable SSH on, password authentication" class="wp-image-5663" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p class="wp-block-paragraph">Then&nbsp;<strong>Write</strong>. Imager asks once more whether it can erase the card, downloads the image, writes it, and verifies it. The write was the slow part: this card takes data at about 10MB/s, so the 6GB image plus verification took about fifteen minutes.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5661" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-writing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager writing" data-image-description="" data-image-caption="&lt;p&gt;Imager, write in progress at 9MB/s&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write in progress at 9MB/s" class="wp-image-5661" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5664" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-write-complete-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager write complete" data-image-description="" data-image-caption="&lt;p&gt;Imager, write complete, with the list of customisations applied&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write complete, with the list of customisations applied" class="wp-image-5664" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<h3 id="first-boot" class="wp-block-heading">First boot</h3>



<p class="wp-block-paragraph">Imager ejects the card when it is done. Card into the Pi, Ethernet in, power in. The green light flickers for a while: the first boot resizes the filesystem to fill the card, generates SSH keys, and runs a one-time setup pass. Mine answered on the network in well under two minutes. Then from your computer:</p>



<pre class="wp-block-code"><code>ssh yourname@cable82.local</code></pre>



<p class="wp-block-paragraph">(If&nbsp;<code>.local</code>&nbsp;does not resolve on your machine, your router&#8217;s device list will show a&nbsp;<code>cable82</code>&nbsp;with an IP address; SSH to that instead.)</p>



<p class="wp-block-paragraph">Three things to check while you are in:</p>



<pre class="wp-block-code"><code>head -2 /etc/os-release
free -m
df -h /</code></pre>



<p class="wp-block-paragraph">Mine came back Debian 13 (trixie), 905MB of memory with about 570MB available, and a 15GB root partition with 8.4GB free after the 6GB image. The Pi had been up eight minutes by the time I got around to asking. Then bring the image current:</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt full-upgrade -y</code></pre>



<p class="wp-block-paragraph">(<code>sudo</code>&nbsp;asks for your password; recent Raspberry Pi OS releases turned off passwordless sudo by default.)</p>



<p class="wp-block-paragraph">The Pi is on the network, current, and answering SSH.</p>



<h2 id="step-2-nodejs" class="wp-block-heading">Step 2: Node.js</h2>



<p class="wp-block-paragraph">CABLE 82 is a Node.js app with no dependencies, so Node is the only thing to install. It needs Node 18 or newer, and a fresh Raspberry Pi OS has none at all:</p>



<pre class="wp-block-code"><code>$ node -v
bash: node: command not found</code></pre>



<p class="wp-block-paragraph">That line, by the way, is almost certainly what was behind the reader&#8217;s &#8220;localhost refused to connect.&#8221; No Node, no server, nothing listening, and the browser reports it as a refused connection.</p>



<p class="wp-block-paragraph">Two ways to get Node on a 64-bit Pi. The quick one is the distro&#8217;s own package,&nbsp;<code>sudo apt install nodejs</code>, which gives you Node 20. I went with NodeSource for Node 22, the current long-term-support line, and it is two commands:</p>



<pre class="wp-block-code"><code>curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v</code></pre>



<p class="wp-block-paragraph">Mine printed&nbsp;<code>v22.23.2</code>. (NodeSource only builds for 64-bit now; if you flashed the 32-bit image, use the&nbsp;<code>apt</code>&nbsp;route.)</p>



<h2 id="step-3-cable-82-on-the-air" class="wp-block-heading">Step 3: CABLE 82 on the air</h2>



<p class="wp-block-paragraph">With Node in place, the channel itself is next. Clone it and start it:</p>



<pre class="wp-block-code"><code>cd ~
git clone https://github.com/nothans/cable-82
cd cable-82
node server.js</code></pre>



<p class="wp-block-paragraph">It prints every address it answers on:</p>



<pre class="wp-block-code"><code>CABLE 82 broadcasting
  http://localhost:1982   (a browser on this machine)
  http://192.168.68.93:1982   (a browser on another device on your network)
Control room: http://localhost:1982/config</code></pre>



<p class="wp-block-paragraph">Read that second line carefully, because it is the other half of the reader&#8217;s problem.&nbsp;<code>localhost</code>&nbsp;means &#8220;this machine.&#8221; Typed into a browser on your laptop, it asks the laptop for a channel it does not have. The&nbsp;<code>192.168.x.x</code>&nbsp;address is the Pi as seen from everywhere else on your network, and that is the one to open from the laptop. I did, and the channel was there: blue screen, the clock, the crawl.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5673" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/channel-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Channel from laptop" data-image-description="" data-image-caption="&lt;p&gt;The channel from a browser on the laptop: blue clock page, LATEST crawl&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The channel from a browser on the laptop: blue clock page, LATEST crawl" class="wp-image-5673" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p class="wp-block-paragraph">The first run also writes a&nbsp;<code>config.json</code>&nbsp;next to the server, which is where everything you change in the control room ends up. Open&nbsp;<code>http://192.168.68.93:1982/config</code>&nbsp;from the laptop and make it yours: channel name, your messages, your feeds, your town for the weather. Save, and the channel picks it up within about twenty seconds.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5674" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Control room from laptop" data-image-description="" data-image-caption="&lt;p&gt;The control room from the laptop: the whole channel in one screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The control room from the laptop: the whole channel in one screen" class="wp-image-5674" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<h3 id="make-it-a-service" class="wp-block-heading">Make it a service</h3>



<p class="wp-block-paragraph">Ctrl-C the server and hand it to systemd so it runs at boot and restarts if it ever dies. Create&nbsp;<code>/etc/systemd/system/cable82.service</code>:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=CABLE 82
After=network-online.target

&#91;Service]
ExecStart=/usr/bin/node /home/cable82/cable-82/server.js
Restart=always
User=cable82

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">Both&nbsp;<code>cable82</code>s are my username; use yours (<code>whoami</code>&nbsp;tells you, and&nbsp;<code>which node</code>&nbsp;confirms the path on the&nbsp;<code>ExecStart</code>&nbsp;line). Then:</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now cable82
systemctl status cable82</code></pre>



<p class="wp-block-paragraph"><code>active (running)</code>&nbsp;with the broadcasting lines in its log, and&nbsp;<code>sudo journalctl -u cable82 -f</code>&nbsp;is where to look if anything is ever wrong. The server sits at about 46MB of memory.</p>



<h2 id="step-4-chromium-in-kiosk-mode" class="wp-block-heading">Step 4: Chromium in kiosk mode</h2>



<p class="wp-block-paragraph">The desktop image already logs in automatically and starts a Wayland session (the compositor is called labwc; the old LXDE desktop from earlier Pi OS releases is gone). Chromium 151 is preinstalled. All we have to do is tell the session to open Chromium full screen on the channel at login.</p>



<p class="wp-block-paragraph">The file for that is&nbsp;<code>~/.config/labwc/autostart</code>. Create it with these lines:</p>



<pre class="wp-block-code"><code># CABLE 82 kiosk: wait for the channel server, then put Chromium on it full screen.
until curl -s -o /dev/null http://localhost:1982; do sleep 1; done
/usr/bin/lwrespawn /usr/bin/chromium http://localhost:1982   --kiosk --noerrdialogs --disable-infobars --no-first-run --no-memcheck   --disable-lcd-text --autoplay-policy=no-user-gesture-required   --enable-features=OverlayScrollbar --password-store=basic --start-maximized &amp;</code></pre>



<p class="wp-block-paragraph">A few of those deserve a word:</p>



<ul class="wp-block-list">
<li>The&nbsp;<code>until curl</code>&nbsp;loop waits for the server to answer before launching the browser. Without it, Chromium can win the race at boot and show &#8220;localhost refused to connect&#8221; on the TV, and nothing ever tells it to try again.</li>



<li><code>lwrespawn</code>&nbsp;is a Raspberry Pi helper that restarts a program if it dies, so a crash brings the channel back instead of leaving a blank desktop.</li>



<li><code>--no-memcheck</code>&nbsp;stops Chromium from popping a low-memory warning over the channel on a 1GB board.</li>



<li><code>--autoplay-policy=no-user-gesture-required</code>&nbsp;lets the background music start without anyone clicking.</li>



<li><code>--disable-lcd-text</code>&nbsp;turns off subpixel font smoothing so the chunky text stays crisp white instead of going pink at the edges.</li>



<li><code>--password-store=basic</code>&nbsp;keeps the desktop keyring from asking for a password at login.</li>
</ul>



<p class="wp-block-paragraph">Then turn off screen blanking, or the TV goes dark after ten minutes:</p>



<pre class="wp-block-code"><code>sudo raspi-config nonint do_blanking 1</code></pre>



<p class="wp-block-paragraph">(Or interactively:&nbsp;<code>sudo raspi-config</code>&nbsp;&gt; Display Options &gt; Screen Blanking &gt; No.)</p>



<p class="wp-block-paragraph">If you are here from the original post: the&nbsp;<code>chromium-browser --kiosk</code>&nbsp;line and the&nbsp;<code>/etc/xdg/lxsession/LXDE-pi/autostart</code>&nbsp;file in that post were for the previous Pi OS release. On Trixie the binary is&nbsp;<code>chromium</code>&nbsp;and the file is the labwc one above.</p>



<p class="wp-block-paragraph">Reboot. About a minute later Chromium was running full screen on the channel. I could tell from the laptop before the TV was even connected:</p>



<pre class="wp-block-code"><code>$ pgrep -a chromium | head -1
1407 /usr/lib/chromium/chromium ... --kiosk ... http://localhost:1982</code></pre>



<h3 id="check-the-power-supply-while-you-are-here" class="wp-block-heading">Check the power supply while you are here</h3>



<p class="wp-block-paragraph">This section wasn&#8217;t what I expected. My first run was off a phone charger&#8230;</p>



<pre class="wp-block-code"><code>$ vcgencmd get_throttled
throttled=0xd0005
$ vcgencmd measure_clock arm
frequency(48)=600064000</code></pre>



<p class="wp-block-paragraph">Any bit set in&nbsp;<code>get_throttled</code>&nbsp;is a complaint;&nbsp;<code>0x5</code>&nbsp;means under-voltage and throttling right now, and the clock line shows a 1.4GHz Pi running at 600MHz. It worked, in the sense that the channel was on, but at less than half speed. With a proper 5V 2.5A supply the under-voltage bits cleared and the clock came back up. If you only run one check from this whole post on an existing Pi, run that one.</p>



<p class="wp-block-paragraph">(On a 3 B+ you may still see&nbsp;<code>0x80008</code>&nbsp;with a 1.2GHz clock: that is the board&#8217;s own soft temperature limit at 60C, normal with Chromium running, and nothing to do with power.)</p>



<h2 id="step-5-the-crt" class="wp-block-heading">Step 5: The CRT</h2>



<p class="wp-block-paragraph"><em>Note on photos of the TV&#8230; it turns out to be surprisingly hard to get a good photo of the screen. My phone didn&#8217;t capture it well. Also, the screen had a giant smudge backed into the acrylic covering the TV. I had to use Novus 2 polish to clean up the smudge and scratches. I assure you that it looks better in person&#8230;</em></p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5671" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/first-picture-on-the-magnavox-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="First picture on the magnavox" data-image-description="" data-image-caption="&lt;p&gt;The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet" class="wp-image-5671" style="width:316px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">The Magnavox has exactly one way in: an F connector marked EXT ANT.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="403" height="547" data-attachment-id="5665" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-back-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" data-orig-size="403,547" data-comments-opened="0" data-image-title="Magnavox back panel" data-image-description="" data-image-caption="&lt;p&gt;The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=403%2C547&#038;ssl=1" alt="The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna" class="wp-image-5665" style="width:293px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?w=403&amp;ssl=1 403w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=221%2C300&amp;ssl=1 221w" sizes="auto, (max-width: 403px) 100vw, 403px" /></figure>
</div>


<p class="wp-block-paragraph">So the path is HDMI out of the Pi into a small&nbsp;<a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, coax from the modulator into the TV, and the TV tuned to channel 3. The box is the size of a cassette tape, takes USB power, has a CH3/CH4 switch, and its spec sheet says everything you need to know: NTSC out, 480p to 1080p in, sound on the 4.5MHz carrier (that means mono, the way 1982 did it).</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="730" data-attachment-id="5666" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/hdm61-modulator-specs-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=1500%2C1459&amp;ssl=1" data-orig-size="1500,1459" data-comments-opened="0" data-image-title="Hdm61 modulator specs" data-image-description="" data-image-caption="&lt;p&gt;The modulator&amp;#8217;s spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=750%2C729&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&#038;ssl=1" alt="The modulator's spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz" class="wp-image-5666" style="aspect-ratio:1.0281124497991967;width:447px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?w=1500&amp;ssl=1 1500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=300%2C292&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1024%2C996&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=768%2C747&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1320%2C1284&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5670" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/modulator-and-tv-clock-page-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Modulator and tv clock page" data-image-description="" data-image-caption="&lt;p&gt;The HDMI-to-RF modulator and the TV, clock page on screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The HDMI-to-RF modulator and the TV, clock page on screen" class="wp-image-5670" style="width:408px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">Plug it all in and the channel was on the tube.</p>



<h3 id="send-it-a-43-picture" class="wp-block-heading">Send it a 4:3 picture</h3>



<p class="wp-block-paragraph">The box scales whatever it gets to fill the 4:3 tube. CABLE 82 draws a 4:3 stage, so if the Pi sends a widescreen mode, the stage gets squashed. The Pi has to output 640&#215;480. On current Raspberry Pi OS the old&nbsp;<code>hdmi_group</code>&nbsp;and&nbsp;<code>hdmi_mode</code>&nbsp;lines in&nbsp;<code>config.txt</code>&nbsp;are dead; the kernel takes its orders from&nbsp;<code>cmdline.txt</code>, and the desktop then picks its own mode on top of that. So it takes two small files.</p>



<p class="wp-block-paragraph">Append to the end of the single long line in&nbsp;<code>/boot/firmware/cmdline.txt</code>:</p>



<pre class="wp-block-code"><code>video=HDMI-A-1:640x480@60D vc4.force_hotplug=1</code></pre>



<p class="wp-block-paragraph">The&nbsp;<code>D</code>&nbsp;forces the output on even when nothing answers, and&nbsp;<code>force_hotplug</code>&nbsp;keeps it on if the modulator never raises the hotplug pin (mine does not). Then pin the desktop to the same mode in&nbsp;<code>~/.config/kanshi/config</code>:</p>



<pre class="wp-block-code"><code>profile crt {
  output HDMI-A-1 mode 640x480 position 0,0
}</code></pre>



<p class="wp-block-paragraph">Without that second file, the desktop on my Pi happily chose 1024&#215;768 on top of the kernel&#8217;s 640&#215;480.</p>



<h3 id="give-it-an-edid-so-there-is-sound" class="wp-block-heading">Give it an EDID, so there is sound</h3>



<p class="wp-block-paragraph">The first picture had no audio, and the reason is a good one: cheap modulators send no EDID, the little data block a screen uses to introduce itself. No EDID means the Pi does not know the &#8220;screen&#8221; can hear, and it refuses to send HDMI audio at all. So I made it one. The CABLE 82 <a href="https://github.com/nothans/cable-82">repo</a> now ships a 256-byte EDID that describes a 640&#215;480 4:3 screen with stereo audio (<code>edid/cable82-640x480-audio.bin</code>, with the script that generates it). Hand it to the kernel:</p>



<pre class="wp-block-code"><code>sudo mkdir -p /lib/firmware/edid
sudo cp ~/cable-82/edid/cable82-640x480-audio.bin /lib/firmware/edid/cable82.bin</code></pre>



<p class="wp-block-paragraph">and add one more parameter to that same&nbsp;<code>cmdline.txt</code>&nbsp;line:</p>



<pre class="wp-block-code"><code>drm.edid_firmware=HDMI-A-1:edid/cable82.bin</code></pre>



<p class="wp-block-paragraph">Reboot.&nbsp;<code>wpctl status</code>&nbsp;now lists an HDMI sink next to the headphone jack; make it the default and give it some level (WirePlumber remembers):</p>



<pre class="wp-block-code"><code>wpctl status                       # find the "(HDMI)" sink's number
wpctl set-default &lt;number&gt;
wpctl set-volume &lt;number&gt; 0.8</code></pre>



<p class="wp-block-paragraph">The channel&#8217;s music came out of the Magnavox&#8217;s speaker on the next page turn.</p>



<h3 id="hide-the-cursor" class="wp-block-heading">Hide the cursor</h3>



<p class="wp-block-paragraph">A mouse pointer sat in the middle of the picture with no mouse attached. The HDMI CEC input counts as a pointer device, so the desktop draws one. The fix is a labwc keybinding that hides it, pressed automatically after boot. Copy&nbsp;<code>/etc/xdg/labwc/rc.xml</code>&nbsp;to&nbsp;<code>~/.config/labwc/rc.xml</code>, add inside&nbsp;<code>&lt;keyboard&gt;</code>:</p>



<pre class="wp-block-code"><code>&lt;keybind key="A-W-h"&gt;&lt;action name="HideCursor"/&gt;&lt;/keybind&gt;</code></pre>



<p class="wp-block-paragraph">then&nbsp;<code>sudo apt install wtype</code>&nbsp;and add to the end of&nbsp;<code>~/.config/labwc/autostart</code>:</p>



<pre class="wp-block-code"><code>(sleep 10; wtype -M alt -M logo -P h -p h -m logo -m alt) &amp;</code></pre>



<h3 id="the-detour-composite" class="wp-block-heading">The detour: composite</h3>



<p class="wp-block-paragraph">Before the HDMI modulator arrived I tried the other way in: the Pi&#8217;s 3.5mm AV jack, a 4-pole cable to yellow/red/white, and an old composite-to-RF adapter. On a Pi 3 that means&nbsp;<code>sudo raspi-config nonint do_composite 0</code>, which turns HDMI off; on every Pi before the 5 it is one or the other. The Wayland desktop also does not trust the composite connector until it is told the mode, so&nbsp;<code>video=Composite-1:720x480@60ie,tv_mode=NTSC</code>&nbsp;goes on the&nbsp;<code>cmdline.txt</code>&nbsp;line too.</p>



<h2 id="step-6-make-it-readable" class="wp-block-heading">Step 6: Make it readable</h2>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5676" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/did-you-know-page-best-legibility-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Did you know page best legibility" data-image-description="" data-image-caption="&lt;p&gt;The DID YOU KNOW page, the most legible of the bunch before CRT mode&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The DID YOU KNOW page, the most legible of the bunch before CRT mode" class="wp-image-5676" style="width:453px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">With everything working, the verdict on a 9-inch 1987 tube over RF: the big clock and the crawl read fine, the small text was marginal, and the red and blue pages were worse than the cyan one. That is NTSC. It smears saturated color, it clips pure white (broadcast engineers kept white at 90% for a reason), and the hard drop shadow under every character turned into ringing.</p>



<p class="wp-block-paragraph">So I added a CRT set of settings in the control room for much older TVs&#8230;</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="320" data-attachment-id="5669" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-crt-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=813%2C347&amp;ssl=1" data-orig-size="813,347" data-comments-opened="0" data-image-title="Control room crt panel" data-image-description="" data-image-caption="&lt;p&gt;The CRT panel: CRT mode, text size, and the overscan margin&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=750%2C320&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&#038;ssl=1" alt="The CRT panel: CRT mode, text size, and the overscan margin" class="wp-image-5669" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?w=813&amp;ssl=1 813w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=300%2C128&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=768%2C328&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<ul class="wp-block-list">
<li><strong>CRT mode</strong>&nbsp;swaps in a softer palette (less saturated backgrounds, 90% white) and drops the drop shadow.</li>



<li><strong>Text size</strong>&nbsp;enlarges the body text, kicker, crawl, and the small header lines, from 1 to 1.5x. I run 1.25 on this set; the big clock stays as it is.</li>



<li><strong>Overscan safe margin</strong>&nbsp;was already there; raise it if the TV crops the edges.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5668" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/crt-mode-640x480-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Crt mode 640&amp;#215;480 from laptop" data-image-description="" data-image-caption="&lt;p&gt;CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=640%2C480&#038;ssl=1" alt="CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x" class="wp-image-5668" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>


<p class="wp-block-paragraph">Turning text size up found one more thing: at 640&#215;480 the weather card no longer fit and its HI/LO line slid under the crawl.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5675" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-crt-mode-cut-off-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Weather page crt mode cut off" data-image-description="" data-image-caption="&lt;p&gt;The weather page with the bottom line cut off&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The weather page with the bottom line cut off" class="wp-image-5675" style="width:586px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">So pages now fit themselves: if the content would overflow, the weather card gives up its sunrise/sunset line first, then shrinks just enough, and a long fact does the same.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5650" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-fit-640x480" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Weather page fit 640&amp;#215;480" data-image-description="" data-image-caption="&lt;p&gt;The weather page fitting the 640&amp;#215;480 frame after the fix&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=640%2C480&#038;ssl=1" alt="" class="wp-image-5650" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">The weather page fitting the 640&#215;480 frame after the fix</figcaption></figure>
</div>


<p class="wp-block-paragraph">All of that is in the repo as of this post.</p>



<h2 id="what-changed-because-of-this-build" class="wp-block-heading">What changed because of this build</h2>



<p class="wp-block-paragraph">Three things fed straight back into the project:</p>



<ul class="wp-block-list">
<li>The&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">original post</a>&nbsp;now carries a dated update: the kiosk command is&nbsp;<code>chromium</code>&nbsp;in&nbsp;<code>~/.config/labwc/autostart</code>&nbsp;on current Raspberry Pi OS, and the power supply got the mention it earned.</li>



<li>The&nbsp;<a href="https://github.com/nothans/cable-82#running-it-on-a-real-crt-raspberry-pi">repo README</a>&nbsp;was rewritten from this build, step by step as tested, with a Troubleshooting section keyed to the exact errors from the comment thread.</li>



<li>CABLE 82 itself gained CRT mode, the text size setting, the fit-to-page behavior, and the shipped EDID, because a real 1987 tube demanded all four.</li>
</ul>



<p class="wp-block-paragraph">That is the part I did not expect when a reader said &#8220;localhost refused to connect&#8221;: the failure report turned into the best test pass the project ever had!</p>



<h2 id="a-channel-of-your-own" class="wp-block-heading">A channel of your own</h2>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="5667" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/the-whole-chain-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=1255%2C945&amp;ssl=1" data-orig-size="1255,945" data-comments-opened="0" data-image-title="The whole chain" data-image-description="" data-image-caption="&lt;p&gt;The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&#038;ssl=1" alt="The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air" class="wp-image-5667" style="aspect-ratio:1.3280763643909526;width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?w=1255&amp;ssl=1 1255w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">The Magnavox sits there now, tuned to channel 3, being a channel. The clock, the bake-sale energy, the crawl, the beautiful-music bed coming out of a mono speaker that was built when the music was new. It is a thirty-nine-year-old TV showing a channel that stopped existing before the TV was built, fed by a computer the size of a deck of cards, and the whole thing works because somebody left a comment saying it did not.</p>



<p class="wp-block-paragraph">So: if you build one and it refuses to connect, say so. That is how this channel gets better, and it is very 1982 of you. Thanks.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5604</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>Live Preview of HTML Files in Visual Studio Code</title>
		<link>https://nothans.com/live-preview-of-html-files-in-visual-studio-code</link>
					<comments>https://nothans.com/live-preview-of-html-files-in-visual-studio-code#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 18:45:07 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Live Preview]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5560</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This post started as a <a href="https://nothans.com/til-how-to-use-live-server-in-visual-studio-code">TIL</a>: I was building a little arcade game called <a href="https://shoot.nothans.com/">Shoot</a>, opened the index.html and the Web Audio API refused to load a single sound because of CORS. (A shooter with no shooting sounds is mostly just pointing.) The fix was a local development server, and the tool I found was the Live Server extension for Visual Studio Code.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="460" data-attachment-id="4817" data-permalink="https://nothans.com/til-how-to-use-live-server-in-visual-studio-code/image-47" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?fit=971%2C595&amp;ssl=1" data-orig-size="971,595" data-comments-opened="0" data-image-title="Live Preview extension for Visual Studio Code" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?fit=750%2C460&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?resize=750%2C460&#038;ssl=1" alt="" class="wp-image-4817" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?w=971&amp;ssl=1 971w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?resize=300%2C184&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?resize=768%2C471&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/10/image.png?resize=750%2C460&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p class="wp-block-paragraph">That problem I had hasn&#8217;t changed, but the best answer has. Live Server went years without maintenance, and in early 2026 a critical security vulnerability in its dev server was publicly disclosed before it finally got a patch. Meanwhile, Microsoft now ships a first-party extension that does the same job: <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server">Live Preview</a>. Same right-click workflow, actively maintained, and it&#8217;s what I use now.</p>



<h2 id="why-you-need-a-local-server-at-all" class="wp-block-heading">Why you need a local server at all</h2>



<p class="wp-block-paragraph">Open an HTML file from disk and the browser loads it with a&nbsp;<code>file://</code>&nbsp;address. That works right up until your page tries to fetch a file, load a JavaScript module, or play audio. Then the browser blocks it, for security reasons. Your code isn&#8217;t broken; it just needs to be served over HTTP like a real website. A local development server does exactly that, on your own machine, at an address like&nbsp;<code>http://127.0.0.1:3000</code>.</p>



<h2 id="the-quick-answer-live-preview" class="wp-block-heading">The quick answer: Live Preview</h2>



<p class="wp-block-paragraph"><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server">Live Preview</a>&nbsp;is Microsoft&#8217;s extension for exactly this.</p>



<ol class="wp-block-list">
<li>Open the Extensions panel (<code>Ctrl+Shift+X</code>), search for <strong>Live Preview</strong> by Microsoft, and install it.</li>



<li>Open your HTML file.</li>



<li>Right-click in the editor and choose <strong>Show Preview</strong>.</li>
</ol>



<p class="wp-block-paragraph">You get a live browser panel right inside VS Code, and it refreshes automatically as you type. When you want the full browser experience (developer tools, real window size), use&nbsp;<strong>Show Preview in External Browser</strong>&nbsp;instead, or just open the&nbsp;<code>http://127.0.0.1:3000</code>&nbsp;address it prints.</p>



<h2 id="what-happened-to-live-server" class="wp-block-heading">What happened to Live Server</h2>



<p class="wp-block-paragraph">The original version of this post recommended the Live Server extension by Ritwick Dey, and 80 million installs say I wasn&#8217;t alone. It still works, and the workflow is nearly identical: right-click the file,&nbsp;<strong>Open with Live Server</strong>, or hit the&nbsp;<strong>Go Live</strong>&nbsp;button in the status bar.</p>



<p class="wp-block-paragraph">But the extension went years without maintenance, and in February 2026 a critical vulnerability (CVE-2025-65717) was publicly disclosed: visit the wrong webpage while Live Server is running, and that page can quietly pull files off your machine through the extension&#8217;s local server. Source code, config files, <code>.env</code> secrets, whatever the server can reach. Security researchers had been trying to reach the maintainer since mid-2025; the patch (version 5.7.10) landed only after the story went public. If you have Live Server installed, make sure it&#8217;s updated to 5.7.10 or later. Better yet, switch.</p>



<h2 id="no-extension-at-all" class="wp-block-heading">No extension at all</h2>



<p class="wp-block-paragraph">If you&#8217;d rather not install anything, you already have a server or two on your machine:</p>



<pre class="wp-block-code"><code># Node
npx serve

# Python
python -m http.server 8000</code></pre>



<p class="wp-block-paragraph">Run either one in your project folder and open the address it prints. You lose the auto-refresh, but for a quick test it&#8217;s hard to beat.</p>



<h2 id="debugging" class="wp-block-heading">Debugging</h2>



<p class="wp-block-paragraph">Once the page is served, the browser&#8217;s developer tools (<code>F12</code>&nbsp;or&nbsp;<code>Ctrl+Shift+I</code>) work exactly as you&#8217;d expect: console, breakpoints, network tab, the works.</p>



<p class="wp-block-paragraph">The original post suggested installing the &#8220;Debugger for Chrome&#8221; extension to debug from inside VS Code. You don&#8217;t need it anymore; JavaScript debugging is built into VS Code now. Create a&nbsp;<code>launch.json</code>&nbsp;with a&nbsp;<code>chrome</code>&nbsp;or&nbsp;<code>msedge</code>&nbsp;configuration pointed at your local server URL, hit F5, and set breakpoints right in the editor.</p>



<h2 id="the-game-by-the-way" class="wp-block-heading">The game, by the way</h2>



<p class="wp-block-paragraph">Shoot shipped with sound! Play it here: <a href="https://shoot.nothans.com/">https://shoot.nothans.com/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/live-preview-of-html-files-in-visual-studio-code/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5560</post-id>	</item>
		<item>
		<title>Dungeon Crawler Carl Pinball at Gen Con&#8230; with Matt Dinniman</title>
		<link>https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman</link>
					<comments>https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 14:38:30 +0000</pubDate>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Dungeon Crawling Carl]]></category>
		<category><![CDATA[Gen Con]]></category>
		<category><![CDATA[pinball]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5547</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">There&#8217;s a new pinball machine. It is a Dungeon Crawler Carl-themed pinball machine from <a href="https://www.multimorphic.com/dungeon-crawler-carl/">Multimorphic</a>. This pinball machine was announced a few days ago and had a surprise reveal at Gen Con. I have been attending Gen Con for over 20 years and have watched it grow 10x in size and stretch into all things you could geek out on. 90k people come to Indianapolis, IN, and spend four days gaming, talking about games, selling games, and buying games. Then, there is also Pinball! It became a fixture a few years ago. Before that, we would drive to arcades and get an evening of pinball. Now, with a Dungeons and Dragons-themed pinball machine and crossover themes, Pinball is a mainstay here at Gen Con. The cult classic Dungeon Crawler Carl seems to be the perfect and well-suited for the innovative P3 platform from Multimorphic.</p>



<p class="wp-block-paragraph">As soon I as I heard that there would be a surpsise reveal of the new pinball machine, I wanted to try it. It was in the Crawl Con room by Rengade Games in the Indiana Convention Center.</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="996" data-attachment-id="5548" data-permalink="https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/image-139" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?fit=1553%2C2063&amp;ssl=1" data-orig-size="1553,2063" data-comments-opened="0" data-image-title="Gerry Stellenberg and Matt Dinniman at Gen Con" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=750%2C996&#038;ssl=1" alt="Gerry Stellenberg and Matt Dinniman at Gen Con" class="wp-image-5548" style="width:574px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=1156%2C1536&amp;ssl=1 1156w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?resize=1320%2C1753&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-29.png?w=1553&amp;ssl=1 1553w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Gerry Stellenberg and Matt Dinniman at Gen Con</figcaption></figure>
</div>


<h2 id="what-is-dungeon-crawling-carl" class="wp-block-heading">What is Dungeon Crawling Carl?</h2>



<p class="wp-block-paragraph"><em>Well, you are about to hear about it from everyone you know. Buckle up.</em></p>



<p class="wp-block-paragraph">Dungeon Crawler Carl is a wildly popular LitRPG series by Matt Dinniman that kicks off with a guy named Carl running outside in nothing but his boxers, a leather jacket, and his ex-girlfriend&#8217;s tight pink Crocs to catch her prized tortoiseshell Persian cat, Princess Donut. That wardrobe choice saves their lives: seconds later, aliens flatten every building on Earth, killing everyone indoors.</p>



<p class="wp-block-paragraph">The survivors are herded into a colossal underground dungeon and forced to fight their way down floor by floor. The entire death trap is broadcast across the universe as a massive reality show, meaning sponsors, fan popularity, and audience bloodlust dictate who lives or dies. Carl teams up with Donut, who gains human speech and immediately weaponizes her pampered show-cat ego to manipulate the galactic viewers. Meanwhile, the dungeon&#8217;s AI develops a weird, sadistic foot fetish and actively refuses to give Carl decent lower-body armor, forcing him to fight off monsters while basically half-naked.</p>



<p class="wp-block-paragraph">Because it&#8217;s LitRPG, the story includes video game mechanics like stat screens, loot drops, and system notifications. But it works perfectly as both a genuinely tense survival story and a hilarious, deeply angry satire about corporate greed and the entertainment industry. If you get into it, I recommend the audiobook. They are narrated and voiced by Jeff Hays. His performance is so good.</p>



<h2 id="what-is-dungeon-crawler-carl-pinball" class="wp-block-heading">What is Dungeon Crawler Carl Pinball?</h2>



<p class="wp-block-paragraph"><em>Dungeon Crawler Carl</em> is a pinball machine based on the <em>Dungeon Crawler Carl</em> book series, written by Matt Dinniman. You play as Carl, accompanied by Princess Donut, navigating the various dungeon levels and all of the dangers and challenges it presents. Fighting mobs, battle bosses, cast spells, build your viewer count, collect friends, and figure out how to not just survive in the dungeon, but also how to get vengeance! Every aspect of the game combines to immerse you into the story. This includes a host of thematically integrated interactive mechanisms, an audio experience led by Jeff Hays voicing all of the characters, new artwork from Luciano Fleitas, Brad Albright, as well as other Dungeon Crawler Carl artwork shared by Renegade Game Studios, and game rules that connect you with all of the major events and plotlines and many of the minor plotlines as well.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="5549" data-permalink="https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/image-140" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?fit=900%2C1200&amp;ssl=1" data-orig-size="900,1200" data-comments-opened="0" data-image-title="Dungeon Crawler Carl Pinball playfield" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?fit=750%2C1000&amp;ssl=1" data-id="5549" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?resize=750%2C1000&#038;ssl=1" alt="" class="wp-image-5549" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?resize=750%2C1000&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-30.png?w=900&amp;ssl=1 900w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="5550" data-permalink="https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/image-141" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?fit=900%2C1200&amp;ssl=1" data-orig-size="900,1200" data-comments-opened="0" data-image-title="Dungeon Crawler Carl Pinball sculpt" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?fit=750%2C1000&amp;ssl=1" data-id="5550" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?resize=750%2C1000&#038;ssl=1" alt="" class="wp-image-5550" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?resize=750%2C1000&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-31.png?w=900&amp;ssl=1 900w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5551" data-permalink="https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/image-142" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?fit=1200%2C900&amp;ssl=1" data-orig-size="1200,900" data-comments-opened="0" data-image-title="Dungeon Crawler Carl Pinball Princess Donut" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?fit=750%2C563&amp;ssl=1" data-id="5551" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=750%2C563&#038;ssl=1" alt="" class="wp-image-5551" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-32.png?w=1200&amp;ssl=1 1200w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</figure>



<p class="wp-block-paragraph"> After getting a chance to see the surprise reveal of the game, I got my own surprise. Matt came out to hang with the pinball players and talk about the weather&#8230; I MEAN DUNGEON CRAWLER CARL. Matt kicked off something bizarae and sweeping. Like I said, buckle up!</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="1000" data-attachment-id="5552" data-permalink="https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/image-143" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?fit=1548%2C2063&amp;ssl=1" data-orig-size="1548,2063" data-comments-opened="0" data-image-title="Hans Scharler and Matt Dinniman at Gen Con 2026" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?fit=750%2C1000&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=750%2C1000&#038;ssl=1" alt="Hans Scharler and Matt Dinniman at Gen Con 2026" class="wp-image-5552" style="aspect-ratio:0.7503663898387885;width:659px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=1153%2C1536&amp;ssl=1 1153w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=1537%2C2048&amp;ssl=1 1537w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=750%2C1000&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?resize=1320%2C1759&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-33.png?w=1548&amp;ssl=1 1548w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Hans Scharler and Matt Dinniman at Gen Con 2026</figcaption></figure>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/dungeon-crawler-carl-pinball-at-gen-con-with-matt-dinniman/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5547</post-id>	</item>
		<item>
		<title>Pinball: A Quest for Mastery</title>
		<link>https://nothans.com/pinball-a-quest-for-mastery</link>
					<comments>https://nothans.com/pinball-a-quest-for-mastery#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 10:41:23 +0000</pubDate>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[pinball]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5539</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">First, I need to say I love the pinball community. It is a community, and all kinds are there. Since I relocated to New England, Pinball has been my source of creativity and drive, a way to find friends, a place to have randos over to the house, a place to go to a warehouse filled with old pinball machines, and a way to be around people who love this game.</p>



<p class="wp-block-paragraph">On my journey, I met Tasker Smith. Right from the start, Tasker had a unique point of view about pinball <em>and life</em>. He didn&#8217;t slam the machine, but he also had feelings about getting better. He turned failures into lessons and was always awesome to play with. Then, he says he is writing a book. And, a very Tasker thing to do is to actually write a little bit a time and couple of years go by you have a book, then it is is getting published, then he is on a book tour. </p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://link.amazon/B0j7dzd4Z"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="920" data-attachment-id="5540" data-permalink="https://nothans.com/pinball-a-quest-for-mastery/image-135" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?fit=1683%2C2063&amp;ssl=1" data-orig-size="1683,2063" data-comments-opened="0" data-image-title="Pinball: A Quest for Mastery book" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?fit=750%2C920&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=750%2C920&#038;ssl=1" alt="" class="wp-image-5540" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=835%2C1024&amp;ssl=1 835w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=245%2C300&amp;ssl=1 245w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=768%2C941&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=1253%2C1536&amp;ssl=1 1253w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=1671%2C2048&amp;ssl=1 1671w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=750%2C919&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?resize=1320%2C1618&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?w=1683&amp;ssl=1 1683w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-25.png?w=1500&amp;ssl=1 1500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption"><a href="https://link.amazon/B0j7dzd4Z">Pinball: A Quest for Mastery by Tasker Smith</a></figcaption></figure>
</div>


<p class="wp-block-paragraph"><a href="https://link.amazon/B0j7dzd4Z">Pinball: A Quest for Mastery</a> is about pinball, but it is also philosophy. The book is not about being a master at pinball; it is about being on the quest. The book shares history, demystifies rule complexity, gives you a primer for understanding the game, and what it takes to get better and why. I feel Tasker just shares a user manual with us on how to approach any hobby or pursuit.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="5541" data-permalink="https://nothans.com/pinball-a-quest-for-mastery/image-136" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?fit=1548%2C2063&amp;ssl=1" data-orig-size="1548,2063" 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/07/image-26.png?fit=750%2C1000&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=750%2C1000&#038;ssl=1" alt="Hans Scharler and Tasker Smith at the Pinball: A Quest for Mastery Book Release Party" class="wp-image-5541" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=1153%2C1536&amp;ssl=1 1153w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=1537%2C2048&amp;ssl=1 1537w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=750%2C1000&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?resize=1320%2C1759&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-26.png?w=1548&amp;ssl=1 1548w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Hans Scharler and Tasker Smith at the Pinball: A Quest for Mastery Book Release Party</figcaption></figure>



<p class="wp-block-paragraph">I recommend the book for players of all skill levels. I find myself opening the book, flipping to a section, and learning something interesting no matter where I read. This also echoes one of Tasker&#8217;s viewpoints: take every moment to learn, get better, and make your own luck. The book is filled with advice and resources. The book doesn&#8217;t leave you feeling alone. I thoroughly enjoyed the read!</p>



<p class="wp-block-paragraph">Go to your friendly local bookstore and pick up a copy.</p>



<p class="wp-block-paragraph">Congrats, Tasker!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/pinball-a-quest-for-mastery/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5539</post-id>	</item>
		<item>
		<title>Atari Superman Pinball Wall Art Project</title>
		<link>https://nothans.com/atari-superman-pinball-wall-art-project</link>
					<comments>https://nothans.com/atari-superman-pinball-wall-art-project#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 25 Jul 2026 22:46:06 +0000</pubDate>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[pinball]]></category>
		<category><![CDATA[WLED]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5492</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">My family was spending the day at the <a href="https://www.electromagneticpinballmuseum.com/">Electromagnetic Pinball Museum</a> in Pawtucket, RI, and stumbled across an Atari Pinball Machine. Yes, Atari made pinball machines for a brief, unsuccessful spell. Atari launched the career of the most prolific pinball game designer, <a href="https://en.wikipedia.org/wiki/Steve_Ritchie_(pinball_designer)">Steve Ritchie</a>. Steve is still designing pinball machines 50 years later, with his most recent game, Sonic the Hedgehog from Jersey Jack Pinball. One of the people working there took me around and showed me all of the things that have been donated to the museum&#8230; just rooms and rooms of arcade machines, CRTs, and pinball parts. The Superman pinball machine was not in great shape, but looking at the classic art got me thinking about my yesteryear and sparked an idea&#8230; what if I turned it into some wall art for my game room? The guys said if I made a donation, the pinball playfield for Atari Superman is mine. That night I started my research. I actually didn&#8217;t find too much detail on Atari pinball machines, so I posted on the pinball forums and quickly got connected to people who knew something about it. The main thing was figuring out how far I needed to go to give this a second life, and I am glad that I didn&#8217;t know how much work it was going to be. I just took little steps, learned, shared, engaged with lots of new people, and plodded along. It took a month, but George and I got it done.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://youtube.com/shorts/bCr1r18FhCQ?si=aXXhcFiwhbjGVFm5"><img data-recalc-dims="1" loading="lazy" decoding="async" width="400" height="533" data-attachment-id="5493" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/superman-playfield-lit-small" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/superman-playfield-lit-small.gif?fit=400%2C533&amp;ssl=1" data-orig-size="400,533" data-comments-opened="0" data-image-title="superman playfield lit up with LEDs" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/superman-playfield-lit-small.gif?fit=400%2C533&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/superman-playfield-lit-small.gif?resize=400%2C533&#038;ssl=1" alt="" class="wp-image-5493"/></a></figure>
</div>


<p class="wp-block-paragraph">The results are gorgeous! I learned a lot and will share more of the details when I get time. You can follow the live build here: <a href="https://pinside.com/pinball/forum/topic/atari-superman-playfield-wall-art">https://pinside.com/pinball/forum/topic/atari-superman-playfield-wall-art</a></p>



<h2 id="inserts-and-plastics" class="wp-block-heading">Inserts and Plastics</h2>



<p class="wp-block-paragraph">When I got the playfield home, I realized that I didn&#8217;t have the complete playfield. I only had the wood and the printed art. Every insert, plastic piece, and post was removed. The original owner was planning a playfield restoration and had stopped at some point. The artwork was touched up and looked beautiful, but probably would not work for playing pinball on it. The inserts were going to be important since my goal was to place an LED behind them to make them glow.</p>



<p class="wp-block-paragraph">I put out a post on Pinside looking for any old parts for the Atari Superman Pinball and got a few bites.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="680" height="797" data-attachment-id="5515" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-119" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-9.png?fit=680%2C797&amp;ssl=1" data-orig-size="680,797" 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/07/image-9.png?fit=680%2C797&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-9.png?resize=680%2C797&#038;ssl=1" alt="" class="wp-image-5515" style="width:546px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-9.png?w=680&amp;ssl=1 680w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-9.png?resize=256%2C300&amp;ssl=1 256w" sizes="auto, (max-width: 680px) 100vw, 680px" /><figcaption class="wp-element-caption">Original Playfield Inserts for Superman Pinball</figcaption></figure>
</div>


<p class="wp-block-paragraph">Soon enough, I got the original parts for this exact playfield. I got to meet up with the pinhead that donated the playfield to the museum. We chatted for hours about 70s and 80s pinball, swapped stories, and made a community connection. It was surreal to find the original owner, but the pinball community is a small niche hobby.</p>



<p class="wp-block-paragraph">I also found the original Superman plafield plastic pieces. They shined right up with <a href="https://amzn.to/4fVQlYp">Novus Plastic Polish</a>. The Novus cleaning products are a must if you work on pinball machines.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5516" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-120" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-10.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" 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/07/image-10.png?fit=712%2C945&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-10.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5516" style="width:460px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-10.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-10.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>
</div>


<p class="wp-block-paragraph">To mount the plastic pieces on the playfield, you need post mounts and post stud screws. The mounts were easy to find, but the stud screws were a challenge. New ones were about a dollar each. So, this didn&#8217;t scale well. I needed like 60 of them, so if my math is right, that&#8217;s $60. I turned to eBay and found someone selling &#8220;pounds of old pinball parts&#8221;. This came in at $90! Look at the savings. Somehow, I felt better about buying old used parts than buying new ones at a lower price&#8230; and in the process, I got a bunch of rusty parts I didn&#8217;t even need.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="559" height="652" data-attachment-id="5517" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-121" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-11.png?fit=559%2C652&amp;ssl=1" data-orig-size="559,652" 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/07/image-11.png?fit=559%2C652&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-11.png?resize=559%2C652&#038;ssl=1" alt="" class="wp-image-5517" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-11.png?w=559&amp;ssl=1 559w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-11.png?resize=257%2C300&amp;ssl=1 257w" sizes="auto, (max-width: 559px) 100vw, 559px" /><figcaption class="wp-element-caption">Rusty Pinball Parts from eBay</figcaption></figure>
</div>


<p class="wp-block-paragraph">My old screw bucket was not happy that I bought someone else&#8217;s old screw bucket and didn&#8217;t even consult it.</p>



<p class="wp-block-paragraph">Mounting all of the playfield parts took a lot of time, but you just do one at a time. I have a new respect for anyone who designs these things. 70s pinball was so much simpler than modern pinball machines, and it was still a lot of parts to track.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/atari-superman-pinball-wall-art-project&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5525" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-129" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-19.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="playfield posts" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-19.png?fit=712%2C945&amp;ssl=1" data-id="5525" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-19.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5525" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-19.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-19.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5526" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-130" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-20.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="plastic pieces mounted to posts" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-20.png?fit=712%2C945&amp;ssl=1" data-id="5526" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-20.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5526" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-20.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-20.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5527" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-131" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-21.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="lane guides mounted" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-21.png?fit=712%2C945&amp;ssl=1" data-id="5527" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-21.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5527" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-21.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-21.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5528" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-132" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-22.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="making progress on the playfield" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-22.png?fit=712%2C945&amp;ssl=1" data-id="5528" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-22.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5528" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-22.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-22.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>
</figure>



<h2 id="flippers" class="wp-block-heading">Flippers</h2>



<p class="wp-block-paragraph">I wanted to complete the top side of the playfield with flippers. So, I took old flippers from my Strikes and Spares pinball machine and cut them down for this build. Again, this will be wall-mounted, so you can&#8217;t have things sticking out too far in the back. They needed to be modded, and Dremel came to the rescue. Shooting a 6-foot stream of sparks across the room.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/atari-superman-pinball-wall-art-project&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5521" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-125" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-15.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="Guiding the cut" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-15.png?fit=712%2C945&amp;ssl=1" data-id="5521" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-15.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5521" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-15.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-15.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5523" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-127" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-17.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="starting the cut" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-17.png?fit=712%2C945&amp;ssl=1" data-id="5523" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-17.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5523" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-17.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-17.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5522" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-126" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-16.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="finished flipper arm cut down to the right size" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-16.png?fit=712%2C945&amp;ssl=1" data-id="5522" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-16.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5522" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-16.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-16.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>
</figure>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="527" data-attachment-id="5524" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-128" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?fit=1024%2C720&amp;ssl=1" data-orig-size="1024,720" 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/07/image-18.png?fit=750%2C527&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?resize=750%2C527&#038;ssl=1" alt="" class="wp-image-5524" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?resize=300%2C211&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?resize=768%2C540&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-18.png?resize=750%2C527&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Flippers Mounted</figcaption></figure>
</div>


<h2 id="led-control-and-cheerlights" class="wp-block-heading">LED Control and CheerLights</h2>



<p class="wp-block-paragraph">Of course, it is connected to the <a href="https://cheerlights.com/">CheerLights</a> project. This was going to happen 100% of the time whenever I connected 150 LEDs to something. I used WS2811 bullet-style LEDs that you can control one at a time. They fit perfectly in the 12.5mm general illumination holes in the playfield. I used a <a href="https://www.amazon.com/dp/B0D4TG8Y2Z?tag=nothans">WLED controller</a> and a 3A power supply to control the colors, animations, and synchronization with the <a href="https://cheerlights.com/build/wled/">CheerLights MQTT server</a>.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/atari-superman-pinball-wall-art-project&quot;}'  class="wp-block-gallery has-nested-images columns-3 is-cropped is-style-rectangular wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5519" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-123" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-13.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="WS2811 12mm LED" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-13.png?fit=712%2C945&amp;ssl=1" data-id="5519" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-13.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5519" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-13.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-13.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="5518" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-122" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?fit=1255%2C945&amp;ssl=1" data-orig-size="1255,945" data-comments-opened="0" data-image-title="WS2811 12mm LED back side" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?fit=750%2C565&amp;ssl=1" data-id="5518" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-5518" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=750%2C565&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-12.png?w=1255&amp;ssl=1 1255w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5520" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-124" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-14.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="WS2811 12mm LED working" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-14.png?fit=712%2C945&amp;ssl=1" data-id="5520" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-14.png?resize=712%2C945&#038;ssl=1" alt="" class="wp-image-5520" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-14.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-14.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>
</figure>



<p class="wp-block-paragraph">The insert near the flippers stays in sync with the latest CheerLights color while the rest of the inserts can have their own color or visual effects.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5494" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-111" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?fit=945%2C945&amp;ssl=1" data-orig-size="945,945" 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/07/image-1.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5494" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?w=945&amp;ssl=1 945w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-1.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">CheerLights Insert on the Superman Pinball Playfield Stays in Sync with the Current CheerLights Color</figcaption></figure>



<p class="wp-block-paragraph">Out of the box, the best animation effect was Stream 2. This very much looks like an attract mode on a pinball machine.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="361" data-attachment-id="5495" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-112" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?fit=1147%2C552&amp;ssl=1" data-orig-size="1147,552" 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/07/image-2.png?fit=750%2C361&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?resize=750%2C361&#038;ssl=1" alt="" class="wp-image-5495" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?resize=1024%2C493&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?resize=300%2C144&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?resize=768%2C370&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?resize=750%2C361&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-2.png?w=1147&amp;ssl=1 1147w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">WLED settings for CheerLights and the Superman Pinball Wall Art Project</figcaption></figure>



<h2 id="3d-models" class="wp-block-heading">3D Models</h2>



<p class="wp-block-paragraph">Part of the project was making my first 3D model to have the original pop bumpers mounted above the playfield but not connected to the original mechanism. Since this is wall art, I can&#8217;t have a mechanism sticking out 7 inches on the back. I also could not find the old-style pop bumpers on Maker World, so I designed my own&#8230; ish. Meaning it is not a pop bumper for function, it is a pop bumper to take light from an LED and let it shine through. I just published my first <a href="https://makerworld.com/en/models/3097105-atari-pop-bumper-base-light-up-pinball-display">model</a>!</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://makerworld.com/en/models/3097105-atari-pop-bumper-base-light-up-pinball-display" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="425" data-attachment-id="5502" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-113" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-3.png?fit=765%2C434&amp;ssl=1" data-orig-size="765,434" 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/07/image-3.png?fit=750%2C425&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-3.png?resize=750%2C425&#038;ssl=1" alt="" class="wp-image-5502" style="width:637px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-3.png?w=765&amp;ssl=1 765w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-3.png?resize=300%2C170&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-3.png?resize=750%2C425&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">3D Model for Atari Pinball Pop Bumper Base for LED Wall Art Projects</figcaption></figure>
</div>


<p class="wp-block-paragraph">For other parts needed, I found a person on Pinside who created a system called <a href="https://pinside.com/pinball/shops/shop/1167-gameroom-mods/15694-pinglow-playfield-art-system-starter-kits">PinGlow</a>. They were way ahead of me and had thought through the kind of stuff you are going to need for a wall art project like mine. They offer drop targets, stand-up targets, wall mounting kits, and even LEDs. I reached out to them on Pinside, and they offered to make a custom version of their drop targets specifically for the Atari Pinball machine. These drop targets had the Superman logo on them.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://pinside.com/pinball/shops/shop/1167-gameroom-mods/15694-pinglow-playfield-art-system-starter-kits" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" width="743" height="803" data-attachment-id="5505" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-114" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-4.png?fit=743%2C803&amp;ssl=1" data-orig-size="743,803" 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/07/image-4.png?fit=743%2C803&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-4.png?resize=743%2C803&#038;ssl=1" alt="" class="wp-image-5505" style="width:546px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-4.png?w=743&amp;ssl=1 743w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-4.png?resize=278%2C300&amp;ssl=1 278w" sizes="auto, (max-width: 743px) 100vw, 743px" /></a><figcaption class="wp-element-caption">PinGlow parts from Gameroom Mods on Pinside</figcaption></figure>
</div>


<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/atari-superman-pinball-wall-art-project&quot;}'  class="wp-block-gallery has-nested-images columns-3 is-cropped is-style-rectangular wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="748" height="993" data-attachment-id="5507" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-115" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-5.png?fit=748%2C993&amp;ssl=1" data-orig-size="748,993" data-comments-opened="0" data-image-title="pinglow custom drop targets" data-image-description="" data-image-caption="&lt;p&gt;pinglow custom drop targets&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-5.png?fit=748%2C993&amp;ssl=1" data-id="5507" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-5.png?resize=748%2C993&#038;ssl=1" alt="" class="wp-image-5507" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-5.png?w=748&amp;ssl=1 748w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-5.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 748px) 100vw, 748px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="748" height="993" data-attachment-id="5508" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-116" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-6.png?fit=748%2C993&amp;ssl=1" data-orig-size="748,993" data-comments-opened="0" data-image-title="pinglow drop target mounted to the bottom of the pinall playfield" data-image-description="" data-image-caption="&lt;p&gt;pinglow drop target mounted to the bottom of the pinall playfield&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-6.png?fit=748%2C993&amp;ssl=1" data-id="5508" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-6.png?resize=748%2C993&#038;ssl=1" alt="" class="wp-image-5508" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-6.png?w=748&amp;ssl=1 748w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-6.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 748px) 100vw, 748px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="748" height="993" data-attachment-id="5510" data-permalink="https://nothans.com/atari-superman-pinball-wall-art-project/image-117" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-7.png?fit=748%2C993&amp;ssl=1" data-orig-size="748,993" data-comments-opened="0" data-image-title="pinglow stand up targets" data-image-description="" data-image-caption="&lt;p&gt;pinglow stand up targets&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-7.png?fit=748%2C993&amp;ssl=1" data-id="5510" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-7.png?resize=748%2C993&#038;ssl=1" alt="" class="wp-image-5510" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-7.png?w=748&amp;ssl=1 748w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-7.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 748px) 100vw, 748px" /></figure>
</figure>



<h2 id="project-demo" class="wp-block-heading">Project Demo</h2>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Atari Superman Pinball Wall Art Project #esp32 #wled #pinball" width="563" height="1000" src="https://www.youtube.com/embed/bCr1r18FhCQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption">Short project video for the Superman Pinball Wall Art Project</figcaption></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/atari-superman-pinball-wall-art-project/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5492</post-id>	</item>
	</channel>
</rss>
