PulseHR
Multi-Tenant Workforce Management Platform
Ongoing
- Full-Stack Developer
- Personal
- Web, 2026
- Next.js, TypeScript, Shadcn UI, TanStack Query, Express, Drizzle ORM, PostgreSQL, Redis, Turborepo
PulseHR is a multi-tenant HRM SaaS built to explore real SaaS architecture: JWT auth, tenant isolation, RBAC across an admin dashboard and employee self-service (ESS) portal, an event-driven attendance pipeline, and a platform operator console for tenant lifecycle, plans, billing, and feature flags.
Objective
I built PulseHR to practice the hard parts of a real SaaS product: isolating tenant data, splitting day-to-day HR work from platform operations, and modeling attendance as an event pipeline instead of a single table. The goal was a complete system I could run, demo, and keep extending.
Tasks I have done
- Product ideation, domain modeling, and monorepo architecture with Turborepo
- Full-stack development of the admin dashboard, ESS portal, and platform console
- Express REST API with JWT auth, tenant isolation, and RBAC
- Event-driven attendance pipeline (punches → sessions → daily summaries)
- Shift and roster scheduling with exception handling and approval workflows
- Platform operator flows for tenants, subscription plans, billing, monitoring, and feature flags
- OpenAPI documentation for the modular REST API
Live demos
- App — admin dashboard and employee portal
- Platform console — operator / SaaS console
Features
- Multi-tenant SaaS with JWT auth, tenant isolation, and role-based access control
- Admin dashboard for HR modules, reporting, and complex data tables
- Employee self-service (ESS) portal for day-to-day HR actions
- Attendance engine — event-driven pipeline from punches to sessions to daily summaries
- Shift and roster scheduling with exception handling and approval workflows
- Platform operator console for tenant lifecycle, subscription plans, billing, monitoring, and feature flags
- Modular REST API with OpenAPI documentation
Architecture
Attendance pipeline: immutable punch events are aggregated into sessions, then rolled into daily summaries, with shift/roster rules and approval workflows on top.



