Welcome to Skateboard
A React starter with auth, Stripe, shadcn/ui, and SQLite β ship your app in minutes
What is Skateboard?
Skateboard is a production-ready React starter built on an Application Shell Architecture: the shell (@stevederico/skateboard-ui) owns routing, auth, layout, and build utilities, so your app code is just routes, views, and config. Everything you need to ship a modern web app is included:
- β‘ React 19 with Vite 8 for fast development (SWC, no Babel)
- π¦ TypeScript end-to-end (frontend and backend) β strict typecheck (
tsc --noEmit) gates builds and tests, with no separate build step (Vite/esbuild transpiles) - π¨ Tailwind CSS v4 with Shadcn/ui components from skateboard-ui
- π Authentication β native HS256 JWT in HttpOnly cookies, CSRF protection, scrypt password hashing (zero external auth deps)
- π³ Stripe integration for checkout, the customer portal, and webhooks
- ποΈ Multi-database backend on Hono β SQLite by default, with PostgreSQL and MongoDB adapters
- π± Responsive layout with a mobile-ready sidebar and TabBar
- π Dark mode with system detection
- π‘οΈ Protected routes, account lockout, and usage tracking for free-tier limits
Quick Start
npx create-skateboard-app
Thatβs it β your app is now running at http://localhost:5173 with the frontend, a complete authentication system, Stripe integration, and beautiful UI components.
To run the frontend and backend together during development:
npm run start # Frontend (Vite :5173) + backend (Hono :8000)
npm run front # Frontend only
npm run server # Backend only
Why Skateboard?
β° Save Time β Skip the boilerplate and focus on your unique features
π‘οΈ Battle-tested β Built with security and best practices in mind
π¨ Beautiful β Modern design system with dark mode, driven by semantic tokens
π± Mobile-first β Responsive design that works on every device
π§ Customizable β Convention over configuration, with escape hatches everywhere
Updating the Boilerplate
Skateboard ships an update script that syncs only boilerplate-owned files (backend/server.ts, backend/adapters/*, vite.config.ts, Dockerfile, and more) and never touches your constants.json, components, or env:
node scripts/update-skateboard.js # interactive β diff per file
node scripts/update-skateboard.js --yes # apply all without prompts