Daily Development
Once the one time setup is done, daily work on Dashify is a rhythm of three or four commands. This page lists every command you will reach for and explains what it does.
Start the stack
pnpm dev
Brings up the whole platform, databases, caches, AI services, API, worker, and the browser app, in one go via Docker Compose. Logs from every service stream into your terminal. Hit Ctrl+C to stop.
Stop the stack
pnpm dev:down
Stops the containers but keeps their volumes (so your database survives restart).
Bring up only the helper services (Qdrant + Ollama)
pnpm up
Useful when you have already installed Node deps and just want the supporting stack online. Also re-pulls AI models if missing.
pnpm down
Stops only Qdrant and Ollama, leaving the rest running.
Run the API and the client without Docker
Some tasks (debugging with breakpoints, attaching the editor's TypeScript server) are easier when the API and client run directly on your host. To do that:
# Terminal 1, bring up just the databases
docker compose up mongo redis qdrant ollama mailhog
# Terminal 2, start the API
pnpm --filter @dashify/server run server
# Terminal 3, start the worker
pnpm --filter @dashify/server run worker
# Terminal 4, start the browser app
pnpm --filter @dashify/client run dev
This is heavier on your terminal real estate but makes hot-reload and breakpoints feel instant.
Linting and formatting
pnpm format # Prettier across the whole repo
pnpm format:check # CI mode, fails on unformatted files
pnpm lint # ESLint across all packages
pnpm lint:server # only the API
pnpm lint:client # only the browser app
A pre-commit hook (managed by Husky) runs Prettier and ESLint automatically on staged files. You usually do not need to run these by hand.
Tests
pnpm test # all packages
pnpm test:server # only the API
Server tests cover the integration layer with real MongoDB and Redis (via Testcontainers) and use Vitest as the runner. Client tests use Vitest + React Testing Library; end to end flows live in Playwright.
Documentation site
You are reading the documentation site right now, but to run it locally:
pnpm docs:dev # http://localhost:3001
pnpm docs:build # produce a static site
pnpm docs:serve # serve the built site locally
The docs site lives in /docs-site/ and uses Docusaurus.
Deploy commands
Two convenience scripts at the root rebuild and restart the API or the client without bringing the whole stack down:
pnpm deploy:backend # rebuild + restart api + worker
pnpm deploy:frontend # rebuild + restart web
Each script stops the relevant service, removes its container and image, rebuilds from scratch with --no-cache, and starts it again detached. Useful when a Dockerfile or build-time dependency has changed.
A typical workflow
Where things live
| Folder | Contains |
|---|---|
client/src/pages/ | The route-level React pages |
client/src/components/ | Reusable UI pieces |
client/src/api/ | API clients (RTK Query slices) |
server/src/routes/ | Route definitions |
server/src/controllers/ | Route handlers |
server/src/services/ | Business logic |
server/src/models/ | Mongoose schemas |
server/src/middleware/ | Auth, CSRF, tenant scoping, etc. |
server/src/docs/ | Swagger/OpenAPI definitions |
docs-site/docs/ | This documentation |
Key takeaways
pnpm devis your everyday command.pnpm deploy:backendandpnpm deploy:frontendrebuild a single tier without touching the rest.- Pre-commit hooks keep formatting and linting honest automatically.
- The docs site runs independently with
pnpm docs:dev.