DEV Community

Cover image for Road To KiwiEngine #8: Why I Built Seltzer Instead of Reaching for Another Framework
Drew Marshall
Drew Marshall

Posted on

Road To KiwiEngine #8: Why I Built Seltzer Instead of Reaching for Another Framework

Recently, I published another piece of the ecosystem publicly:

@citrusworx/seltzer on NPM

And honestly, Seltzer represents something much bigger to me than:

  • another backend framework
  • another routing system
  • another HTTP abstraction

It represents a shift in how I started thinking about operational flow inside modern systems.

Because the more systems I worked on, the more I realized something:

Modern applications are not just servers anymore.

They’re operational ecosystems constantly moving between:

  • clients
  • APIs
  • runtimes
  • infrastructure
  • workflows
  • services

That realization heavily influenced why I started building Seltzer.


Modern Systems Are Mostly Flows

At some point, I stopped seeing applications primarily as:

  • pages
  • endpoints
  • isolated APIs

and started seeing them as:

  • operational pipelines
  • communication layers
  • transformations
  • runtime orchestration
  • infrastructure movement

Requests move through systems.
Data moves through systems.
Events move through systems.
Operational state moves through systems.

Modern software increasingly behaves less like isolated applications and more like interconnected operational ecosystems.

That shift completely changed how I thought about backend architecture.


The Problem Was Never Just Routing

One thing I kept running into with modern backend systems was that routing alone was rarely the actual challenge.

The harder questions were usually:

  • What transforms this request?
  • What operational stage is this in?
  • What owns this workflow?
  • What infrastructure layer is involved?
  • What responsibility boundary exists here?
  • How does this system communicate outwardly?

The endpoint itself often became the smallest part of the operational problem.

That changed how I thought about runtime systems entirely.


I Wanted Runtime Flow To Feel Explicit

One thing I kept coming back to while designing Seltzer was readability.

Not just:

  • readable syntax
  • readable APIs

But readable operational intent.

For example:

import { Seltzer } from "./core/seltzer.js";

const app = Seltzer.init();

app.route({
    method: "GET",
    path: "/",
    handler: (ctx) => {
        return ctx.json([{ message: "Hello World!" }]);
    }
});

app.listen(3000);
Enter fullscreen mode Exit fullscreen mode

One thing I like about this structure is that the flow feels extremely visible:

  • initialize runtime
  • define operational route
  • handle request
  • return response
  • start runtime

No decorators.
No hidden runtime injection.
No deeply abstracted controller hierarchy.

Just explicit operational flow.

And honestly, the more systems I work on, the more I value explicitness over magic.


Seltzer Eventually Became More Than a Server Runtime

One thing that started becoming interesting while building Seltzer was realizing that operational flow doesn’t stop at the server boundary.

Modern systems constantly move between:

  • frontend applications
  • backend services
  • APIs
  • infrastructure layers
  • runtime systems

That’s one reason Seltzer eventually started evolving toward both:

  • server-side runtime orchestration and
  • client-side communication flow.

In some ways, it started inheriting ideas similar to:

  • Express-style server flow
  • Axios-style client communication

inside a broader operational systems philosophy.

For example:

const response = await Seltzer.client({
    method: "GET",
    url: "/api/posts"
});
Enter fullscreen mode Exit fullscreen mode

That may seem small at first glance, but philosophically it became important to me because it reinforced an idea I kept returning to:

Applications are fundamentally communication systems.

Not just rendering systems.


This Connects Deeply to the Larger WebEngine Philosophy

A lot of the ecosystem eventually started converging around similar ideas:

  • Juice → explicit UI intent
  • Nectarine → explicit data structure
  • GrapeVine → explicit infrastructure workflows
  • KiwiPress → operational publishing systems
  • Citrode → operational ownership & infrastructure awareness

Seltzer became part of the runtime communication layer inside that broader philosophy.

Not:

“framework for framework’s sake.”

But:

“how do systems communicate operationally in a more understandable way?”


I Think Modern Development Is Becoming Operationally Heavy

One thing I’ve noticed more lately is how much modern development increasingly revolves around:

  • orchestration
  • integrations
  • workflows
  • infrastructure coordination
  • deployment pipelines
  • service communication

Applications are no longer isolated codebases.

They’re interconnected operational systems.

And honestly?
I think a lot of developer tooling still treats these systems too narrowly.


I’m Less Interested in “Magic” Than I Used To Be

Earlier in my development journey, I was much more attracted to:

  • abstraction
  • automation
  • hidden convenience
  • framework magic

But over time, I started valuing:

  • readability
  • observability
  • explicit systems
  • predictable behavior
  • operational clarity

much more heavily.

Especially as I began thinking more deeply about:

  • maintainability
  • long-term ecosystems
  • deployment
  • infrastructure
  • lifecycle sustainability

That shift influenced almost every part of WebEngine philosophy.


Operational Clarity Matters More Than We Admit

One thing I think modern software culture underestimates is how expensive unclear systems become over time.

Not immediately.

Over time.

Because eventually teams inherit:

  • hidden behavior
  • unclear execution
  • operational ambiguity
  • undocumented workflows
  • layered abstractions
  • unpredictable integrations

And suddenly:
simple changes become dangerous.

That’s one reason I think explicit operational systems matter increasingly more as ecosystems grow.


AI Makes Runtime Structure More Important

Ironically, I think AI increases the importance of systems like this.

Because AI accelerates:

  • implementation
  • generation
  • scaffolding
  • integration creation

But generated systems still require:

  • structure
  • responsibility boundaries
  • observability
  • maintainability
  • operational discipline

Otherwise complexity compounds at machine speed.

That’s one reason I keep coming back to:

  • contracts
  • pipelines
  • flows
  • explicit runtime systems

throughout this entire ecosystem.


Publishing Publicly Changes Everything

One thing I’m realizing more lately is that publishing these systems publicly changes the psychology of building them.

Internally, systems can remain experimental forever.

But once something becomes installable publicly:

  • responsibility becomes real
  • architecture gets tested
  • assumptions get challenged
  • operational quality matters more

And honestly?
That pressure is healthy.

Because eventually systems need:

  • real-world usage
  • operational feedback
  • practical friction
  • visible workflows

to mature properly.


The Road To KiwiEngine Is Becoming Increasingly Tangible

One thing I find exciting is that the ecosystem is slowly moving from:

  • disconnected concepts toward:
  • interoperating operational systems.

The runtime layer.
The UI layer.
The infrastructure layer.
The deployment layer.
The publishing layer.

They’re all beginning to converge around the same operational philosophy:

  • explicit systems
  • composable architecture
  • infrastructure awareness
  • lifecycle sustainability
  • operational clarity

That convergence is what makes the journey interesting to me.


Final Thoughts

Seltzer is not really about creating:

“another backend framework.”

It’s part of a much larger exploration around:

  • runtime communication
  • operational orchestration
  • explicit systems
  • infrastructure-aware development
  • sustainable architecture

Because the more modern systems evolve, the more I think software increasingly becomes less about isolated endpoints…

…and more about understanding how entire operational ecosystems communicate and move together.

Top comments (0)