Build fast. Ship lean.
A full-stack web microframework — five tools, zero bloat.
bunx degit TekkadanPlays/spore my-app
cd my-app && bun install
bun run build && bun run devOpen http://localhost:3000.
| Layer | Tool | Why |
|---|---|---|
| Runtime | Bun | Fastest JS runtime. Bundles, serves, installs — in milliseconds. |
| Server | Hono | Ultra-fast routing, middleware, and static files in 14KB. |
| UI | InfernoJS | Fastest virtual DOM. React-compatible API at a fraction of the size. |
| Components | Blazecn | 49 shadcn/ui-compatible components — no React, no Radix. |
| State | Preact Signals | Fine-grained reactivity. No providers, no selectors — just .value. |
| Styling | Tailwind CSS v4 | OKLCH color system, utility-first, compiles in 56ms. |
src/
├── server.ts Hono server — routes, APIs, static files
├── template.ts HTML shell with theme-flash prevention
├── signals.ts Reactive state layer (Preact Signals)
├── styles.css Tailwind v4 + design tokens (light/dark)
└── client/
├── entry.ts Client entry — mounts Inferno
└── App.ts Your application
| Command | What it does |
|---|---|
bun run dev |
Start server with file-watch restart |
bun run dev:css |
Watch and rebuild CSS on file changes |
bun run build |
Build CSS + client bundle for production |
bun run start |
Start production server |
Server — Hono serves an HTML shell at GET * and JSON APIs at /api/*. Static assets from public/.
Client — Bun bundles src/client/entry.ts into a single JS file. InfernoJS mounts your app. Blazecn provides the design system.
State — Preact Signals live outside the component tree. A SignalBridge component subscribes via effect() and triggers surgical Inferno re-renders:
import { signal, computed } from '@preact/signals-core';
const count = signal(0);
const doubled = computed(() => count.value * 2);
// Only re-renders this subtree when count changes:
S(() => createElement('span', null, count.value))Theming — Light and dark mode via OKLCH design tokens in styles.css. The ThemeToggle component from Blazecn handles persistence.
MIT