<?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: Drew Marshall</title>
    <description>The latest articles on DEV Community by Drew Marshall (@stinklewinks).</description>
    <link>https://dev.to/stinklewinks</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F832808%2Fa1b7233f-14c6-4bcd-8a1e-c9f338124447.png</url>
      <title>DEV Community: Drew Marshall</title>
      <link>https://dev.to/stinklewinks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stinklewinks"/>
    <language>en</language>
    <item>
      <title>Why Juice Generates CSS Instead of Owning It</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Wed, 01 Jul 2026 19:21:27 +0000</pubDate>
      <link>https://dev.to/stinklewinks/why-juice-generates-css-instead-of-owning-it-gk</link>
      <guid>https://dev.to/stinklewinks/why-juice-generates-css-instead-of-owning-it-gk</guid>
      <description>&lt;p&gt;One design goal I’ve had for Juice from the beginning is that it shouldn’t try to replace CSS.&lt;/p&gt;

&lt;p&gt;CSS already exists.&lt;/p&gt;

&lt;p&gt;It’s incredibly capable.&lt;/p&gt;

&lt;p&gt;The web doesn’t need another styling language.&lt;/p&gt;

&lt;p&gt;Instead, I wanted Juice to answer a different question:&lt;/p&gt;

&lt;p&gt;How can a design system express intent while still producing plain CSS?&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Becomes The Source Of Truth
&lt;/h2&gt;

&lt;p&gt;Recently I added support for configuration-driven stylesheet generation.&lt;/p&gt;

&lt;p&gt;Instead of shipping every possible style with Juice, the framework consumes a project configuration and generates stylesheets from it.&lt;/p&gt;

&lt;p&gt;Think of it as a theme generator.&lt;/p&gt;

&lt;p&gt;The configuration defines things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colors&lt;/li&gt;
&lt;li&gt;Typography&lt;/li&gt;
&lt;li&gt;Spacing&lt;/li&gt;
&lt;li&gt;Shadows&lt;/li&gt;
&lt;li&gt;Borders&lt;/li&gt;
&lt;li&gt;Radius&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Design tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juice then generates the stylesheets those decisions require.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;One concern I have with many frameworks is that applications slowly become dependent on the framework itself for every design decision.&lt;/p&gt;

&lt;p&gt;Eventually the framework becomes responsible for everything.&lt;/p&gt;

&lt;p&gt;That wasn’t the direction I wanted.&lt;/p&gt;

&lt;p&gt;Instead, I wanted the project to own its design language.&lt;/p&gt;

&lt;p&gt;Juice simply helps express it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Shouldn’t Own Your Brand
&lt;/h2&gt;

&lt;p&gt;Every application has its own identity.&lt;/p&gt;

&lt;p&gt;Its own colors.&lt;/p&gt;

&lt;p&gt;Its own typography.&lt;/p&gt;

&lt;p&gt;Its own spacing.&lt;/p&gt;

&lt;p&gt;Those things belong to the project.&lt;/p&gt;

&lt;p&gt;Not the framework.&lt;/p&gt;

&lt;p&gt;Juice shouldn’t tell you what your design system looks like.&lt;/p&gt;

&lt;p&gt;It should help you implement it consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Is Documentation
&lt;/h2&gt;

&lt;p&gt;An unexpected benefit is that the configuration becomes documentation.&lt;/p&gt;

&lt;p&gt;Instead of searching through dozens of CSS files, you can understand an application’s design language by reading a single configuration.&lt;/p&gt;

&lt;p&gt;The project becomes easier to reason about.&lt;/p&gt;

&lt;p&gt;The styling becomes intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I don’t want Juice to become another framework that tries to solve every styling problem.&lt;/p&gt;

&lt;p&gt;I want it to become a design system engine.&lt;/p&gt;

&lt;p&gt;The project defines the language.&lt;/p&gt;

&lt;p&gt;Juice helps enforce it.&lt;/p&gt;

&lt;p&gt;That’s a much more sustainable relationship than asking a framework to own every design decision.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why Juice Generates CSS Instead of Owning It</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Wed, 01 Jul 2026 19:21:27 +0000</pubDate>
      <link>https://dev.to/stinklewinks/why-juice-generates-css-instead-of-owning-it-3ong</link>
      <guid>https://dev.to/stinklewinks/why-juice-generates-css-instead-of-owning-it-3ong</guid>
      <description>&lt;p&gt;One design goal I’ve had for Juice from the beginning is that it shouldn’t try to replace CSS.&lt;/p&gt;

&lt;p&gt;CSS already exists.&lt;/p&gt;

&lt;p&gt;It’s incredibly capable.&lt;/p&gt;

&lt;p&gt;The web doesn’t need another styling language.&lt;/p&gt;

&lt;p&gt;Instead, I wanted Juice to answer a different question:&lt;/p&gt;

&lt;p&gt;How can a design system express intent while still producing plain CSS?&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Becomes The Source Of Truth
&lt;/h2&gt;

&lt;p&gt;Recently I added support for configuration-driven stylesheet generation.&lt;/p&gt;

&lt;p&gt;Instead of shipping every possible style with Juice, the framework consumes a project configuration and generates stylesheets from it.&lt;/p&gt;

&lt;p&gt;Think of it as a theme generator.&lt;/p&gt;

&lt;p&gt;The configuration defines things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colors&lt;/li&gt;
&lt;li&gt;Typography&lt;/li&gt;
&lt;li&gt;Spacing&lt;/li&gt;
&lt;li&gt;Shadows&lt;/li&gt;
&lt;li&gt;Borders&lt;/li&gt;
&lt;li&gt;Radius&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Design tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juice then generates the stylesheets those decisions require.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;One concern I have with many frameworks is that applications slowly become dependent on the framework itself for every design decision.&lt;/p&gt;

&lt;p&gt;Eventually the framework becomes responsible for everything.&lt;/p&gt;

&lt;p&gt;That wasn’t the direction I wanted.&lt;/p&gt;

&lt;p&gt;Instead, I wanted the project to own its design language.&lt;/p&gt;

&lt;p&gt;Juice simply helps express it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Shouldn’t Own Your Brand
&lt;/h2&gt;

&lt;p&gt;Every application has its own identity.&lt;/p&gt;

&lt;p&gt;Its own colors.&lt;/p&gt;

&lt;p&gt;Its own typography.&lt;/p&gt;

&lt;p&gt;Its own spacing.&lt;/p&gt;

&lt;p&gt;Those things belong to the project.&lt;/p&gt;

&lt;p&gt;Not the framework.&lt;/p&gt;

&lt;p&gt;Juice shouldn’t tell you what your design system looks like.&lt;/p&gt;

&lt;p&gt;It should help you implement it consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Is Documentation
&lt;/h2&gt;

&lt;p&gt;An unexpected benefit is that the configuration becomes documentation.&lt;/p&gt;

&lt;p&gt;Instead of searching through dozens of CSS files, you can understand an application’s design language by reading a single configuration.&lt;/p&gt;

&lt;p&gt;The project becomes easier to reason about.&lt;/p&gt;

&lt;p&gt;The styling becomes intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I don’t want Juice to become another framework that tries to solve every styling problem.&lt;/p&gt;

&lt;p&gt;I want it to become a design system engine.&lt;/p&gt;

&lt;p&gt;The project defines the language.&lt;/p&gt;

&lt;p&gt;Juice helps enforce it.&lt;/p&gt;

&lt;p&gt;That’s a much more sustainable relationship than asking a framework to own every design decision.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Architecture Doesn’t Care What You Build</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Tue, 30 Jun 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/architecture-doesnt-care-what-you-build-4g4o</link>
      <guid>https://dev.to/stinklewinks/architecture-doesnt-care-what-you-build-4g4o</guid>
      <description>&lt;p&gt;One of the biggest realizations I’ve had while building KiwiEngine is that architecture doesn’t really care what you’re building.&lt;/p&gt;

&lt;p&gt;An authentication system doesn’t know whether it’s protecting an artist website or an accounting platform.&lt;/p&gt;

&lt;p&gt;An API doesn’t care whether it’s serving a CRM or a music player.&lt;/p&gt;

&lt;p&gt;A routing system doesn’t know if it’s powering an e-commerce store or a game launcher.&lt;/p&gt;

&lt;p&gt;Good architecture solves engineering problems.&lt;/p&gt;

&lt;p&gt;The domain simply gives those solutions a purpose.&lt;/p&gt;

&lt;p&gt;That realization completely changed how I think about KiwiEngine—and more importantly, how I think about the software I want to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Solves Engineering Problems
&lt;/h2&gt;

&lt;p&gt;The longer I’ve worked on KiwiEngine, the more I’ve realized that many of the problems we solve are universal.&lt;/p&gt;

&lt;p&gt;Authentication.&lt;/p&gt;

&lt;p&gt;Authorization.&lt;/p&gt;

&lt;p&gt;Routing.&lt;/p&gt;

&lt;p&gt;Caching.&lt;/p&gt;

&lt;p&gt;State management.&lt;/p&gt;

&lt;p&gt;Content management.&lt;/p&gt;

&lt;p&gt;Documentation.&lt;/p&gt;

&lt;p&gt;These challenges exist regardless of the application.&lt;/p&gt;

&lt;p&gt;A music platform still needs users.&lt;/p&gt;

&lt;p&gt;An online store still needs payments.&lt;/p&gt;

&lt;p&gt;An artist website still needs content.&lt;/p&gt;

&lt;p&gt;A game launcher still needs updates.&lt;/p&gt;

&lt;p&gt;The engineering principles don’t suddenly change because the audience does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domains Give Architecture Purpose
&lt;/h2&gt;

&lt;p&gt;If architecture doesn’t care about the domain, people certainly do.&lt;/p&gt;

&lt;p&gt;For a long time, I assumed that because KiwiEngine could support business applications, I should be the one building them.&lt;/p&gt;

&lt;p&gt;CRMs.&lt;/p&gt;

&lt;p&gt;Inventory systems.&lt;/p&gt;

&lt;p&gt;Scheduling platforms.&lt;/p&gt;

&lt;p&gt;SaaS products.&lt;/p&gt;

&lt;p&gt;The architecture was capable.&lt;/p&gt;

&lt;p&gt;But I slowly realized something important.&lt;/p&gt;

&lt;p&gt;Capability and calling aren’t the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Curiosity Is A Better Compass
&lt;/h2&gt;

&lt;p&gt;Looking back over the projects that energized me, a clear pattern emerged.&lt;/p&gt;

&lt;p&gt;I kept returning to creative technology.&lt;/p&gt;

&lt;p&gt;Music production.&lt;/p&gt;

&lt;p&gt;Artist websites.&lt;/p&gt;

&lt;p&gt;Plugins.&lt;/p&gt;

&lt;p&gt;Media platforms.&lt;/p&gt;

&lt;p&gt;Game development.&lt;/p&gt;

&lt;p&gt;Digital publishing.&lt;/p&gt;

&lt;p&gt;Those weren’t distractions from KiwiEngine.&lt;/p&gt;

&lt;p&gt;They were the best proving ground for it.&lt;/p&gt;

&lt;p&gt;Every time I worked on those projects, I naturally discovered improvements to the framework because I genuinely depended on it.&lt;/p&gt;

&lt;p&gt;The software wasn’t theoretical anymore.&lt;/p&gt;

&lt;p&gt;It became part of my own workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Changes The Equation
&lt;/h2&gt;

&lt;p&gt;One of the greatest strengths of open source is that it removes the pressure to build everything yourself.&lt;/p&gt;

&lt;p&gt;KiwiEngine doesn’t need me to build every CRM.&lt;/p&gt;

&lt;p&gt;Or every scheduling platform.&lt;/p&gt;

&lt;p&gt;Or every business application.&lt;/p&gt;

&lt;p&gt;If someone wants to build those things, I hope KiwiEngine becomes a solid foundation for their work.&lt;/p&gt;

&lt;p&gt;My role is to build the engine.&lt;/p&gt;

&lt;p&gt;Document the philosophy.&lt;/p&gt;

&lt;p&gt;Share the blueprints.&lt;/p&gt;

&lt;p&gt;Teach what I’ve learned.&lt;/p&gt;

&lt;p&gt;The community can take those ideas in directions I would have never imagined.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Software Comes From Understanding
&lt;/h2&gt;

&lt;p&gt;I’ve come to believe that software improves when its creator genuinely understands the people using it.&lt;/p&gt;

&lt;p&gt;I understand creators because I am one.&lt;/p&gt;

&lt;p&gt;I write songs.&lt;/p&gt;

&lt;p&gt;I produce music.&lt;/p&gt;

&lt;p&gt;I mix and master.&lt;/p&gt;

&lt;p&gt;I build games.&lt;/p&gt;

&lt;p&gt;I design graphics.&lt;/p&gt;

&lt;p&gt;I enjoy creating things.&lt;/p&gt;

&lt;p&gt;Building software for those communities isn’t narrowing KiwiEngine’s vision.&lt;/p&gt;

&lt;p&gt;It’s giving it a better proving ground.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;KiwiEngine hasn’t changed.&lt;/p&gt;

&lt;p&gt;Its architecture hasn’t changed.&lt;/p&gt;

&lt;p&gt;Its philosophy hasn’t changed.&lt;/p&gt;

&lt;p&gt;What has changed is my understanding of where I create the most value.&lt;/p&gt;

&lt;p&gt;Architecture doesn’t care whether you’re building software for musicians, accountants, educators, or game developers.&lt;/p&gt;

&lt;p&gt;People do.&lt;/p&gt;

&lt;p&gt;And the better you understand the people you’re building for, the better your software becomes.&lt;/p&gt;

&lt;p&gt;That’s why I’m no longer chasing every market.&lt;/p&gt;

&lt;p&gt;I’m choosing the one I understand best—and letting the architecture do what it was designed to do.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Finding The Customer You Understand</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Mon, 29 Jun 2026 17:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/finding-the-customer-you-understand-3h50</link>
      <guid>https://dev.to/stinklewinks/finding-the-customer-you-understand-3h50</guid>
      <description>&lt;p&gt;One piece of startup advice you'll hear often is:&lt;/p&gt;

&lt;p&gt;"Find a problem worth solving."&lt;/p&gt;

&lt;p&gt;I agree.&lt;/p&gt;

&lt;p&gt;But I think there's another question that's just as important.&lt;/p&gt;

&lt;p&gt;Find a customer you genuinely understand.&lt;/p&gt;

&lt;p&gt;For a while, I tried thinking about software markets in general.&lt;/p&gt;

&lt;p&gt;Small businesses.&lt;/p&gt;

&lt;p&gt;SaaS.&lt;/p&gt;

&lt;p&gt;Enterprise.&lt;/p&gt;

&lt;p&gt;Productivity.&lt;/p&gt;

&lt;p&gt;Eventually I realized something.&lt;/p&gt;

&lt;p&gt;I wasn't excited because of the market.&lt;/p&gt;

&lt;p&gt;I was excited by the work itself.&lt;/p&gt;

&lt;p&gt;Music.&lt;/p&gt;

&lt;p&gt;Creative software.&lt;/p&gt;

&lt;p&gt;Audio engineering.&lt;/p&gt;

&lt;p&gt;Game development.&lt;/p&gt;

&lt;p&gt;Design.&lt;/p&gt;

&lt;p&gt;Those aren't hobbies sitting beside software.&lt;/p&gt;

&lt;p&gt;They're the reason I build software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Experience Is An Advantage
&lt;/h2&gt;

&lt;p&gt;Every builder has accumulated years of experience in something.&lt;/p&gt;

&lt;p&gt;Mine happens to include music production, songwriting, game development, design, and software architecture.&lt;/p&gt;

&lt;p&gt;Ignoring that experience would be like ignoring a built-in competitive advantage.&lt;/p&gt;

&lt;p&gt;Instead of trying to become an expert in industries I don't live in, I've decided to build for the communities I already understand.&lt;/p&gt;

&lt;p&gt;Not because they're bigger.&lt;/p&gt;

&lt;p&gt;Because I can genuinely contribute something valuable there.&lt;/p&gt;

</description>
      <category>career</category>
      <category>architecture</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>You Don't Have To Build Everything Yourself</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sun, 28 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/you-dont-have-to-build-everything-yourself-2fk6</link>
      <guid>https://dev.to/stinklewinks/you-dont-have-to-build-everything-yourself-2fk6</guid>
      <description>&lt;p&gt;One misconception I had early on was believing that creating a framework meant creating every application that framework could support.&lt;/p&gt;

&lt;p&gt;That's impossible.&lt;/p&gt;

&lt;p&gt;If KiwiEngine can build hundreds of different kinds of applications, why should one person try to build all of them?&lt;/p&gt;

&lt;p&gt;The answer is simple.&lt;/p&gt;

&lt;p&gt;They shouldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Is Multiplication
&lt;/h2&gt;

&lt;p&gt;Open source isn't about creating every solution.&lt;/p&gt;

&lt;p&gt;It's about creating more builders.&lt;/p&gt;

&lt;p&gt;The framework provides the foundation.&lt;/p&gt;

&lt;p&gt;The community provides the imagination.&lt;/p&gt;

&lt;p&gt;Some people will build business software.&lt;/p&gt;

&lt;p&gt;Others will build education platforms.&lt;/p&gt;

&lt;p&gt;Others will build games.&lt;/p&gt;

&lt;p&gt;Others will build entirely new ideas I haven't even considered.&lt;/p&gt;

&lt;p&gt;That's far more exciting than trying to own every application myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build The Blueprint
&lt;/h2&gt;

&lt;p&gt;I've become increasingly interested in building blueprints rather than finished buildings.&lt;/p&gt;

&lt;p&gt;A blueprint enables many buildings.&lt;/p&gt;

&lt;p&gt;One application solves one problem.&lt;/p&gt;

&lt;p&gt;A blueprint helps solve hundreds.&lt;/p&gt;

&lt;p&gt;That's where I think the long-term value lives.&lt;/p&gt;

&lt;p&gt;Not in trying to build everything.&lt;/p&gt;

&lt;p&gt;But in making it easier for others to build anything.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Burnout Was Trying To Tell Me Something</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sat, 27 Jun 2026 12:53:07 +0000</pubDate>
      <link>https://dev.to/stinklewinks/burnout-was-trying-to-tell-me-something-4hc1</link>
      <guid>https://dev.to/stinklewinks/burnout-was-trying-to-tell-me-something-4hc1</guid>
      <description>&lt;p&gt;For a long time, I assumed burnout meant I wasn't working hard enough.&lt;/p&gt;

&lt;p&gt;Or that I needed better discipline.&lt;/p&gt;

&lt;p&gt;Or better time management.&lt;/p&gt;

&lt;p&gt;Looking back, I think something else was happening.&lt;/p&gt;

&lt;p&gt;Burnout was feedback.&lt;/p&gt;

&lt;p&gt;Every time I forced myself toward projects that didn't naturally fit my interests, progress slowed.&lt;/p&gt;

&lt;p&gt;Everything became heavier.&lt;/p&gt;

&lt;p&gt;Then I'd spend an evening designing a music application, thinking about plugin architecture, composing music, or sketching ideas for Blackwater Sound.&lt;/p&gt;

&lt;p&gt;Hours disappeared.&lt;/p&gt;

&lt;p&gt;The energy came back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passion Is Data
&lt;/h2&gt;

&lt;p&gt;I don't think passion should replace discipline.&lt;/p&gt;

&lt;p&gt;But I do think it's worth paying attention to.&lt;/p&gt;

&lt;p&gt;If you consistently find yourself energized by one type of work and drained by another, that's information.&lt;/p&gt;

&lt;p&gt;Not an excuse.&lt;/p&gt;

&lt;p&gt;Information.&lt;/p&gt;

&lt;p&gt;It tells you where your curiosity naturally lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alignment Creates Momentum
&lt;/h2&gt;

&lt;p&gt;Today I still believe KiwiEngine can power almost any kind of application.&lt;/p&gt;

&lt;p&gt;What has changed is how I'm choosing to use it.&lt;/p&gt;

&lt;p&gt;Instead of chasing every possible market, I'm building creative tools that I personally want to use every day.&lt;/p&gt;

&lt;p&gt;Ironically, I think that will make KiwiEngine stronger.&lt;/p&gt;

&lt;p&gt;Because software improves the most when its creator genuinely depends on it.&lt;/p&gt;

&lt;p&gt;Sometimes burnout isn't telling you to stop building.&lt;/p&gt;

&lt;p&gt;Sometimes it's telling you to build the right thing.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why I Stopped Chasing Every Market</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sat, 27 Jun 2026 12:46:48 +0000</pubDate>
      <link>https://dev.to/stinklewinks/why-i-stopped-chasing-every-market-3586</link>
      <guid>https://dev.to/stinklewinks/why-i-stopped-chasing-every-market-3586</guid>
      <description>&lt;p&gt;One of the biggest realizations I've had over the last year wasn't about software.&lt;/p&gt;

&lt;p&gt;It was about focus.&lt;/p&gt;

&lt;p&gt;When I first started building KiwiEngine, I wanted it to power everything.&lt;/p&gt;

&lt;p&gt;Business software.&lt;/p&gt;

&lt;p&gt;CRMs.&lt;/p&gt;

&lt;p&gt;Inventory systems.&lt;/p&gt;

&lt;p&gt;Scheduling platforms.&lt;/p&gt;

&lt;p&gt;Accounting tools.&lt;/p&gt;

&lt;p&gt;SaaS products.&lt;/p&gt;

&lt;p&gt;If someone could build it, I wanted KiwiEngine to support it.&lt;/p&gt;

&lt;p&gt;Technically, I still do.&lt;/p&gt;

&lt;p&gt;But something changed.&lt;/p&gt;

&lt;p&gt;I realized there is a difference between building software that can solve every problem and trying to solve every problem yourself.&lt;/p&gt;

&lt;p&gt;Those aren't the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Never Changed
&lt;/h2&gt;

&lt;p&gt;KiwiEngine is still designed to power business applications.&lt;/p&gt;

&lt;p&gt;Nothing about the architecture changed.&lt;/p&gt;

&lt;p&gt;The modules.&lt;/p&gt;

&lt;p&gt;The APIs.&lt;/p&gt;

&lt;p&gt;The philosophy.&lt;/p&gt;

&lt;p&gt;The engine remains general-purpose.&lt;/p&gt;

&lt;p&gt;What changed was my focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build What You Understand
&lt;/h2&gt;

&lt;p&gt;I started asking myself a simple question.&lt;/p&gt;

&lt;p&gt;Who do I actually understand?&lt;/p&gt;

&lt;p&gt;Not as a developer.&lt;/p&gt;

&lt;p&gt;As a creator.&lt;/p&gt;

&lt;p&gt;The answer wasn't accountants.&lt;/p&gt;

&lt;p&gt;It wasn't HR departments.&lt;/p&gt;

&lt;p&gt;It wasn't inventory managers.&lt;/p&gt;

&lt;p&gt;The answer was musicians.&lt;/p&gt;

&lt;p&gt;Artists.&lt;/p&gt;

&lt;p&gt;Game developers.&lt;/p&gt;

&lt;p&gt;Creators.&lt;/p&gt;

&lt;p&gt;Builders.&lt;/p&gt;

&lt;p&gt;Those are the people whose problems I experience every day.&lt;/p&gt;

&lt;p&gt;Those are the workflows I naturally understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Changes The Equation
&lt;/h2&gt;

&lt;p&gt;One of the beautiful things about open source is that I don't have to build every application.&lt;/p&gt;

&lt;p&gt;I can build the engine.&lt;/p&gt;

&lt;p&gt;I can document it.&lt;/p&gt;

&lt;p&gt;I can share the philosophy.&lt;/p&gt;

&lt;p&gt;Someone else can build the CRM.&lt;/p&gt;

&lt;p&gt;Someone else can build the scheduling platform.&lt;/p&gt;

&lt;p&gt;Someone else can build the accounting software.&lt;/p&gt;

&lt;p&gt;Meanwhile, I can focus on building the creative tools I genuinely want to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Proving Ground
&lt;/h2&gt;

&lt;p&gt;Today, KiwiEngine's proving ground is becoming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Artist websites&lt;/li&gt;
&lt;li&gt;EPKs&lt;/li&gt;
&lt;li&gt;Music production tools&lt;/li&gt;
&lt;li&gt;Digital storefronts&lt;/li&gt;
&lt;li&gt;Creative workflows&lt;/li&gt;
&lt;li&gt;Game development&lt;/li&gt;
&lt;li&gt;Media platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because they're the only things KiwiEngine can build.&lt;/p&gt;

&lt;p&gt;Because they're the things I care deeply enough to refine every day.&lt;/p&gt;

&lt;p&gt;And I think that creates better software than chasing every possible market ever could.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>The API Design Lesson I Learned From Building Nectarine</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Fri, 26 Jun 2026 18:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/the-api-design-lesson-i-learned-from-building-nectarine-4gf5</link>
      <guid>https://dev.to/stinklewinks/the-api-design-lesson-i-learned-from-building-nectarine-4gf5</guid>
      <description>&lt;p&gt;One of the most surprising lessons I've learned while building software is that APIs are not really about code.&lt;/p&gt;

&lt;p&gt;They're about communication.&lt;/p&gt;

&lt;p&gt;At first, that sounds strange.&lt;/p&gt;

&lt;p&gt;After all, APIs exist so software can talk to software.&lt;/p&gt;

&lt;p&gt;But every API is also a conversation between developers.&lt;/p&gt;

&lt;p&gt;And like any conversation, clarity matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Version Is Usually Technical
&lt;/h2&gt;

&lt;p&gt;Most APIs begin from an implementation perspective.&lt;/p&gt;

&lt;p&gt;The database exists.&lt;/p&gt;

&lt;p&gt;The endpoints exist.&lt;/p&gt;

&lt;p&gt;The underlying logic exists.&lt;/p&gt;

&lt;p&gt;The API becomes a reflection of those details.&lt;/p&gt;

&lt;p&gt;It exposes how the system works internally.&lt;/p&gt;

&lt;p&gt;The problem is that users often don't care about internal implementation.&lt;/p&gt;

&lt;p&gt;They care about solving problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent Is Easier To Understand
&lt;/h2&gt;

&lt;p&gt;One idea I've become increasingly interested in is designing around intent.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;p&gt;"How should users interact with the implementation?"&lt;/p&gt;

&lt;p&gt;I try to ask:&lt;/p&gt;

&lt;p&gt;"What are users trying to accomplish?"&lt;/p&gt;

&lt;p&gt;The difference seems small.&lt;/p&gt;

&lt;p&gt;The results are often significant.&lt;/p&gt;

&lt;p&gt;Intent tends to produce simpler APIs.&lt;/p&gt;

&lt;p&gt;Clearer workflows.&lt;/p&gt;

&lt;p&gt;Better naming.&lt;/p&gt;

&lt;p&gt;Better abstractions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Database Is Not The Product
&lt;/h2&gt;

&lt;p&gt;One mistake many systems make is exposing internal structures directly.&lt;/p&gt;

&lt;p&gt;Tables become endpoints.&lt;/p&gt;

&lt;p&gt;Schemas become workflows.&lt;/p&gt;

&lt;p&gt;Implementation becomes the interface.&lt;/p&gt;

&lt;p&gt;This is understandable.&lt;/p&gt;

&lt;p&gt;It's also limiting.&lt;/p&gt;

&lt;p&gt;The API should represent the problem domain.&lt;/p&gt;

&lt;p&gt;Not necessarily the storage mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good APIs Read Like Conversations
&lt;/h2&gt;

&lt;p&gt;The best APIs I've encountered often feel obvious.&lt;/p&gt;

&lt;p&gt;Not because they're simplistic.&lt;/p&gt;

&lt;p&gt;Because they're expressive.&lt;/p&gt;

&lt;p&gt;You can often read the code and understand the intention behind it.&lt;/p&gt;

&lt;p&gt;The API communicates purpose.&lt;/p&gt;

&lt;p&gt;Not just mechanics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Usage Changes Everything
&lt;/h2&gt;

&lt;p&gt;Just like documentation, abstractions, and frameworks, APIs reveal themselves through usage.&lt;/p&gt;

&lt;p&gt;The first version is rarely the final version.&lt;/p&gt;

&lt;p&gt;Real projects expose awkward naming.&lt;/p&gt;

&lt;p&gt;Unexpected workflows.&lt;/p&gt;

&lt;p&gt;Missing concepts.&lt;/p&gt;

&lt;p&gt;Confusing assumptions.&lt;/p&gt;

&lt;p&gt;The API evolves as understanding evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Goal
&lt;/h2&gt;

&lt;p&gt;I used to think API design was primarily about flexibility.&lt;/p&gt;

&lt;p&gt;Now I think it's more about reducing misunderstanding.&lt;/p&gt;

&lt;p&gt;Every confusing name creates hesitation.&lt;/p&gt;

&lt;p&gt;Every unclear workflow creates friction.&lt;/p&gt;

&lt;p&gt;Every implementation detail exposed unnecessarily creates cognitive load.&lt;/p&gt;

&lt;p&gt;The best APIs reduce those costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The longer I build software, the less I think about APIs as technical interfaces.&lt;/p&gt;

&lt;p&gt;I think about them as communication tools.&lt;/p&gt;

&lt;p&gt;A good API helps developers understand a system.&lt;/p&gt;

&lt;p&gt;A great API helps developers forget the system exists and focus on solving the problem instead.&lt;/p&gt;

&lt;p&gt;That's the lesson I'm continuing to learn while building software.&lt;/p&gt;

&lt;p&gt;And it's one that seems to apply far beyond APIs themselves.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>backend</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why I Stopped Adding Features and Started Removing Friction</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Thu, 25 Jun 2026 16:55:37 +0000</pubDate>
      <link>https://dev.to/stinklewinks/why-i-stopped-adding-features-and-started-removing-friction-47n6</link>
      <guid>https://dev.to/stinklewinks/why-i-stopped-adding-features-and-started-removing-friction-47n6</guid>
      <description>&lt;p&gt;Early in a project, adding features feels like progress.&lt;/p&gt;

&lt;p&gt;A new capability appears.&lt;/p&gt;

&lt;p&gt;A new screen gets built.&lt;/p&gt;

&lt;p&gt;A new workflow becomes possible.&lt;/p&gt;

&lt;p&gt;Everything feels like forward motion.&lt;/p&gt;

&lt;p&gt;For a long time, I assumed that was the primary job of software development.&lt;/p&gt;

&lt;p&gt;Build more features.&lt;/p&gt;

&lt;p&gt;Solve more problems.&lt;/p&gt;

&lt;p&gt;Expand the system.&lt;/p&gt;

&lt;p&gt;Over time, I've started to think differently.&lt;/p&gt;

&lt;p&gt;Some of the most valuable improvements I've ever made weren't new features.&lt;/p&gt;

&lt;p&gt;They were reductions in friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Create Possibilities
&lt;/h2&gt;

&lt;p&gt;Features matter.&lt;/p&gt;

&lt;p&gt;Users need capabilities.&lt;/p&gt;

&lt;p&gt;Products need functionality.&lt;/p&gt;

&lt;p&gt;Without features, software doesn't solve problems.&lt;/p&gt;

&lt;p&gt;The challenge is that every feature introduces complexity.&lt;/p&gt;

&lt;p&gt;Every button.&lt;/p&gt;

&lt;p&gt;Every setting.&lt;/p&gt;

&lt;p&gt;Every workflow.&lt;/p&gt;

&lt;p&gt;Every API.&lt;/p&gt;

&lt;p&gt;Every configuration option.&lt;/p&gt;

&lt;p&gt;The system grows.&lt;/p&gt;

&lt;p&gt;Sometimes that's necessary.&lt;/p&gt;

&lt;p&gt;Sometimes it's expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Friction Is Easier To Ignore
&lt;/h2&gt;

&lt;p&gt;One reason friction survives so long is because it often looks small.&lt;/p&gt;

&lt;p&gt;An extra click.&lt;/p&gt;

&lt;p&gt;An extra configuration step.&lt;/p&gt;

&lt;p&gt;A confusing name.&lt;/p&gt;

&lt;p&gt;A repetitive workflow.&lt;/p&gt;

&lt;p&gt;None of these things seem important individually.&lt;/p&gt;

&lt;p&gt;But software isn't experienced one interaction at a time.&lt;/p&gt;

&lt;p&gt;It's experienced as a whole.&lt;/p&gt;

&lt;p&gt;Small friction accumulates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The User Feels Everything
&lt;/h2&gt;

&lt;p&gt;As builders, we often focus on what software can do.&lt;/p&gt;

&lt;p&gt;Users focus on how software feels.&lt;/p&gt;

&lt;p&gt;The difference matters.&lt;/p&gt;

&lt;p&gt;A powerful feature that creates frustration may deliver less value than a simple workflow that feels effortless.&lt;/p&gt;

&lt;p&gt;The experience is part of the product.&lt;/p&gt;

&lt;p&gt;Not just the functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Projects Expose Friction
&lt;/h2&gt;

&lt;p&gt;One reason I believe strongly in building real projects is because friction becomes impossible to ignore.&lt;/p&gt;

&lt;p&gt;Features tend to dominate planning meetings.&lt;/p&gt;

&lt;p&gt;Friction dominates daily usage.&lt;/p&gt;

&lt;p&gt;You feel it.&lt;/p&gt;

&lt;p&gt;Repeatedly.&lt;/p&gt;

&lt;p&gt;The same awkward workflow.&lt;/p&gt;

&lt;p&gt;The same repetitive task.&lt;/p&gt;

&lt;p&gt;The same confusing decision.&lt;/p&gt;

&lt;p&gt;Eventually the problem becomes obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Removing Friction Creates Leverage
&lt;/h2&gt;

&lt;p&gt;A feature helps users do something new.&lt;/p&gt;

&lt;p&gt;Removing friction helps users do everything faster.&lt;/p&gt;

&lt;p&gt;That's a different kind of value.&lt;/p&gt;

&lt;p&gt;The improvement compounds.&lt;/p&gt;

&lt;p&gt;Every interaction benefits.&lt;/p&gt;

&lt;p&gt;Every workflow benefits.&lt;/p&gt;

&lt;p&gt;Every future feature benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Metric
&lt;/h2&gt;

&lt;p&gt;I've started paying attention to a question that rarely appears on roadmaps:&lt;/p&gt;

&lt;p&gt;"How much effort does this require to understand?"&lt;/p&gt;

&lt;p&gt;Not implement.&lt;/p&gt;

&lt;p&gt;Not maintain.&lt;/p&gt;

&lt;p&gt;Understand.&lt;/p&gt;

&lt;p&gt;Understanding is one of the most expensive costs in software.&lt;/p&gt;

&lt;p&gt;Reducing friction often means reducing the effort required to understand the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Features are important.&lt;/p&gt;

&lt;p&gt;But they're not the only way software improves.&lt;/p&gt;

&lt;p&gt;Sometimes the best feature is the removal of a problem users encounter every day.&lt;/p&gt;

&lt;p&gt;The longer I build software, the more I find myself asking:&lt;/p&gt;

&lt;p&gt;Not "What should we add next?"&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;"What can we make easier?"&lt;/p&gt;

&lt;p&gt;Because removing friction often creates more value than adding another feature ever could.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Constraints Create Better Software</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Tue, 23 Jun 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/why-constraints-create-better-software-12lc</link>
      <guid>https://dev.to/stinklewinks/why-constraints-create-better-software-12lc</guid>
      <description>&lt;p&gt;When developers talk about software design, flexibility is usually treated as an unquestionable good.&lt;/p&gt;

&lt;p&gt;More options.&lt;/p&gt;

&lt;p&gt;More customization.&lt;/p&gt;

&lt;p&gt;More configuration.&lt;/p&gt;

&lt;p&gt;More control.&lt;/p&gt;

&lt;p&gt;The assumption is simple:&lt;/p&gt;

&lt;p&gt;More freedom equals better software.&lt;/p&gt;

&lt;p&gt;I'm no longer convinced that's true.&lt;/p&gt;

&lt;p&gt;In many cases, the opposite seems to happen.&lt;/p&gt;

&lt;p&gt;The most successful systems often become successful because of their constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every System Has Rules
&lt;/h2&gt;

&lt;p&gt;Whether we acknowledge them or not, every system operates within constraints.&lt;/p&gt;

&lt;p&gt;Programming languages have syntax.&lt;/p&gt;

&lt;p&gt;Frameworks have conventions.&lt;/p&gt;

&lt;p&gt;Databases have schemas.&lt;/p&gt;

&lt;p&gt;Operating systems have permissions.&lt;/p&gt;

&lt;p&gt;The question isn't whether constraints exist.&lt;/p&gt;

&lt;p&gt;The question is whether they're intentional.&lt;/p&gt;

&lt;p&gt;Good constraints guide behavior.&lt;/p&gt;

&lt;p&gt;Bad constraints create frustration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints Reduce Decisions
&lt;/h2&gt;

&lt;p&gt;Every decision requires effort.&lt;/p&gt;

&lt;p&gt;Every configuration option requires understanding.&lt;/p&gt;

&lt;p&gt;Every customization path requires maintenance.&lt;/p&gt;

&lt;p&gt;One reason good software feels simple is because it removes unnecessary decisions.&lt;/p&gt;

&lt;p&gt;The system makes sensible choices so users can focus on solving problems.&lt;/p&gt;

&lt;p&gt;Not configuring tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency Creates Trust
&lt;/h2&gt;

&lt;p&gt;One of the hidden benefits of constraints is consistency.&lt;/p&gt;

&lt;p&gt;When developers encounter the same patterns repeatedly, they begin building intuition.&lt;/p&gt;

&lt;p&gt;The system becomes predictable.&lt;/p&gt;

&lt;p&gt;Predictability creates confidence.&lt;/p&gt;

&lt;p&gt;Confidence creates speed.&lt;/p&gt;

&lt;p&gt;The result is often greater productivity than a completely unrestricted system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Languages Depend On Constraints
&lt;/h2&gt;

&lt;p&gt;Languages work because of grammar.&lt;/p&gt;

&lt;p&gt;Without shared rules, communication becomes difficult.&lt;/p&gt;

&lt;p&gt;Frameworks are similar.&lt;/p&gt;

&lt;p&gt;The more a framework grows, the more important consistency becomes.&lt;/p&gt;

&lt;p&gt;Conventions become vocabulary.&lt;/p&gt;

&lt;p&gt;Patterns become expectations.&lt;/p&gt;

&lt;p&gt;The system develops a language.&lt;/p&gt;

&lt;p&gt;And languages require rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Projects Reveal Useful Constraints
&lt;/h2&gt;

&lt;p&gt;The best constraints rarely emerge from theory.&lt;/p&gt;

&lt;p&gt;They emerge from usage.&lt;/p&gt;

&lt;p&gt;A real project exposes confusion.&lt;/p&gt;

&lt;p&gt;A real project exposes repetition.&lt;/p&gt;

&lt;p&gt;A real project exposes complexity.&lt;/p&gt;

&lt;p&gt;Over time, useful constraints begin to emerge naturally.&lt;/p&gt;

&lt;p&gt;Not because someone imposed them.&lt;/p&gt;

&lt;p&gt;Because reality demanded them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal Is Progress
&lt;/h2&gt;

&lt;p&gt;I've started thinking about software design differently.&lt;/p&gt;

&lt;p&gt;The goal isn't maximum flexibility.&lt;/p&gt;

&lt;p&gt;The goal is maximum progress.&lt;/p&gt;

&lt;p&gt;Sometimes progress requires freedom.&lt;/p&gt;

&lt;p&gt;Sometimes progress requires constraints.&lt;/p&gt;

&lt;p&gt;The challenge is knowing the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Good constraints aren't limitations.&lt;/p&gt;

&lt;p&gt;They're guidance.&lt;/p&gt;

&lt;p&gt;They help developers focus on what matters.&lt;/p&gt;

&lt;p&gt;They reduce cognitive load.&lt;/p&gt;

&lt;p&gt;They create consistency.&lt;/p&gt;

&lt;p&gt;They improve communication.&lt;/p&gt;

&lt;p&gt;And over time, they help transform a collection of features into a coherent system.&lt;/p&gt;

&lt;p&gt;The longer I build software, the more I find myself asking:&lt;/p&gt;

&lt;p&gt;Not "What should this allow?"&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;"What should this encourage?"&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building a Design System Without Recreating CSS</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Mon, 22 Jun 2026 23:17:44 +0000</pubDate>
      <link>https://dev.to/stinklewinks/building-a-design-system-without-recreating-css-1a41</link>
      <guid>https://dev.to/stinklewinks/building-a-design-system-without-recreating-css-1a41</guid>
      <description>&lt;p&gt;One of the easiest traps to fall into when building a design system is accidentally recreating CSS.&lt;/p&gt;

&lt;p&gt;At first, it seems harmless.&lt;/p&gt;

&lt;p&gt;You add a few utility classes.&lt;/p&gt;

&lt;p&gt;Then a few responsive options.&lt;/p&gt;

&lt;p&gt;Then a few layout helpers.&lt;/p&gt;

&lt;p&gt;Then a few exceptions.&lt;/p&gt;

&lt;p&gt;Before long, you've built an entirely new syntax for doing the exact same thing CSS already does.&lt;/p&gt;

&lt;p&gt;I've become increasingly interested in a different approach.&lt;/p&gt;

&lt;p&gt;Not replacing CSS.&lt;/p&gt;

&lt;p&gt;Not hiding CSS.&lt;/p&gt;

&lt;p&gt;Creating a layer above CSS that focuses on intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With More Options
&lt;/h2&gt;

&lt;p&gt;Developers love flexibility.&lt;/p&gt;

&lt;p&gt;I do too.&lt;/p&gt;

&lt;p&gt;The challenge is that flexibility often comes with complexity.&lt;/p&gt;

&lt;p&gt;Consider responsive layouts.&lt;/p&gt;

&lt;p&gt;Many systems solve this by exposing every possible breakpoint and layout combination.&lt;/p&gt;

&lt;p&gt;The result is powerful.&lt;/p&gt;

&lt;p&gt;But it's also easy to end up with markup that spends more time describing implementation details than communicating purpose.&lt;/p&gt;

&lt;p&gt;The system becomes harder to understand.&lt;/p&gt;

&lt;p&gt;Not because it's incapable.&lt;/p&gt;

&lt;p&gt;Because it's trying to describe everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent Versus Implementation
&lt;/h2&gt;

&lt;p&gt;Lately I've been thinking less about how a layout is built and more about what the layout is trying to accomplish.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="na"&gt;adapt=&lt;/span&gt;&lt;span class="s"&gt;"grid"&lt;/span&gt; &lt;span class="na"&gt;mobile=&lt;/span&gt;&lt;span class="s"&gt;"stack"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't trying to replace CSS.&lt;/p&gt;

&lt;p&gt;It's trying to express intent.&lt;/p&gt;

&lt;p&gt;The content should adapt as a grid.&lt;/p&gt;

&lt;p&gt;On mobile, it should stack.&lt;/p&gt;

&lt;p&gt;The implementation details can remain inside the design system.&lt;/p&gt;

&lt;p&gt;The goal isn't more abstraction.&lt;/p&gt;

&lt;p&gt;The goal is better communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strong Defaults Create Simplicity
&lt;/h2&gt;

&lt;p&gt;One lesson I've learned from building software is that good defaults are often more valuable than endless configuration.&lt;/p&gt;

&lt;p&gt;Most layouts follow common patterns.&lt;/p&gt;

&lt;p&gt;Most responsive behavior follows common patterns.&lt;/p&gt;

&lt;p&gt;Most developers aren't trying to create entirely new layout systems.&lt;/p&gt;

&lt;p&gt;They're trying to organize content.&lt;/p&gt;

&lt;p&gt;A design system can help by providing thoughtful defaults rather than exposing every possible option.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Danger Of Recreating CSS
&lt;/h2&gt;

&lt;p&gt;The moment a design system attempts to expose every CSS capability, it starts competing with CSS itself.&lt;/p&gt;

&lt;p&gt;That's usually a losing battle.&lt;/p&gt;

&lt;p&gt;CSS already exists.&lt;/p&gt;

&lt;p&gt;CSS is already powerful.&lt;/p&gt;

&lt;p&gt;CSS is already standardized.&lt;/p&gt;

&lt;p&gt;The job of a design system isn't to replace CSS.&lt;/p&gt;

&lt;p&gt;The job of a design system is to reduce cognitive load.&lt;/p&gt;

&lt;p&gt;To create consistency.&lt;/p&gt;

&lt;p&gt;To communicate intent.&lt;/p&gt;

&lt;p&gt;To make common patterns easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing For Readability
&lt;/h2&gt;

&lt;p&gt;One question I increasingly ask when designing APIs is:&lt;/p&gt;

&lt;p&gt;"Can I understand this six months from now?"&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;"Can I configure everything?"&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;"Can I support every edge case?"&lt;/p&gt;

&lt;p&gt;Simply:&lt;/p&gt;

&lt;p&gt;"Can I read this and understand what it is trying to do?"&lt;/p&gt;

&lt;p&gt;Readability scales.&lt;/p&gt;

&lt;p&gt;Complexity doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal Isn't Less Power
&lt;/h2&gt;

&lt;p&gt;Sometimes simplicity gets mistaken for limitation.&lt;/p&gt;

&lt;p&gt;I don't think that's true.&lt;/p&gt;

&lt;p&gt;The goal isn't to remove power.&lt;/p&gt;

&lt;p&gt;The goal is to place power where it belongs.&lt;/p&gt;

&lt;p&gt;Common workflows should be simple.&lt;/p&gt;

&lt;p&gt;Advanced workflows should remain possible.&lt;/p&gt;

&lt;p&gt;The design system should help developers move quickly without preventing them from solving unique problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I've become increasingly convinced that the best design systems don't try to replace CSS.&lt;/p&gt;

&lt;p&gt;They try to create a shared language around common design decisions.&lt;/p&gt;

&lt;p&gt;A language focused on intent rather than implementation.&lt;/p&gt;

&lt;p&gt;A language that helps developers communicate purpose.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, most developers aren't trying to build layouts.&lt;/p&gt;

&lt;p&gt;They're trying to build products.&lt;/p&gt;

&lt;p&gt;The layout is simply one part of the system.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Every Framework Eventually Becomes a Language</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sun, 21 Jun 2026 17:00:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/every-framework-eventually-becomes-a-language-1b4h</link>
      <guid>https://dev.to/stinklewinks/every-framework-eventually-becomes-a-language-1b4h</guid>
      <description>&lt;p&gt;When most developers think about frameworks, they think about features.&lt;/p&gt;

&lt;p&gt;Routing.&lt;/p&gt;

&lt;p&gt;Components.&lt;/p&gt;

&lt;p&gt;State management.&lt;/p&gt;

&lt;p&gt;Authentication.&lt;/p&gt;

&lt;p&gt;Data access.&lt;/p&gt;

&lt;p&gt;Build tools.&lt;/p&gt;

&lt;p&gt;All important things.&lt;/p&gt;

&lt;p&gt;But I've started to believe that the longer a framework survives, the less important its features become.&lt;/p&gt;

&lt;p&gt;Instead, something else emerges.&lt;/p&gt;

&lt;p&gt;A language.&lt;/p&gt;

&lt;p&gt;Not a programming language.&lt;/p&gt;

&lt;p&gt;A language of ideas.&lt;/p&gt;

&lt;p&gt;A language of patterns.&lt;/p&gt;

&lt;p&gt;A language of intent.&lt;/p&gt;

&lt;p&gt;And once that language forms, it often becomes more valuable than the framework itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks Start As Tools
&lt;/h2&gt;

&lt;p&gt;Most frameworks begin life as solutions to technical problems.&lt;/p&gt;

&lt;p&gt;How do we route requests?&lt;/p&gt;

&lt;p&gt;How do we manage state?&lt;/p&gt;

&lt;p&gt;How do we organize code?&lt;/p&gt;

&lt;p&gt;How do we build interfaces?&lt;/p&gt;

&lt;p&gt;The early focus is almost entirely mechanical.&lt;/p&gt;

&lt;p&gt;The framework exists to make something easier.&lt;/p&gt;

&lt;p&gt;The language hasn't formed yet.&lt;/p&gt;

&lt;p&gt;At this stage, the framework is mostly a collection of features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Patterns Begin To Appear
&lt;/h2&gt;

&lt;p&gt;Something interesting happens once enough people start using a framework.&lt;/p&gt;

&lt;p&gt;Certain approaches become common.&lt;/p&gt;

&lt;p&gt;Certain solutions become preferred.&lt;/p&gt;

&lt;p&gt;Certain conventions emerge.&lt;/p&gt;

&lt;p&gt;Developers start recognizing patterns.&lt;/p&gt;

&lt;p&gt;The framework begins teaching its users how to think.&lt;/p&gt;

&lt;p&gt;Not just how to code.&lt;/p&gt;

&lt;p&gt;How to approach problems.&lt;/p&gt;

&lt;p&gt;This is where the framework starts becoming a language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Frameworks Teach More Than APIs
&lt;/h2&gt;

&lt;p&gt;Think about the frameworks and tools that have survived for years.&lt;/p&gt;

&lt;p&gt;People don't just learn the APIs.&lt;/p&gt;

&lt;p&gt;They learn the philosophy.&lt;/p&gt;

&lt;p&gt;They learn the conventions.&lt;/p&gt;

&lt;p&gt;They learn the assumptions.&lt;/p&gt;

&lt;p&gt;Eventually they start speaking the language of the framework.&lt;/p&gt;

&lt;p&gt;You can often tell when someone has spent years working within a particular ecosystem.&lt;/p&gt;

&lt;p&gt;Not because of the code they write.&lt;/p&gt;

&lt;p&gt;Because of the way they think.&lt;/p&gt;

&lt;p&gt;The framework has shaped their mental model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Language Matters More Than The Syntax
&lt;/h2&gt;

&lt;p&gt;Most developers assume the syntax is the important part.&lt;/p&gt;

&lt;p&gt;I don't think it is.&lt;/p&gt;

&lt;p&gt;Syntax changes.&lt;/p&gt;

&lt;p&gt;Versions change.&lt;/p&gt;

&lt;p&gt;Features change.&lt;/p&gt;

&lt;p&gt;The underlying language tends to remain.&lt;/p&gt;

&lt;p&gt;The language is what allows developers to communicate ideas efficiently.&lt;/p&gt;

&lt;p&gt;Once a shared vocabulary exists, complexity starts shrinking.&lt;/p&gt;

&lt;p&gt;A single term can communicate an entire concept.&lt;/p&gt;

&lt;p&gt;A single convention can communicate an entire workflow.&lt;/p&gt;

&lt;p&gt;The language becomes a form of compression.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation Is Really Language Training
&lt;/h2&gt;

&lt;p&gt;This realization changed how I think about documentation.&lt;/p&gt;

&lt;p&gt;Documentation isn't just explaining APIs.&lt;/p&gt;

&lt;p&gt;It's teaching vocabulary.&lt;/p&gt;

&lt;p&gt;It's teaching concepts.&lt;/p&gt;

&lt;p&gt;It's teaching patterns.&lt;/p&gt;

&lt;p&gt;Good documentation helps users understand how the framework thinks.&lt;/p&gt;

&lt;p&gt;Bad documentation simply lists features.&lt;/p&gt;

&lt;p&gt;The difference is significant.&lt;/p&gt;

&lt;p&gt;One teaches understanding.&lt;/p&gt;

&lt;p&gt;The other teaches memorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Projects Shape The Language
&lt;/h2&gt;

&lt;p&gt;One reason I believe every library needs a real project is because real projects shape the language.&lt;/p&gt;

&lt;p&gt;Features can be designed in isolation.&lt;/p&gt;

&lt;p&gt;Languages cannot.&lt;/p&gt;

&lt;p&gt;Languages emerge from use.&lt;/p&gt;

&lt;p&gt;They emerge from friction.&lt;/p&gt;

&lt;p&gt;They emerge from repeated interactions with real problems.&lt;/p&gt;

&lt;p&gt;The most useful concepts survive.&lt;/p&gt;

&lt;p&gt;The awkward concepts disappear.&lt;/p&gt;

&lt;p&gt;Over time the language becomes more refined.&lt;/p&gt;

&lt;p&gt;More expressive.&lt;/p&gt;

&lt;p&gt;More coherent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every Successful System Develops Vocabulary
&lt;/h2&gt;

&lt;p&gt;This isn't unique to software.&lt;/p&gt;

&lt;p&gt;Businesses develop language.&lt;/p&gt;

&lt;p&gt;Trades develop language.&lt;/p&gt;

&lt;p&gt;Music develops language.&lt;/p&gt;

&lt;p&gt;Architecture develops language.&lt;/p&gt;

&lt;p&gt;Communities develop language.&lt;/p&gt;

&lt;p&gt;The larger and more complex a system becomes, the more important shared vocabulary becomes.&lt;/p&gt;

&lt;p&gt;Without a common language, collaboration becomes difficult.&lt;/p&gt;

&lt;p&gt;With one, entire ideas can be communicated in a few words.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters To Builders
&lt;/h2&gt;

&lt;p&gt;The longer I build software, the less interested I become in adding features for the sake of features.&lt;/p&gt;

&lt;p&gt;Instead, I find myself asking different questions.&lt;/p&gt;

&lt;p&gt;Does this fit the language?&lt;/p&gt;

&lt;p&gt;Does this reinforce the philosophy?&lt;/p&gt;

&lt;p&gt;Does this make the system easier to understand?&lt;/p&gt;

&lt;p&gt;Does this create a more coherent experience?&lt;/p&gt;

&lt;p&gt;Those questions often lead to better decisions than simply asking what feature should come next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Most frameworks begin as tools.&lt;/p&gt;

&lt;p&gt;Some evolve into ecosystems.&lt;/p&gt;

&lt;p&gt;The most successful ones eventually become languages.&lt;/p&gt;

&lt;p&gt;They create vocabulary.&lt;/p&gt;

&lt;p&gt;They create conventions.&lt;/p&gt;

&lt;p&gt;They create ways of thinking.&lt;/p&gt;

&lt;p&gt;The APIs matter.&lt;/p&gt;

&lt;p&gt;The features matter.&lt;/p&gt;

&lt;p&gt;But over time, the language becomes the thing people truly adopt.&lt;/p&gt;

&lt;p&gt;And once that happens, the framework is no longer just software.&lt;/p&gt;

&lt;p&gt;It's a way of expressing ideas.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
