<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex</title>
    <description>The latest articles on DEV Community by Alex (@seriousbydesign).</description>
    <link>https://dev.to/seriousbydesign</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847749%2F49f8fef6-5e4a-4545-94bc-51734bad3722.jpeg</url>
      <title>DEV Community: Alex</title>
      <link>https://dev.to/seriousbydesign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seriousbydesign"/>
    <language>en</language>
    <item>
      <title>Claude Design gives you a prototype. Then what?</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:32:59 +0000</pubDate>
      <link>https://dev.to/seriousbydesign/i-built-a-frame-cartridge-for-claude-design-day-one-1doi</link>
      <guid>https://dev.to/seriousbydesign/i-built-a-frame-cartridge-for-claude-design-day-one-1doi</guid>
      <description>&lt;p&gt;Anthropic launched Claude Design on Friday. By end of Saturday I had a working FRAME cartridge that wires it into a structured development workflow. Not because I planned to – but because the architecture made it obvious.&lt;/p&gt;

&lt;p&gt;That’s the thing I wanted to test: whether FRAME’s engine/cartridge split actually holds when something new drops. New tool, new domain, new workflow. Does the engine stretch to cover it, or do you end up patching around it?&lt;/p&gt;

&lt;p&gt;Here’s what happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you haven’t heard of FRAME (which is likely):&lt;/strong&gt; it’s a prompt-native workflow engine for Claude Code. Instead of a freeform session, you load a cartridge – a set of Markdown files that defines phases, roles, and checkpoints for a specific kind of work. SHAPE gathers requirements. BREAKDOWN decomposes scope. DESIGN decides the approach. BUILD implements one unit at a time. CHECK reviews the output. A fixed engine handles state, commits, and resume across &lt;code&gt;/clear&lt;/code&gt;. Cartridges define the domain.&lt;/p&gt;

&lt;p&gt;The architecture is deliberately split: the engine never changes, cartridges define what happens in between. That split is what this post is actually about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap Claude Design creates
&lt;/h2&gt;

&lt;p&gt;Claude Design is impressive. You describe what you want, it asks a few focused questions about aesthetic direction and layout, and it produces a working interactive prototype — not a static mockup, an actual React app with localStorage state, seed data, and live interactions. In a single session.&lt;/p&gt;




&lt;p&gt;A daily habit tracker web app. Three screens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard – shows today’s habits as a list with checkboxes, a streak count per habit, and a weekly completion ring per habit. Header shows today’s date and an overall completion percentage for the day.&lt;/li&gt;
&lt;li&gt;Add/Edit habit – form to create or edit a habit. Fields: name, frequency (daily / weekdays / custom days), colour tag, optional reminder time. Save and cancel actions.&lt;/li&gt;
&lt;li&gt;History view – a monthly calendar grid where each day cell shows a coloured dot per habit indicating completion. Tapping a day shows a popover with that day’s detail.&lt;/li&gt;
&lt;li&gt;Target: web app, light mode, clean and minimal aesthetic.&lt;/li&gt;
&lt;li&gt;No authentication needed. Assume a single user.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2fczduk9gwhm2hqqnmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2fczduk9gwhm2hqqnmu.png" alt="habit tracker - Claude Design" width="800" height="969"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The problem is what comes next. The “Handoff to Claude Code” button gives you a command that says: &lt;em&gt;fetch this design file, read its readme, and implement the relevant aspects of the design.&lt;/em&gt; Claude Code takes that literally. It fetches the bundle, reads the prototype HTML, and starts implementing.&lt;/p&gt;

&lt;p&gt;Which sounds fine – until you think about what it doesn’t know. It doesn’t know what you originally asked for. It doesn’t know what Claude Design added beyond scope. It doesn’t know what production stack you want, because Claude Design deliberately deferred that decision. It doesn’t know which of the prototype’s design choices were intentional constraints and which were defaults.&lt;/p&gt;

&lt;p&gt;FRAME knows all of those things, because it asks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the cartridge
&lt;/h2&gt;

&lt;p&gt;The phase sequence came together quickly once I looked at how the handoff actually works.&lt;/p&gt;

&lt;p&gt;The raw &lt;code&gt;sw-development&lt;/code&gt; cartridge goes: SHAPE → BREAKDOWN → DESIGN → BUILD → CHECK. For a Claude Design workflow, DESIGN is redundant – Claude Design already made those decisions. What you need instead is a review step between the handoff and decomposition: something that checks what came back against what you agreed to build.&lt;/p&gt;

&lt;p&gt;I called it DESIGN-REVIEW.&lt;/p&gt;

&lt;p&gt;SHAPE → [Claude Design - external] → DESIGN-REVIEW → BREAKDOWN → BUILD → CHECK&lt;br&gt;
SHAPE gets two extra responsibilities: a question about existing design systems and brand assets, and a second output – &lt;code&gt;design_brief.md&lt;/code&gt;, a clean brief formatted for Claude Design, not for FRAME. No SESSION headers, no gate blocks. Just: what to build, which screens, what constraints.&lt;/p&gt;

&lt;p&gt;The gate at the end of SHAPE tells you to drop brand assets into &lt;code&gt;design-assets/&lt;/code&gt; before attaching the codebase in Claude Design – it’ll pick them up automatically. Then it tells you exactly what to do when you come back: paste the handoff command, don’t implement yet.&lt;/p&gt;

&lt;p&gt;DESIGN-REVIEW intercepts the handoff command. It extracts the bundle URL, fetches it, reads the README and the prototype HTML – then does the work the raw handoff skips:&lt;/p&gt;

&lt;p&gt;– Which screens did Claude Design actually cover?&lt;/p&gt;

&lt;p&gt;– What did it add that wasn’t in scope?&lt;/p&gt;

&lt;p&gt;– What stack decisions need confirming?&lt;/p&gt;

&lt;p&gt;– What production gaps does BUILD need to address that the prototype didn’t?&lt;/p&gt;

&lt;p&gt;The output is a structured review that BREAKDOWN and BUILD read instead of a DESIGN document. Everything from BREAKDOWN onward is inherited from the &lt;code&gt;sw-development&lt;/code&gt; cartridge unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test run
&lt;/h2&gt;

&lt;p&gt;I used the cartridge to build a habit tracker – the same prompt I’d used earlier to test Claude Design itself, so I could compare prototype to implementation directly.&lt;/p&gt;

&lt;p&gt;SHAPE ran cleanly. One question at a time, screens locked, out-of-scope list explicit. Then I took &lt;code&gt;design_brief.md&lt;/code&gt; to Claude Design by attaching the project folder via &lt;code&gt;Import → Link code folder&lt;/code&gt;. Claude Design reads everything in the linked folder, picking up the brief and any assets in &lt;code&gt;design-assets/&lt;/code&gt; automatically. It asked a few questions about aesthetic direction (should have kept the white background) and produced this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg4tr2izbeekvs72z9pn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg4tr2izbeekvs72z9pn.png" alt="habit tracker - Claude Design from SHAPE input" width="800" height="1009"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then the handoff. The command came back as a URL instruction – not a zip, not a set of files. Just a hosted bundle with a README telling Claude Code to fetch, read, and implement. I pasted it unchanged into the Claude Code session.&lt;/p&gt;

&lt;p&gt;DESIGN-REVIEW didn’t implement. It fetched the bundle, read it, then surfaced the scope additions: drag-to-reorder (Claude Design added it; HTML5 drag works desktop-only), a history stats bar (not in the original brief but already designed), and the Tweaks panel (explicitly out of scope). It asked about each one. I kept the stats bar, scoped drag-to-reorder to desktop-only, descoped Tweaks.&lt;/p&gt;

&lt;p&gt;BREAKDOWN split the confirmed scope into five units. BUILD worked through them with the prototype HTML and CSS as visual reference.&lt;/p&gt;

&lt;p&gt;This is what the cartridge produced, single run, no tweaks, running on Sonnet 4.6 – not the Opus 4.7 model that made the original:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv46ukc2yv3qdc7s0d0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv46ukc2yv3qdc7s0d0h.png" alt="habit tracker - working app image" width="800" height="1483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cream background, terracotta accent, strikethrough on completed habits, the “Not today” section, the weekly rings. Not identical – the flame emoji became a droplet, the date header got a touch of italic weight – but close enough that you’d use it.&lt;/p&gt;

&lt;p&gt;After CHECK passed, I ran the deploy cartridge – Vercel target, one command. The habit tracker is live at &lt;a href="https://habit-tracker-nu-blue.vercel.app" rel="noopener noreferrer"&gt;habit-tracker-nu-blue.vercel.app&lt;/a&gt; (demo only – resets on reload, nothing is persisted).&lt;/p&gt;

&lt;p&gt;That’s the full loop: brief → prototype → scope review → build → check → deploy. FRAME handled every step except the creative work itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proves
&lt;/h2&gt;

&lt;p&gt;Two things, I think.&lt;/p&gt;

&lt;p&gt;One: the engine/cartridge split works. Claude Design is a new tool with a new workflow. The engine didn’t change. I wrote a cartridge. The phases, gates, state management, and resume mechanic all carry over without modification. That’s the whole point of the architecture.&lt;/p&gt;

&lt;p&gt;Two: the separation of concerns between Claude Design and FRAME is genuinely useful, not just structural. Claude Design does the creative work fast – aesthetic decisions, interaction design, visual hierarchy – better than a requirements interview ever could. FRAME does the disciplined work that turns a prototype into a production build: scope review, decomposition, unit-by-unit implementation, test coverage.&lt;/p&gt;

&lt;p&gt;Neither replaces the other. Claude Design produces something FRAME would struggle to produce in a DESIGN phase. FRAME produces something Claude Design’s raw handoff doesn’t: a structured build process with a paper trail, scope discipline, and a resume point if you run out of context halfway through.&lt;/p&gt;

&lt;p&gt;The Tweaks panel was out of scope. DESIGN-REVIEW caught it. BUILD never saw it.&lt;/p&gt;

&lt;p&gt;That’s the workflow working.&lt;/p&gt;

&lt;p&gt;FRAME is open source at &lt;a href="https://github.com/SeriousByDesign/frame" rel="noopener noreferrer"&gt;github.com/SeriousByDesign/frame&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>webdev</category>
      <category>claude</category>
    </item>
    <item>
      <title>I made Claude Code slower. On purpose. Here's why.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 09 Apr 2026 14:10:09 +0000</pubDate>
      <link>https://dev.to/seriousbydesign/i-made-claude-code-slower-on-purpose-heres-why-1lo9</link>
      <guid>https://dev.to/seriousbydesign/i-made-claude-code-slower-on-purpose-heres-why-1lo9</guid>
      <description>&lt;p&gt;You're 40 minutes into a Claude Code session. You've lost track of what you decided.&lt;/p&gt;

&lt;p&gt;Claude is re-reading files it already read. You're not sure if you're building the right thing anymore, and you're not sure when you stopped being sure.&lt;/p&gt;

&lt;p&gt;This is not a Claude problem. It's a structure problem. That's why I built FRAME.&lt;/p&gt;




&lt;h2&gt;
  
  
  What FRAME is
&lt;/h2&gt;

&lt;p&gt;FRAME is a set of Markdown files that give Claude Code a role to play and a gate to stop at. Nothing installs beyond copying a few files. No config, no runtime, no dependencies. You run &lt;code&gt;/frame load sw-development&lt;/code&gt; and Claude Code knows it's a Requirements Engineer now, and that it doesn't move until you confirm what you're building.&lt;/p&gt;

&lt;p&gt;The core mechanic: a cartridge defines the phases, roles, and gates for a particular kind of work. The engine reads the cartridge and runs the session accordingly. You keep control at every gate — nothing advances without your &lt;code&gt;y&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's it. The rest is Markdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two runs, same task
&lt;/h2&gt;

&lt;p&gt;I wanted to test this honestly, so I ran the same bug fix twice — once with plain Claude Code, once with FRAME's &lt;code&gt;sw-development&lt;/code&gt; cartridge. Same prompt, same codebase, same starting branch.&lt;/p&gt;

&lt;p&gt;The bug: &lt;code&gt;_get_daily_limit()&lt;/code&gt; crashes when &lt;code&gt;NOTEBOOKLM_DAILY_LIMIT&lt;/code&gt; is set to a non-numeric value or zero. Fix it and add tests.&lt;/p&gt;

&lt;p&gt;Plain Claude Code read the function, wrote the fix, wrote the tests, committed. About a minute. No questions asked. The fix was correct.&lt;/p&gt;

&lt;p&gt;FRAME started by asking questions. Branch name? Hard constraints? Acceptance criteria beyond what was stated? Anything explicitly out of scope? It produced a SHAPE block before touching a single file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal       : Fix _get_daily_limit() crash - non-numeric or zero env var
Stack      : Python 3.9+, pytest
Branch     : fix/frame-daily-limit-validation
Constraints: none
Acceptance : - Non-numeric → returns 50, no exception
             - Zero → returns 50, no exception
             - Negative → returns 50, no exception
             - Valid numeric → still works correctly
             - At least one test per bad-input case
Out of scope: all other functions, no refactoring, no interface changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You confirm this, or you push back. Only then does it write code.&lt;/p&gt;

&lt;p&gt;Some minutes later, the fix landed. Same correctness as plain CC. But then the QA Engineer ran a pass — mapping every acceptance criterion to a test, checking for gaps. It flagged one: whitespace-only strings (&lt;code&gt;" "&lt;/code&gt;) aren't covered. A fourth test, not in the original brief.&lt;/p&gt;

&lt;p&gt;Plain CC found its edge cases by instinct. FRAME found them by process.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest framing
&lt;/h2&gt;

&lt;p&gt;FRAME didn't produce better code. It produced a documented contract for what the code was supposed to do — agreed before anything was written, verified after.&lt;/p&gt;

&lt;p&gt;For a contained bug fix where you know exactly what you want, plain Claude Code is hard to beat. One minute versus ten is a real difference.&lt;/p&gt;

&lt;p&gt;FRAME earns its keep when "what does done look like?" isn't obvious before you start. When the session is a decision, not just a task. When you're about to build something that depends on choices you haven't made yet, and you don't want to discover mid-BUILD that you've been building the wrong thing.&lt;/p&gt;

&lt;p&gt;The ten minutes isn't overhead. It's the work of agreeing on what you're building before you build it. For the right task, that's the most valuable ten minutes in the session.&lt;/p&gt;

&lt;p&gt;That right task looks like: a feature with ambiguous requirements. A codebase you haven't touched in six months. An audit where you need to explain every finding to a stakeholder. A project plan that has to survive a conversation with someone who wasn't in the room when it was made.&lt;/p&gt;

&lt;p&gt;In those sessions, the documentation FRAME produces isn't a side effect — it's the point. The SHAPE archive records what was agreed before code was written. The phase archives record what was decided at every gate. The final output is something you can hand to someone who wasn't there and they can reconstruct exactly what happened and why. Plain Claude Code produces an output. FRAME produces an output and a record.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;A session has five phases: SHAPE, BREAKDOWN, DESIGN, BUILD, CHECK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SHAPE&lt;/strong&gt; is where the Requirements Engineer extracts the goal, stack, constraints, and scope. No code is touched. The output is a &lt;code&gt;PROJECT.md&lt;/code&gt; you confirm before anything else happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BREAKDOWN&lt;/strong&gt; is where the Orchestrator turns the goal into work units — small enough to complete in one context window, sequenced by dependency. The first time I saw the unit list appear I understood why FRAME works: a project that felt overwhelming at the goal level becomes a list of five things, in order, with clear scope. The Tur-Tur effect — something that looks impossibly large from a distance resolves into ordinary steps up close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DESIGN&lt;/strong&gt; is where the Architect turns the unit list into a plan — interfaces, dependencies, sequencing decisions. Nothing is built yet. The point is to make implementation choices explicit before a Developer touches a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUILD&lt;/strong&gt; executes one unit at a time. Gates between units let you &lt;code&gt;/clear&lt;/code&gt; context without losing state — FRAME writes everything to file before it stops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CHECK&lt;/strong&gt; runs a Code Reviewer and QA Engineer pass. This is where the acceptance criteria table appears, mapped to actual test coverage. Gaps surface here, not in production.&lt;/p&gt;

&lt;p&gt;The cartridge is just Markdown. You can read every instruction Claude Code is following. You can edit them. You can build your own in an hour using the &lt;code&gt;cartridge-creator&lt;/code&gt; cartridge.&lt;/p&gt;




&lt;h2&gt;
  
  
  What makes it different from SPARC, claude-flow and others alike
&lt;/h2&gt;

&lt;p&gt;Those tools are powerful. If you want multi-agent orchestration, parallel execution, XML-structured plans, and a framework with a full ecosystem — use them. They're built for that.&lt;/p&gt;

&lt;p&gt;FRAME is deliberately smaller. No multi-agent complexity. No tooling overhead. No XML. The entire engine is one Markdown file. The design principle is: if it needs an installer to be useful, it's already too complicated.&lt;/p&gt;

&lt;p&gt;If you want a framework, use SPARC or claude-flow. If you want structure without infrastructure, this is for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/SeriousByDesign/frame.git
&lt;span class="nb"&gt;cd &lt;/span&gt;frame
bash install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in any Claude Code session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/frame load sw-development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FRAME is domain-agnostic — the engine stays the same, the cartridge defines the kind of work. Available initially: &lt;code&gt;sw-development&lt;/code&gt;, &lt;code&gt;code-audit&lt;/code&gt;, &lt;code&gt;blog-writing&lt;/code&gt;, &lt;code&gt;linkedin-profile&lt;/code&gt;, &lt;code&gt;project-planner&lt;/code&gt;, &lt;code&gt;cartridge-creator&lt;/code&gt;. Each one is a validated workflow you can use as-is or modify. Build your own with &lt;code&gt;cartridge-creator&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;v0.3.0 added four more: &lt;code&gt;codebase-analysis&lt;/code&gt; (structured documentation reports from an existing codebase), &lt;code&gt;findings-to-tasks&lt;/code&gt; (turns audit findings into actionable tasks), &lt;code&gt;skill-creation&lt;/code&gt; (designs and validates new Claude Code skills), and &lt;code&gt;document-and-commit&lt;/code&gt; (documents and commits code changes made outside of FRAME).&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;This is v0.3.0. Validated across real sessions — software development, code audit, blog writing, LinkedIn profile creation, cartridge authorship, project planning. All core design decisions are closed.&lt;/p&gt;

&lt;p&gt;It's not done. I'm looking for people who like to run it on real work, file issues when it breaks, and tell me where the friction is. If that's you, the repo is at &lt;a href="https://github.com/SeriousByDesign/frame" rel="noopener noreferrer"&gt;github.com/SeriousByDesign/frame&lt;/a&gt;. Just want to give it a go? You're welcome as well. Everyone is.&lt;/p&gt;

&lt;p&gt;Break it. That's the point of v0.3.0.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
