Monorepo starter template powered by Bun + moonrepo, with:
apps/web: SolidStart frontend (Vite + Nitro + Solid Router)apps/api: FastAPI backend with Pydantic AI- shared UI/design-system packages under
packages/*
- Monorepo orchestration with moonrepo + Bun workspaces
- SolidStart frontend (
apps/web) with Vite and Nitro - FastAPI backend (
apps/api) using Pydantic AI + Pydantic - OXC + TypeScript for quality and type safety
- Toolchains pinned with proto (
.prototools)
For the complete dependency list (with links), see Dependencies and Tools.
Run everything from the repository root unless an app README says otherwise.
# 1) Install pinned tools from .prototools (proto, moon, bun, python)
proto install
# 2) Install JS/TS dependencies
bun install
# 3) Install API Python dependencies
moon run api:setup
# 4) Verify quality checks
bun run checkapps/
web/ # SolidStart marketing app
api/ # FastAPI + Pydantic AI backend
packages/
ui/ # shared UI components
ds/ # shared design systemMore details:
- Web app:
apps/web/README.md - API app:
apps/api/README.md - UI package:
packages/ui/README.md - Design system package:
packages/ds/README.md
bun run dev # run application-layer dev tasks
bun run build # build application-layer projects
bun run start # start application-layer projects
bun run clean # moon clean --allbun run lint
bun run format:check
bun run typecheck
bun run check # lint + format:check + typecheck
bun run lint:fix
bun run format
bun run fix # lint:fix + format# Web
moon run web:dev
moon run web:build
moon run web:start
# API
moon run api:setup
moon run api:dev
moon run api:start# Single command from repo root
bun run dev
# Or run in separate terminals
# Terminal 1: moon run web:dev
# Terminal 2: moon run api:devbun run dev uses the root script to run all app-level dev tasks together.
Web runs via Vite dev server. API runs via Uvicorn on port 8080.
# Check if a port is in use (e.g., 8080 for API, 3000 for web)
lsof -i :8080
lsof -i :3000
# List all node/python processes running uvicorn or vite
ps aux | grep -E "(uvicorn|vite)" | grep -v grep# Kill process on a specific port
kill -9 <PID>
# Or use pkill to kill by process name
pkill -f "uvicorn src.main:app" # API
pkill -f "vite" # Web
# Kill all node processes (if needed)
pkill -f "node"- Address already in use: Port is still held by a previous process. Find and kill it with
lsof -i :<port>. - Multiple dev servers: Running
bun run devormoon run :devstarts all apps - usemoon run api:devormoon run web:devto run a single app.
- π’ Bun - JS runtime, package manager, and workspace command runner
- π Moon - task orchestration and project graph
- βοΈ Proto - pinned toolchain management via
.prototools - βοΈ SolidStart - full-stack app framework for
apps/web - π§© SolidJS - reactive UI library
- π Solid Router - routing for Solid apps
- β‘ Vite - dev server and build tooling
- π₯ Nitro - server runtime used by SolidStart
- π§Ή OXC (
oxlint+oxfmt) - linting and formatting - π¦ TypeScript - static typing and project references
- π Python - backend runtime (version pinned in
.prototools) - π¦ uv - Python dependency and environment management
- π FastAPI - API framework
- π€ Pydantic AI - AI agent framework for backend AI features
- β Pydantic - schema validation and data modeling
- βοΈ pydantic-settings - environment-driven settings
- π Uvicorn - ASGI server
- Tool/version pins:
.prototools - Workspace root scripts:
package.json - Moon workspace graph + VCS:
.moon/workspace.yml - Moon toolchains:
.moon/toolchains.yml - Shared app tasks:
.moon/tasks/app.yml - Shared lib tasks:
.moon/tasks/lib.yml - Root moon config:
moon.yml - TypeScript project graph:
tsconfig.json - Shared TypeScript options:
tsconfig.options.json - OXC formatter config:
.oxfmtrc.json - OXC linter config:
.oxlintrc.json
# list outdated packages across workspaces
bun outdated --recursive
# update within semver ranges
bun update --recursive
# update to latest versions
bun update --recursive --latest# sync dependencies from pyproject/lock
cd apps/api
uv sync
# add a dependency
uv add <package># install or update pinned tools
proto install
# check for newer versions
proto outdated
# pin a specific version
proto pin <tool> <version>