<?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>Sig Is Becoming The Reactive Engine</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Mon, 28 Sep 2026 17:15:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/sig-is-becoming-the-reactive-engine-fmb</link>
      <guid>https://dev.to/stinklewinks/sig-is-becoming-the-reactive-engine-fmb</guid>
      <description>&lt;p&gt;In the last Road To KiwiEngine post, I talked about Juice getting close to version 1.0.&lt;/p&gt;

&lt;p&gt;Juice has reached a point where I understand its responsibility pretty clearly.&lt;/p&gt;

&lt;p&gt;It takes design intent, project configuration, and attribute-based styling rules and turns those things into the visual language of an application.&lt;/p&gt;

&lt;p&gt;But interfaces aren't static.&lt;/p&gt;

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

&lt;p&gt;Users click buttons.&lt;/p&gt;

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

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

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

&lt;p&gt;Parts of the interface need to update without rebuilding everything around them.&lt;/p&gt;

&lt;p&gt;That's where another KiwiEngine library has been quietly becoming one of the more complete pieces of the ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sig.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Juice Makes It Look Right. Sig Makes It Alive.
&lt;/h2&gt;

&lt;p&gt;This is probably the simplest way I can describe the relationship.&lt;/p&gt;

&lt;p&gt;Juice is concerned with presentation.&lt;/p&gt;

&lt;p&gt;Sig is concerned with reactivity.&lt;/p&gt;

&lt;p&gt;They're related because they both participate in the user interface, but I don't want them becoming the same system.&lt;/p&gt;

&lt;p&gt;That's an important architectural boundary.&lt;/p&gt;

&lt;p&gt;Juice shouldn't need to understand application state just because an element has styling.&lt;/p&gt;

&lt;p&gt;Sig shouldn't need to understand a project's design system just because something on the screen changed.&lt;/p&gt;

&lt;p&gt;They can work together without owning each other's responsibilities.&lt;/p&gt;

&lt;p&gt;That's becoming a recurring theme throughout KiwiEngine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sig Is Signal-Based
&lt;/h2&gt;

&lt;p&gt;At the center of Sig is the idea of signals.&lt;/p&gt;

&lt;p&gt;A signal represents a value that can change.&lt;/p&gt;

&lt;p&gt;Conceptually, something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the interesting part isn't simply storing &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It's establishing that &lt;code&gt;count&lt;/code&gt; is something the interface can react to.&lt;/p&gt;

&lt;p&gt;If that value changes, the parts of the UI depending on it can respond.&lt;/p&gt;

&lt;p&gt;That gives me a much cleaner mental model for reactive interfaces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something changed. Update what depends on it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I like that.&lt;/p&gt;

&lt;p&gt;It's small.&lt;/p&gt;

&lt;p&gt;It's understandable.&lt;/p&gt;

&lt;p&gt;And it doesn't require the entire application to become one giant state-management problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Didn't Want Reactivity Everywhere
&lt;/h2&gt;

&lt;p&gt;This is one of the architectural decisions I've become more confident about.&lt;/p&gt;

&lt;p&gt;When you're building a framework, it's tempting to make every system aware of every other system.&lt;/p&gt;

&lt;p&gt;The UI needs state.&lt;/p&gt;

&lt;p&gt;The state affects rendering.&lt;/p&gt;

&lt;p&gt;Rendering affects components.&lt;/p&gt;

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

&lt;p&gt;Styles have configuration.&lt;/p&gt;

&lt;p&gt;Suddenly everything knows everything.&lt;/p&gt;

&lt;p&gt;That's exactly the kind of coupling I'm trying to avoid.&lt;/p&gt;

&lt;p&gt;Sig owns reactivity.&lt;/p&gt;

&lt;p&gt;Juice owns styling.&lt;/p&gt;

&lt;p&gt;Nectarine can own configuration.&lt;/p&gt;

&lt;p&gt;Seltzer can own HTTP concerns.&lt;/p&gt;

&lt;p&gt;WebEngine can coordinate the larger application lifecycle.&lt;/p&gt;

&lt;p&gt;The pieces can communicate.&lt;/p&gt;

&lt;p&gt;But communication doesn't require collapsing them into one enormous abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sig Has Its Own JSX Runtime
&lt;/h2&gt;

&lt;p&gt;This is where Sig becomes more than a tiny signals utility.&lt;/p&gt;

&lt;p&gt;It also has its own JSX runtime.&lt;/p&gt;

&lt;p&gt;That matters because JSX gives me a really expressive way to describe interfaces while Sig controls how those interfaces actually become reactive.&lt;/p&gt;

&lt;p&gt;Instead of depending on another UI framework to interpret the application, KiwiEngine can have a rendering model that belongs to its own architecture.&lt;/p&gt;

&lt;p&gt;That's a significant step.&lt;/p&gt;

&lt;p&gt;Because now Sig isn't simply helping another framework manage state.&lt;/p&gt;

&lt;p&gt;It's becoming the reactive UI runtime itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSX Isn't The Architecture
&lt;/h2&gt;

&lt;p&gt;At the same time, I don't want JSX to become the point of Sig.&lt;/p&gt;

&lt;p&gt;Syntax is useful.&lt;/p&gt;

&lt;p&gt;But syntax isn't architecture.&lt;/p&gt;

&lt;p&gt;The important part is the relationship underneath it.&lt;/p&gt;

&lt;p&gt;A component expresses an interface.&lt;/p&gt;

&lt;p&gt;Signals represent changing values.&lt;/p&gt;

&lt;p&gt;The renderer understands those relationships.&lt;/p&gt;

&lt;p&gt;When state changes, the system updates what needs to change.&lt;/p&gt;

&lt;p&gt;JSX gives developers a convenient way to express that.&lt;/p&gt;

&lt;p&gt;But the real value is the reactive model underneath it.&lt;/p&gt;

&lt;p&gt;That's the engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reactivity Should Feel Boring
&lt;/h2&gt;

&lt;p&gt;I mean that as a compliment.&lt;/p&gt;

&lt;p&gt;When I click something and a value changes, I don't want to think about the rendering engine every time.&lt;/p&gt;

&lt;p&gt;I don't want every feature to require another conversation about state synchronization.&lt;/p&gt;

&lt;p&gt;I don't want to manually coordinate every DOM update.&lt;/p&gt;

&lt;p&gt;The system should establish the relationship.&lt;/p&gt;

&lt;p&gt;Then it should do its job.&lt;/p&gt;

&lt;p&gt;That's where libraries start becoming infrastructure.&lt;/p&gt;

&lt;p&gt;When they're new, you think about them constantly.&lt;/p&gt;

&lt;p&gt;When they're mature, you think about the thing you're building.&lt;/p&gt;

&lt;p&gt;Sig getting closer to version 1 means I want more of that second experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Renderer Is Where The Abstraction Gets Tested
&lt;/h2&gt;

&lt;p&gt;A reactive API can look incredibly elegant in isolation.&lt;/p&gt;

&lt;p&gt;The real test happens when you start rendering actual applications.&lt;/p&gt;

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

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

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

&lt;p&gt;Elements appear and disappear.&lt;/p&gt;

&lt;p&gt;Events fire.&lt;/p&gt;

&lt;p&gt;Values depend on other values.&lt;/p&gt;

&lt;p&gt;Cleanup matters.&lt;/p&gt;

&lt;p&gt;Lifecycle matters.&lt;/p&gt;

&lt;p&gt;The happy-path demo stops being enough.&lt;/p&gt;

&lt;p&gt;That's where the implementation has to prove that the abstraction actually works.&lt;/p&gt;

&lt;p&gt;And that's part of why building real KiwiEngine applications matters so much.&lt;/p&gt;

&lt;p&gt;I'm not trying to design Sig from hypothetical examples forever.&lt;/p&gt;

&lt;p&gt;The applications need to pressure-test it.&lt;/p&gt;

&lt;p&gt;If something becomes awkward repeatedly, that's information.&lt;/p&gt;

&lt;p&gt;If an abstraction only works in a demo, that's information too.&lt;/p&gt;

&lt;p&gt;The application is part of the design process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sig Shouldn't Become Everything Either
&lt;/h2&gt;

&lt;p&gt;The lesson I learned with Juice applies here too.&lt;/p&gt;

&lt;p&gt;A library becomes more mature when I understand what &lt;strong&gt;doesn't&lt;/strong&gt; belong in it.&lt;/p&gt;

&lt;p&gt;Sig doesn't need to become a styling framework.&lt;/p&gt;

&lt;p&gt;It doesn't need to become an HTTP client.&lt;/p&gt;

&lt;p&gt;It doesn't need to become a configuration system.&lt;/p&gt;

&lt;p&gt;It doesn't need to absorb every capability an application might eventually require.&lt;/p&gt;

&lt;p&gt;Its responsibility is already substantial:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make reactive interfaces work well.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Other KiwiEngine systems can handle the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Why Separate Libraries Matter
&lt;/h2&gt;

&lt;p&gt;Sometimes it would be easier to put everything into one giant package.&lt;/p&gt;

&lt;p&gt;Install KiwiEngine.&lt;/p&gt;

&lt;p&gt;Get everything.&lt;/p&gt;

&lt;p&gt;UI.&lt;/p&gt;

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

&lt;p&gt;HTTP.&lt;/p&gt;

&lt;p&gt;Configuration.&lt;/p&gt;

&lt;p&gt;Infrastructure.&lt;/p&gt;

&lt;p&gt;Rendering.&lt;/p&gt;

&lt;p&gt;All living inside the same enormous abstraction.&lt;/p&gt;

&lt;p&gt;But that's not really the engine I want.&lt;/p&gt;

&lt;p&gt;I want systems with understandable responsibilities.&lt;/p&gt;

&lt;p&gt;Juice can mature independently.&lt;/p&gt;

&lt;p&gt;Sig can mature independently.&lt;/p&gt;

&lt;p&gt;Seltzer can mature independently.&lt;/p&gt;

&lt;p&gt;Nectarine can mature independently.&lt;/p&gt;

&lt;p&gt;Then WebEngine can compose those capabilities into something larger.&lt;/p&gt;

&lt;p&gt;That means improvements to one system don't necessarily require redesigning everything else.&lt;/p&gt;

&lt;p&gt;It also means developers can understand KiwiEngine one piece at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juice And Sig Show What KiwiEngine Is Becoming
&lt;/h2&gt;

&lt;p&gt;This is where the architecture is starting to feel real to me.&lt;/p&gt;

&lt;p&gt;Juice can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should this interface express its design?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sig can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should this interface respond when something changes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;They deserve different systems.&lt;/p&gt;

&lt;p&gt;But when they're composed, something interesting happens.&lt;/p&gt;

&lt;p&gt;Now I have an interface that can express design intent &lt;strong&gt;and&lt;/strong&gt; react to application state.&lt;/p&gt;

&lt;p&gt;Neither library needs to become the other.&lt;/p&gt;

&lt;p&gt;That's the kind of composition I've been trying to reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Close To Version 1 Changes The Questions
&lt;/h2&gt;

&lt;p&gt;Just like Juice, getting Sig closer to version 1 isn't making me ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What else can I cram into this thing?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the responsibility clear?&lt;/p&gt;

&lt;p&gt;Is the reactive model predictable?&lt;/p&gt;

&lt;p&gt;Does the renderer behave consistently?&lt;/p&gt;

&lt;p&gt;Are the lifecycle boundaries understandable?&lt;/p&gt;

&lt;p&gt;Can I build real interfaces without constantly fighting the abstraction?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those questions matter more to me than the size of the feature list.&lt;/p&gt;

&lt;p&gt;Version 1 doesn't mean there will never be another feature.&lt;/p&gt;

&lt;p&gt;It means the foundation should be dependable enough to build on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Another Piece Of The Engine Is Settling Into Place
&lt;/h2&gt;

&lt;p&gt;This is why I've been saying KiwiEngine is finally becoming an engine.&lt;/p&gt;

&lt;p&gt;It's not because one giant package suddenly became capable of doing everything.&lt;/p&gt;

&lt;p&gt;It's almost the opposite.&lt;/p&gt;

&lt;p&gt;The individual systems are figuring out what they're responsible for.&lt;/p&gt;

&lt;p&gt;Juice is becoming the design engine.&lt;/p&gt;

&lt;p&gt;Sig is becoming the reactive UI engine.&lt;/p&gt;

&lt;p&gt;And as those responsibilities stabilize, WebEngine gains dependable pieces it can compose instead of experimental ideas it has to compensate for.&lt;/p&gt;

&lt;p&gt;That's progress I can actually build on.&lt;/p&gt;

&lt;p&gt;Because eventually I don't want to spend all my time thinking about signals.&lt;/p&gt;

&lt;p&gt;I want to think about the music application using them.&lt;/p&gt;

&lt;p&gt;The storefront using them.&lt;/p&gt;

&lt;p&gt;The artist platform using them.&lt;/p&gt;

&lt;p&gt;The electronics dashboard using them.&lt;/p&gt;

&lt;p&gt;The things I'm actually trying to create.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good reactive engine shouldn't become the application.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It should make the application feel alive.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Juice Is Becoming a Design Engine</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sun, 27 Sep 2026 18:30:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/juice-is-becoming-a-design-engine-49an</link>
      <guid>https://dev.to/stinklewinks/juice-is-becoming-a-design-engine-49an</guid>
      <description>&lt;p&gt;I've spent a lot of the Road To KiwiEngine series talking about architecture from thirty thousand feet.&lt;/p&gt;

&lt;p&gt;Systems.&lt;/p&gt;

&lt;p&gt;Abstractions.&lt;/p&gt;

&lt;p&gt;Boundaries.&lt;/p&gt;

&lt;p&gt;Intent.&lt;/p&gt;

&lt;p&gt;Configuration.&lt;/p&gt;

&lt;p&gt;Framework design.&lt;/p&gt;

&lt;p&gt;But KiwiEngine is becoming more of an actual engine because the individual pieces underneath it are becoming more capable.&lt;/p&gt;

&lt;p&gt;So I want to spend the next several posts looking at those pieces individually.&lt;/p&gt;

&lt;p&gt;And there's probably no better place to start than Juice.&lt;/p&gt;

&lt;p&gt;Because Juice is getting very close to version 1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juice Started With A Much Smaller Idea
&lt;/h2&gt;

&lt;p&gt;Juice started because I wanted a better way to handle common styling patterns.&lt;/p&gt;

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

&lt;p&gt;Not invent another enormous styling language.&lt;/p&gt;

&lt;p&gt;Not recreate every CSS property as an attribute.&lt;/p&gt;

&lt;p&gt;I wanted to express common design intentions directly in markup.&lt;/p&gt;

&lt;p&gt;That eventually led to things like:&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;There's a lot happening in a very small statement.&lt;/p&gt;

&lt;p&gt;I'm saying this element contains content.&lt;/p&gt;

&lt;p&gt;I'm saying that content should adapt using a grid.&lt;/p&gt;

&lt;p&gt;And I'm saying that on mobile, I explicitly want that layout to stack.&lt;/p&gt;

&lt;p&gt;But I'm &lt;em&gt;not&lt;/em&gt; describing every CSS declaration required to accomplish it.&lt;/p&gt;

&lt;p&gt;That's Juice's job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent Became The Important Part
&lt;/h2&gt;

&lt;p&gt;The more I developed Juice, the more I realized that its value wasn't really about shortening CSS.&lt;/p&gt;

&lt;p&gt;It was about communicating intent.&lt;/p&gt;

&lt;p&gt;There's a difference between saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Apply these seven CSS properties.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This content is a grid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first describes an implementation.&lt;/p&gt;

&lt;p&gt;The second describes what I'm trying to accomplish.&lt;/p&gt;

&lt;p&gt;That distinction became one of the core ideas behind Juice.&lt;/p&gt;

&lt;p&gt;And it started affecting how I thought about KiwiEngine as a whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Intent Can Become Another Trap
&lt;/h2&gt;

&lt;p&gt;Once I started thinking this way, there was an obvious temptation.&lt;/p&gt;

&lt;p&gt;Add more attributes.&lt;/p&gt;

&lt;p&gt;And more.&lt;/p&gt;

&lt;p&gt;And more.&lt;/p&gt;

&lt;p&gt;Until eventually every CSS property has a Juice equivalent.&lt;/p&gt;

&lt;p&gt;At that point I've accomplished something incredible:&lt;/p&gt;

&lt;p&gt;I've reinvented CSS.&lt;/p&gt;

&lt;p&gt;Except probably worse.&lt;/p&gt;

&lt;p&gt;That's exactly what I don't want.&lt;/p&gt;

&lt;p&gt;Juice needs to know where its responsibility ends.&lt;/p&gt;

&lt;p&gt;If something is already expressive and easy to accomplish with CSS, I don't necessarily need to invent another abstraction for it.&lt;/p&gt;

&lt;p&gt;Juice should handle the common intentions.&lt;/p&gt;

&lt;p&gt;CSS should remain available for everything else.&lt;/p&gt;

&lt;p&gt;That boundary has become part of the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defaults Are Part Of The Product
&lt;/h2&gt;

&lt;p&gt;Responsive design helped clarify this philosophy.&lt;/p&gt;

&lt;p&gt;Take:&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="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I don't necessarily want developers to have to specify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mobile = ...
tablet = ...
laptop = ...
desktop = ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;every single time they create a grid.&lt;/p&gt;

&lt;p&gt;Juice already knows that grids usually need to adapt.&lt;/p&gt;

&lt;p&gt;So it can provide sensible responsive behavior by default.&lt;/p&gt;

&lt;p&gt;Then, when the developer actually wants different behavior, they can express it:&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;That's the relationship I want.&lt;/p&gt;

&lt;p&gt;Good defaults.&lt;/p&gt;

&lt;p&gt;Small intentional overrides.&lt;/p&gt;

&lt;p&gt;Escape hatches when necessary.&lt;/p&gt;

&lt;p&gt;I don't want configuration for the sake of configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Juice Became Configuration-Driven
&lt;/h2&gt;

&lt;p&gt;This was one of the bigger steps forward.&lt;/p&gt;

&lt;p&gt;Juice can now consume project configuration and generate stylesheets from it.&lt;/p&gt;

&lt;p&gt;That changes the relationship between the library and the project.&lt;/p&gt;

&lt;p&gt;Instead of Juice defining the entire visual language, the project can define its own design decisions.&lt;/p&gt;

&lt;p&gt;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;borders&lt;/li&gt;
&lt;li&gt;shadows&lt;/li&gt;
&lt;li&gt;radius&lt;/li&gt;
&lt;li&gt;other design tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juice consumes those decisions and generates the stylesheet needed to support its attribute-based styling system.&lt;/p&gt;

&lt;p&gt;It's effectively becoming a theme generator.&lt;/p&gt;

&lt;p&gt;And I really like that direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Owns The Theme
&lt;/h2&gt;

&lt;p&gt;This is important to me.&lt;/p&gt;

&lt;p&gt;I don't want every application built with KiwiEngine to look like a "KiwiEngine application."&lt;/p&gt;

&lt;p&gt;The framework shouldn't own the brand.&lt;/p&gt;

&lt;p&gt;The project should.&lt;/p&gt;

&lt;p&gt;Blackwater Sound should look like Blackwater Sound.&lt;/p&gt;

&lt;p&gt;A WebStore storefront should reflect the business using it.&lt;/p&gt;

&lt;p&gt;An artist platform should reflect the artist.&lt;/p&gt;

&lt;p&gt;A completely unrelated developer using Juice should be able to create something that looks nothing like anything I've built.&lt;/p&gt;

&lt;p&gt;Juice provides the styling engine.&lt;/p&gt;

&lt;p&gt;The project provides the identity.&lt;/p&gt;

&lt;p&gt;That's a much healthier boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generated CSS Is Still CSS
&lt;/h2&gt;

&lt;p&gt;There's another part of this architecture that I like.&lt;/p&gt;

&lt;p&gt;The output is still stylesheets.&lt;/p&gt;

&lt;p&gt;I'm not trying to create an alternate universe where the browser suddenly doesn't use CSS.&lt;/p&gt;

&lt;p&gt;Juice can consume configuration.&lt;/p&gt;

&lt;p&gt;It can understand its attributes.&lt;/p&gt;

&lt;p&gt;It can generate the appropriate styling.&lt;/p&gt;

&lt;p&gt;But eventually we're still speaking the language the browser understands.&lt;/p&gt;

&lt;p&gt;That matters because Juice can't be everything.&lt;/p&gt;

&lt;p&gt;And it shouldn't be.&lt;/p&gt;

&lt;p&gt;If a project needs custom CSS, write CSS.&lt;/p&gt;

&lt;p&gt;If something doesn't belong in Juice, don't force it into Juice.&lt;/p&gt;

&lt;p&gt;The abstraction should help until it stops helping.&lt;/p&gt;

&lt;p&gt;Then it should get out of the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Starting To Feel Like An Engine
&lt;/h2&gt;

&lt;p&gt;This is why I'm beginning to think about Juice differently.&lt;/p&gt;

&lt;p&gt;Originally, it was a styling library.&lt;/p&gt;

&lt;p&gt;That's still technically true.&lt;/p&gt;

&lt;p&gt;But increasingly, it behaves like a small design engine.&lt;/p&gt;

&lt;p&gt;It has inputs.&lt;/p&gt;

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

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

&lt;p&gt;Intent expressed through attributes.&lt;/p&gt;

&lt;p&gt;It has rules.&lt;/p&gt;

&lt;p&gt;Defaults.&lt;/p&gt;

&lt;p&gt;Responsive behavior.&lt;/p&gt;

&lt;p&gt;Attribute semantics.&lt;/p&gt;

&lt;p&gt;And it produces output.&lt;/p&gt;

&lt;p&gt;Stylesheets.&lt;/p&gt;

&lt;p&gt;Consistent styling behavior.&lt;/p&gt;

&lt;p&gt;A design language that can be reused throughout an application.&lt;/p&gt;

&lt;p&gt;That's more interesting to me than simply having a collection of CSS utilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1 Is About Knowing What Juice Is
&lt;/h2&gt;

&lt;p&gt;This connects back to what I wrote recently about Juice approaching version 1.0.&lt;/p&gt;

&lt;p&gt;I don't think 1.0 means Juice has every feature I could possibly imagine.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;Getting closer to 1.0 has made me more comfortable saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No, Juice doesn't need that.&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;p&gt;The goal is a clear responsibility.&lt;/p&gt;

&lt;p&gt;I want to be able to explain what Juice does.&lt;/p&gt;

&lt;p&gt;I want developers to understand its vocabulary.&lt;/p&gt;

&lt;p&gt;I want its defaults to be predictable.&lt;/p&gt;

&lt;p&gt;I want its configuration to make sense.&lt;/p&gt;

&lt;p&gt;And I want its boundaries to remain visible.&lt;/p&gt;

&lt;p&gt;If I can accomplish those things, Juice doesn't need to solve every styling problem.&lt;/p&gt;

&lt;p&gt;It just needs to solve &lt;em&gt;its&lt;/em&gt; styling problems well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Libraries Becoming Engines
&lt;/h2&gt;

&lt;p&gt;This is part of a larger change happening inside KiwiEngine.&lt;/p&gt;

&lt;p&gt;The individual libraries are no longer just experiments asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I built this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They're developing philosophies.&lt;/p&gt;

&lt;p&gt;Boundaries.&lt;/p&gt;

&lt;p&gt;Configuration.&lt;/p&gt;

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

&lt;p&gt;Relationships with other parts of the ecosystem.&lt;/p&gt;

&lt;p&gt;That's what makes WebEngine increasingly capable of behaving like an engine.&lt;/p&gt;

&lt;p&gt;Not because I created one enormous framework that does everything.&lt;/p&gt;

&lt;p&gt;But because the smaller systems underneath it are becoming dependable enough to compose.&lt;/p&gt;

&lt;p&gt;Juice is one of the first pieces reaching that point.&lt;/p&gt;

&lt;p&gt;And after all the experimentation, redesigning, questioning, and real-world use, I think I finally know what it wants to be.&lt;/p&gt;

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

&lt;p&gt;It isn't trying to become another utility framework.&lt;/p&gt;

&lt;p&gt;And it isn't trying to own the visual identity of an application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Juice is becoming the design engine that translates project intent into styling behavior.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a much more interesting foundation to build on.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Engine Is Finally Becoming an Engine</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Sat, 26 Sep 2026 16:30:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/the-engine-is-finally-becoming-an-engine-28k6</link>
      <guid>https://dev.to/stinklewinks/the-engine-is-finally-becoming-an-engine-28k6</guid>
      <description>&lt;p&gt;There's a strange moment in framework development when the individual pieces start becoming something larger.&lt;/p&gt;

&lt;p&gt;You spend months building libraries.&lt;/p&gt;

&lt;p&gt;You design APIs.&lt;/p&gt;

&lt;p&gt;You work on configuration.&lt;/p&gt;

&lt;p&gt;You improve routing.&lt;/p&gt;

&lt;p&gt;You experiment with styling.&lt;/p&gt;

&lt;p&gt;You rethink abstractions.&lt;/p&gt;

&lt;p&gt;Then one day, you start connecting everything and realize you're no longer just building a collection of tools.&lt;/p&gt;

&lt;p&gt;You're building an engine.&lt;/p&gt;

&lt;p&gt;That's where KiwiEngine is starting to feel like it is now.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Collection of Libraries Isn't an Engine
&lt;/h2&gt;

&lt;p&gt;I've spent a lot of time thinking about the responsibilities of individual KiwiEngine components.&lt;/p&gt;

&lt;p&gt;Juice handles attribute-driven styling.&lt;/p&gt;

&lt;p&gt;Nectarine provides configuration-related capabilities.&lt;/p&gt;

&lt;p&gt;Seltzer addresses HTTP.&lt;/p&gt;

&lt;p&gt;Sig provides reactive capabilities.&lt;/p&gt;

&lt;p&gt;Other parts of the ecosystem address data, infrastructure, and application concerns.&lt;/p&gt;

&lt;p&gt;Each piece has its own reason to exist.&lt;/p&gt;

&lt;p&gt;But having several useful libraries doesn't automatically create a useful engine.&lt;/p&gt;

&lt;p&gt;The real question is how those pieces work together.&lt;/p&gt;

&lt;p&gt;Can they share conventions?&lt;/p&gt;

&lt;p&gt;Can they communicate without becoming tightly coupled?&lt;/p&gt;

&lt;p&gt;Can they be assembled into applications without forcing developers to understand every implementation detail?&lt;/p&gt;

&lt;p&gt;Can they remain independently useful?&lt;/p&gt;

&lt;p&gt;That's where architecture starts becoming more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebEngine Is Where the Pieces Meet
&lt;/h2&gt;

&lt;p&gt;WebEngine is becoming the place where these ideas come together.&lt;/p&gt;

&lt;p&gt;Instead of every application having to figure out how the libraries should interact, the engine can establish common lifecycle and integration patterns.&lt;/p&gt;

&lt;p&gt;That doesn't mean every library loses its independence.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;I want each component to retain a clear responsibility.&lt;/p&gt;

&lt;p&gt;The engine should coordinate those responsibilities.&lt;/p&gt;

&lt;p&gt;Not absorb them.&lt;/p&gt;

&lt;p&gt;That distinction has become increasingly important to me.&lt;/p&gt;

&lt;p&gt;A library solves a particular problem.&lt;/p&gt;

&lt;p&gt;An engine coordinates the systems needed to operate an application.&lt;/p&gt;

&lt;p&gt;An application gives those systems a purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engine Should Understand the Process
&lt;/h2&gt;

&lt;p&gt;Think about what happens when an application starts.&lt;/p&gt;

&lt;p&gt;Configuration needs to be understood.&lt;/p&gt;

&lt;p&gt;Dependencies need to be established.&lt;/p&gt;

&lt;p&gt;Routes need to be registered.&lt;/p&gt;

&lt;p&gt;Services need to be prepared.&lt;/p&gt;

&lt;p&gt;The application needs to become ready to handle work.&lt;/p&gt;

&lt;p&gt;And eventually, it needs to shut down cleanly.&lt;/p&gt;

&lt;p&gt;These aren't isolated features.&lt;/p&gt;

&lt;p&gt;They're parts of a lifecycle.&lt;/p&gt;

&lt;p&gt;Once you begin treating them as a coordinated process, the architecture starts feeling different.&lt;/p&gt;

&lt;p&gt;Instead of asking every library to solve the entire problem, the engine can establish when and how each piece participates.&lt;/p&gt;

&lt;p&gt;That's a more sustainable direction than turning everything into one enormous framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundaries Make Composition Possible
&lt;/h2&gt;

&lt;p&gt;One of the recurring lessons from this series has been that abstractions need boundaries.&lt;/p&gt;

&lt;p&gt;Juice shouldn't replace CSS.&lt;/p&gt;

&lt;p&gt;An HTTP library shouldn't own the application's business logic.&lt;/p&gt;

&lt;p&gt;A configuration system shouldn't decide what the application is supposed to accomplish.&lt;/p&gt;

&lt;p&gt;An infrastructure tool shouldn't dictate the user experience.&lt;/p&gt;

&lt;p&gt;Each component needs enough responsibility to be useful without becoming responsible for everything.&lt;/p&gt;

&lt;p&gt;WebEngine is where those boundaries become practical.&lt;/p&gt;

&lt;p&gt;If the pieces are designed well, they can work together without losing their identities.&lt;/p&gt;

&lt;p&gt;That's what I want KiwiEngine to accomplish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI Is Part of the Experience
&lt;/h2&gt;

&lt;p&gt;Another piece of this is the developer experience around creating projects.&lt;/p&gt;

&lt;p&gt;I don't want starting a new KiwiEngine application to mean manually assembling a dozen unrelated components.&lt;/p&gt;

&lt;p&gt;There should be a clear path from an idea to a working project.&lt;/p&gt;

&lt;p&gt;The Kiwi CLI can help establish that path.&lt;/p&gt;

&lt;p&gt;Creating a project.&lt;/p&gt;

&lt;p&gt;Adding capabilities.&lt;/p&gt;

&lt;p&gt;Assembling applications.&lt;/p&gt;

&lt;p&gt;Applying conventions.&lt;/p&gt;

&lt;p&gt;Reducing repetitive setup.&lt;/p&gt;

&lt;p&gt;The goal isn't to hide how everything works.&lt;/p&gt;

&lt;p&gt;It's to make the common path easier.&lt;/p&gt;

&lt;p&gt;Developers should be able to understand the system without having to rebuild the system every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Changes How I Think About New Projects
&lt;/h2&gt;

&lt;p&gt;The practical benefit becomes obvious when I think about the things I want to build.&lt;/p&gt;

&lt;p&gt;A Blackwater Sound application.&lt;/p&gt;

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

&lt;p&gt;An artist platform.&lt;/p&gt;

&lt;p&gt;A publishing system.&lt;/p&gt;

&lt;p&gt;An internal workshop tool.&lt;/p&gt;

&lt;p&gt;Those applications have different purposes.&lt;/p&gt;

&lt;p&gt;But they don't need completely unrelated foundations.&lt;/p&gt;

&lt;p&gt;They can share the same underlying architecture while expressing their own domains.&lt;/p&gt;

&lt;p&gt;That's what I want WebEngine to enable.&lt;/p&gt;

&lt;p&gt;Not identical applications.&lt;/p&gt;

&lt;p&gt;Different applications built on dependable shared infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Framework Should Eventually Become Predictable
&lt;/h2&gt;

&lt;p&gt;There's something satisfying about reaching a point where the architecture starts answering questions before I have to ask them.&lt;/p&gt;

&lt;p&gt;Where should this responsibility live?&lt;/p&gt;

&lt;p&gt;How should configuration be consumed?&lt;/p&gt;

&lt;p&gt;How does this component participate in the lifecycle?&lt;/p&gt;

&lt;p&gt;How should a new application be assembled?&lt;/p&gt;

&lt;p&gt;The answers don't need to be identical for every situation.&lt;/p&gt;

&lt;p&gt;But the system should establish enough consistency that developers aren't constantly inventing new conventions.&lt;/p&gt;

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

&lt;p&gt;Confidence makes experimentation easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engine Is Not the Destination
&lt;/h2&gt;

&lt;p&gt;This is the part that connects to the previous posts.&lt;/p&gt;

&lt;p&gt;I'm not building WebEngine because I want to spend the rest of my life maintaining a web framework.&lt;/p&gt;

&lt;p&gt;I'm building it because I want a dependable foundation for the things I actually want to create.&lt;/p&gt;

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

&lt;p&gt;Stores.&lt;/p&gt;

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

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

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

&lt;p&gt;Applications supporting physical products.&lt;/p&gt;

&lt;p&gt;The engine should make those projects easier to pursue.&lt;/p&gt;

&lt;p&gt;And the more its pieces mature, the closer I get to spending my time on those projects instead of rebuilding their foundations.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's Starting to Feel Real
&lt;/h2&gt;

&lt;p&gt;There's still work to do.&lt;/p&gt;

&lt;p&gt;There are still things to refine.&lt;/p&gt;

&lt;p&gt;There will always be improvements.&lt;/p&gt;

&lt;p&gt;But the nature of the work is changing.&lt;/p&gt;

&lt;p&gt;I'm spending less time asking what every individual library might become.&lt;/p&gt;

&lt;p&gt;I'm spending more time thinking about how the ecosystem operates as a whole.&lt;/p&gt;

&lt;p&gt;That's an exciting milestone.&lt;/p&gt;

&lt;p&gt;Because KiwiEngine is finally starting to feel less like a collection of experiments.&lt;/p&gt;

&lt;p&gt;And more like the engine I've been trying to build all along.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Difference Between Delegating Code and Delegating Decisions</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Fri, 25 Sep 2026 17:34:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/the-difference-between-delegating-code-and-delegating-decisions-1nhh</link>
      <guid>https://dev.to/stinklewinks/the-difference-between-delegating-code-and-delegating-decisions-1nhh</guid>
      <description>&lt;p&gt;In my last post, I talked about why AI has become part of my workforce.&lt;/p&gt;

&lt;p&gt;I have too many things I want to build and not enough hours to personally implement every little detail.&lt;/p&gt;

&lt;p&gt;But there's an important distinction I want to explore.&lt;/p&gt;

&lt;p&gt;Delegating code and delegating decisions are not the same thing.&lt;/p&gt;

&lt;p&gt;And I think understanding that difference is going to become increasingly important as AI-assisted development becomes more common.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing Code Is Only Part of Engineering
&lt;/h2&gt;

&lt;p&gt;When people talk about AI writing code, the conversation often centers on whether the generated code works.&lt;/p&gt;

&lt;p&gt;Does it compile?&lt;/p&gt;

&lt;p&gt;Do the tests pass?&lt;/p&gt;

&lt;p&gt;Does the application run?&lt;/p&gt;

&lt;p&gt;Those are important questions.&lt;/p&gt;

&lt;p&gt;But they're not the only questions.&lt;/p&gt;

&lt;p&gt;Software engineering involves deciding what should exist in the first place.&lt;/p&gt;

&lt;p&gt;What belongs in a library?&lt;/p&gt;

&lt;p&gt;What belongs in an application?&lt;/p&gt;

&lt;p&gt;What should be configurable?&lt;/p&gt;

&lt;p&gt;What should be opinionated?&lt;/p&gt;

&lt;p&gt;What responsibilities should a component own?&lt;/p&gt;

&lt;p&gt;What dependencies should it introduce?&lt;/p&gt;

&lt;p&gt;What happens when requirements change?&lt;/p&gt;

&lt;p&gt;Those decisions shape the system long before implementation begins.&lt;/p&gt;

&lt;p&gt;And those are the decisions I'm not interested in blindly delegating.&lt;/p&gt;

&lt;h2&gt;
  
  
  KiwiEngine Has An Architectural Philosophy
&lt;/h2&gt;

&lt;p&gt;Take Juice as an example.&lt;/p&gt;

&lt;p&gt;One of my goals is to avoid recreating CSS.&lt;/p&gt;

&lt;p&gt;I want Juice to provide a small vocabulary for expressing common design intentions while allowing CSS to remain CSS.&lt;/p&gt;

&lt;p&gt;Something like:&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;communicates an intention.&lt;/p&gt;

&lt;p&gt;It doesn't need to expose every possible responsive layout option.&lt;/p&gt;

&lt;p&gt;Now imagine I ask AI to implement additional responsive functionality.&lt;/p&gt;

&lt;p&gt;It might produce something that works perfectly well.&lt;/p&gt;

&lt;p&gt;But what if it introduces twenty new attributes?&lt;/p&gt;

&lt;p&gt;What if it creates a completely different configuration pattern?&lt;/p&gt;

&lt;p&gt;What if it solves the immediate problem by making Juice responsible for something that should belong to CSS?&lt;/p&gt;

&lt;p&gt;The implementation might work.&lt;/p&gt;

&lt;p&gt;But it would violate the architecture.&lt;/p&gt;

&lt;p&gt;That's why the distinction matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architect Defines The Boundaries
&lt;/h2&gt;

&lt;p&gt;My preferred workflow starts with understanding the problem.&lt;/p&gt;

&lt;p&gt;Before delegating implementation, I want to establish:&lt;/p&gt;

&lt;p&gt;What problem are we solving?&lt;/p&gt;

&lt;p&gt;Where does the solution belong?&lt;/p&gt;

&lt;p&gt;What existing patterns should it follow?&lt;/p&gt;

&lt;p&gt;What should remain outside its responsibility?&lt;/p&gt;

&lt;p&gt;How will we know the implementation is correct?&lt;/p&gt;

&lt;p&gt;Once those decisions are established, AI becomes incredibly useful.&lt;/p&gt;

&lt;p&gt;It can implement an established pattern.&lt;/p&gt;

&lt;p&gt;It can help create tests.&lt;/p&gt;

&lt;p&gt;It can identify repetitive work.&lt;/p&gt;

&lt;p&gt;It can help document the behavior.&lt;/p&gt;

&lt;p&gt;It can examine edge cases I may have overlooked.&lt;/p&gt;

&lt;p&gt;But it isn't automatically authorized to redefine the system.&lt;/p&gt;

&lt;p&gt;That's a separate decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  No Ghost Code
&lt;/h2&gt;

&lt;p&gt;I've been very deliberate about this boundary while working on KiwiEngine.&lt;/p&gt;

&lt;p&gt;AI doesn't get independent authority to commit code.&lt;/p&gt;

&lt;p&gt;It doesn't get to rewrite architecture without approval.&lt;/p&gt;

&lt;p&gt;It doesn't get to introduce dependencies simply because they're convenient.&lt;/p&gt;

&lt;p&gt;And it doesn't get to silently make changes that I haven't authorized.&lt;/p&gt;

&lt;p&gt;If a proposed implementation requires changing the architecture, that's a conversation.&lt;/p&gt;

&lt;p&gt;Not an automatic next step.&lt;/p&gt;

&lt;p&gt;I want to know what changed.&lt;/p&gt;

&lt;p&gt;I want to know why it changed.&lt;/p&gt;

&lt;p&gt;And I want to understand what I'm approving.&lt;/p&gt;

&lt;p&gt;That doesn't mean I need to personally type every line.&lt;/p&gt;

&lt;p&gt;It means I remain responsible for the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Can Challenge My Decisions
&lt;/h2&gt;

&lt;p&gt;There's another important distinction here.&lt;/p&gt;

&lt;p&gt;Retaining architectural authority doesn't mean refusing to listen.&lt;/p&gt;

&lt;p&gt;I actually want AI to challenge my assumptions.&lt;/p&gt;

&lt;p&gt;If there's a simpler implementation, show me.&lt;/p&gt;

&lt;p&gt;If an abstraction introduces unnecessary complexity, explain why.&lt;/p&gt;

&lt;p&gt;If an API creates a maintenance problem, point it out.&lt;/p&gt;

&lt;p&gt;If my proposed design has an obvious weakness, I want to know.&lt;/p&gt;

&lt;p&gt;But there's a difference between presenting an alternative and silently implementing it.&lt;/p&gt;

&lt;p&gt;I can consider the recommendation.&lt;/p&gt;

&lt;p&gt;I can compare the tradeoffs.&lt;/p&gt;

&lt;p&gt;I can change my mind.&lt;/p&gt;

&lt;p&gt;That's still engineering.&lt;/p&gt;

&lt;p&gt;The important part is that the decision remains deliberate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review Is More Than Reading A Diff
&lt;/h2&gt;

&lt;p&gt;As AI becomes more capable, I think reviewing generated code needs to become more sophisticated.&lt;/p&gt;

&lt;p&gt;A diff can tell me what changed.&lt;/p&gt;

&lt;p&gt;It doesn't necessarily tell me whether the change belongs.&lt;/p&gt;

&lt;p&gt;I need to understand the behavior.&lt;/p&gt;

&lt;p&gt;I need to understand the dependencies.&lt;/p&gt;

&lt;p&gt;I need to understand the architectural consequences.&lt;/p&gt;

&lt;p&gt;I need to know whether the implementation follows established conventions.&lt;/p&gt;

&lt;p&gt;I need to know whether the tests actually validate the intended behavior.&lt;/p&gt;

&lt;p&gt;And I need to know whether the solution creates more complexity than the problem requires.&lt;/p&gt;

&lt;p&gt;A passing test suite is valuable.&lt;/p&gt;

&lt;p&gt;It isn't a substitute for understanding the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delegation Is A Skill
&lt;/h2&gt;

&lt;p&gt;One thing I'm discovering is that using AI effectively requires becoming better at communicating engineering intent.&lt;/p&gt;

&lt;p&gt;Vague instructions produce more room for assumptions.&lt;/p&gt;

&lt;p&gt;Clear boundaries produce work that's easier to evaluate.&lt;/p&gt;

&lt;p&gt;Instead of simply saying:&lt;/p&gt;

&lt;p&gt;"Add a theme system."&lt;/p&gt;

&lt;p&gt;I can explain that Juice consumes project configuration and generates stylesheets for its attribute-based styling system.&lt;/p&gt;

&lt;p&gt;The project owns its design decisions.&lt;/p&gt;

&lt;p&gt;Juice translates those decisions into reusable styling behavior.&lt;/p&gt;

&lt;p&gt;CSS remains available for everything outside that scope.&lt;/p&gt;

&lt;p&gt;Now the implementation has a direction.&lt;/p&gt;

&lt;p&gt;That's a much better starting point.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Still Want To Be An Engineer
&lt;/h2&gt;

&lt;p&gt;Using AI doesn't mean I want to stop learning.&lt;/p&gt;

&lt;p&gt;I still want to understand software architecture.&lt;/p&gt;

&lt;p&gt;I still want to improve my programming ability.&lt;/p&gt;

&lt;p&gt;I still want to understand electronics, DSP, embedded systems, and the technologies behind the things I'm building.&lt;/p&gt;

&lt;p&gt;But I don't need to personally perform every repetitive task to prove that I understand my work.&lt;/p&gt;

&lt;p&gt;I can learn deeply while delegating appropriately.&lt;/p&gt;

&lt;p&gt;Those ideas aren't mutually exclusive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Matters
&lt;/h2&gt;

&lt;p&gt;I don't want AI to replace my judgment.&lt;/p&gt;

&lt;p&gt;I want it to extend my capacity.&lt;/p&gt;

&lt;p&gt;I want to spend more time designing systems, solving interesting problems, making music, building electronics, and creating things that matter to me.&lt;/p&gt;

&lt;p&gt;And I want the code supporting those ambitions to remain understandable and intentional.&lt;/p&gt;

&lt;p&gt;That's the relationship I'm trying to build.&lt;/p&gt;

&lt;p&gt;Delegate implementation where it makes sense. Retain responsibility for the decisions.&lt;/p&gt;

&lt;p&gt;AI can help me build KiwiEngine.&lt;/p&gt;

&lt;p&gt;But it doesn't get to decide what KiwiEngine is.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Is My Workforce, Not My Replacement</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Fri, 25 Sep 2026 02:30:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/ai-is-my-workforce-not-my-replacement-3045</link>
      <guid>https://dev.to/stinklewinks/ai-is-my-workforce-not-my-replacement-3045</guid>
      <description>&lt;p&gt;I've come to a realization.&lt;/p&gt;

&lt;p&gt;I have to use AI as part of my workforce.&lt;/p&gt;

&lt;p&gt;Not because I can't code.&lt;/p&gt;

&lt;p&gt;Not because I don't understand what I'm building.&lt;/p&gt;

&lt;p&gt;And certainly not because I want to surrender my projects to a machine.&lt;/p&gt;

&lt;p&gt;I need to make progress.&lt;/p&gt;

&lt;p&gt;I have a lot of things I want to build, and unfortunately, I still only have 24 hours in a day.&lt;/p&gt;

&lt;p&gt;KiwiEngine.&lt;/p&gt;

&lt;p&gt;Blackwater Sound.&lt;/p&gt;

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

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

&lt;p&gt;Stores.&lt;/p&gt;

&lt;p&gt;Guitar pedals.&lt;/p&gt;

&lt;p&gt;Amplifiers.&lt;/p&gt;

&lt;p&gt;Electronics.&lt;/p&gt;

&lt;p&gt;Games.&lt;/p&gt;

&lt;p&gt;Writing.&lt;/p&gt;

&lt;p&gt;Teaching.&lt;/p&gt;

&lt;p&gt;And that's before we get into actually making music.&lt;/p&gt;

&lt;p&gt;I can either spend the next several years trying to do every little thing myself, or I can use the tools available to me to start bringing these ideas to life.&lt;/p&gt;

&lt;p&gt;I've made my decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Don't Have The Luxury Of Being A Purist
&lt;/h2&gt;

&lt;p&gt;There's a perspective in software development that I understand and respect.&lt;/p&gt;

&lt;p&gt;Learn your tools.&lt;/p&gt;

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

&lt;p&gt;Write your own code.&lt;/p&gt;

&lt;p&gt;Master your specialty.&lt;/p&gt;

&lt;p&gt;Become exceptionally good at what you do.&lt;/p&gt;

&lt;p&gt;There's nothing wrong with that.&lt;/p&gt;

&lt;p&gt;But I think we sometimes make the mistake of treating one approach to professional development as though it's prescribed to everyone.&lt;/p&gt;

&lt;p&gt;Not everyone is trying to accomplish the same thing.&lt;/p&gt;

&lt;p&gt;Some developers want to specialize deeply in a particular area of engineering.&lt;/p&gt;

&lt;p&gt;Some want to work for established companies.&lt;/p&gt;

&lt;p&gt;Some want to become experts in a particular language, framework, or discipline.&lt;/p&gt;

&lt;p&gt;Those are legitimate goals.&lt;/p&gt;

&lt;p&gt;But they're not necessarily mine.&lt;/p&gt;

&lt;p&gt;I'm a builder.&lt;/p&gt;

&lt;p&gt;I have a vision for things that extend well beyond software development.&lt;/p&gt;

&lt;p&gt;Software is one of the tools I use to bring those things into existence.&lt;/p&gt;

&lt;p&gt;And if I'm spending all my time proving that I can personally implement every line of code, I'm not necessarily getting closer to those goals.&lt;/p&gt;

&lt;p&gt;I'm just getting better at doing everything myself.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  I Can Put My Code Where My Thoughts Are
&lt;/h2&gt;

&lt;p&gt;One thing I've learned about myself is that I'm a big thinker.&lt;/p&gt;

&lt;p&gt;I see systems.&lt;/p&gt;

&lt;p&gt;I see how things connect.&lt;/p&gt;

&lt;p&gt;I see how one piece of infrastructure can support five different projects.&lt;/p&gt;

&lt;p&gt;I can look at a music business, a software platform, a storefront, and an electronics workshop and start imagining how they could operate together.&lt;/p&gt;

&lt;p&gt;And for the most part, I can put my code where my thoughts are.&lt;/p&gt;

&lt;p&gt;I've been doing that with KiwiEngine.&lt;/p&gt;

&lt;p&gt;The problem isn't that I don't know how to build things.&lt;/p&gt;

&lt;p&gt;The problem is that I can't personally implement every idea at the speed I can envision it.&lt;/p&gt;

&lt;p&gt;There are only so many hours available.&lt;/p&gt;

&lt;p&gt;And I don't have an entire engineering department sitting behind me.&lt;/p&gt;

&lt;p&gt;So why wouldn't I use technology that helps me extend my capacity?&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Doesn't Design My Vision
&lt;/h2&gt;

&lt;p&gt;This is where I think an important distinction needs to be made.&lt;/p&gt;

&lt;p&gt;I don't hand AI a vague idea and tell it to go build my company.&lt;/p&gt;

&lt;p&gt;I design the systems.&lt;/p&gt;

&lt;p&gt;I establish the architecture.&lt;/p&gt;

&lt;p&gt;I determine the responsibilities of the libraries.&lt;/p&gt;

&lt;p&gt;I make decisions about how the pieces interact.&lt;/p&gt;

&lt;p&gt;I write and develop the foundations.&lt;/p&gt;

&lt;p&gt;Then I use AI to help with implementation, repetitive work, documentation, tests, and other tasks that would otherwise consume significant amounts of time.&lt;/p&gt;

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

&lt;p&gt;And delegation doesn't eliminate responsibility.&lt;/p&gt;

&lt;p&gt;If anything, it makes responsibility more important.&lt;/p&gt;

&lt;p&gt;Because now I have to understand not only what I'm building, but what I'm approving.&lt;/p&gt;

&lt;h2&gt;
  
  
  No Ghost Code
&lt;/h2&gt;

&lt;p&gt;I have a very deliberate boundary when it comes to AI working on KiwiEngine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI does not have independent authority to commit code, change architectural direction, or make decisions on my behalf.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It doesn't get to decide that a library should be rewritten.&lt;/p&gt;

&lt;p&gt;It doesn't get to introduce dependencies because it thinks they're convenient.&lt;/p&gt;

&lt;p&gt;It doesn't get to change the design philosophy because another approach is more conventional.&lt;/p&gt;

&lt;p&gt;And it doesn't get to silently commit code I haven't approved.&lt;/p&gt;

&lt;p&gt;There is no ghost code.&lt;/p&gt;

&lt;p&gt;If AI is going to take an action that changes the project, it needs my explicit authorization.&lt;/p&gt;

&lt;p&gt;I review the work.&lt;/p&gt;

&lt;p&gt;I approve the direction.&lt;/p&gt;

&lt;p&gt;I remain responsible for the result.&lt;/p&gt;

&lt;p&gt;AI can be part of my workforce without becoming the owner of my work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grunt Work Is Still Work
&lt;/h2&gt;

&lt;p&gt;Here's something I think gets lost in conversations about AI-assisted development.&lt;/p&gt;

&lt;p&gt;Not every programming task requires the same level of creative investment.&lt;/p&gt;

&lt;p&gt;Some tasks are genuinely interesting architectural problems.&lt;/p&gt;

&lt;p&gt;Others are repetitive implementation work.&lt;/p&gt;

&lt;p&gt;Writing another adapter.&lt;/p&gt;

&lt;p&gt;Creating another set of tests.&lt;/p&gt;

&lt;p&gt;Updating documentation.&lt;/p&gt;

&lt;p&gt;Implementing a pattern that's already established elsewhere in the project.&lt;/p&gt;

&lt;p&gt;Working through boilerplate.&lt;/p&gt;

&lt;p&gt;Those things matter.&lt;/p&gt;

&lt;p&gt;They still need to be done correctly.&lt;/p&gt;

&lt;p&gt;But they don't all require me to spend hours personally typing every character.&lt;/p&gt;

&lt;p&gt;If I've already established how a system should work, why wouldn't I use a tool to help implement that established pattern?&lt;/p&gt;

&lt;p&gt;My time is better spent reviewing the result, improving the architecture, and moving on to the next problem.&lt;/p&gt;

&lt;p&gt;That's not avoiding engineering.&lt;/p&gt;

&lt;p&gt;That's managing engineering work.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Doesn't Eliminate The Need To Understand Your Code
&lt;/h2&gt;

&lt;p&gt;There's a difference between using AI to extend your abilities and using it to avoid developing them.&lt;/p&gt;

&lt;p&gt;I don't believe AI should become an excuse to stop learning.&lt;/p&gt;

&lt;p&gt;If I don't understand a change, I shouldn't approve it.&lt;/p&gt;

&lt;p&gt;If I can't explain why something belongs in the architecture, it probably doesn't belong there yet.&lt;/p&gt;

&lt;p&gt;If AI generates code that violates the design principles of KiwiEngine, that code doesn't get a pass simply because it works.&lt;/p&gt;

&lt;p&gt;Working code isn't automatically good architecture.&lt;/p&gt;

&lt;p&gt;And generated code isn't automatically correct.&lt;/p&gt;

&lt;p&gt;AI can make mistakes.&lt;/p&gt;

&lt;p&gt;It can misunderstand requirements.&lt;/p&gt;

&lt;p&gt;It can introduce unnecessary complexity.&lt;/p&gt;

&lt;p&gt;It can confidently implement something that doesn't fit the rest of the system.&lt;/p&gt;

&lt;p&gt;That's why oversight matters.&lt;/p&gt;

&lt;p&gt;I want AI helping me move faster, not helping me accumulate problems faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm Not Trying To Win A Coding Endurance Competition
&lt;/h2&gt;

&lt;p&gt;This is the part I've been thinking about the most.&lt;/p&gt;

&lt;p&gt;What exactly am I proving by doing everything manually?&lt;/p&gt;

&lt;p&gt;That I can work longer?&lt;/p&gt;

&lt;p&gt;That I can memorize more syntax?&lt;/p&gt;

&lt;p&gt;That I can rebuild the same implementation for the fifteenth time?&lt;/p&gt;

&lt;p&gt;I already know I can build software.&lt;/p&gt;

&lt;p&gt;I want to use that ability to accomplish something.&lt;/p&gt;

&lt;p&gt;I want to create tools for musicians.&lt;/p&gt;

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

&lt;p&gt;I want to develop physical products.&lt;/p&gt;

&lt;p&gt;I want to experiment with electronics.&lt;/p&gt;

&lt;p&gt;I want to build businesses around things I genuinely enjoy.&lt;/p&gt;

&lt;p&gt;I want to spend more time creating cool things and less time getting bogged down in technical work simply for the sake of purity.&lt;/p&gt;

&lt;p&gt;If AI can help me accomplish that while I retain ownership and oversight, I'm going to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  KiwiEngine Is Supposed To Create Leverage
&lt;/h2&gt;

&lt;p&gt;This is actually very consistent with why I'm building KiwiEngine in the first place.&lt;/p&gt;

&lt;p&gt;The whole point of a reusable framework is to avoid solving the same problems repeatedly.&lt;/p&gt;

&lt;p&gt;Juice helps me avoid recreating common styling behavior.&lt;/p&gt;

&lt;p&gt;Nectarine helps establish reusable configuration patterns.&lt;/p&gt;

&lt;p&gt;Other libraries and engines provide foundations I can build upon.&lt;/p&gt;

&lt;p&gt;AI fits into that philosophy as another form of leverage.&lt;/p&gt;

&lt;p&gt;KiwiEngine reduces the amount of infrastructure I need to rebuild.&lt;/p&gt;

&lt;p&gt;AI reduces the amount of implementation work I need to personally perform.&lt;/p&gt;

&lt;p&gt;Together, they allow me to spend more time on the problems that are unique to what I'm creating.&lt;/p&gt;

&lt;p&gt;And that's the entire point.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Want To Build Things, Not Just Talk About Building Them
&lt;/h2&gt;

&lt;p&gt;I have enough ideas to keep myself busy for several lifetimes.&lt;/p&gt;

&lt;p&gt;What I don't have is several lifetimes.&lt;/p&gt;

&lt;p&gt;I have this one.&lt;/p&gt;

&lt;p&gt;And I would rather spend it bringing as many meaningful ideas into reality as I reasonably can.&lt;/p&gt;

&lt;p&gt;I'm not interested in pretending that using AI somehow makes those ideas less mine.&lt;/p&gt;

&lt;p&gt;The architecture is mine.&lt;/p&gt;

&lt;p&gt;The decisions are mine.&lt;/p&gt;

&lt;p&gt;The responsibility is mine.&lt;/p&gt;

&lt;p&gt;The vision is mine.&lt;/p&gt;

&lt;p&gt;The tools help me execute it.&lt;/p&gt;

&lt;p&gt;That's how I see AI.&lt;/p&gt;

&lt;p&gt;Not as a replacement for my abilities.&lt;/p&gt;

&lt;p&gt;Not as an excuse to abandon craftsmanship.&lt;/p&gt;

&lt;p&gt;And not as an autonomous authority over my projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's part of my workforce.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I intend to use it that way.&lt;/p&gt;

&lt;p&gt;The future isn't something I'm waiting around for.&lt;/p&gt;

&lt;p&gt;It's already here.&lt;/p&gt;

&lt;p&gt;And I have things to build.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Best Framework Gives You Your Time Back</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Wed, 23 Sep 2026 17:15:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/the-best-framework-gives-you-your-time-back-i3d</link>
      <guid>https://dev.to/stinklewinks/the-best-framework-gives-you-your-time-back-i3d</guid>
      <description>&lt;p&gt;Frameworks are supposed to save time.&lt;/p&gt;

&lt;p&gt;That's an obvious statement.&lt;/p&gt;

&lt;p&gt;But I think there's a deeper version of it.&lt;/p&gt;

&lt;p&gt;A good framework doesn't just help you write today's application faster.&lt;/p&gt;

&lt;p&gt;It prevents tomorrow's application from making you solve yesterday's problems again.&lt;/p&gt;

&lt;p&gt;That's becoming one of the biggest reasons I'm building KiwiEngine.&lt;/p&gt;

&lt;h2&gt;
  
  
  I've Already Solved This Problem
&lt;/h2&gt;

&lt;p&gt;Every new project starts with excitement.&lt;/p&gt;

&lt;p&gt;Then comes the familiar work.&lt;/p&gt;

&lt;p&gt;Configuration.&lt;/p&gt;

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

&lt;p&gt;HTTP.&lt;/p&gt;

&lt;p&gt;Styling.&lt;/p&gt;

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

&lt;p&gt;Deployment.&lt;/p&gt;

&lt;p&gt;Infrastructure.&lt;/p&gt;

&lt;p&gt;Project structure.&lt;/p&gt;

&lt;p&gt;All necessary.&lt;/p&gt;

&lt;p&gt;But after you've built enough applications, something starts feeling strange.&lt;/p&gt;

&lt;p&gt;You've solved many of these problems before.&lt;/p&gt;

&lt;p&gt;Why are you solving them again?&lt;/p&gt;

&lt;p&gt;Of course, applications aren't identical.&lt;/p&gt;

&lt;p&gt;But many of the mechanisms underneath them are remarkably similar.&lt;/p&gt;

&lt;p&gt;That was part of the motivation behind KiwiEngine.&lt;/p&gt;

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

&lt;p&gt;"How can I eliminate programming?"&lt;/p&gt;

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

&lt;p&gt;"How can I spend more of my programming time on problems that are actually new?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Repetition Isn't Always Bad
&lt;/h2&gt;

&lt;p&gt;There's an important distinction here.&lt;/p&gt;

&lt;p&gt;Repeating code isn't automatically a problem.&lt;/p&gt;

&lt;p&gt;Sometimes two things merely happen to look similar.&lt;/p&gt;

&lt;p&gt;Abstracting too early can create something worse than duplication.&lt;/p&gt;

&lt;p&gt;I've learned that lesson repeatedly while building KiwiEngine.&lt;/p&gt;

&lt;p&gt;But when the same problem appears across real projects over and over again, that's different.&lt;/p&gt;

&lt;p&gt;Eventually a pattern earns an abstraction.&lt;/p&gt;

&lt;p&gt;That's where libraries become valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build It Once. Improve It Everywhere.
&lt;/h2&gt;

&lt;p&gt;Imagine I discover a better way of handling something while building a Blackwater Sound application.&lt;/p&gt;

&lt;p&gt;If that improvement belongs in the underlying library, I can improve the library.&lt;/p&gt;

&lt;p&gt;Now another application benefits.&lt;/p&gt;

&lt;p&gt;And another.&lt;/p&gt;

&lt;p&gt;And another.&lt;/p&gt;

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

&lt;p&gt;Instead of maintaining ten unrelated implementations of the same idea, I can improve the shared foundation.&lt;/p&gt;

&lt;p&gt;The applications still remain different.&lt;/p&gt;

&lt;p&gt;Their domains remain different.&lt;/p&gt;

&lt;p&gt;Their users remain different.&lt;/p&gt;

&lt;p&gt;But the boring problems underneath them don't have to be reinvented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time Is The Resource I'm Actually Optimizing
&lt;/h2&gt;

&lt;p&gt;This has become more important as my interests have expanded.&lt;/p&gt;

&lt;p&gt;I don't only want to build web applications.&lt;/p&gt;

&lt;p&gt;I want to make music.&lt;/p&gt;

&lt;p&gt;I want to produce records.&lt;/p&gt;

&lt;p&gt;I want to teach.&lt;/p&gt;

&lt;p&gt;I want to build pedals.&lt;/p&gt;

&lt;p&gt;I want to experiment with amplifiers.&lt;/p&gt;

&lt;p&gt;I want to build guitars.&lt;/p&gt;

&lt;p&gt;I want to create stores.&lt;/p&gt;

&lt;p&gt;I want to work with artists.&lt;/p&gt;

&lt;p&gt;I want to write.&lt;/p&gt;

&lt;p&gt;There are only so many hours available.&lt;/p&gt;

&lt;p&gt;So if every idea requires me to rebuild an entire technical foundation before I can explore it, most of those ideas will never happen.&lt;/p&gt;

&lt;p&gt;That's the real problem KiwiEngine can solve for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure Should Compound
&lt;/h2&gt;

&lt;p&gt;A framework becomes interesting when yesterday's work makes tomorrow's experiment cheaper.&lt;/p&gt;

&lt;p&gt;Build a configuration system once.&lt;/p&gt;

&lt;p&gt;Improve it across several projects.&lt;/p&gt;

&lt;p&gt;Build an HTTP layer once.&lt;/p&gt;

&lt;p&gt;Harden it through real use.&lt;/p&gt;

&lt;p&gt;Build deployment tooling once.&lt;/p&gt;

&lt;p&gt;Use it repeatedly.&lt;/p&gt;

&lt;p&gt;Build a design system once.&lt;/p&gt;

&lt;p&gt;Let projects configure it differently.&lt;/p&gt;

&lt;p&gt;Each piece becomes another tool sitting on the workbench.&lt;/p&gt;

&lt;p&gt;Eventually starting something new doesn't mean starting from zero.&lt;/p&gt;

&lt;p&gt;It means assembling proven pieces and concentrating on what's different.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Why Boundaries Matter
&lt;/h2&gt;

&lt;p&gt;There's a danger here.&lt;/p&gt;

&lt;p&gt;If KiwiEngine tries to solve everything, it eventually creates a different kind of burden.&lt;/p&gt;

&lt;p&gt;Instead of saving time, I'll spend all my time maintaining KiwiEngine.&lt;/p&gt;

&lt;p&gt;That's why I've become increasingly interested in boundaries.&lt;/p&gt;

&lt;p&gt;Juice doesn't need to replace CSS.&lt;/p&gt;

&lt;p&gt;A store package doesn't need to understand every business on Earth.&lt;/p&gt;

&lt;p&gt;An API abstraction doesn't need to hide every capability of the underlying service.&lt;/p&gt;

&lt;p&gt;Each piece should solve its problem well and then get out of the way.&lt;/p&gt;

&lt;p&gt;Otherwise the framework becomes the project.&lt;/p&gt;

&lt;p&gt;That's exactly what I'm trying to avoid.&lt;/p&gt;

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

&lt;p&gt;I'm not particularly interested in bragging about how few lines of code something requires.&lt;/p&gt;

&lt;p&gt;Sometimes explicit code is good.&lt;/p&gt;

&lt;p&gt;Sometimes configuration is good.&lt;/p&gt;

&lt;p&gt;Sometimes abstraction is good.&lt;/p&gt;

&lt;p&gt;The metric I care about more is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How quickly can I get from an idea to working on the part of that idea that actually matters?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I'm building a music tool, I want to spend my time thinking about musicians.&lt;/p&gt;

&lt;p&gt;If I'm building a store, I want to think about products and customers.&lt;/p&gt;

&lt;p&gt;If I'm building electronics, I want to think about circuits and hardware.&lt;/p&gt;

&lt;p&gt;The framework should help me reach those problems sooner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eventually The Framework Should Become Boring
&lt;/h2&gt;

&lt;p&gt;I actually think this might be one of the greatest compliments I could eventually give KiwiEngine.&lt;/p&gt;

&lt;p&gt;I stopped thinking about it.&lt;/p&gt;

&lt;p&gt;Not because development stopped.&lt;/p&gt;

&lt;p&gt;Not because there aren't improvements to make.&lt;/p&gt;

&lt;p&gt;But because the common pieces simply work.&lt;/p&gt;

&lt;p&gt;I know how to start a project.&lt;/p&gt;

&lt;p&gt;I know how configuration behaves.&lt;/p&gt;

&lt;p&gt;I know how the pieces connect.&lt;/p&gt;

&lt;p&gt;I know how to deploy it.&lt;/p&gt;

&lt;p&gt;Then my attention can move somewhere else.&lt;/p&gt;

&lt;p&gt;That's what infrastructure is supposed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give Me My Time Back
&lt;/h2&gt;

&lt;p&gt;Building a framework requires an enormous investment of time.&lt;/p&gt;

&lt;p&gt;So eventually it needs to repay that investment.&lt;/p&gt;

&lt;p&gt;Not necessarily through subscriptions.&lt;/p&gt;

&lt;p&gt;Not necessarily by becoming a huge software company.&lt;/p&gt;

&lt;p&gt;It can repay me through leverage.&lt;/p&gt;

&lt;p&gt;Through reuse.&lt;/p&gt;

&lt;p&gt;Through faster experimentation.&lt;/p&gt;

&lt;p&gt;Through shared improvements.&lt;/p&gt;

&lt;p&gt;Through letting me pursue more ideas without rebuilding the same foundation every time.&lt;/p&gt;

&lt;p&gt;The best framework isn't necessarily the one with the most features.&lt;/p&gt;

&lt;p&gt;It might be the one that quietly gives you your time back.&lt;/p&gt;

&lt;p&gt;That's what I want KiwiEngine to become.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Didn't Build KiwiEngine Just To Build Software</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Tue, 22 Sep 2026 16:15:00 +0000</pubDate>
      <link>https://dev.to/stinklewinks/i-didnt-build-kiwiengine-just-to-build-software-57hk</link>
      <guid>https://dev.to/stinklewinks/i-didnt-build-kiwiengine-just-to-build-software-57hk</guid>
      <description>&lt;p&gt;I've spent years building software so I can eventually spend less time rebuilding software.&lt;/p&gt;

&lt;p&gt;That sounds contradictory.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;KiwiEngine was never supposed to become the thing I spend the rest of my life rebuilding.&lt;/p&gt;

&lt;p&gt;It's supposed to become the foundation that lets me build everything else.&lt;/p&gt;

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

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

&lt;p&gt;Stores.&lt;/p&gt;

&lt;p&gt;Print-on-demand products.&lt;/p&gt;

&lt;p&gt;Guitar pedals.&lt;/p&gt;

&lt;p&gt;Amplifiers.&lt;/p&gt;

&lt;p&gt;Electronics.&lt;/p&gt;

&lt;p&gt;Games.&lt;/p&gt;

&lt;p&gt;Whatever comes next.&lt;/p&gt;

&lt;p&gt;The goal isn't to make KiwiEngine the center of everything I do.&lt;/p&gt;

&lt;p&gt;The goal is to make it dependable enough that it doesn't have to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's More I Want To Build Than Software
&lt;/h2&gt;

&lt;p&gt;I love software development.&lt;/p&gt;

&lt;p&gt;But I'm also a musician.&lt;/p&gt;

&lt;p&gt;I write and produce music. I mix. I build things. I'm interested in electronics, guitars, amplifiers, pedals, recording equipment, games, design, publishing, and probably a dozen other things I'll discover along the way.&lt;/p&gt;

&lt;p&gt;For a while, I treated those interests almost like separate worlds.&lt;/p&gt;

&lt;p&gt;There was software development.&lt;/p&gt;

&lt;p&gt;Then there was music.&lt;/p&gt;

&lt;p&gt;Then there were physical products.&lt;/p&gt;

&lt;p&gt;Then there was business.&lt;/p&gt;

&lt;p&gt;But they're increasingly starting to look like parts of the same workshop.&lt;/p&gt;

&lt;p&gt;Because almost everything I want to build eventually needs some kind of digital infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imagine Starting A Store
&lt;/h2&gt;

&lt;p&gt;Let's say I want to start selling merchandise through Print on Demand.&lt;/p&gt;

&lt;p&gt;The interesting part isn't building another login system.&lt;/p&gt;

&lt;p&gt;It isn't figuring out routing again.&lt;/p&gt;

&lt;p&gt;It isn't rebuilding configuration management.&lt;/p&gt;

&lt;p&gt;And it definitely isn't creating the same application foundation for the twentieth time.&lt;/p&gt;

&lt;p&gt;The interesting problems are things like:&lt;/p&gt;

&lt;p&gt;How should products be represented?&lt;/p&gt;

&lt;p&gt;How do I interact with a Print on Demand provider?&lt;/p&gt;

&lt;p&gt;What happens when someone places an order?&lt;/p&gt;

&lt;p&gt;How do I make switching providers possible?&lt;/p&gt;

&lt;p&gt;What kind of storefront experience fits the brand?&lt;/p&gt;

&lt;p&gt;How can products from multiple providers live together?&lt;/p&gt;

&lt;p&gt;Those are the problems specific to the thing I'm actually building.&lt;/p&gt;

&lt;p&gt;Everything underneath them is infrastructure.&lt;/p&gt;

&lt;p&gt;That's where KiwiEngine starts becoming useful in a completely different way.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs Become Building Materials
&lt;/h2&gt;

&lt;p&gt;This is one of the things I'm excited to explore.&lt;/p&gt;

&lt;p&gt;There are APIs everywhere.&lt;/p&gt;

&lt;p&gt;Print on Demand providers.&lt;/p&gt;

&lt;p&gt;Payment processors.&lt;/p&gt;

&lt;p&gt;Shipping providers.&lt;/p&gt;

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

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

&lt;p&gt;Analytics services.&lt;/p&gt;

&lt;p&gt;Cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Instead of treating each integration as a completely separate application, I can build adapters around those services and expose them through systems I control.&lt;/p&gt;

&lt;p&gt;KiwiEngine provides the foundation.&lt;/p&gt;

&lt;p&gt;The external API provides a capability.&lt;/p&gt;

&lt;p&gt;My application decides what to do with it.&lt;/p&gt;

&lt;p&gt;That's a very different relationship with software development.&lt;/p&gt;

&lt;p&gt;I'm no longer starting with:&lt;/p&gt;

&lt;p&gt;"What application can I build?"&lt;/p&gt;

&lt;p&gt;I'm starting with:&lt;/p&gt;

&lt;p&gt;"What am I trying to accomplish?"&lt;/p&gt;

&lt;p&gt;Then software becomes one of the tools I use to accomplish it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Same Thing Applies To Music
&lt;/h2&gt;

&lt;p&gt;Blackwater Sound gives me an enormous testing ground for this.&lt;/p&gt;

&lt;p&gt;An artist might need an EPK.&lt;/p&gt;

&lt;p&gt;A musician might need a storefront.&lt;/p&gt;

&lt;p&gt;A studio might need a client portal.&lt;/p&gt;

&lt;p&gt;A producer might need a way to transfer sessions.&lt;/p&gt;

&lt;p&gt;A band might need a merch system.&lt;/p&gt;

&lt;p&gt;A release might need its own interactive website.&lt;/p&gt;

&lt;p&gt;A musician might need a better music player.&lt;/p&gt;

&lt;p&gt;A studio might need internal tools that don't exist yet.&lt;/p&gt;

&lt;p&gt;These don't all need to become SaaS companies.&lt;/p&gt;

&lt;p&gt;Sometimes they can simply be useful tools.&lt;/p&gt;

&lt;p&gt;And because I already have a technical foundation, experimenting with those ideas becomes much less expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then There Are Physical Products
&lt;/h2&gt;

&lt;p&gt;This is where things get especially interesting to me.&lt;/p&gt;

&lt;p&gt;I've been spending more time thinking about electronics.&lt;/p&gt;

&lt;p&gt;Pedals.&lt;/p&gt;

&lt;p&gt;Amplifiers.&lt;/p&gt;

&lt;p&gt;Cabinets.&lt;/p&gt;

&lt;p&gt;Guitars.&lt;/p&gt;

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

&lt;p&gt;At first glance, that seems completely separate from KiwiEngine.&lt;/p&gt;

&lt;p&gt;A guitar pedal certainly isn't running a web framework.&lt;/p&gt;

&lt;p&gt;But think about everything surrounding that pedal.&lt;/p&gt;

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

&lt;p&gt;Component inventories.&lt;/p&gt;

&lt;p&gt;Bills of materials.&lt;/p&gt;

&lt;p&gt;Product pages.&lt;/p&gt;

&lt;p&gt;Storefronts.&lt;/p&gt;

&lt;p&gt;Warranty registration.&lt;/p&gt;

&lt;p&gt;Serial numbers.&lt;/p&gt;

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

&lt;p&gt;Testing information.&lt;/p&gt;

&lt;p&gt;Customer support.&lt;/p&gt;

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

&lt;p&gt;Internal manufacturing utilities.&lt;/p&gt;

&lt;p&gt;If I eventually sell physical products, software becomes infrastructure around those products.&lt;/p&gt;

&lt;p&gt;KiwiEngine doesn't have to power the pedal.&lt;/p&gt;

&lt;p&gt;It can help power the company that builds the pedal.&lt;/p&gt;

&lt;p&gt;That's a much more interesting role for technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Changes How I Think About Frameworks
&lt;/h2&gt;

&lt;p&gt;Framework development can easily become its own endless hobby.&lt;/p&gt;

&lt;p&gt;There's always another abstraction.&lt;/p&gt;

&lt;p&gt;Another feature.&lt;/p&gt;

&lt;p&gt;Another optimization.&lt;/p&gt;

&lt;p&gt;Another rewrite.&lt;/p&gt;

&lt;p&gt;Eventually you can spend so much time building tools for building things that you stop building the things.&lt;/p&gt;

&lt;p&gt;I don't want that.&lt;/p&gt;

&lt;p&gt;KiwiEngine needs to reach a point where parts of it become boring.&lt;/p&gt;

&lt;p&gt;Stable.&lt;/p&gt;

&lt;p&gt;Documented.&lt;/p&gt;

&lt;p&gt;Predictable.&lt;/p&gt;

&lt;p&gt;Dependable.&lt;/p&gt;

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

&lt;p&gt;Because then I can stop thinking about the engine every time I want to drive somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology Should Create Leverage
&lt;/h2&gt;

&lt;p&gt;That's probably the biggest change in how I'm thinking about CitrusWorx.&lt;/p&gt;

&lt;p&gt;Technology doesn't always need to be the final product.&lt;/p&gt;

&lt;p&gt;Sometimes technology exists to create leverage.&lt;/p&gt;

&lt;p&gt;A storefront helps sell something.&lt;/p&gt;

&lt;p&gt;An internal application helps manufacture something.&lt;/p&gt;

&lt;p&gt;A music platform helps release something.&lt;/p&gt;

&lt;p&gt;A website helps communicate something.&lt;/p&gt;

&lt;p&gt;Infrastructure helps operate something.&lt;/p&gt;

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

&lt;p&gt;But it doesn't always have to be the destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Is Starting To Look Different
&lt;/h2&gt;

&lt;p&gt;The early Road To KiwiEngine posts were naturally about building the engine.&lt;/p&gt;

&lt;p&gt;What should this library do?&lt;/p&gt;

&lt;p&gt;Where should this abstraction live?&lt;/p&gt;

&lt;p&gt;How should configuration work?&lt;/p&gt;

&lt;p&gt;What should the API look like?&lt;/p&gt;

&lt;p&gt;Those questions still matter.&lt;/p&gt;

&lt;p&gt;But something interesting is starting to happen.&lt;/p&gt;

&lt;p&gt;The engine is becoming capable enough that I can increasingly ask a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What can I build with it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the question I've wanted to reach all along.&lt;/p&gt;

&lt;p&gt;KiwiEngine isn't supposed to become everything I build.&lt;/p&gt;

&lt;p&gt;It's supposed to make everything else easier to build.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>When Is a Library Ready for Version 1.0?</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Mon, 21 Sep 2026 16:45:42 +0000</pubDate>
      <link>https://dev.to/stinklewinks/when-is-a-library-ready-for-version-10-32cg</link>
      <guid>https://dev.to/stinklewinks/when-is-a-library-ready-for-version-10-32cg</guid>
      <description>&lt;p&gt;Juice is getting very close to version 1.0.&lt;/p&gt;

&lt;p&gt;That's a sentence I've been hesitant to write.&lt;/p&gt;

&lt;p&gt;Not because Juice isn't usable.&lt;/p&gt;

&lt;p&gt;I've been using it.&lt;/p&gt;

&lt;p&gt;Not because it doesn't have enough features.&lt;/p&gt;

&lt;p&gt;If anything, one of the biggest lessons I've learned while building it has been knowing when &lt;em&gt;not&lt;/em&gt; to add another feature.&lt;/p&gt;

&lt;p&gt;The hesitation comes from what &lt;code&gt;1.0&lt;/code&gt; represents.&lt;/p&gt;

&lt;p&gt;At some point, a library has to stop being an experiment and start making promises.&lt;/p&gt;

&lt;p&gt;I think Juice is getting there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1.0 Isn't "Finished"
&lt;/h2&gt;

&lt;p&gt;I've never liked the idea that version 1.0 means software is finished.&lt;/p&gt;

&lt;p&gt;Software is rarely finished.&lt;/p&gt;

&lt;p&gt;There will be new ideas.&lt;/p&gt;

&lt;p&gt;There will be bugs.&lt;/p&gt;

&lt;p&gt;There will be things I haven't considered yet.&lt;/p&gt;

&lt;p&gt;There will undoubtedly be things I look back at later and wonder why I designed them that way.&lt;/p&gt;

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

&lt;p&gt;For me, 1.0 means something different.&lt;/p&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I understand what this library is now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a much bigger milestone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juice Took Time To Find Its Identity
&lt;/h2&gt;

&lt;p&gt;Juice started as a way to solve styling problems inside KiwiEngine.&lt;/p&gt;

&lt;p&gt;Over time, its philosophy became clearer.&lt;/p&gt;

&lt;p&gt;I didn't want another collection of utility classes.&lt;/p&gt;

&lt;p&gt;I didn't want to recreate CSS with different syntax.&lt;/p&gt;

&lt;p&gt;And I definitely didn't want Juice to become responsible for every possible design decision.&lt;/p&gt;

&lt;p&gt;CSS is already extremely good at being CSS.&lt;/p&gt;

&lt;p&gt;Juice needed its own reason to exist.&lt;/p&gt;

&lt;p&gt;Eventually, I realized that reason was &lt;strong&gt;intent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of describing every implementation detail, Juice could provide a small vocabulary for common design intentions.&lt;/p&gt;

&lt;p&gt;Something like:&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;doesn't attempt to expose every responsive CSS possibility.&lt;/p&gt;

&lt;p&gt;It communicates what I want the content to do.&lt;/p&gt;

&lt;p&gt;Juice handles the common behavior.&lt;/p&gt;

&lt;p&gt;CSS remains available when I need something more specific.&lt;/p&gt;

&lt;p&gt;That boundary became incredibly important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Projects Designed More of Juice Than I Did
&lt;/h2&gt;

&lt;p&gt;A lot of Juice didn't come from sitting down and trying to invent a design system.&lt;/p&gt;

&lt;p&gt;It came from using it.&lt;/p&gt;

&lt;p&gt;I'd build something.&lt;/p&gt;

&lt;p&gt;I'd encounter friction.&lt;/p&gt;

&lt;p&gt;I'd notice a repeated pattern.&lt;/p&gt;

&lt;p&gt;Then I'd ask whether that pattern belonged in Juice.&lt;/p&gt;

&lt;p&gt;Sometimes the answer was yes.&lt;/p&gt;

&lt;p&gt;Sometimes it was no.&lt;/p&gt;

&lt;p&gt;That's how features like &lt;code&gt;adapt&lt;/code&gt; started taking shape.&lt;/p&gt;

&lt;p&gt;The abstraction came after the problem.&lt;/p&gt;

&lt;p&gt;That's a development philosophy I've become increasingly attached to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let abstractions earn their way into the system.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Configuration Changed Things
&lt;/h2&gt;

&lt;p&gt;One of the more recent milestones has been getting Juice to consume configuration and generate stylesheets from it.&lt;/p&gt;

&lt;p&gt;This pushed Juice closer to what I actually wanted it to become.&lt;/p&gt;

&lt;p&gt;A project can define its own design decisions:&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;borders&lt;/li&gt;
&lt;li&gt;shadows&lt;/li&gt;
&lt;li&gt;other design tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juice can then generate the stylesheet that supports its attribute-based styling system.&lt;/p&gt;

&lt;p&gt;In other words, Juice can act almost like a theme generator.&lt;/p&gt;

&lt;p&gt;That's important because I don't want applications to rely on Juice for their entire identity.&lt;/p&gt;

&lt;p&gt;Juice can't be everything.&lt;/p&gt;

&lt;p&gt;And it shouldn't try to be.&lt;/p&gt;

&lt;p&gt;The application should still own its brand.&lt;/p&gt;

&lt;p&gt;The developer should still own the application.&lt;/p&gt;

&lt;p&gt;CSS should still be CSS.&lt;/p&gt;

&lt;p&gt;Juice provides the system connecting those decisions together.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.0 Is About Boundaries
&lt;/h2&gt;

&lt;p&gt;Strangely, getting closer to 1.0 hasn't made me think about everything else Juice could do.&lt;/p&gt;

&lt;p&gt;It's made me think harder about what Juice &lt;strong&gt;shouldn't&lt;/strong&gt; do.&lt;/p&gt;

&lt;p&gt;That's probably one of the clearest signs that the library is maturing.&lt;/p&gt;

&lt;p&gt;Early development asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What else can I add?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mature development increasingly asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does this actually belong here?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A stable library needs boundaries.&lt;/p&gt;

&lt;p&gt;Without them, every useful idea eventually becomes another feature.&lt;/p&gt;

&lt;p&gt;And every feature expands the surface area that has to be understood, documented, tested, supported, and maintained.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API Has To Become A Promise
&lt;/h2&gt;

&lt;p&gt;Before 1.0, changing an API is relatively inexpensive.&lt;/p&gt;

&lt;p&gt;After 1.0, I think the relationship changes.&lt;/p&gt;

&lt;p&gt;If someone builds around:&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="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I want them to have reasonable confidence that I'm not going to wake up next month and decide the entire vocabulary should work differently.&lt;/p&gt;

&lt;p&gt;That doesn't mean nothing can ever change.&lt;/p&gt;

&lt;p&gt;It means change needs to become more deliberate.&lt;/p&gt;

&lt;p&gt;Version 1.0 isn't only a milestone for the maintainer.&lt;/p&gt;

&lt;p&gt;It's a commitment to the people using the library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation Matters More Now
&lt;/h2&gt;

&lt;p&gt;That also means the work leading into 1.0 isn't just code.&lt;/p&gt;

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

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

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

&lt;p&gt;Naming matters.&lt;/p&gt;

&lt;p&gt;Error behavior matters.&lt;/p&gt;

&lt;p&gt;The installation experience matters.&lt;/p&gt;

&lt;p&gt;The little things that were easy to ignore while experimenting suddenly matter much more.&lt;/p&gt;

&lt;p&gt;Because a library isn't ready simply because its author understands it.&lt;/p&gt;

&lt;p&gt;Other people have to be able to understand it too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juice Doesn't Need To Be Everything
&lt;/h2&gt;

&lt;p&gt;This may be the most important thing I've learned while building it.&lt;/p&gt;

&lt;p&gt;I don't want Juice to replace CSS.&lt;/p&gt;

&lt;p&gt;I don't want it to contain every layout imaginable.&lt;/p&gt;

&lt;p&gt;I don't want it to become a giant collection of options simply so I can say it supports everything.&lt;/p&gt;

&lt;p&gt;I want it to make the common things expressive.&lt;/p&gt;

&lt;p&gt;I want the markup to communicate intent.&lt;/p&gt;

&lt;p&gt;I want sensible defaults.&lt;/p&gt;

&lt;p&gt;I want projects to own their identities.&lt;/p&gt;

&lt;p&gt;And when Juice isn't the right tool for something, I want developers to be able to use CSS without fighting the framework.&lt;/p&gt;

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

&lt;p&gt;In fact, knowing that might be exactly what makes Juice ready for 1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road To KiwiEngine Continues
&lt;/h2&gt;

&lt;p&gt;Juice reaching version 1.0 isn't just a Juice milestone.&lt;/p&gt;

&lt;p&gt;It's a KiwiEngine milestone.&lt;/p&gt;

&lt;p&gt;KiwiEngine is an ecosystem, and ecosystems become real one stable piece at a time.&lt;/p&gt;

&lt;p&gt;Juice becoming stable gives everything built above it a more dependable foundation.&lt;/p&gt;

&lt;p&gt;And after spending so much time writing about systems, abstractions, constraints, real projects, documentation, and intent, it's satisfying to see those ideas materializing in an actual library.&lt;/p&gt;

&lt;p&gt;There's still work to do before I put the &lt;code&gt;1.0.0&lt;/code&gt; tag on it.&lt;/p&gt;

&lt;p&gt;But for the first time, the question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does Juice need to become?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think I know what Juice is.&lt;/p&gt;

&lt;p&gt;Now the job is making sure it does that well.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>css</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Artist Is Taking the Reins</title>
      <dc:creator>Drew Marshall</dc:creator>
      <pubDate>Fri, 04 Sep 2026 13:50:32 +0000</pubDate>
      <link>https://dev.to/stinklewinks/the-artist-is-taking-the-reins-5bn9</link>
      <guid>https://dev.to/stinklewinks/the-artist-is-taking-the-reins-5bn9</guid>
      <description>&lt;p&gt;For a long time, I treated my interests in technology and creativity like they belonged in separate rooms.&lt;/p&gt;

&lt;p&gt;There was the technical side of me:&lt;/p&gt;

&lt;p&gt;Software engineering.&lt;br&gt;
Web development.&lt;br&gt;
Systems architecture.&lt;br&gt;
Game engines.&lt;br&gt;
Infrastructure.&lt;br&gt;
Electronics.&lt;br&gt;
Security.&lt;br&gt;
Tools.&lt;/p&gt;

&lt;p&gt;And then there was the creative side:&lt;/p&gt;

&lt;p&gt;Music.&lt;br&gt;
Songwriting.&lt;br&gt;
Guitars.&lt;br&gt;
Sound.&lt;br&gt;
Stories.&lt;br&gt;
Design.&lt;br&gt;
Worldbuilding.&lt;br&gt;
Making things simply because I wanted them to exist.&lt;/p&gt;

&lt;p&gt;I kept trying to figure out which one I was supposed to be.&lt;/p&gt;

&lt;p&gt;Was I a software engineer who happened to make music?&lt;/p&gt;

&lt;p&gt;Was I a musician who knew how to code?&lt;/p&gt;

&lt;p&gt;Was CitrusWorx the "serious" technical work while Blackwater Sound was the creative side project?&lt;/p&gt;

&lt;p&gt;Eventually I realized that the question itself was wrong.&lt;/p&gt;

&lt;p&gt;They were never supposed to be separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology Was Becoming My Identity
&lt;/h2&gt;

&lt;p&gt;I love technology.&lt;/p&gt;

&lt;p&gt;That hasn't changed.&lt;/p&gt;

&lt;p&gt;I love opening something up and figuring out how it works.&lt;/p&gt;

&lt;p&gt;I love understanding systems.&lt;/p&gt;

&lt;p&gt;I love asking why an architecture was designed a certain way, why a circuit behaves the way it does, why a programming language made a particular tradeoff, or why an old amplifier sounds different from a modern one.&lt;/p&gt;

&lt;p&gt;I can happily spend hours thinking about software architecture, operating systems, networking, electronics, programming languages, rendering engines, distributed systems, or some obscure piece of computer history.&lt;/p&gt;

&lt;p&gt;But somewhere along the way, technology went from being something I used to becoming something I felt obligated to center my identity around.&lt;/p&gt;

&lt;p&gt;And that distinction matters.&lt;/p&gt;

&lt;p&gt;Because I'm not interested in technology simply for technology's sake.&lt;/p&gt;

&lt;p&gt;I'm interested in what technology allows people to &lt;strong&gt;make&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That realization changed how I think about nearly everything I'm building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Artist Gets to Drive Now
&lt;/h2&gt;

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

&lt;p&gt;My artistic and creative side gets to take the reins.&lt;/p&gt;

&lt;p&gt;My technical side doesn't disappear.&lt;/p&gt;

&lt;p&gt;It becomes the superpower.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;What technology should I build?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm more interested in asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What do I want to create, and what technology would make that possible?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That might sound like a small difference.&lt;/p&gt;

&lt;p&gt;For me, it isn't.&lt;/p&gt;

&lt;p&gt;It changes the entire direction of the work.&lt;/p&gt;

&lt;p&gt;The destination is no longer dictated by the technology.&lt;/p&gt;

&lt;p&gt;The destination is dictated by the thing I want to make.&lt;/p&gt;

&lt;p&gt;The engineer figures out how to get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blackwater Sound + CitrusWorx
&lt;/h2&gt;

&lt;p&gt;This realization also helped me understand something about the different projects I've been building.&lt;/p&gt;

&lt;p&gt;Blackwater Sound and CitrusWorx aren't competing identities.&lt;/p&gt;

&lt;p&gt;They belong together.&lt;/p&gt;

&lt;p&gt;Blackwater Sound is where a lot of the musical and creative work lives.&lt;/p&gt;

&lt;p&gt;Within that world are projects like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;berylaudio&lt;/strong&gt; — audio software, plugins, pedals, and tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WINK Guitar&lt;/strong&gt; — guitars, basses, mandolins, education, and instrument making&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LIME Amplification&lt;/strong&gt; — guitar amplifiers and cabinets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there is CitrusWorx, where much of my engineering, software, systems thinking, research, and technology work lives.&lt;/p&gt;

&lt;p&gt;Those worlds don't need a wall between them.&lt;/p&gt;

&lt;p&gt;In fact, separating them makes both of them weaker.&lt;/p&gt;

&lt;p&gt;An amplifier is art and engineering.&lt;/p&gt;

&lt;p&gt;A guitar is art and engineering.&lt;/p&gt;

&lt;p&gt;A pedal is art and engineering.&lt;/p&gt;

&lt;p&gt;A synthesizer is art and engineering.&lt;/p&gt;

&lt;p&gt;A recording studio is art and engineering.&lt;/p&gt;

&lt;p&gt;An audio plugin is art and engineering.&lt;/p&gt;

&lt;p&gt;Even the modern music industry itself is inseparable from technology.&lt;/p&gt;

&lt;p&gt;The history of music is full of people abusing, modifying, misusing, inventing, rebuilding, and reimagining technology in the pursuit of a sound that didn't exist yet.&lt;/p&gt;

&lt;p&gt;That is much closer to the kind of technologist I want to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiwi Engine Still Matters
&lt;/h2&gt;

&lt;p&gt;This doesn't mean I'm abandoning software.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;I'm returning to Kiwi Engine with a clearer reason for why I want it to exist.&lt;/p&gt;

&lt;p&gt;Kiwi Engine is my web application engine.&lt;/p&gt;

&lt;p&gt;The goal is for the sites, tools, applications, and digital experiences throughout this ecosystem to be built on technology that I understand and can shape.&lt;/p&gt;

&lt;p&gt;But Kiwi Engine no longer needs to be the center of the universe.&lt;/p&gt;

&lt;p&gt;It is infrastructure.&lt;/p&gt;

&lt;p&gt;It is a workshop.&lt;/p&gt;

&lt;p&gt;It is a toolbench.&lt;/p&gt;

&lt;p&gt;It is something I can use to build the experiences surrounding the things I actually care about.&lt;/p&gt;

&lt;p&gt;Maybe that means building software for musicians.&lt;/p&gt;

&lt;p&gt;Maybe it powers an interactive guitar-building course.&lt;/p&gt;

&lt;p&gt;Maybe it becomes the foundation for an amplifier design notebook.&lt;/p&gt;

&lt;p&gt;Maybe it runs tools for organizing recording sessions.&lt;/p&gt;

&lt;p&gt;Maybe it powers documentation for an open hardware project.&lt;/p&gt;

&lt;p&gt;Maybe it becomes part of an ecosystem for musicians who want more ownership over their creative tools.&lt;/p&gt;

&lt;p&gt;Maybe none of those ideas look exactly the way I imagine them today.&lt;/p&gt;

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

&lt;p&gt;The important thing is that the technology is serving the creative work instead of the creative work becoming an excuse to build technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Want to Talk About Things That Make Noise
&lt;/h2&gt;

&lt;p&gt;I also realized something about what I actually enjoy writing and talking about.&lt;/p&gt;

&lt;p&gt;I don't want every article I write to be:&lt;/p&gt;

&lt;p&gt;"Here are ten JavaScript tricks."&lt;/p&gt;

&lt;p&gt;"Here's another framework comparison."&lt;/p&gt;

&lt;p&gt;"Here's how I configured Kubernetes."&lt;/p&gt;

&lt;p&gt;There's nothing wrong with those articles.&lt;/p&gt;

&lt;p&gt;I'll probably still write some of them.&lt;/p&gt;

&lt;p&gt;But I also want to write about why a particular guitar pickup sounds the way it does.&lt;/p&gt;

&lt;p&gt;I want to explore what happens inside a tube amplifier.&lt;/p&gt;

&lt;p&gt;I want to talk about distortion circuits.&lt;/p&gt;

&lt;p&gt;I want to tear apart pedals and understand their topology.&lt;/p&gt;

&lt;p&gt;I want to study recording techniques.&lt;/p&gt;

&lt;p&gt;I want to explore the history of instruments.&lt;/p&gt;

&lt;p&gt;I want to talk about the technology that changed music.&lt;/p&gt;

&lt;p&gt;I want to study the technology behind famous recordings.&lt;/p&gt;

&lt;p&gt;I want to understand why certain pieces of gear became culturally important.&lt;/p&gt;

&lt;p&gt;I want to build audio software and then explain exactly how it works.&lt;/p&gt;

&lt;p&gt;I want to make instruments.&lt;/p&gt;

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

&lt;p&gt;I want to create sounds that didn't exist before.&lt;/p&gt;

&lt;p&gt;And yes, somewhere in the middle of all of that, I will probably write a ridiculous amount of code.&lt;/p&gt;

&lt;p&gt;That sounds much more like me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creative Engineering
&lt;/h2&gt;

&lt;p&gt;Maybe the best term I have for all of this is &lt;strong&gt;creative engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Engineering without creativity becomes optimization without direction.&lt;/p&gt;

&lt;p&gt;Creativity without execution can remain an idea forever.&lt;/p&gt;

&lt;p&gt;Put the two together and things start happening.&lt;/p&gt;

&lt;p&gt;You can imagine a sound and then design the circuit that creates it.&lt;/p&gt;

&lt;p&gt;You can imagine an instrument and then learn the woodworking, electronics, acoustics, manufacturing, and design required to build it.&lt;/p&gt;

&lt;p&gt;You can imagine a piece of software and then write the engine underneath it.&lt;/p&gt;

&lt;p&gt;You can imagine a world and then write the stories, compose the soundtrack, create the artwork, and build the systems that let someone experience it.&lt;/p&gt;

&lt;p&gt;That's the intersection I want to live in.&lt;/p&gt;

&lt;p&gt;Not purely art.&lt;/p&gt;

&lt;p&gt;Not purely technology.&lt;/p&gt;

&lt;p&gt;Making things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology Is an Instrument
&lt;/h2&gt;

&lt;p&gt;A guitar player doesn't usually build their identity around the screwdriver they used to adjust the bridge.&lt;/p&gt;

&lt;p&gt;A carpenter doesn't wake up every morning wondering whether they are primarily a table-saw person or a bandsaw person.&lt;/p&gt;

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

&lt;p&gt;Mastery matters.&lt;/p&gt;

&lt;p&gt;Understanding the tool deeply matters.&lt;/p&gt;

&lt;p&gt;But the tool exists in service of the work.&lt;/p&gt;

&lt;p&gt;I'm starting to think about software the same way.&lt;/p&gt;

&lt;p&gt;Programming languages are tools.&lt;/p&gt;

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

&lt;p&gt;Cloud platforms are tools.&lt;/p&gt;

&lt;p&gt;AI is a tool.&lt;/p&gt;

&lt;p&gt;Electronics are tools.&lt;/p&gt;

&lt;p&gt;CAD is a tool.&lt;/p&gt;

&lt;p&gt;Manufacturing is a tool.&lt;/p&gt;

&lt;p&gt;Kiwi Engine is a tool.&lt;/p&gt;

&lt;p&gt;And I absolutely want to understand my tools.&lt;/p&gt;

&lt;p&gt;I want to modify them.&lt;/p&gt;

&lt;p&gt;I want to build my own when necessary.&lt;/p&gt;

&lt;p&gt;I want to know what is happening underneath the abstraction.&lt;/p&gt;

&lt;p&gt;That curiosity isn't going anywhere.&lt;/p&gt;

&lt;p&gt;But the tool doesn't get to decide what I make.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm Still an Engineer
&lt;/h2&gt;

&lt;p&gt;There's a funny thing about saying that technology isn't my identity anymore.&lt;/p&gt;

&lt;p&gt;It doesn't make me less technical.&lt;/p&gt;

&lt;p&gt;If anything, I think it gives me permission to become more technical.&lt;/p&gt;

&lt;p&gt;Because now the learning has somewhere to go.&lt;/p&gt;

&lt;p&gt;DSP isn't just mathematics.&lt;/p&gt;

&lt;p&gt;It's how I create an audio plugin.&lt;/p&gt;

&lt;p&gt;Electronics isn't just circuit theory.&lt;/p&gt;

&lt;p&gt;It's how I design a pedal or amplifier.&lt;/p&gt;

&lt;p&gt;Web development isn't just another application stack.&lt;/p&gt;

&lt;p&gt;It's how I build the platform around my creative work.&lt;/p&gt;

&lt;p&gt;Embedded programming isn't just firmware.&lt;/p&gt;

&lt;p&gt;It's how I make physical objects respond to musicians.&lt;/p&gt;

&lt;p&gt;Acoustics isn't just physics.&lt;/p&gt;

&lt;p&gt;It's how I understand an instrument.&lt;/p&gt;

&lt;p&gt;Manufacturing isn't just production engineering.&lt;/p&gt;

&lt;p&gt;It's how an idea becomes something another person can hold in their hands.&lt;/p&gt;

&lt;p&gt;Those connections make me want to learn more, not less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming Back Different
&lt;/h2&gt;

&lt;p&gt;I took some time away from developing Kiwi Engine.&lt;/p&gt;

&lt;p&gt;I took some time away from writing.&lt;/p&gt;

&lt;p&gt;At first, that felt like I had stopped.&lt;/p&gt;

&lt;p&gt;Now I think I was recalibrating.&lt;/p&gt;

&lt;p&gt;I'm coming back with a different hierarchy.&lt;/p&gt;

&lt;p&gt;The artist decides what should exist.&lt;/p&gt;

&lt;p&gt;The designer determines what it should feel like.&lt;/p&gt;

&lt;p&gt;The engineer figures out how to make it work.&lt;/p&gt;

&lt;p&gt;The researcher figures out what we can learn from everyone who came before us.&lt;/p&gt;

&lt;p&gt;The craftsperson builds it.&lt;/p&gt;

&lt;p&gt;And sometimes all of those people happen to be the same person.&lt;/p&gt;

&lt;p&gt;That's the part I'm finally learning to embrace.&lt;/p&gt;

&lt;p&gt;I still love software.&lt;/p&gt;

&lt;p&gt;I still love systems.&lt;/p&gt;

&lt;p&gt;I still want to build Kiwi Engine.&lt;/p&gt;

&lt;p&gt;I still want to explore strange technical rabbit holes.&lt;/p&gt;

&lt;p&gt;But I also want to build guitars.&lt;/p&gt;

&lt;p&gt;I want to make amplifiers.&lt;/p&gt;

&lt;p&gt;I want to design pedals.&lt;/p&gt;

&lt;p&gt;I want to create plugins.&lt;/p&gt;

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

&lt;p&gt;I want to study music history.&lt;/p&gt;

&lt;p&gt;I want to understand why things sound the way they do.&lt;/p&gt;

&lt;p&gt;I want to make things that are technical, artistic, useful, strange, beautiful, complicated, simple, loud, quiet, digital, analog, physical, and occasionally completely unnecessary.&lt;/p&gt;

&lt;p&gt;Because sometimes "I wonder if I can build this" is reason enough to start.&lt;/p&gt;

&lt;p&gt;Technology isn't going away.&lt;/p&gt;

&lt;p&gt;It just isn't sitting in the driver's seat anymore.&lt;/p&gt;

&lt;p&gt;The artist is driving now.&lt;/p&gt;

&lt;p&gt;The engineer is riding shotgun.&lt;/p&gt;

&lt;p&gt;And I think we're going to build some interesting things.&lt;/p&gt;

</description>
      <category>music</category>
      <category>programming</category>
      <category>creativecoding</category>
      <category>discuss</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-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>
  </channel>
</rss>
