<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Stoneberg Design</title>
    <link>https://stonebergdesign.com/</link>
    <description>Enterprise web strategy and development at boutique scale. 15+ years of experience at Veeva, Salesforce, and Tableau applied to mid-market organizations.</description>
    <language>en-us</language>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <atom:link href="https://stonebergdesign.com/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Datatype — variable font that turns text into charts</title>
      <link>https://franktisellano.github.io/datatype/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-07-27-datatype-variable-font-that-turns-text-into-charts</guid>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;📊&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Open Source Alternatives to Popular Software</title>
      <link>https://openalternative.co/?ref=DenseDiscovery-395</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-06-30-open-source-alternatives-to-popular-software</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Open Source Alternatives to Popular Software&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Using Claude Code: The unreasonable effectiveness of HTML | Claude</title>
      <link>https://claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-06-06-using-claude-code-the-unreasonable-effectiveness-of-html-claude</guid>
      <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The case from Anthropic for having Claude Code emit HTML instead of Markdown. Specs,
mockups, code reviews, and reports get tables, SVG, and interactivity, and a file you
can hand someone as a link.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>§ Project Kickoff: Start Every Project the Same Way</title>
      <link>https://stonebergdesign.com/blog/project-kickoff-skill</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/project-kickoff-skill</guid>
      <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I recently published &lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;project-briefing&lt;/a&gt;, a skill for getting back up to speed on a project after time away. But it depends on having good source material to synthesize: an overview document, an activity log, structured notes. If those files don&apos;t exist, the briefing has nothing to work with.&lt;/p&gt;
&lt;p&gt;That raised an obvious question: how do I make sure every project starts with the right files in the first place?&lt;/p&gt;
&lt;h2&gt;The bootstrapping problem&lt;/h2&gt;
&lt;p&gt;Starting a new project usually means I have a pile of scattered artifacts. Forwarded emails, a requirements PDF, some screenshots, maybe a meeting transcript. It all lives in a folder somewhere, unstructured.&lt;/p&gt;
&lt;p&gt;Getting organized takes real effort, especially if I want the structure to be machine-readable for coding agents. And if I&apos;m honest, I skip it more often than I should. I just start working and pay for it later when I can&apos;t remember what was decided three sessions ago.&lt;/p&gt;
&lt;p&gt;The other issue is consistency. When every project has a different structure, re-orienting is slow. There is no muscle memory for where things live.&lt;/p&gt;
&lt;h2&gt;What project-kickoff does&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rocksoup/project-kickoff&quot;&gt;project-kickoff&lt;/a&gt; is a skill that solves this once. I create a directory, drop in whatever I already have, and invoke the skill. It does four things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scans&lt;/strong&gt; everything in the directory: documents, screenshots, PDFs, emails, whatever I&apos;ve dumped in&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interviews&lt;/strong&gt; me with 3-5 targeted questions to fill gaps the artifacts don&apos;t cover&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writes an OVERVIEW.md&lt;/strong&gt; and reads it back for my approval&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaffolds the rest&lt;/strong&gt;: an activity log, an agent instructions file, and a scratch directory&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The scan-first design is important. Most project kickoffs start with a blank template and make you fill everything in. That ignores the reality that you usually already have information. The skill reads what exists and only asks about what&apos;s missing.&lt;/p&gt;
&lt;p&gt;When it&apos;s done, the project directory looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-project/
├── OVERVIEW.md      # What the project is
├── LOG.md           # What&apos;s happened so far
├── AGENTS.md        # How agents should work here
├── CLAUDE.md        # Points to AGENTS.md
└── temp/
    └── README.md    # Scratch space for intermediate work
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Why these four files&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;OVERVIEW.md&lt;/strong&gt; is the single source of truth. Goals, stakeholders, timelines, key facts, open questions, and an index of important files. It&apos;s written in plain language so anyone picking up the project cold can understand it. This is also what &lt;a href=&quot;https://github.com/rocksoup/project-briefing&quot;&gt;project-briefing&lt;/a&gt; reads when I ask &quot;get me up to speed.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LOG.md&lt;/strong&gt; is insurance against lost context. Sessions end unexpectedly all the time: token limits, disconnects, timeouts. The AGENTS.md file instructs agents to update the log proactively throughout a session, not at the end. If a session stops mid-task, everything completed up to that point is recorded and recoverable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt; is loaded into every agent session automatically. It contains operational rules, not project knowledge: stay inside this directory, use &lt;code&gt;temp/&lt;/code&gt; for scratch work, update the log as you go, read the overview before starting. Rules in this file get followed session after session without me repeating myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; is a one-liner that points to AGENTS.md. It exists because Claude Code auto-loads files named CLAUDE.md — so this gives Claude a native entry point without putting any content there. The actual rules live in AGENTS.md, which any tool can read. Cursor, Copilot, and other agents don&apos;t care about CLAUDE.md, but they can all read AGENTS.md directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;temp/&lt;/strong&gt; is the pressure valve. By giving agents a sanctioned place for messy intermediate work, the rest of the project directory stays clean.&lt;/p&gt;
&lt;p&gt;The separation between OVERVIEW.md and AGENTS.md is deliberate. The overview answers &quot;what is this?&quot; The instructions answer &quot;how should I work on this?&quot; They reference each other but never duplicate content. Mixing project facts and operational rules into a single file creates something too long to maintain and too confusing to follow.&lt;/p&gt;
&lt;h2&gt;The pair&lt;/h2&gt;
&lt;p&gt;These two skills form a project lifecycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kickoff&lt;/strong&gt; creates the directory structure with OVERVIEW.md, LOG.md, AGENTS.md, CLAUDE.md, and temp/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work&lt;/strong&gt; happens; agents update LOG.md as they go&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Return&lt;/strong&gt; with project-briefing, which synthesizes the overview and log into a quick status update&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeat&lt;/strong&gt; because re-entry is fast when the structure is consistent and the log is current&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The OVERVIEW.md that project-kickoff creates is specifically designed to give project-briefing everything it needs. The five questions that project-briefing answers (objective, completed work, current milestone, next step, risks) all have their source material in the overview and log files.&lt;/p&gt;
&lt;h2&gt;Install and use&lt;/h2&gt;
&lt;p&gt;The skill is open source. Install it by copying the inner directory into your agent&apos;s skill directory:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp -R project-kickoff/project-kickoff ~/.claude/skills/project-kickoff
# or
cp -R project-kickoff/project-kickoff ~/.codex/skills/project-kickoff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only copy the nested &lt;code&gt;project-kickoff/&lt;/code&gt; directory, not the repo root.&lt;/p&gt;
&lt;p&gt;Then create a new project directory, drop in your artifacts, and invoke the skill:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/project-kickoff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The whole process takes a few minutes. At the end, you have a project directory that any agent or human can pick up and work with immediately.&lt;/p&gt;
&lt;p&gt;Like project-briefing, this is intentionally agent-agnostic. The files it creates are plain markdown, readable by any tool. Workflow assets should be portable.&lt;/p&gt;
&lt;p&gt;The repo is at &lt;a href=&quot;https://github.com/rocksoup/project-kickoff&quot;&gt;rocksoup/project-kickoff&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. The companion skill that turns project state into a fast handoff when returning after time away.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/slack-bridge-for-claude-code&quot;&gt;How I Control Claude Code from Slack Using the Channels MCP&lt;/a&gt;. Push messages into a running Claude Code session from Slack on your phone using the Channels MCP.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/linear-walkthrough-pattern&quot;&gt;The Linear Walkthrough: Architecture Context That Stays Accurate for AI Agents&lt;/a&gt;. The documentation pattern that gives AI agents full codebase context at session start.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Using the Chrome DevTools MCP to query live site markup from inside Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/screen-recording-skill&quot;&gt;Show, Don&apos;t Describe: Analyzing UI Recordings with Claude Code&lt;/a&gt;. Extract key frames from a screen recording to communicate dynamic UI behavior to the agent with full fidelity.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>§ Closing the Visual Feedback Loop in AI-Assisted UI Development</title>
      <link>https://stonebergdesign.com/blog/aieyes-screenshot-mcp</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/aieyes-screenshot-mcp</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;The standard feedback loop in AI-assisted UI development looks something like this: you describe a change, the agent writes the code, you look at the browser, you take a screenshot, you paste it into the conversation. The agent looks at it and suggests the next change. You repeat this a dozen times to get a component right.&lt;/p&gt;
&lt;p&gt;That manual step in the middle is not neutral. Every time you stop to take a screenshot and paste it back in, you&apos;re breaking your working context. You&apos;re also creating a gap where the agent is flying blind between changes: it produces output, waits, and has no signal about what that output actually looks like until you bring the information back to it.&lt;/p&gt;
&lt;p&gt;I built &lt;a href=&quot;https://github.com/rocksoup/aieyes&quot;&gt;aieyes&lt;/a&gt; to remove that gap. The agent takes its own screenshots and sees what it produced without you in the middle.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What it is&lt;/h2&gt;
&lt;p&gt;aieyes is a small MCP server that exposes two tools to Claude Code:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;screenshot&lt;/strong&gt; captures any URL and returns the image directly into the agent&apos;s context. It supports full-page capture, element-scoped capture via CSS selector, and custom viewport dimensions. The agent can use it exactly the way you would: navigate to a page, take a screenshot, look at it, and decide what to do next.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;open_browser&lt;/strong&gt; opens a URL in your system browser. This one sounds trivial but it fills a real gap: when the agent wants to show you something and have you confirm it, this is how it sends you there. The agent takes the screenshot for its own verification, then opens the browser for yours.&lt;/p&gt;
&lt;p&gt;The screenshot tool is the one that changes how you work. The iteration loop that used to require you as an intermediary becomes autonomous. The agent can make a change, capture the result, compare it against what was asked for, and iterate, all within a single session without stopping to ask you to look at something.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The foundation&lt;/h2&gt;
&lt;p&gt;The screenshot capability is entirely built on &lt;a href=&quot;https://shot-scraper.datasette.io/&quot;&gt;shot-scraper&lt;/a&gt;, Simon Willison&apos;s headless browser screenshot tool. aieyes is a thin MCP wrapper around it: when Claude calls &lt;code&gt;screenshot&lt;/code&gt;, the server shells out to shot-scraper, which drives a headless Chromium instance via Playwright, and returns the resulting PNG base64-encoded into the conversation.&lt;/p&gt;
&lt;p&gt;I want to be explicit about this because it matters when something breaks. If a screenshot fails, the failure is almost certainly in shot-scraper or Playwright, not in aieyes itself. The tool is thin by design: one external dependency doing the real work, one MCP layer making it available to the agent.&lt;/p&gt;
&lt;p&gt;The one honest friction point in the current setup: the path to shot-scraper is hardcoded in &lt;code&gt;index.js&lt;/code&gt;. pip installs to a user-specific location that varies by machine and Python version, and there is no clean cross-platform way to resolve this automatically. The README tells you how to find the right path and where to update it. It is a one-time setup step, but it means the repo is not quite clone-and-run.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How I actually use it&lt;/h2&gt;
&lt;p&gt;The primary use case is iterative UI work. When I&apos;m building a component and want the agent to verify its own output visually, I&apos;ll note in the session that the screenshot tool is available. The agent will use it at natural checkpoints: after making a change, before declaring something done, when comparing two layout options.&lt;/p&gt;
&lt;p&gt;The selector parameter is underused and worth calling out. You can scope a screenshot to a specific element, which means the agent can focus on the component it changed without capturing irrelevant page context. That&apos;s cleaner than a full-page screenshot when you&apos;re debugging something specific.&lt;/p&gt;
&lt;p&gt;The viewport parameters matter for responsive work. A component that looks right at 1280px can break at 390px. The agent can take both, compare them, and address the mobile layout without you needing to manually resize your browser.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What it doesn&apos;t replace&lt;/h2&gt;
&lt;p&gt;aieyes is for visual output during development iteration. It is not a substitute for live DOM inspection.&lt;/p&gt;
&lt;p&gt;If you need to check whether a class was applied at runtime, query computed styles, verify a selector against the actual rendered markup, or confirm that a third-party script didn&apos;t inject extra wrapper elements: that&apos;s work for the Chrome DevTools MCP, not aieyes. The DevTools protocol works against the rendered DOM and can answer questions that a screenshot can&apos;t, because screenshots show what something looks like, not why.&lt;/p&gt;
&lt;p&gt;The two tools are complementary. aieyes tells the agent whether it looks right. Chrome DevTools tells the agent what&apos;s actually in the DOM when it doesn&apos;t look right. I use both in the same sessions without conflict.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;Requirements: macOS, Node.js 18+, Python 3 with pip.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip3 install shot-scraper
shot-scraper install
which shot-scraper   # note this path
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/rocksoup/aieyes.git
cd aieyes
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update the &lt;code&gt;SHOT_SCRAPER&lt;/code&gt; path in &lt;code&gt;index.js&lt;/code&gt; to match the output of &lt;code&gt;which shot-scraper&lt;/code&gt;, then register it as a global MCP server in &lt;code&gt;~/.claude.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;aieyes&quot;: {
      &quot;command&quot;: &quot;node&quot;,
      &quot;args&quot;: [&quot;/absolute/path/to/aieyes/index.js&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart Claude Code. The &lt;code&gt;screenshot&lt;/code&gt; and &lt;code&gt;open_browser&lt;/code&gt; tools will be available in every session.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/screen-recording-skill&quot;&gt;Show, Don&apos;t Describe: Analyzing UI Recordings with Claude Code&lt;/a&gt;. For behavior that plays out over time, a recording beats a screenshot.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Live DOM inspection from inside Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. A skill that turns tracker state and git history into a fast project handoff.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>§ Show, Don&apos;t Describe: Analyzing UI Recordings with Claude Code</title>
      <link>https://stonebergdesign.com/blog/screen-recording-skill</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/screen-recording-skill</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Text descriptions of UI behavior are lossy by nature. While developing and building with AI I am often passing screenshots of an interface to the agent to communicate what is on screen in a high fidelity way, but when the scenario I want to communicate is dynamic or interactive the quick screnshot is insufficent.&lt;/p&gt;
&lt;p&gt;&quot;The modal flickers when you click the button&quot; doesn&apos;t tell the agent where in the sequence the flicker happens, what state precedes it, what it looks like at the moment it occurs, or whether it&apos;s a flash of the control state before a test variation loads.&lt;/p&gt;
&lt;p&gt;A 10-second screen recording is not lossy in the same way. Everything is there. The sequence, the timing, the visual state at each moment.&lt;/p&gt;
&lt;p&gt;So I built a skill that lets me hand a recording to Claude Code and get a frame-by-frame analysis back.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;The skill uses FFmpeg to extract key frames from the recording using scene detection tuned for UI work. Standard film-editing thresholds miss subtle transitions, things like a modal opening, a spinner appearing, or a hover state changing. The threshold I landed on (0.1) catches those. It falls back to uniform 1fps sampling if the recording is visually static enough that scene detection doesn&apos;t fire.&lt;/p&gt;
&lt;p&gt;It then reads every extracted frame directly into Claude&apos;s context, along with a contact sheet overview of the full sequence. From there it produces a structured breakdown: the starting UI state, what changes and when, the end state.&lt;/p&gt;
&lt;p&gt;The first run surfaced something worth documenting: FFmpeg installed via Homebrew on macOS doesn&apos;t include libfreetype, so the &lt;code&gt;drawtext&lt;/code&gt; filter for burning timestamps into frames fails silently unless you know to look for it. The skill now omits that filter entirely and notes why, so the next person using it doesn&apos;t spend time debugging a filter dependency.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What it caught in the first real test&lt;/h2&gt;
&lt;p&gt;The first recording I fed it was a 10-second clip of a website showing a behavior that was hard to describe precisely. Within four frames, the skill identified it as a classic A/B test flicker: the control state renders first, then the testing platform&apos;s script fires, evaluates its targeting rules, and swaps in the variant. You can see the original layout briefly before the form appears.&lt;/p&gt;
&lt;p&gt;That identification was immediate and specific enough to be actionable. The fix isn&apos;t in the code, it&apos;s in the test platform configuration. That&apos;s the kind of answer that takes 30 minutes to reach through text description and back-and-forth clarification.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The iteration happened in the same session&lt;/h2&gt;
&lt;p&gt;One thing I find genuinely useful about building skills this way: they improve in real time. After the first run, I noticed two things that were wrong.&lt;/p&gt;
&lt;p&gt;The temp files landed in &lt;code&gt;/tmp/&lt;/code&gt;, which means they scatter outside the project and get cleaned up by the OS at unpredictable times. That&apos;s fine for a quick session but annoying in practice. The skill now writes frames to &lt;code&gt;screen-recordings/&lt;/code&gt; inside the project root, so they stay in context and you know where to find them.&lt;/p&gt;
&lt;p&gt;The focus hint (the optional second argument for telling the skill what to look for) was optional in the invocation but easy to forget. The skill now prompts for it interactively if you don&apos;t provide one. A short question before the FFmpeg work starts is worth it: &quot;general overview&quot; is a valid answer, but &quot;why does the header shift at the moment the modal opens&quot; produces a much more targeted analysis.&lt;/p&gt;
&lt;p&gt;Both changes happened in the same conversation where the skill ran for the first time. That feedback loop is one of the things that makes skills worth building.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;When to use this versus a screenshot&lt;/h2&gt;
&lt;p&gt;I already have a skill for screenshot-grounded development (aieyes), which captures the live site at a specific viewport and reads it into context. That&apos;s the right tool when you have a static UI state you want to inspect.&lt;/p&gt;
&lt;p&gt;Screen recording is for behavior. Anything that involves a sequence of states, a transition, a timing dependency, or something you&apos;d otherwise describe with &quot;when I click X, then Y happens&quot; is a better fit for a recording than a screenshot.&lt;/p&gt;
&lt;p&gt;Short clips work best. Under three minutes. If you have a longer recording, QuickTime&apos;s trim tool takes about 10 seconds to isolate the relevant segment, and the analysis is sharper for it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The skill is public&lt;/h2&gt;
&lt;p&gt;The skill is available at &lt;a href=&quot;https://github.com/rocksoup/videofeedback&quot;&gt;rocksoup/videofeedback&lt;/a&gt;. It requires FFmpeg (&lt;code&gt;brew install ffmpeg&lt;/code&gt;) and Claude Code. Copy &lt;code&gt;SKILL.md&lt;/code&gt; into &lt;code&gt;.claude/skills/screen-recording/&lt;/code&gt; and it registers automatically at next launch.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Using the Chrome DevTools MCP to query live site markup from inside Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. A skill that turns tracker state and git history into a fast project handoff.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/slack-bridge-for-claude-code&quot;&gt;How I Control Claude Code from Slack Using the Channels MCP&lt;/a&gt;. Push messages into a running Claude Code session from Slack on your phone.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Building Agent Memory That Survives Between Sessions | Pere Villega</title>
      <link>https://perevillega.com/posts/2026-03-24-building-agent-memory-that-survives-between-sessions/?ref=sidebar</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-04-13-building-agent-memory-that-survives-between-sessions-pere-villega</guid>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;original 170-line CLAUDE.md had Claude ignoring instructions in the middle. This isn’t a quirk, it’s a well-documented phenomenon.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>§ Inspect before you ask: wiring Chrome&apos;s debug protocol into your AI workflow</title>
      <link>https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection</guid>
      <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I was in the middle of a GA4 event tracking project and needed to know the exact CSS selector for a promo button buried in a mega menu. I didn&apos;t know the answer off the top of my head.&lt;/p&gt;
&lt;p&gt;I could have opened DevTools in my browser and clicked around. Instead, I queried the live DOM from inside Claude Code and had the confirmed selector in about 30 seconds.&lt;/p&gt;
&lt;p&gt;That 30-second lookup is the point of this post.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The pattern: answer your own questions before they become someone else&apos;s&lt;/h2&gt;
&lt;p&gt;When you&apos;re coordinating across a project (with collaborators, with an AI doing implementation work, or just with your future self) ambiguity has a compounding cost. A question you can&apos;t answer right now becomes a blocker or a guess. With the right tooling, it becomes a 30-second lookup.&lt;/p&gt;
&lt;p&gt;This applies at every stage of a project. During discovery, you&apos;re checking whether the live site matches the documented spec. During implementation, you&apos;re verifying selectors, event bindings, z-index stacking. During QA, you&apos;re confirming that the deployed version behaves the way the code says it should.&lt;/p&gt;
&lt;p&gt;The common thread: you have a question about the live rendered page, and the answer lives in the DOM, not in the source code. Source tells you what the code intends. The live DOM tells you what actually happened after the framework, the CMS, the lazy loader, and the ad scripts all had their say.&lt;/p&gt;
&lt;p&gt;The Chrome DevTools Protocol has been available for years. What&apos;s changed is that MCP servers make it a first-class tool in an AI workflow, not a standalone debugging utility. You don&apos;t need to leave your terminal to get the answer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What the Chrome DevTools MCP actually gives you&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/anthropics/anthropic-quickstarts/tree/main/mcp-chrome-devtools&quot;&gt;Chrome DevTools MCP server&lt;/a&gt; connects Claude Code to a running Chrome instance through the Chrome DevTools Protocol. That gives you a set of concrete capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate to any URL.&lt;/strong&gt; Load the page as a real browser, not a fetch request. JavaScript executes, lazy content loads, auth cookies apply.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluate arbitrary JavaScript against the live DOM.&lt;/strong&gt; &lt;code&gt;document.querySelector&lt;/code&gt;, &lt;code&gt;getComputedStyle&lt;/code&gt;, read &lt;code&gt;dataset&lt;/code&gt; attributes, walk the DOM tree. Anything you could type in the Chrome console, the AI can run programmatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extract markup, computed styles, event listener bindings.&lt;/strong&gt; Not the authored CSS, but what the browser actually applied after cascade, specificity, and media queries resolved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take screenshots.&lt;/strong&gt; Visual confirmation that the page state matches what you&apos;re querying. Useful for catching cases where the DOM says one thing and the layout says another.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inspect network requests.&lt;/strong&gt; See what resources loaded, what failed, what the response headers look like. Catch third-party scripts misbehaving without opening the Network tab manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The critical thing: you&apos;re working against the &lt;em&gt;live, rendered site&lt;/em&gt;, not the source code, not a static build artifact. If a class gets added at runtime by a JS framework, you see it. If a lazy-loaded element hasn&apos;t rendered yet, you know. If a third-party script injects a wrapper div that shifts your layout, it&apos;s right there.&lt;/p&gt;
&lt;p&gt;For analytics work, this means you can query selectors against the production site and get confirmed answers. No guessing, no &quot;I think this is the right class.&quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The friction problem, and why it matters&lt;/h2&gt;
&lt;p&gt;The MCP itself is easy to configure. A few lines in &lt;code&gt;.mcp.json&lt;/code&gt; and Claude Code picks it up at session start. The friction is upstream of that.&lt;/p&gt;
&lt;p&gt;Chrome needs to be running with &lt;code&gt;--remote-debugging-port=9222&lt;/code&gt; for the MCP to connect. On macOS, that means quitting your existing Chrome session and relaunching with the flag. The first time, it&apos;s fine. The fifth time in a week, it&apos;s annoying enough that you start skipping it for &quot;small&quot; questions. And small questions answered with guesses are where projects accumulate technical debt.&lt;/p&gt;
&lt;p&gt;Two pieces solve this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A shell function&lt;/strong&gt; (&lt;code&gt;chrome-debug&lt;/code&gt;) that handles the quit-and-relaunch dance in one command. It closes Chrome gracefully, waits for the process to terminate, relaunches with &lt;code&gt;--remote-debugging-port=9222&lt;/code&gt;, and polls until the debug port responds. One command, no manual steps, works from any terminal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chrome-debug() {
  osascript -e &apos;tell application &quot;Google Chrome&quot; to quit&apos; 2&gt;/dev/null
  while pgrep -x &quot;Google Chrome&quot; &gt; /dev/null; do sleep 0.5; done
  open -a &quot;Google Chrome&quot; --args --remote-debugging-port=9222
  echo &quot;Waiting for debug port...&quot;
  while ! curl -s http://localhost:9222/json &gt; /dev/null 2&gt;&amp;#x26;1; do sleep 0.5; done
  echo &quot;Chrome debug port active on 9222&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;A Claude Code skill&lt;/strong&gt; (&lt;code&gt;/chrome-debug&lt;/code&gt;) that wraps the shell function, verifies the MCP connection is live, and optionally navigates to a URL, all from inside Claude Code without switching windows. The skill calls the shell function, confirms the port is responding, and reports back. From that point, every &lt;code&gt;chrome-devtools&lt;/code&gt; MCP tool is available in the session.&lt;/p&gt;
&lt;p&gt;The skill part matters more than it sounds. When the tool is one slash command away, you use it reflexively. When it requires a context switch to a terminal, a remembered flag, and a manual verification step, you skip it for &quot;small&quot; questions. Those are exactly the questions where guessing introduces errors.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What this changes about how you work&lt;/h2&gt;
&lt;p&gt;The selector lookup is a small example. The larger pattern is: when you can inspect the live site directly, a whole category of &quot;I&apos;ll need to check on that&quot; questions becomes &quot;let me look that up now.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Need to confirm which elements exist in a mega menu before writing tracking code? Query the DOM.&lt;/li&gt;
&lt;li&gt;Not sure whether a component is lazy-loaded or server-rendered? Check the live page.&lt;/li&gt;
&lt;li&gt;Wondering if a CMS injected extra wrapper markup that changes your selector path? Inspect and find out.&lt;/li&gt;
&lt;li&gt;Want to verify that the deployed site matches what the source code says it should produce? Screenshot and compare.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of those is a question that would otherwise stall work, either because you&apos;d need to context-switch to a browser or because you&apos;d guess and move on. The tool doesn&apos;t make you faster at guessing. It makes guessing unnecessary.&lt;/p&gt;
&lt;p&gt;Any time you&apos;re writing code, documentation, or instructions that reference the live site (selectors, page structure, computed styles, loaded resources) the ability to query the real thing from inside your AI workflow eliminates an entire class of &quot;I think this is right&quot; hedging.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The setup&lt;/h2&gt;
&lt;p&gt;The full setup has three pieces: the MCP server configuration, the shell function, and the skill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. MCP server configuration&lt;/strong&gt; (in &lt;code&gt;.mcp.json&lt;/code&gt; at the project root):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;chrome-devtools&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@anthropic/mcp-chrome-devtools@latest&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Claude Code reads this at session start and makes the chrome-devtools tools available automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Shell function&lt;/strong&gt; (in your &lt;code&gt;.zshrc&lt;/code&gt; or &lt;code&gt;.bashrc&lt;/code&gt;):&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;chrome-debug&lt;/code&gt; function shown above. Source your shell config or restart your terminal after adding it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Claude Code skill&lt;/strong&gt; (optional, but recommended):&lt;/p&gt;
&lt;p&gt;A skill file at &lt;code&gt;.claude/skills/chrome-debug/&lt;/code&gt; that wraps the shell function with verification. This gives you &lt;code&gt;/chrome-debug&lt;/code&gt; as a slash command inside Claude Code, so you never need to leave the session to set up the connection.&lt;/p&gt;
&lt;p&gt;Once all three are in place, the workflow is: &lt;code&gt;/chrome-debug&lt;/code&gt; → Chrome relaunches with debugging → MCP connects → you can query the live DOM from inside Claude Code. The whole startup takes about five seconds.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;When to reach for this versus other tools&lt;/h2&gt;
&lt;p&gt;This isn&apos;t the right tool for everything. Some guidelines from using it on real projects:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use the Chrome DevTools MCP when&lt;/strong&gt; you need the live rendered page: runtime-generated markup, computed styles, lazy-loaded content, third-party script effects. Anything where the source code and the browser output might diverge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Playwright or a headless scraper when&lt;/strong&gt; you need to automate a multi-step flow: click through a navigation, fill a form, capture a sequence of states. The Chrome DevTools MCP is better for point queries; Playwright is better for scripted interactions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;curl&lt;/code&gt; or &lt;code&gt;fetch&lt;/code&gt; when&lt;/strong&gt; you just need the raw HTML response. If you&apos;re checking whether a meta tag exists in the initial HTML, you don&apos;t need a full browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the source code when&lt;/strong&gt; you&apos;re changing the implementation, not inspecting the output. The MCP shows you what the browser did with the code. The source shows you what you intended.&lt;/p&gt;
&lt;p&gt;The sweet spot is exactly where I started: you have a specific question about the live page, and you want a verified answer in your current working context, without switching tools.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/slack-bridge-for-claude-code&quot;&gt;How I Control Claude Code from Slack Using the Channels MCP&lt;/a&gt;. Push messages into a running Claude Code session from Slack on your phone.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/linear-walkthrough-pattern&quot;&gt;The Linear Walkthrough: Architecture Context That Stays Accurate for AI Agents&lt;/a&gt;. The documentation pattern that gives AI agents full codebase context at session start.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. A skill that turns tracker state and git history into a fast project handoff.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>§ Skills as Lightweight Workflow Packaging: Project Briefing</title>
      <link>https://stonebergdesign.com/blog/project-briefing-skill</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/project-briefing-skill</guid>
      <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;The most useful agent skills are not magic prompts. They are lightweight workflow packages: a clear trigger, a repeatable method, and an expected output stored in files that can be reviewed and versioned.&lt;/p&gt;
&lt;p&gt;That pattern matters because recurring work drifts when its procedure lives only in conversation history. A file-based skill gives the workflow a durable home, makes its assumptions visible, and lets different agents execute the same process.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rocksoup/project-briefing&quot;&gt;Project Briefing&lt;/a&gt; is one concrete example. I keep many projects in flight and might step away from one for a week or more. When I return, I need a fast answer to three questions: what is this project trying to do, what just finished, and what should happen next?&lt;/p&gt;
&lt;h2&gt;What it does&lt;/h2&gt;
&lt;p&gt;The skill is designed to turn a project&apos;s real working state into a short, business-readable brief. Instead of dumping tickets or commit messages, it tries to answer five practical questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the project objective?&lt;/li&gt;
&lt;li&gt;What was completed recently?&lt;/li&gt;
&lt;li&gt;What is the current milestone?&lt;/li&gt;
&lt;li&gt;What is the next concrete step?&lt;/li&gt;
&lt;li&gt;What risks or open questions remain?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That structure matters. I usually do not need a changelog when I am re-entering a project. I need something closer to a handoff.&lt;/p&gt;
&lt;h2&gt;How I use it&lt;/h2&gt;
&lt;p&gt;The workflow is intentionally simple. I install the skill locally, then trigger it with plain-English prompts like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;get me up to speed
where did we leave this
give me the brief
summarize completed work and what&apos;s next
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The skill reads across a few high-signal sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repo instruction files such as &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;README.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the project tracker, including Beads-backed repos&lt;/li&gt;
&lt;li&gt;recent git activity&lt;/li&gt;
&lt;li&gt;architecture docs, runbooks, plans, and notes&lt;/li&gt;
&lt;li&gt;the current conversation when there is context that has not been written down yet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, that means I can come back to a project and get a quick narrative instead of re-reading a pile of tracker state and commit history.&lt;/p&gt;
&lt;p&gt;If you want to try it, install the nested skill directory rather than the repo root:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp -R project-briefing/project-briefing ~/.codex/skills/project-briefing
# or
cp -R project-briefing/project-briefing ~/.claude/skills/project-briefing
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Why I like skills in general&lt;/h2&gt;
&lt;p&gt;I use skills as lightweight workflow packaging for recurring jobs. They help me avoid rewriting the same instructions every session, and they make outputs more consistent across projects, machines, and agents.&lt;/p&gt;
&lt;p&gt;For me, the value is less about magic and more about reducing startup friction. A good skill narrows a vague request into a reliable shape.&lt;/p&gt;
&lt;p&gt;This &lt;code&gt;project-briefing&lt;/code&gt; skill is a good example of that. It takes a messy mix of tracker state, docs, and recent implementation history and turns it into something I can actually use to decide what to do next.&lt;/p&gt;
&lt;p&gt;It is also intentionally agent-agnostic. I want these workflow assets to move with me instead of being locked to one tool.&lt;/p&gt;
&lt;p&gt;The repo is public here if you want to look at it or use it yourself: &lt;a href=&quot;https://github.com/rocksoup/project-briefing&quot;&gt;rocksoup/project-briefing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you find yourself wishing the source material existed before you need the briefing, take a look at &lt;a href=&quot;https://stonebergdesign.com/blog/project-kickoff-skill&quot;&gt;project-kickoff&lt;/a&gt;. It&apos;s the companion skill that bootstraps new project directories with OVERVIEW.md, LOG.md, and CLAUDE.md so that project-briefing has something good to work with from day one.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-kickoff-skill&quot;&gt;Project Kickoff: Start Every Project the Same Way&lt;/a&gt;. The companion skill that bootstraps new project directories with consistent structure so briefings have good source material.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/slack-bridge-for-claude-code&quot;&gt;How I Control Claude Code from Slack Using the Channels MCP&lt;/a&gt;. Push messages into a running Claude Code session from Slack on your phone using the Channels MCP.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/linear-walkthrough-pattern&quot;&gt;The Linear Walkthrough: Architecture Context That Stays Accurate for AI Agents&lt;/a&gt;. The documentation pattern that gives AI agents full codebase context at session start.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Using the Chrome DevTools MCP to query live site markup from inside Claude Code.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>§ Control Claude Code from Slack with the Channels MCP</title>
      <link>https://stonebergdesign.com/blog/slack-bridge-for-claude-code</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/slack-bridge-for-claude-code</guid>
      <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Claude Code sessions are stateful. The agent has context, file access, a running tool environment but the session is tied to a terminal window which means you have to be sitting in front of it to interact with it.&lt;/p&gt;
&lt;p&gt;A common occurence for me is to set Claude to work in Claude Code on my Mac and walk away from the computer and when I do that I lose touch with that open process. This solution offers a way to continue interacting with Claude in that session on my Mac via Slack on my phone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stonebergdesign.com/static/videos/slack-channel-demo.mp4&quot;&gt;Claude Code terminal on the left, Slack on the right. Message in, work done, reply back in the thread.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The setup: Claude Code is running a session on my laptop. As long as that session is open and the computer is awake and connected to the network I can pick up my phone, send a message to the right Slack channel, and Claude will act on it and reply. No app switching, no VPN, no remote desktop. Just Slack.&lt;/p&gt;
&lt;p&gt;From Slack on my phone, mid-afternoon:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Which projects are best to work on next? Like which issues?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude ran &lt;code&gt;bd ready&lt;/code&gt;, checked priorities, and replied in the thread within a few seconds. I didn&apos;t open the terminal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;You could already do something like this with &lt;a href=&quot;https://openclaw.ai&quot;&gt;Open Claw&lt;/a&gt; — using a Slack bot that talks to Claude through MCP. But that requires standing up a separate service. &lt;a href=&quot;https://code.claude.com/docs/en/channels&quot;&gt;Channels&lt;/a&gt; looks like it is Anthropic addressing a part of the Open Claw feature set in Claude Code itself: a research preview MCP capability that lets external processes push events directly into a running session. Claude picks them up between turns, it finishes whatever it&apos;s doing then reads the message. The asynchronous nature is the point.&lt;/p&gt;
&lt;p&gt;The Slack side uses Socket Mode, which opens a persistent WebSocket &lt;em&gt;to&lt;/em&gt; Slack rather than waiting for Slack to push to you. No public URL, no ngrok session to babysit. Your machine dials out on startup and keeps the connection alive. It&apos;s the same model the official Telegram and Discord plugins use, and it&apos;s the right call for a tool running on a dev laptop.&lt;/p&gt;
&lt;p&gt;One server file. One Slack bot. Each project gets its own channel configured by env vars in &lt;code&gt;.mcp.json&lt;/code&gt;. Claude Code spawns the server at startup and the whole thing is running.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The thing that actually matters&lt;/h2&gt;
&lt;p&gt;The initial version worked one way: messages arrived, Claude did the work, nothing went back to Slack. The &lt;code&gt;reply&lt;/code&gt; tool was listed correctly, but Claude wasn&apos;t calling it.&lt;/p&gt;
&lt;p&gt;The fix was in the &lt;code&gt;instructions&lt;/code&gt; field — the string the MCP server passes to Claude Code, which goes directly into the system prompt. The original wording told Claude to call reply &quot;when appropriate.&quot; The working version is more direct:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;CRITICAL: The user cannot see the terminal at all. The ONLY way they receive your response is if you call the reply tool. You MUST call reply after every single Slack message — no exceptions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is worth internalizing for any MCP tool that expects reliable behavior: the &lt;code&gt;instructions&lt;/code&gt; field is your system prompt. Write it like a constraint, not a suggestion. Claude will follow vague guidance vaguely.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;One security decision worth naming&lt;/h2&gt;
&lt;p&gt;An ungated channel is a prompt injection vector. Anyone who can reach the Slack channel can put arbitrary text in front of Claude.&lt;/p&gt;
&lt;p&gt;The server gates on Slack user ID, not channel ID. That distinction matters in group channels, where gating on membership would let anyone in the channel inject messages. User ID is the right unit.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The short version&lt;/h2&gt;
&lt;p&gt;The Channels API turns Claude Code into something you can interact with asynchronously. The &quot;one server, many projects&quot; pattern keeps it from becoming maintenance work — add a project by creating a Slack channel, inviting the bot, and dropping a &lt;code&gt;.mcp.json&lt;/code&gt;. Everything else is already running.&lt;/p&gt;
&lt;p&gt;It&apos;s research preview, and it shows. But the model is right.&lt;/p&gt;
&lt;p&gt;Pair it with &lt;a href=&quot;https://stonebergdesign.com/blog/aieyes-screenshot-mcp&quot;&gt;screenshot-based visual feedback&lt;/a&gt; or &lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;live site inspection via the Chrome DevTools MCP&lt;/a&gt; to build a more complete picture of what the agent is doing while you&apos;re away from the terminal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Next: give the agent eyes on the live site&lt;/h2&gt;
&lt;p&gt;The Slack bridge lets you send commands remotely, but the agent still can&apos;t &lt;em&gt;see&lt;/em&gt; what it built. Inspect Before You Ask covers wiring Chrome&apos;s debug protocol into Claude Code so it can query live DOM, check layout, and verify its own work without you in the loop.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/aieyes-screenshot-mcp&quot;&gt;Closing the Visual Feedback Loop in AI-Assisted UI Development&lt;/a&gt;. Let the agent take its own screenshots and see what it produced, without you in the middle.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/linear-walkthrough-pattern&quot;&gt;The Linear Walkthrough: Architecture Context That Stays Accurate for AI Agents&lt;/a&gt;. The documentation pattern that gives AI agents full codebase context at session start.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. A skill that turns tracker state and git history into a fast project handoff.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Using the Chrome DevTools MCP to query live site markup from inside Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/screen-recording-skill&quot;&gt;Show, Don&apos;t Describe: Analyzing UI Recordings with Claude Code&lt;/a&gt;. Extract key frames from a screen recording to communicate dynamic UI behavior to the agent with full fidelity — better than describing what you saw.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/channels&quot;&gt;Channels documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/channels-reference&quot;&gt;Channels reference — building a custom channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://api.slack.com/apis/socket-mode&quot;&gt;Official Slack Socket Mode docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;If you&apos;re building AI-assisted workflows into your team&apos;s development process, &lt;a href=&quot;https://stonebergdesign.com/about&quot;&gt;I work with organizations on exactly this kind of integration&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Agent Skills Directory</title>
      <link>https://skills.sh/?ref=sidebar</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-19-the-agent-skills-directory</guid>
      <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Skills are reusable capabilities for AI agents. Install them with a single command to enhance your agents with access to procedural knowledge.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>QuiverAI – Building the Future of Vector Design</title>
      <link>https://quiver.ai/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-19-quiverai-building-the-future-of-vector-design</guid>
      <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Foundational models for Generating, Editing, and Animating vector graphics. Built by researchers. Made for designers.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Dark Factory Is a .dot file — 2389 Research, Inc</title>
      <link>https://2389.ai/posts/the-dark-factory-is-a-dot-file/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-18-the-dark-factory-is-a-dot-file-2389-research-inc</guid>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The factory code is dorodango — polish it, throw it away, rebuild from spec. The pipeline files are the durable artifact. They’re the part worth sharing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- This resonates. The BPMN-ish build file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The last year of localhost · Ona</title>
      <link>https://ona.com/stories/the-last-year-of-localhost</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-17-the-last-year-of-localhost-ona</guid>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Background agents humming across a software assembly line can&apos;t run on a laptop.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- ++ on cloud environments for agent activity&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenUI</title>
      <link>https://www.openui.com/?ref=sidebar</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-17-openui</guid>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;An open source toolkit to make your
AI apps respond with your UI.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>DoltHub</title>
      <link>https://www.dolthub.com/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-17-dolthub</guid>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dolt is Git for Data
The world&apos;s first and only version controlled SQL database&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- turns out I&apos;m going to become an expert at DOLT now that Beads has adopted it...&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beads - Memory for your Agent and The Best Damn Issue Tracker Your&apos;re Not Using</title>
      <link>https://ianbull.com/posts/beads/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-15-beads-memory-for-your-agent-and-the-best-damn-issue-tracker-your-re-not-using</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The tool provides the memory. You provide the discipline.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- Beads is in every repo owned by me, indispensable&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Self-Driving Codebase: Background Agents and the Next Era of Software Delivery</title>
      <link>https://background-agents.com/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-03-06-the-self-driving-codebase-background-agents-and-the-next-era-of-software-deliver</guid>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;A coding agent needs your machine and your attention. A background agent needs neither. It runs in its own development environment in the cloud: full toolchain, test suite, everything. Completely decoupled from your device and your session.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kick one off from your laptop, check the result from your phone. Trigger it from a PR, a Slack thread, a Linear ticket, a webhook, or just spin one up manually.&lt;/p&gt;
&lt;p&gt;You&apos;re not steering it. You&apos;re not watching it. It&apos;s an asynchronous task: delegate, walk away, review later. It runs for as long as it needs to.&lt;/p&gt;
&lt;p&gt;--- Strongly agree on the perspective here and looking forward to moving in this direction&lt;/p&gt;</description>
    </item>
    <item>
      <title>§ A Catalog Is Not a Map: Architecture Context for AI Agents</title>
      <link>https://stonebergdesign.com/blog/linear-walkthrough-pattern</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/linear-walkthrough-pattern</guid>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I&apos;ve been thinking about what makes AI-assisted development actually work at the session level. Not prompt engineering or model choice, but the operational context an agent receives when it starts. What does the agent read when it wakes up, and how accurate is it?&lt;/p&gt;
&lt;p&gt;The answer I landed on is a document pattern I&apos;m calling the Linear Walkthrough. I first wrote about it while implementing it on a side project called OnCourt. This week I implemented it here on this site.&lt;/p&gt;
&lt;h2&gt;The problem it solves&lt;/h2&gt;
&lt;p&gt;Every AI coding session starts with a context gap. The agent has no memory of the last session, no intuition built up from months of working in the codebase. It has to figure out the system from scratch.&lt;/p&gt;
&lt;p&gt;The usual approach is to put a summary in &lt;code&gt;CLAUDE.md&lt;/code&gt;: a list of directories, key files, and commands. That&apos;s better than nothing, but it&apos;s a catalog, not a map. It tells you what files exist, not how they relate. &quot;The blog posts live in &lt;code&gt;data/blog/&lt;/code&gt;&quot; is useful. &quot;Blog posts are MDX files that Contentlayer processes at build time, generating typed TypeScript objects that page components import from &lt;code&gt;contentlayer/generated&lt;/code&gt;&quot; creates understanding.&lt;/p&gt;
&lt;p&gt;The difference is: one is a reference, the other is understanding.&lt;/p&gt;
&lt;h2&gt;What the Linear Walkthrough is&lt;/h2&gt;
&lt;p&gt;A single document, &lt;code&gt;docs/architecture.md&lt;/code&gt;, that narrates how the system works from the outside in. Not a list of files, but a connected story about how data flows through the app.&lt;/p&gt;
&lt;p&gt;It has six sections:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. What the app is.&lt;/strong&gt; One paragraph, plain English. What does this thing do and who uses it? Establishes context before diving into tech.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. System map.&lt;/strong&gt; An ASCII diagram showing all components and how they connect. Makes the overall topology scannable at a glance before you read the details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Layers.&lt;/strong&gt; One section per architectural layer, working from the bottom of the stack upward: data storage, content schema, configuration, pages, SEO, feature flags, analytics, and so on. Each layer explains not just what exists but how it connects to the layers above and below it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. End-to-end flows.&lt;/strong&gt; Two or three concrete user journeys traced all the way through the stack. &quot;Visitor reads a blog post&quot; and &quot;AI agent starts a session&quot; on this site. These are the most valuable sections for agents because they stitch the layers into a coherent picture of cause and effect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Infrastructure.&lt;/strong&gt; Local dev, production, CI/CD. Deploy commands and what auto-deploys vs. requires manual action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Maintenance rules.&lt;/strong&gt; An explicit list of what changes require updating the document. This is what separates a useful doc from one that quietly goes stale in three weeks.&lt;/p&gt;
&lt;h2&gt;Key design decisions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Narrative, not catalog.&lt;/strong&gt; Everything written from the perspective of a reader who needs to understand, not reference. Routes get a table, but the table has a paragraph above it explaining the request lifecycle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code snippets as schemas.&lt;/strong&gt; Inline TypeScript and JSON blocks show data shapes directly. Readers shouldn&apos;t need to open &lt;code&gt;contentlayer.config.ts&lt;/code&gt; to know what fields a blog post has.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Only verifiable facts.&lt;/strong&gt; Every endpoint path, field name, and environment variable is copied directly from source. No inferred behavior, no aspirational behavior. This is the constraint that keeps the doc trustworthy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surgical updates.&lt;/strong&gt; When code changes, only the affected section updates, not the entire document. A section-to-source mapping table in the maintenance rules tells you exactly which source files to read for each section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI-agent-optimized.&lt;/strong&gt; The primary reader is an AI agent at session start. The goal is that after reading this document, the agent has enough context to complete routine tasks without exploring files.&lt;/p&gt;
&lt;h2&gt;On this site specifically&lt;/h2&gt;
&lt;p&gt;This site is a statically-exported Next.js portfolio site with a Contentlayer MDX pipeline, a blog feature flag, and a GitHub Actions deploy to GitHub Pages. The architecture isn&apos;t complicated, but the interactions between the feature flag, the redirect config, the sitemap generation, and the nav rendering are exactly the kind of thing an agent gets wrong without full context.&lt;/p&gt;
&lt;p&gt;The system map for this site looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Visitor&apos;s browser
  └── stonebergdesign.com (GitHub Pages CDN)
        └── Static HTML/CSS/JS (pre-built at deploy time)

Build pipeline (GitHub Actions)
  └── Next.js static export (EXPORT=1 UNOPTIMIZED=1)
        ├── Contentlayer: processes data/blog/**/*.mdx
        └── Next.js App Router: renders all pages to /out/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s the whole thing. No server. No database. No auth. Even a simple system benefits from having its interactions documented, especially the blog feature flag, which touches four separate files and controls whether the blog exists at all for visitors.&lt;/p&gt;
&lt;h2&gt;Enforcing freshness&lt;/h2&gt;
&lt;p&gt;The pattern only works if the document stays accurate. Two mechanisms enforce that:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The update skill.&lt;/strong&gt; A runbook at &lt;code&gt;docs/skills/architecture-update/SKILL.md&lt;/code&gt; that gives a step-by-step process for updating the doc when code changes. It includes a section-to-source mapping table so you know exactly which files to read for each section, and an explicit checklist for accuracy (no inferred behavior, no aspirational behavior, no historical context).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The CLAUDE.md rule.&lt;/strong&gt; A mandatory rule in the agent instructions file that lists the specific triggers for updating the architecture doc and points to the skill for procedure. The rule makes the update explicitly non-optional.&lt;/p&gt;
&lt;p&gt;The key operational rule is: &lt;strong&gt;commit the doc update in the same commit as the code change.&lt;/strong&gt; Treating it as optional or &quot;I&apos;ll do it later&quot; is what causes drift.&lt;/p&gt;
&lt;h2&gt;Maintenance burden&lt;/h2&gt;
&lt;p&gt;Realistically: low. Most changes are surgical: one route table, one field name, or one section header. The full document on this site is about 350 lines and took a single focused session to write. Future updates will be measured in paragraphs, not documents.&lt;/p&gt;
&lt;p&gt;The discipline isn&apos;t writing the doc. It&apos;s committing the update alongside the code. That&apos;s the only hard part, and it&apos;s mostly a habit.&lt;/p&gt;
&lt;h2&gt;The pattern in one sentence&lt;/h2&gt;
&lt;p&gt;Write the architecture narrative once, keep it accurate with surgical updates, and give AI agents a rule that makes updating non-negotiable.&lt;/p&gt;
&lt;p&gt;The broader principle is not specific to AI. Documentation earns trust when it explains relationships, stays close to verifiable source material, and changes with the system. AI agents simply make the cost of getting that wrong visible faster. A catalog helps an agent search; a map helps it reason.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;More on AI-assisted development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/slack-bridge-for-claude-code&quot;&gt;How I Control Claude Code from Slack Using the Channels MCP&lt;/a&gt;. Push messages into a running Claude Code session from Slack on your phone using the Channels MCP.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/project-briefing-skill&quot;&gt;Project Briefing: A Small Skill for Getting Back Up to Speed&lt;/a&gt;. A skill that turns tracker state and git history into a fast project handoff.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stonebergdesign.com/blog/chrome-devtools-mcp-live-site-inspection&quot;&gt;Inspect Before You Ask: Wiring Chrome&apos;s Debug Protocol into Your AI Workflow&lt;/a&gt;. Using the Chrome DevTools MCP to query live site markup from inside Claude Code.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Writing about Agentic Engineering Patterns for Real Work</title>
      <link>https://simonwillison.net/2026/Feb/23/agentic-engineering-patterns/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-02-23-writing-about-agentic-engineering-patterns</guid>
      <pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;I’m using Agentic Engineering to refer to building software using coding agents—tools like Claude Code and OpenAI Codex, where the defining feature is that they can both generate and execute code—allowing them to test that code and iterate on it independently of turn-by-turn guidance from their human supervisor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- This lands for me because it is about operating model, not branding. The meaningful shift is that the agent can act, verify, and keep going, which changes how much structure you need around tasks, documentation, and feedback loops.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The A.I. Disruption We’ve Been Waiting for Has Arrived</title>
      <link>https://simonwillison.net/2026/Feb/18/the-ai-disruption/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-02-18-the-a-i-disruption-we-ve-been-waiting-for-has-arrived</guid>
      <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;All of the people I love hate this stuff, and all the people I hate love it. And yet, likely because of the same personality flaws that drew me to technology in the first place, I am annoyingly excited.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The AI hater&apos;s guide to code with LLMs (The Overview) | All Confirmation Bias, All The Time</title>
      <link>https://aredridel.dinhe.net/2026/02/12/the-ai-haters-guide-to-code-with-llms/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-02-16-the-ai-hater-s-guide-to-code-with-llms-the-overview-all-confirmation-bias-all-th</guid>
      <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Suddenly, we have a clear technical reason to document everything, to use a clear type system, to clarify things with schemas and plans, to communicate technical direction before we’re in the weeds of editing code. All the things that developers are structurally pushed to do less of, even though they’re always a net win, are rewarded.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>An AI Hater&apos;s Guide to Coding with LLMs: The How-To</title>
      <link>https://aredridel.dinhe.net/2026/02/15/an-ai-haters-guide-to-code-with-llms-the-how-to/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-02-16-an-ai-haters-guide-to-code-with-llms-the-how-to-all-confirmation-bias-all-the-ti</guid>
      <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Build Guard-rails&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Add more tests. Get the LLM to write tests, and to suggest tests to write.&lt;/p&gt;
&lt;p&gt;--- The useful reminder here is not “LLMs are bad” but “verification is the job now.” If the model makes implementation cheaper, then careful review, stronger tests, and tighter constraints become the part worth spending your own attention on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&apos;t &quot;Trust the Process&quot;</title>
      <link>https://simonwillison.net/2026/Jan/24/dont-trust-the-process/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-25-don-t-trust-the-process</guid>
      <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Don&apos;t &quot;Trust the Process&quot; (via) Jenny Wen, Design Lead at Anthropic (and previously Director of Design at Figma) gave a provocative keynote at Hatch Conference in Berlin last September.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;--- Impacts of AI tools on &quot;best practices&quot; for designers that apply broadly IMO. I do think that while the traditional process might not be as directly required/valuable now the practice of having run through it many times builds a mindset that I think &lt;em&gt;is&lt;/em&gt; super valuable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software as clay on the wheel</title>
      <link>https://dri.es/software-as-clay-on-the-wheel</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-20-software-as-clay-on-the-wheel-dries-buytaert</guid>
      <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;---  Dries Buytaert on the rate of change in AI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The boundary keeps moving fast. A year ago, I was wrestling with local LLMs to generate good alt-text for images. Today, AI agents build working HTML5 parsers while you watch a movie. It&apos;s hard not to find that a little absurd. And hard not to be excited.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AddyOsmani.com - 21 Lessons From 14 Years at Google</title>
      <link>https://addyosmani.com/blog/21-lessons/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-13-addyosmani-com-21-lessons-from-14-years-at-google</guid>
      <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The punchline isn’t “never innovate.” It’s “innovate only where you’re uniquely paid to innovate.” Everything else should default to boring, because boring has known failure modes.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Teaching Claude to Design Better: Improving Anthropic&apos;s Frontend Design Skill</title>
      <link>https://www.justinwetch.com/blog/improvingclaudefrontend</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-10-teaching-claude-to-design-better-improving-anthropic-s-frontend-design-skill</guid>
      <pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;By Justin Wetch    ANTHROPIC DEFAULT FRONTEND SKILL      REWRITTEN FRONTEND SKILL      View the PR Request     After  building a GUI  for Anthropic&apos;s Bloom framework last month (and more recently,  proposing ten new behaviors  it could test for), I found myself wanting to dig deeper into their ecosy&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>My Claude Code Workflow for Building Features</title>
      <link>https://willness.dev/blog/claude-code-workflow</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-08-my-claude-code-workflow-for-building-features</guid>
      <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;A structured workflow for using Claude Code with sub-agents to catch issues, maintain code quality, and ship faster. Plan reviews, code reviews, and persistent task management.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Remote Claude Code: programing like it was the early 2000s | Harper Reed&apos;s Blog</title>
      <link>https://harper.blog/2026/01/05/claude-code-is-better-on-your-phone/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-07-remote-claude-code-programing-like-it-was-the-early-2000s-harper-reed-s-blog</guid>
      <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Harper Reed&apos;s phone setup: Tailscale for the network, Blink for SSH, Mosh and tmux so
the session survives. Framed as nostalgia, but the practical result is running an
agent from anywhere with no deployment infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>A field guide to sandboxes for AI</title>
      <link>https://simonwillison.net/2026/Jan/6/a-field-guide-to-sandboxes-for-ai/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-07-a-field-guide-to-sandboxes-for-ai</guid>
      <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Simon Willison on the isolation options for running untrusted code: containers,
microVMs, gVisor, and WebAssembly, and what each one actually protects you from.
Relevant the moment you let an agent execute something you did not write.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Helping people write code again</title>
      <link>https://simonwillison.net/2026/Jan/4/coding-again/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-04-helping-people-write-code-again</guid>
      <pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;If you have significant previous coding experience - even if it&apos;s a few years stale - you can drive these things really effectively. Especially if you have management experience, quite a lot of which transfers to &quot;managing&quot; coding agents - communicate clearly, set achievable goals, provide all relevant context.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>A Code-Abundant World - Evis</title>
      <link>https://www.evis.dev/posts/vcs</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2026-01-01-a-code-abundant-world-evis</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;In many ways, agents have turned codebases into stories, ones that need their narrative explicitly written in case the agent forgets and has to start over. This wasn&apos;t the case previously. As humans, we remember where we left off and the decisions we made to get there. Agents don&apos;t have that luxury. They need more context. The best part is that when they get it, they are even more productive than before.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Superpowers 4</title>
      <link>https://blog.fsck.com/2025/12/18/superpowers-4/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-19-superpowers-4</guid>
      <pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;I&apos;m pleased to announce Superpowers 4.0.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>designprompts.dev — Fix AI Design Drift Before It Starts</title>
      <link>https://www.designprompts.dev/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-12-design-prompts-ai-powered-design-style-explorer</guid>
      <pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Drop these prompts into any AI assistant and ship beautiful, consistent interfaces in minutes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The problem with AI-generated UI isn&apos;t the code — it&apos;s the aesthetic drift. Each generation pulls toward a bland, generic center unless you direct it with intention. This library addresses that by giving you pre-built style prompts — &quot;brutalist,&quot; &quot;glassmorphism,&quot; &quot;Swiss grid&quot; — that anchor the model to a specific visual language before it starts generating.&lt;/p&gt;
&lt;p&gt;It&apos;s a small tool, but the insight behind it is sound: the way to get consistent AI design output is to be more specific about the design direction upfront, not to iterate your way out of mediocrity afterward.&lt;/p&gt;</description>
    </item>
    <item>
      <title>packnplay: Making it easy to run coding agents in containers</title>
      <link>https://blog.fsck.com/2025/12/10/packnplay/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-11-packnplay-making-it-easy-to-run-coding-agents-in-containers</guid>
      <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;a tool to make it easier to run your favorite coding agent in a container without a lot of setup. It&apos;s called packnplay. You can find it on GitHub&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Improving frontend design through Skills | Claude</title>
      <link>https://claude.com/blog/improving-frontend-design-through-skills</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-11-improving-frontend-design-through-skills-claude</guid>
      <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Best practices for building richer, more customized frontend design with Claude and Skills.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Accessible by Design: The Role of the &apos;lang&apos; Attribute - HTMHell</title>
      <link>https://htmhell.dev/adventcalendar/2025/6/?ref=sidebar</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-11-accessible-by-design-the-role-of-the-lang-attribute-htmhell</guid>
      <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;I am here to discuss the importance of the language attribute in your code.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Useful patterns for building HTML tools</title>
      <link>https://simonwillison.net/2025/Dec/10/html-tools/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-10-useful-patterns-for-building-html-tools</guid>
      <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;So cool!&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>CleanShot X for Mac</title>
      <link>https://cleanshot.com/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-09-cleanshot-x-for-mac</guid>
      <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;CleanShot is a super powerful replacement for the macOS tool.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Hammer Hack – Rands in Repose</title>
      <link>https://randsinrepose.com/archives/the-hammer-hack/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-12-03-the-hammer-hack-rands-in-repose</guid>
      <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The other population knows a hammer doesn’t build anything for you; it just makes the act of building easier. Understanding the act of building doesn’t make your product good; it’s the experience of building and deeply understanding what you want to build that makes it great.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Making Software</title>
      <link>https://www.makingsoftware.com/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-29-making-software</guid>
      <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dan Hollick&apos;s reference manual on how the software you use every day actually works.
Touch screens, Gaussian blur, vector graphics, carried by illustrations rather than
tutorials.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Modern Illustration</title>
      <link>https://www.modernillustration.org/?ref=simplebits.com</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-28-modern-illustration</guid>
      <pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Zara Picken&apos;s archive of commercial print work from roughly 1950 to 1975. Matchbox
labels, greeting cards, advertising, catalogued with format, date, and creator where
known.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>OpenCode | The AI coding agent built for the terminal</title>
      <link>https://opencode.ai/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-25-opencode-the-ai-coding-agent-built-for-the-terminal</guid>
      <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;The AI coding agent built for the terminal&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OpenCode is fully open source, giving you control and freedom to use any provider, any model, and any editor.&lt;/p&gt;</description>
    </item>
    <item>
      <title>tree-me: Because git worktrees shouldn’t be a chore | You’ve Been Haacked</title>
      <link>https://haacked.com/archive/2025/11/21/tree-me/</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-24-tree-me-because-git-worktrees-shouldn-t-be-a-chore-you-ve-been-haacked</guid>
      <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;Phil Haack&apos;s shell wrapper over git worktrees. It derives the repo name and default
branch, files worktrees under a predictable path, and drops you into the new one.
Useful if you are running several agents in parallel.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Understanding Spec-Driven Development: Kiro, spec-kit, and Tessl</title>
      <link>https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-12-understanding-spec-driven-development-kiro-spec-kit-and-tessl</guid>
      <pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;hr&gt;
&lt;/blockquote&gt;
&lt;p&gt;What I like here is that it makes the value of spec-driven development concrete instead of mystical. The tooling will keep changing, but the pattern is already familiar: agents produce better code when you give them intent, boundaries, and acceptance criteria up front.&lt;/p&gt;
&lt;p&gt;--- That is the same reason I keep leaning on architecture walkthroughs, issue context, and repo-local skills. The exact product names are less important than the discipline of giving the model a real brief before it starts typing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stream Ring: Voice-Activated Ring – Sandbar</title>
      <link>https://www.sandbar.com/stream</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-12-stream-ring-voice-activated-ring-sandbar</guid>
      <pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;A fast, private, &amp;#x26; effortless way to capture thoughts in the moment. Whisper in a crowd. Hold to speak, tap to interrupt. Control your music with familiar gestures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Very cool AI input.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up a codebase for working with coding agents</title>
      <link>https://simonwillison.net/2025/Oct/25/coding-agent-tips/#atom-everything</link>
      <guid isPermaLink="false">https://stonebergdesign.com/blog/links/2025-11-11-setting-up-a-codebase-for-working-with-coding-agents</guid>
      <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;I&apos;m having great results from maintaining a GitHub issues collection for projects and pasting URLs to issues directly into Claude Code&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One my personal favorites as well - GH Issues is my source of truth&lt;/p&gt;</description>
    </item>
    <item>
      <title>§ How I Evaluate a Modern Web Stack</title>
      <link>https://stonebergdesign.com/blog/building-with-ai-choosing-a-modern-stack</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/building-with-ai-choosing-a-modern-stack</guid>
      <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Stack choices are bets about the future. I evaluate them less by how quickly they produce a demo and more by whether a team can operate, change, and eventually hand off the resulting system. My criteria are durability, ecosystem depth, deployment clarity, access for automation and agents, and the cost of reversing the decision later.&lt;/p&gt;
&lt;p&gt;My professional foundation is in open-source PHP content management systems, especially &lt;a href=&quot;https://www.drupal.org/&quot;&gt;Drupal&lt;/a&gt; and &lt;a href=&quot;https://wordpress.org/&quot;&gt;WordPress&lt;/a&gt;. Working more directly with AI-assisted development gave me a useful reason to test those criteria against a different ecosystem, including &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a dated stack check-in, not a permanent recommendation. It records what I chose in October 2025, why the pieces fit the work, and what I would reevaluate as the surrounding ecosystem changes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;GitHub: The Hub&lt;/h2&gt;
&lt;p&gt;The backbone of my preferred stack is &lt;strong&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;. This is the one part of the stack I don&apos;t optimize for portability. I find GitHub to be cost-effective, full-featured, and a platform I can rely on for the long term. I am paying $4/month for a Team account at GitHub to use the features I highlight below.&lt;/p&gt;
&lt;p&gt;GitHub’s primary function is managed Git hosting, and it’s the industry standard for version control and collaboration. Beyond the basics, it offers a rich ecosystem of tools that are central to my setup:&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;GitHub Command Line Interface (CLI)&lt;/h3&gt;
&lt;p&gt;I use AI coding tools directly in the terminal and a key part of working with an agentic coding partner is having robust command-line tools the AI agents can interact with. The &lt;strong&gt;&lt;a href=&quot;https://cli.github.com/&quot;&gt;GitHub CLI&lt;/a&gt;&lt;/strong&gt; is well-maintained, feature-rich, and makes it easy for AI agents (and me) to execute tasks directly from the command line.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;GitHub Issues&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/issues&quot;&gt;GitHub Issues&lt;/a&gt; are a &lt;em&gt;core feature&lt;/em&gt; within repositories used to track, plan, and discuss work. They&apos;re a flexible way to manage development and collaboration.&lt;/p&gt;
&lt;p&gt;Anyone who has worked on my teams knows that rule number one before starting any coding is to &lt;em&gt;“make a ticket.”&lt;/em&gt; This simple process ensures we document our intention before starting work. A well-written issue can be passed between contributors, support measuring outcomes against intentions, and serve as living documentation of the codebase.&lt;/p&gt;
&lt;p&gt;Having this project management tool natively integrated with the code repository keeps everything connected and simple to use.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Continuous Integration / Delivery&lt;/h3&gt;
&lt;p&gt;GitHub&apos;s &lt;a href=&quot;https://github.com/features/actions&quot;&gt;CI/CD features&lt;/a&gt; are excellent for automating workflows that respond to repository activity such as commits, merges, and pull requests. These automations are key to my development process - below is an outline of my process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write code locally on a feature branch aligned to a GitHub Issue.&lt;/li&gt;
&lt;li&gt;Test local changes.&lt;/li&gt;
&lt;li&gt;Push the branch to GitHub.&lt;/li&gt;
&lt;li&gt;On the push activity a new environment is automatically updated with the code from that branch.&lt;/li&gt;
&lt;li&gt;Review and QA on that remote environment.&lt;/li&gt;
&lt;li&gt;Once approved, merge the branch via pull request.&lt;/li&gt;
&lt;li&gt;Following the merge the pull request and associated issue are automatically updated and closed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The automated provisioning of a lower environment and release orchestration saves an enormous amount of time and keeps deployment friction low.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;GitHub Pages&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;&lt;/strong&gt; is one of my favorite GitHub features and something I don&apos;t think enough people take advantage of. It&apos;s a static site hosting service that takes HTML, CSS, and JavaScript files directly from a repository, optionally runs a build process, and publishes a website with no separate hosting required.&lt;/p&gt;
&lt;p&gt;GitHub Pages doesn’t support interpreted languages like PHP, so if your project requires server-side functionality, you’ll need an external host. For static websites, though (like this blog), it’s fast, reliable, and free.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Web Application and Database Hosting&lt;/h2&gt;
&lt;p&gt;For projects that require dynamic hosting or databases, I look for solutions that emphasize &lt;strong&gt;portability&lt;/strong&gt;. If a service changes its pricing, features, or policies, I want the freedom to migrate quickly without major rework.&lt;/p&gt;
&lt;p&gt;I initially used &lt;strong&gt;&lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;&lt;/strong&gt; to host a Next.js application and found the developer experience fantastic. However, I&apos;ve since chosen to migrate to &lt;strong&gt;&lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;&lt;/strong&gt;, which offer similar features and align better with my values. This transition highlights why portability matters, I have made architecture decisions prioritizing making it easy to move.&lt;/p&gt;
&lt;p&gt;For databases and authentication, I&apos;ve had a great experience with &lt;strong&gt;&lt;a href=&quot;https://supabase.com/&quot;&gt;Supabase&lt;/a&gt;&lt;/strong&gt;. It made adding authentication and authorization straightforward, and its web dashboard and SQL Editor are easy to use while still supporting advanced features like row-level security.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I’m prioritizing rapid prototyping and app development, and this stack is hard to beat. It keeps you close to your code, removes deployment friction, and scales as your project grows. The learning curve is reasonable, documentation is plentiful, and the productivity gains are immediate.&lt;/p&gt;
&lt;p&gt;With this flow, I spend more time &lt;em&gt;building&lt;/em&gt; and the tools fade into the background.&lt;/p&gt;
&lt;hr&gt;</description>
    </item>
    <item>
      <title>§ Learning to Build with AI: The Agents I Use</title>
      <link>https://stonebergdesign.com/blog/building-with-ai-tools</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/building-with-ai-tools</guid>
      <pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate>
      <description>&lt;h2&gt;Learning to Build with AI: The Agents I Use&lt;/h2&gt;
&lt;p&gt;As I’ve started documenting my work with AI-assisted development, I want to share not only what I’m learning conceptually, but also the &lt;strong&gt;practical tools and workflows&lt;/strong&gt; that make this new way of building possible.&lt;/p&gt;
&lt;p&gt;My use of AI tools for application development began shortly after the release of &lt;strong&gt;Claude Code&lt;/strong&gt; in February 2025. Since then, a wave of new tools has emerged, each taking a different approach to enabling AI-assisted development.&lt;/p&gt;
&lt;p&gt;For my own work, I’ve focused on &lt;strong&gt;&lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt;&lt;/strong&gt; from Anthropic and &lt;strong&gt;&lt;a href=&quot;https://openai.com/codex/&quot;&gt;Codex&lt;/a&gt;&lt;/strong&gt; from OpenAI. These two tools best fit the development approach I prefer—one that maintains a high level of &lt;strong&gt;human oversight and code review&lt;/strong&gt;. I want the AI to contribute meaningfully to the process, but I remain the ultimate approver: directing what work it does, reviewing every output, and ensuring all code meets my standards before it ships - this is &quot;human in the loop&quot; development.&lt;/p&gt;
&lt;p&gt;As I’ve learned to develop alongside these new agentic assistants, I’ve been using the &lt;strong&gt;entry-level plans&lt;/strong&gt; from both Anthropic and OpenAI, currently priced at &lt;strong&gt;$20 per month&lt;/strong&gt; each. I often switch between agents for different tasks or when one has reached its usage limits. This ability to move seamlessly between platforms has become an important part of my workflow. It’s also shaping how I approach &lt;strong&gt;configuration, planning, development, and testing&lt;/strong&gt;, ensuring everything I build is &lt;strong&gt;tool-agnostic and platform-independent&lt;/strong&gt;. Managing tokens and usage is a big part of using AI for development right now and something I will be talking about more in future posts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stonebergdesign.com/static/images/Claude.png&quot; alt=&quot;Claude&quot;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>§ Building With AI After Fifteen Years in Web Technology</title>
      <link>https://stonebergdesign.com/blog/building-with-ai</link>
      <guid isPermaLink="true">https://stonebergdesign.com/blog/building-with-ai</guid>
      <pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate>
      <description>&lt;h2&gt;Why This Blog&lt;/h2&gt;
&lt;p&gt;I have spent more than fifteen years watching new technology arrive with promises to transform how teams build for the web. Some changes earned a permanent place in the stack. Others created a burst of activity and quietly disappeared. AI-assisted development feels consequential, but the interesting question is not whether the tools are impressive. It is whether they help us make better systems and better decisions.&lt;/p&gt;
&lt;p&gt;This blog is where I share that practitioner view: what I am using in real projects, where it creates leverage, where it introduces risk, and how experience changes the way I evaluate it.&lt;/p&gt;
&lt;h2&gt;Where I&apos;m Coming From&lt;/h2&gt;
&lt;p&gt;My career has moved through agency delivery, product and platform work at Tableau and Salesforce, enterprise systems at Veeva, and now independent consulting. Across those environments I have worked beside engineers, designers, product managers, marketers, and executives who needed technology decisions to survive contact with real organizations.&lt;/p&gt;
&lt;p&gt;That cross-functional position is a credential, not a disclaimer. I can prototype, debug, and work directly in code, but I also know that shipping code is only part of the job. Architecture, governance, usability, organizational constraints, and the cost of future change matter just as much. AI makes implementation faster; it does not remove the need for judgment.&lt;/p&gt;
&lt;h2&gt;Why Now&lt;/h2&gt;
&lt;p&gt;AI has compressed the distance between an idea and a working implementation. That is useful, but speed changes the risk profile. Teams can now produce plausible code faster than they can understand, review, or maintain it. The durable advantage will not come from generating the most code. It will come from pairing faster execution with clear constraints, strong review, and an architecture that can absorb change.&lt;/p&gt;
&lt;p&gt;That is the transition I want to examine: not AI as spectacle, but AI as part of a professional delivery system.&lt;/p&gt;
&lt;h2&gt;What&apos;s Next&lt;/h2&gt;
&lt;p&gt;I will write about workflows, tools, architecture, and case studies grounded in actual projects. Some posts will be time-bound check-ins because the tools are moving quickly. Others will focus on principles that should outlast the current generation of products.&lt;/p&gt;
&lt;p&gt;The goal is straightforward: show the work, take positions, and share what changes when experienced practitioners can build more directly without giving up the judgment that experience earned.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
