Skip to content

Enterprise Systems

Self-hosted employee attendance, work assignment and CRM software: how Zulivio models workflow

Zulivio is self-hosted workforce software with employee records, attendance as a state machine, guarded work assignments and a sales CRM. How its rules, roles and sessions are designed.

By · Published · 6 min read

Short answer: Zulivio is a self-hosted workforce-operations platform: employee records, attendance, work assignments, a live master dashboard and a sales CRM pipeline, running on the company's own server. It is open source under AGPL-3.0.

What problem does it address?

Growing teams track people, attendance and work in spreadsheets plus a per-seat CRM. The data drifts between tools and the employee list ends up in someone else's cloud. Zulivio keeps employees, assignments, attendance sessions, leads and opportunities as related records in one database.

Why is attendance modelled as a state machine?

A person cannot end a break they did not start, and the system should refuse that instead of recording nonsense. Attendance has explicit states for logged out, working and on break, with guarded transitions so an impossible work history cannot be recorded. Work assignments have their own status-transition guard. Expressed as rules, invalid actions fail at the boundary and tests have something precise to assert.

Who can do what?

Employees are created, edited, reset and removed under role-based control. NestJS guards and decorators express the role hierarchy, and role checks happen on the server and not just in the interface.

How are logins and sessions protected?

Passwords use Argon2id. Sessions are opaque server-side tokens rather than irrevocable JWTs, so resetting or removing an employee can revoke their access immediately. A same-origin proxy means the browser uses a first-party session cookie and the backend stays behind the web service.

What is the architecture?

A pnpm and Turborepo monorepo: a NestJS REST API, a Next.js frontend and PostgreSQL with Prisma. Shared TypeScript contracts live in a package imported by both sides, so when a field changes, the frontend and backend fail type-checking together instead of silently diverging. TanStack Query manages server state and invalidates the right queries after a mutation, so the dashboard, employee list and assignment view stay in agreement.

How do I install and move data?

A one-click installer checks for Docker, generates a database password if needed, starts the stack and waits for the backend health check. Re-running it after an update rebuilds the services without touching existing data. CSV and Google Sheets import and export move records in and out.

What is honestly in scope?

Zulivio is a deliberately bounded slice of a larger roadmap, and the repository separates what exists today from future plans. A roadmap is not a feature list. See the Zulivio case study for the full detail.

References

Author

Raktim Ranjit is a software engineer and the founder of NodeDR Infotech. He builds and maintains the software described here.

Have something in mind?

Let’s build something useful.

Tell me about the idea, product, or workflow you’re working through.

Tap to say hello