Bit of a personal itch-scratch post — curious if anyone else runs into the same thing.
Every time I kick off a new React project I end up doing the same hour of setup: wire TypeScript strict mode, add Tailwind, pick a UI library, set up routing, build an API layer, configure ESLint, add path aliases… It’s not hard, just boring. And I kept making slightly different decisions each time, so projects never felt consistent.
So I spent some weekends building a CLI that does all of that for me: create-modern-react
npx create-modern-react my-app
cd my-app
yarn dev
The defaults I landed on after a few real projects:
- React 19 + TypeScript 5.9 strict
- Vite with SWC (noticeably faster than Babel for larger codebases)
- Tailwind CSS 4
- shadcn/ui for components (Button, Input, Card, Skeleton already wired)
- Wouter for routing — it’s 2KB vs React Router’s much larger bundle, and I’ve found it covers 95% of what I need
- Axios with a typed wrapper so API calls look like
getApi<User[]>('/users')instead of raw fetch wrangling - React Hot Toast, Error Boundary, and
~/path aliases included
A few hooks I kept copy-pasting between projects are baked in too: useLoader, useDebounce, useCancelToken.
During setup the CLI asks if you want Redux Toolkit, React Hook Form + Zod, Ant Design instead of shadcn, or Husky for git hooks. Nothing gets added unless you ask for it.
I’ve used it as the base for a couple of my own projects now (a resume builder and an e-commerce frontend) and it’s held up well. But I’m aware my defaults are just my defaults — other people’s setups will differ.
Curious what you all think:
- Is Wouter a dealbreaker for you, or do you default to React Router anyway?
- Any obvious gaps in that stack that you always end up adding yourself?
- Would you swap anything out?
GitHub if you want to poke around:
Happy to answer questions or take suggestions — it’s MIT and still pretty early.