@abduljamac/create-mono-init
v0.3.1
Published
CLI to scaffold a Turborepo monorepo with API, web, mobile app, and shared packages
Maintainers
Readme
create-mono-init
A CLI scaffolding tool that generates opinionated pnpm + Turborepo monorepos in one command.
Usage
pnpm dlx @abduljamac/create-mono-initOr with npx:
npx @abduljamac/create-mono-initYou'll be prompted to choose:
- Project name — the folder to create
- Project type:
- (Barebone) Web + API — minimal Next.js + Express apps with root tooling
- Web + API — Next.js + Express
- App + API — Expo (with NativeWind) + Express
- Full monorepo — Next.js + Expo + Express
- Install dependencies — runs
pnpm install - Initialize git — runs
git init
You can also choose the project type non-interactively:
pnpm dlx @abduljamac/create-mono-init my-project --kind barebones --description "My app"
pnpm dlx @abduljamac/create-mono-init my-project --barebones --description "My app" --no-install --no-gitWhat you get
Opinionated modes
my-project/
├── apps/
│ ├── api/ # Express API (TypeScript, tsx watch)
│ ├── web/ # Next.js (App Router, Tailwind)
│ └── app/ # Expo (NativeWind / Tailwind)
├── packages/
│ └── shared/ # Shared TypeScript types across all apps
├── turbo.json # Turborepo pipelines (dev, build, check, format)
├── biome.json # Biome linting & formatting
├── pnpm-workspace.yaml
├── .npmrc
├── AGENTS.md # AI/LLM project guidelines (the source of truth)
├── CLAUDE.md # Points to AGENTS.md (Claude Code)
└── COPILOT.md # Points to AGENTS.md (GitHub Copilot)Apps included depend on the project type you choose. In the opinionated Web/App/Full modes, the packages/shared package is included — it contains shared TypeScript types (API response shapes, etc.) that keep your API contracts in sync across apps. Import from any app with:
import type { HelloResponse } from "shared";Barebone mode
Barebone mode keeps the root Turborepo/Biome setup but skips the opinionated app folders, shared package, tests, middleware, routes, and generated coding rules.
my-project/
├── apps/
│ ├── api/
│ │ └── src/index.ts # Minimal Express listener
│ └── web/
│ └── app/page.tsx # Hello world page
├── packages/ # Empty
├── turbo.json
├── biome.json
├── pnpm-workspace.yaml
├── .npmrc
├── AGENTS.md # Empty
└── CLAUDE.md # Points to AGENTS.mdThe barebone API starts with:
app.listen(port, () => {
console.log(`[api] listening on http://localhost:${port}`);
});The barebone web page starts with:
export default function Page() {
return <h1>Hello world</h1>;
}Stack
- Monorepo: Turborepo + pnpm workspaces
- API: Express + TypeScript + tsx
- Web: Next.js (App Router, Tailwind CSS)
- App: Expo + NativeWind (Tailwind for React Native)
- Linting/Formatting: Biome
Development
pnpm install
pnpm build # Build the CLI
pnpm dev # Watch modeTesting locally
After making changes, you can test the CLI locally without publishing to npm:
# Build the CLI
pnpm build
# Run it directly
node dist/index.js
# Or link it globally so you can run it by name
pnpm link --global
create-mono-init
# When done, unlink it
pnpm unlink --globalPublishing
Changes on GitHub do not auto-publish to npm. To publish a new version:
# Bump the version
npm version patch # or minor / major
# Build and publish
pnpm build
npm publish --access public