Budgets, enforced
Per-route byte and JavaScript ceilings live in your source. The build fails when a route regresses past its limit — a heavy dependency is caught at merge time, not in production.
Gomani makes applications that work on slow, intermittent networks and low-cost, shared devices the natural output of ordinary development — not the reward for exceptional discipline. Enforced budgets, zero-JavaScript-by-default islands, offline-first data, and mobile-money payments, by default.
Everything the prevailing paradigm leaves to your memory, Gomani moves into its defaults.
What you carry today
What Gomani defaults
Per-route byte and JavaScript ceilings live in your source. The build fails when a route regresses past its limit — a heavy dependency is caught at merge time, not in production.
A page is inert HTML plus a stylesheet — the cheapest thing to deliver and run. Interactivity is added surgically as islands, resumed on demand, so unreached code is never downloaded or executed.
Responsive design for the network, not the viewport. A defensive, multi-input signal serves text-first layouts and deferred imagery on constrained links — with a user-owned data-saver override.
The device is the source of truth, the network opportunistic. Optimistic writes, an offline mutation queue, conflict-free merge, and encryption at rest — the client and server halves in one framework.
The African payment reality is mobile money, not cards. A provider-agnostic, idempotent payment engine survives a dropping connection without double-charging — and holds no funds.
Bulkheads, circuit breakers, and degraded-mode contracts as primitives — chase fault isolation, not microservices. One authoring surface, a topology spectrum from single process to split workers.
Interactivity is added surgically as islands. Only what you declare interactive ships JavaScript — and it’s resumed just-in-time, on hover, viewport entry, or interaction, so unreached code is never downloaded or executed.
import { island } from '@gomani/core';
import { signal } from '@gomani/signals';
// ships ZERO JavaScript until the button is
// actually reached — resumed on interaction.
export default island(function Counter() {
const count = signal(0);
return (
<button onClick={() => count.value++}>
Tapped {count} times
</button>
);
});
Minimal at the edge, integrated underneath — every package ships under an enforced size budget.
The budget you carried alone, the stack you assembled alone, the inclusions you were left to remember alone — none of these were ever meant to be yours to carry by discipline.