Self-hosted fullstack service template — CLI + API + GUI in one package.
| Layer | Choice |
|---|---|
| GUI | Vite + React + shadcn/ui + Tailwind |
| API | Express (serves SPA + REST) |
| CLI | Commander (shares core logic with API) |
| Deploy | Docker Compose → Dokploy |
| Expose | Tailscale svc:xxx |
| Package | pnpm |
GUI → fetch(/api/xxx) → API → core logic
CLI → core logic (direct import)
src/
├── core/ # Shared business logic (CLI + API both import)
├── server/ # Express API server + static file serving
├── cli/ # CLI entry point (commander)
└── web/ # Vite SPA (React + shadcn/ui)
# Install dependencies
pnpm install
# Start dev server (API + Vite HMR proxy)
pnpm dev # API on :3900
# In another terminal:
npx vite # Vite dev on :5173, proxies /api to :3900
# Build everything
pnpm build
# Start production server
pnpm start
# Use CLI
pnpm cli health
pnpm cli info
pnpm cli serve --port 3900docker compose up -d# Create service in Tailscale admin console first:
# https://login.tailscale.com/admin/services → Create "selfhosted-template"
tailscale serve --service=svc:selfhosted-template --bg --https 443 http://localhost:3900pnpm build:server
npm link # or: pnpm link --global
# Now available as: selfhosted-template-cli- Clone/fork this repo
- Search-replace
selfhosted-templatewith your service name - Replace
fullstack-selfhostedwith your package name - Add your business logic to
src/core/ - Add API routes to
src/server/routes/ - Build your GUI in
src/web/