Getting started
Scaffold a new app with the constraint-first defaults already in place:
npm create gomani@latest my-app
cd my-app
npm install
gomani dev
The starter ships a zero-JavaScript-by-default page, one interactivity island, the Savanna design system, a passing accessibility + budget gate, and an installable offline PWA.
Your first island
Everything renders to static HTML until you declare interactivity. Only islands contribute to the shipped-and-executed budget.
import { island } from '@gomani/core';
import { signal } from '@gomani/signals';
export default island(function Counter() {
const count = signal(0);
return <button onClick={() => count.value++}>Tapped {count} times</button>;
});
Ship within budget
gomani build # SSG + code-split, gated by budgets/a11y/boundaries
gomani budget check # the standalone budget gate for CI
If a dependency quietly doubles a route's weight, the build goes red at merge time — not in production.