The stack your agent should have picked.

Left alone, a coding agent reaches for whatever was most common in its training data: React, a meta-framework, and a pile of dependencies. Common is not the same as good. Flenze is a small set of opinionated starters that point it somewhere better: less code, less JavaScript, and a project you can still read in a year. SvelteKit first.

You are building Stack
A web app Svelte, SvelteKit, Tailwind CSS, shadcn-svelte View starter →
A web app with markdown posts Svelte, SvelteKit, Tailwind CSS, shadcn-svelte, mdsvex View starter →
A web app with auth Svelte, SvelteKit, Tailwind CSS, shadcn-svelte, Better Auth, Drizzle, Neon View starter →

Each starter is a stack, a bootstrap prompt, an AGENTS.md and the skills to install. Works with any coding agent.

The most training data is not the best choice.

The usual advice is to build with whatever the agent has seen the most of, which means React. That made sense when a model could only work from memory. It does not anymore. An agent reads the current docs, queries the framework's MCP server, runs the type checker and reads the error. Give it up-to-date documentation and a newer framework like Svelte is no harder for it than React. The gap was never ability. It was defaults.

What the training-data argument leaves out is everything after the first commit. React projects bloat: a runtime on every page, hooks and effects and dependency arrays, a meta-framework on top, and a dependency tree that grows every quarter. The long-term philosophy here is the opposite. Keep the code small, keep the framework out of the browser, and keep the project readable a year from now.

Same component. Two thirds of the code.

Counter.jsx React · 16 lines
import { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  function incrementCount() {
    setCount((count) => count + 1);
  }

  return (
    <>
      <p>Counter: {count}</p>
      <button onClick={incrementCount}>+1</button>
    </>
  );
}
Counter.svelte Svelte · 10 lines
<script>
  let count = $state(0);

  function incrementCount() {
    count++;
  }
</script>

<p>Counter: {count}</p>
<button onclick={incrementCount}>+1</button>

No hooks, no setter functions, no fragment wrappers. You change the value and the compiler works out what has to update. Less code for a human to read is also less code for an agent to get wrong.

Source: component-party.dev, Svelte 5 vs React, “Event click”. Forty more examples there.

What actually ships to the browser

React sends a runtime to every visitor before the first line of your app runs. Svelte compiles components into plain DOM updates at build time, so most of the framework never leaves your machine.

We do not ask you to take that on faith. These are the two scaffolds as their CLIs generate them, built with nothing added: create-next-app for Next.js 16 and sv create for SvelteKit 3. Same measurement on both: one production load in headless Chrome with the cache off, gzip recomputed identically, dependencies and disk counted after a clean install.

This is the cost before you have written a line. Everything you add goes on top of it.

Next.js SvelteKit
JavaScript shipped, gzip 139.2 kB 32.0 kB
JavaScript shipped, raw 468.7 kB 82.3 kB
Dependencies installed 344 54
node_modules on disk 407 MB 72 MB
Scaffold code 294 lines 39 lines