A modern web app starter — React + TypeScript + Vite on the frontend, Hono + Neon + Clerk + Drizzle on the backend, with sensible defaults for styling, data fetching, and hosting. Every layer is independently replaceable — swap one piece without rewiring the rest.
# GitHub CLI (for cloning private repos)
brew install gh
gh auth login
# pnpm (package manager)
brew install pnpmgh repo clone webventurer/app-starter
./app-starter/scripts/create.sh my-appThis creates a new my-app/ directory alongside the starter (../my-app relative to this repo) and scaffolds a Vite + React + TypeScript project, installs all dependencies, initialises shadcn/ui (Radix + Nova), sets up Biome, and copies the reference docs into it.
This project uses codefu for AI-assisted development skills and commands. Add if not already cloned:
gh repo clone webventurer/codefu
add-codefu.sh # if not there already
gh repo clone webventurer/app-starter
cd app-starter| File | What it is | When to read it |
|---|---|---|
scripts/create.sh |
Automated setup script — scaffolds Vite, installs deps, configures Tailwind, shadcn/ui, and Biome | You don't — just run it |
package.json |
Declarative dependency list for the full stack — the script copies this into your new project | When you want to see exactly what gets installed |
stack.md |
The why — explains every technology choice, what we considered, and what we rejected | Before starting a project, to understand the decisions |
tech-spec.md |
The how — project structure, config snippets, environment variables, deployment steps | During development, as a reference guide |
TanStack React Query is included from day one because it pays for itself almost immediately. The moment you have two or three API calls, you'd otherwise be hand-rolling useState + useEffect + try/catch for loading and error states in every component. React Query replaces all of that with a single useQuery hook and gives you caching, deduplication, and background refetching for free. Since this starter already has a real backend (Hono + Drizzle + Neon), every app will be fetching data from the start — React Query means you never write the boilerplate.
- Create a
.envfile (see tech-spec.md for the full list of variables) - Set up your project structure (see tech-spec.md for the directory layout)
Config files (vite.config.ts, drizzle.config.ts, vitest.config.ts, src/lib/query-client.ts, src/lib/db.ts, server/index.ts) are copied automatically by the create script.
These are not in package.json — add them only when needed:
# Typography — polished, branded feel (Vercel's Geist font)
pnpm add @fontsource-variable/geist
# then add to src/main.tsx: import "@fontsource-variable/geist";
# and set in src/index.css: font-family: "Geist Variable", sans-serif;
# State management — when useState outgrows local state
pnpm add zustand- stack.md — the rationale behind every technology choice
- tech-spec.md — the actionable setup guide