E
EMS Platform
Enterprise Employee Management System

The employee lifecycle, from hire to retire.

A multi-tenant, event-driven HR platform. An employee is simply the next lifecycle state of a candidate — so onboarding, compliance, compensation, documents, and approvals all live in one auditable system of record.

30+
Backend modules
11
Background workers
15
Architecture ADRs
100%
Tenant-scoped

Built like a system of record

Every write is transactional, historized, and emits a domain event. Nothing is ever hard-deleted.

Multi-tenant SaaS

Shared-schema isolation with tenantId on every collection, index, event, and cache key. Cross-tenant reads are architecturally impossible.

RBAC + ABAC

Roles, permission bindings, and scoped grants (self, reports, department, tenant) enforced server-side on every endpoint.

Workflow engine

Versioned templates → definitions → executions with approver resolution, delegation, quorum, and SLA escalation.

Compliance built-in

Visa & certification expiry sweepers fire T-90/60/30/7 alerts. I-9 tracking, retention policies, and GDPR erasure.

Field-level encryption

SSN and other PII sealed with AES-256-GCM at rest. Segregated read permissions and a fully audited reveal path.

Reports & dashboards

Role-tailored dashboards and a catalog of reports with PII masking and watermarked CSV exports.

Event-driven core

Transactional outbox → Kafka fan-out to audit, activity timeline, notifications, projections, and signed webhooks.

Immutable history

Every master collection has a paired history collection. Effective-dated reads let you time-travel to any point.

ATS-aligned

Same identity, org, auth, and event contracts as the recruiting platform — a future merge is integration, not migration.

One person, one timeline

The same personId flows from the ATS through every stage — a merge, not a migration.

Lead
Candidate
Offer
Hire
Onboarding
Active
Exit

ATS owns acquisition · EMS owns everything after Hire

Explore the platform

Jump straight into the dashboard, browse the employee directory, or read the live OpenAPI reference.