Escape framework hell. A server-first web stack for building server-rendered applications with explicit control over servers, assets, and HTML output.
stack54 does not provide routing, servers, or client runtimes. It focuses on processing assets, rendering templates, and producing HTML, while leaving application structure, request handling, and client behavior entirely up to you.
π Bring Your Own Server (BYOS) stack54 has no opinion about routing or request handling. Use Express, Hono, any Node.js, Deno or Bun server, or even non-JS runtimes like Spring Boot. You control the entry point and request lifecycle.
Svelte as a Templating Layer Use Svelte for server-side HTML generation. Templates compile to deterministic HTML without introducing a client-side framework or runtime unless you explicitly opt in.
ποΈ You Control What JavaScript Ships
stack54 does not inject or generate client-side JavaScript. You explicitly author <script> and <link> tags, just like in traditional web applications.
CSS and JS/TS assets are processed and emitted, and HTML references are updated to point to the built output.
π§© Framework-Agnostic UI Mix Svelte templates, React-rendered output, or plain HTML in the same project. stack54 does not enforce a UI model, hydration strategy, or client-side convention.
Pluggable Build and Integration System Extend or replace asset processing, HTML generation, and output behavior via plugins. Integrations are explicit and composable.
A complete server-rendered page with explicit HTML and assets.
views/page.svelte)<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>stack54</title>
<!-- Explicit assets -->
<link rel="stylesheet" href="./assets/app.css" />
<script src="./assets/app.ts" defer></script>
</head>
<body>
<h1>Hello from stack54</h1>
<p>This page is rendered on the server.</p>
</body>
</html>
assets/app.ts)document.addEventListener("DOMContentLoaded", () => {
console.log("This JavaScript runs because you explicitly shipped it.");
});
import express from "express";
import { engine, View } from "@stack54/express/view";
import { resolver } from "./utils/view";
const app = express();
app.engine("svelte", engine);
app.set("view engine", "svelte");
app.set("view", View({ resolve: resolver }));
app.get("/", (_, res) => {
res.render("page.svelte");
});
app.listen(3000);
app.css and app.tsWhat reaches the browser is exactly what you authored.
If modern frameworks treat the web as a client application that happens to render on the server, stack54 treats the web as HTML first, with assets and interactivity layered on explicitly.
Think of stack54 as:
Routing, request handling, data loading, and client behavior are entirely outside of stack54βs scope.
If you can build a traditional web application with <link> and <script> tags, you already understand the stack54 model.
Full-stack developers who want:
π Documentation