{"id":50594699,"url":"https://github.com/wardvisual/wardsuite","last_synced_at":"2026-06-05T13:01:27.774Z","repository":{"id":357100665,"uuid":"1234586402","full_name":"wardvisual/wardsuite","owner":"wardvisual","description":"Modular ERP for growing operations.","archived":false,"fork":false,"pushed_at":"2026-05-11T11:13:21.000Z","size":1341,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T11:29:04.004Z","etag":null,"topics":["erp","erp-application","firestore","modular-architecture","monorepo","nodejs","nx-workspace","reactjs"],"latest_commit_sha":null,"homepage":"https://suite.wardvisual.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wardvisual.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-10T11:33:50.000Z","updated_at":"2026-05-11T11:13:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wardvisual/wardsuite","commit_stats":null,"previous_names":["wardvisual/wardsuite"],"tags_count":null,"template":false,"template_full_name":"google-gemini/aistudio-repository-template","purl":"pkg:github/wardvisual/wardsuite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wardvisual%2Fwardsuite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wardvisual%2Fwardsuite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wardvisual%2Fwardsuite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wardvisual%2Fwardsuite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wardvisual","download_url":"https://codeload.github.com/wardvisual/wardsuite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wardvisual%2Fwardsuite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33942436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erp","erp-application","firestore","modular-architecture","monorepo","nodejs","nx-workspace","reactjs"],"created_at":"2026-06-05T13:01:26.790Z","updated_at":"2026-06-05T13:01:27.700Z","avatar_url":"https://github.com/wardvisual.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WardSuite ERP\n\n\u003e A modular ERP for growing operations, built in public.\n\nWardSuite is a personal ERP built from frustration with existing tools that are either too expensive, too rigid, or missing the cross-module visibility that operations teams actually need. Starting with CRM and Supply Chain, expanding toward a full business operating system.\n\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-suite.wardvisual.com-white?style=for-the-badge)](https://suite.wardvisual.com)\n\n![WardSuite ERP](https://github.com/wardvisual/wardsuite/blob/main/public/banner.jpg?raw=true)\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|---|---|\n| Frontend | React 19, Vite 6, Tailwind CSS v4 |\n| Animations | Motion (Framer Motion v12) |\n| State | Zustand 5 (persisted) |\n| Backend | Express 4, TypeScript, tsx |\n| Database | Firestore (Firebase Admin SDK) — repository pattern, swappable |\n| Drag \u0026 Drop | @hello-pangea/dnd |\n| Tables | TanStack Table v8 |\n| Monorepo | NX |\n| Build | Vite (web) + esbuild (API) |\n| Deployment | Docker + PM2 |\n\n---\n\n## Monorepo Structure\n\n```\nwardsuite/\n├── apps/\n│   ├── web/                   # React SPA (Vite + Tailwind)\n│   └── api/                   # Express API server\n│\n├── libs/\n│   ├── shared/\n│   │   ├── types/             # @wardsuite/shared/types\n│   │   ├── utils/             # @wardsuite/shared/utils\n│   │   ├── auth/              # @wardsuite/shared/auth (Zustand store)\n│   │   └── ui/                # @wardsuite/shared/ui (design system)\n│   │\n│   └── crm/\n│       ├── domain/            # @wardsuite/crm/domain (entities + DTOs)\n│       ├── data-access/       # @wardsuite/crm/data-access (repos + adapters)\n│       ├── feature-leads/     # @wardsuite/crm/feature-leads\n│       ├── feature-customers/ # @wardsuite/crm/feature-customers\n│       └── ui/                # @wardsuite/crm/ui\n│\n├── CLAUDE.md\n├── tsconfig.base.json\n├── nx.json\n├── Dockerfile\n├── docker-compose.yml\n└── ecosystem.config.js\n```\n\n---\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 22+\n- Firebase project with Firestore enabled\n- Service account key (for Admin SDK)\n\n### 1. Clone and Install\n\n```bash\ngit clone https://github.com/wardvisual/wardsuite.git\ncd wardsuite\nnpm install\n```\n\n### 2. Environment Variables\n\nCreate `.env` at the workspace root:\n\n```env\nPORT=3000\nNODE_ENV=development\n\nFIREBASE_PROJECT_ID=your-project-id\nFIREBASE_CLIENT_EMAIL=your-service-account@project.iam.gserviceaccount.com\nFIREBASE_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\nFIREBASE_DATABASE_ID=\n\nVITE_FIREBASE_API_KEY=\nVITE_FIREBASE_AUTH_DOMAIN=\nVITE_FIREBASE_PROJECT_ID=\nVITE_FIREBASE_STORAGE_BUCKET=\nVITE_FIREBASE_MESSAGING_SENDER_ID=\nVITE_FIREBASE_APP_ID=\nVITE_FIREBASE_DATABASE_ID=\n```\n\n### 3. Development\n\n```bash\nnpm run dev        # API (:3000) + Vite (:5173) in parallel\nnpm run dev:api    # API only\nnpm run dev:web    # Frontend only (proxies /api → localhost:3000)\n```\n\n### 4. Seed Demo Data\n\n```bash\nnpm run firebase:seed\n```\n\n---\n\n## Demo Credentials\n\n| Email | Password | Role |\n|---|---|---|\n| admin@wardsuite.com | admin123 | ADMIN |\n| manager@wardsuite.com | manager123 | MANAGER |\n| staff@wardsuite.com | staff123 | STAFF |\n\n---\n\n## Modules\n\n### CRM\n| Feature | Status |\n|---|---|\n| Leads | ✅ Kanban + table, CSV import with column mapper, drag-and-drop status |\n| Customers | ✅ Full CRUD, convert from lead |\n| Pipeline | ✅ Deal Kanban, drag-and-drop stage transitions, revenue totals per stage |\n| Activities | ✅ Timeline log with type filters, automatic audit trail |\n| Dashboard | ✅ Live revenue stats, 12-month chart, conversion metrics |\n\n### SCM\n| Feature | Status |\n|---|---|\n| Suppliers | ✅ Supplier management, status tracking |\n| Products | ✅ Product catalog with stock levels and reorder alerts |\n| Purchase Requests | ✅ Request lifecycle management |\n| Stock Movements | ✅ Inbound/outbound inventory tracking |\n\n---\n\n## Roadmap\n\n### CRM\n- [x] Lead CRUD with kanban and status pipeline\n- [x] Lead-to-customer conversion with audit trail\n- [x] Customer full CRUD\n- [x] Deal pipeline with drag-and-drop stage management\n- [x] Activities/timeline log\n- [x] Dashboard with live revenue analytics\n- [x] Automatic audit trail on all CRM mutations\n- [ ] Lead scoring (Low / Medium / High / Hot)\n- [ ] Customer segments / tags\n- [ ] Deal probability % and weighted pipeline value\n- [ ] Bulk lead import validation and error reporting\n- [ ] Lead assignment between team members\n- [ ] Deal close date notifications / overdue alerts\n- [ ] Full-text search across leads, customers, deals\n\n### Pipeline \u0026 Revenue\n- [ ] Revenue forecast view\n- [ ] Win/loss reason tracking\n- [ ] Deal history log\n- [ ] Duplicate lead detection on import\n- [ ] Customer LTV calculation\n\n### Notifications\n- [ ] In-app notifications\n- [ ] Email integration (SendGrid / Resend)\n- [ ] Activity reminders\n\n### Reporting\n- [ ] CRM analytics (conversion funnel, lead source breakdown)\n- [ ] Exportable reports (PDF / CSV)\n- [ ] Team performance dashboard\n\n### Auth\n- [ ] Role-based field visibility\n- [ ] Invite by email\n- [ ] Password change and session management\n- [ ] 2FA (TOTP)\n\n---\n\n## Architecture\n\n### Repository Pattern\n\nServices code against interfaces, not concrete classes. Swapping Firestore for Postgres means implementing the interface — no changes to service code.\n\n```typescript\nexport interface ILeadRepository {\n  findAll(): Promise\u003cLead[]\u003e;\n  create(dto: CreateLeadDto, actorId?: string): Promise\u003cLead\u003e;\n}\n\n// Today\nconst repo = new FirestoreLeadRepository(db);\n// Future\nconst repo = new PostgresLeadRepository(pgClient);\n```\n\n### Audit Trail\n\nEvery CRM mutation (create, update, delete, stage change) is logged automatically:\n\n```\nLead \"Acme Corp\" (LD-042) created from source: referral.\nDeal \"Q3 Renewal\" moved from \"proposal\" → \"won\".\nCustomer \"TechBase Ltd\" updated — status \"inactive\" → \"active\".\n```\n\n### Auth Flow\n\n```\nPOST /api/auth/login → { token, user }\n  → stored in Zustand (localStorage persist)\n  → injected as Bearer token on every request\n  → 401 auto-clears session + redirects to /login\n```\n\n---\n\n## Deployment\n\n```bash\n# Docker\nnpm run docker:build\nnpm run docker:up\n\n# PM2\nnpm run build\nnpm run start:pm2\n```\n\n---\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `npm run dev` | API + Vite dev servers in parallel |\n| `npm run build` | Build frontend + bundle API |\n| `npm run lint` | TypeScript type check |\n| `npm run firebase:seed` | Seed Firestore with demo data |\n| `npm run docker:up` | Start Docker containers |\n| `npm run start:pm2` | Start with PM2 in cluster mode |\n\n---\n\n## Author\n\n**Eduardo** — [@wardvisual](https://github.com/wardvisual)\n\n## License\n\n[MIT](./LICENSE) © 2025 Eduardo\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwardvisual%2Fwardsuite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwardvisual%2Fwardsuite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwardvisual%2Fwardsuite/lists"}