Quick Start
One command to scaffold a new project (no clone needed):
pnpm create harmoni my-project
cd my-project
psql -U postgres -h localhost -c "CREATE DATABASE harmoni;"
pnpm db:migrate
pnpm dev
Web at http://localhost:3000, API at http://localhost:4000/graphql.
Tech Stack
| Layer | Stack |
|---|---|
| Web | React, Vite, MobX, Apollo Client, Tailwind, shadcn-style UI |
| Desktop | Electron (loads web app) |
| API | Express, Apollo Server (GraphQL), WebSocket |
| Data | PostgreSQL (Drizzle ORM), Redis (optional) |
| Shared | Zod schemas, pino logger, TypeScript types |
Project Structure
harmoni/ ├── apps/ │ ├── backend/ # GraphQL API, WebSocket, Drizzle │ ├── web/ # React + MobX + Vite │ └── desktop/ # Electron wrapper ├── packages/ │ ├── shared/ # Types, schemas, logger │ └── create-harmoni/ # Scaffold CLI ├── docs/ ├── scripts/ └── docker-compose.yml
Clone or Template
Other ways to get the code:
- Clone:
git clone https://github.com/h7mei/harmoni.git my-project - GitHub template: Use “Use this template” on the repo
Then run pnpm install and pnpm run setup.
Customization
Rebranding for a different product? Update:
- Package names (
@harmoni/*→@your-scope/*) - Database name in
.envanddocker-compose.yml - Desktop
appIdandproductNamein electron-builder.json - Storage key prefixes in web app
See CUSTOMIZATION.md for the full checklist.
Commands
pnpm dev |
Start web, backend, desktop |
pnpm dev:web |
Web only (port 3000) |
pnpm dev:backend |
API only (port 4000) |
pnpm dev:desktop |
Electron app |
pnpm build |
Build all apps |
pnpm db:migrate |
Run migrations |
pnpm db:generate |
Generate migrations |