Zenith HR
00:00:00 ISTSign in

DeparturesAsia/Kolkata

Everything the company owes someone, and when.

Zenith HR runs the people operations of one company — payroll, leave, attendance, hiring, reviews — on a schedule it keeps itself. Below is that schedule. Not a diagram of one: the eight expressions that actually fire, read in the timezone they fire in.

Scheduled operations, with the next time each one runs in India Standard Time.
DepartsOperationNext run
06:00MARK ABSENTYesterday's un-punched working days closed as absentEvery day
06:30ACCRUE LEAVEThe month's accrual credited to every balance1st of the month
07:00CARRY FORWARDBalances rolled into the new leave year, capped per policy1 January
11:30SEND REPORTSSaved reports mailed to the people who asked for themEvery day
12:30OPEN SURVEYSAny recurring survey whose next occurrence is dueEvery day
14:30CHASE APPROVALSApprovers sitting on pending leave requestsEvery day
15:30CHASE REVIEWSReviews not yet submitted in an open cycleEvery day
15:30NUDGE GOALSOwners of goals whose progress has gone staleMondays

RunningEmail queue drains every 10 minutes*/10 * * * *

Schedules live in Postgres under pg_cron, stored in UTC and shown here in IST. The times are the organization’s, not yours.

The reporting lineSample

One request, moving

Leave, expense claims and attendance corrections all travel up the reporting line. Each state change below is one Postgres function, not a sequence of application writes — so a request cannot be approved without its balance moving, and it cannot come to rest half-approved.

AtEventState
09:14Casual leave applied for, 3 daysR. Iyer, EngineeringPending
09:14Balance checked: 11.5 days availableapply_leave_request()Held
11:02Approved at level 1S. Rao, reporting managerApproved
11:02Balance debited: 8.5 days remainingapprove_leave_request()Posted
11:02Written to audit_logs with actor, before and afteraudit triggerRecorded
11:10Notification deliveredemail-queueSent

Sample rows, real mechanism. apply_leave_request and approve_leave_request are security definer functions: the balance write, the status write and the audit row are one transaction. Extending the workflow means extending the function, not the screen.

PayrollSample

The arithmetic, shown

A payslip is the one document an employee will check by hand, so it has to survive being checked. Every statutory line below is read from statutory_config with an effective_from date. None of it is hardcoded: a rate change is a row, not a deploy.

Payslip · April 2026Monthly · Karnataka · INR

Earnings

Basic40,000.00
House rent allowance20,000.00
Special allowance22,500.00
Gross82,500.00

Deductions

EPF, employee 12%on the ₹15,000 wage ceiling, not on basic1,800.00
ESI, employeegross above the ₹21,000 thresholdNot applicable
Professional taxKarnataka slab200.00
TDSdeclared regime, projected annual4,150.00
Total deductions6,150.00
Net pay₹76,350.00

Money is stored as numeric(14,2) with its currency code beside it, never as a float. The seeded statutory values are plausible, not authoritative — they carry an effective_from and have to be verified against current law before anyone is paid from them.

Scope

Twelve modules, one register

Every module is the same object: a table you can scan, a row you can open, and a state that means the same thing in all twelve. Nothing here is a separate product bolted on with its own vocabulary.

DashboardWhat is waiting on you today, by role
PeopleThe employee record: profile, documents, reporting line, history
HiringRequisitions, pipelines, interview scorecards, offers
OnboardingTask templates that assign themselves on a joining date
AttendancePunches, regularisation, shifts, holidays by location
LeavePolicies, accrual, balances, the approval chain
PayrollRuns, statutory components, payslips, lock and sign-off
ExpensesClaims, policy limits, manager then finance approval
PerformanceCycles, goals, check-ins, 360 reviews
SurveysPulse and engagement, anonymous by construction
ReportsSaved reports, delivery schedules, exports, headcount analytics
SettingsOrganization, roles, statutory config, email, audit log

Row-level security

What it refuses

Most of the work in an HR system is the access it does not grant. Each line below is a question the database is asked and answers with nothing — asserted by a test that runs against a real Postgres instance with real sessions, not by a comment promising it would.

QuestionAnswer
A manager opens their report's payslippayroll-rls.test.tsDenied
An employee opens a colleague's published payslippayroll-rls.test.tsDenied
Anyone edits a payslip inside a locked run, service role includedpayroll-rls.test.tsDenied
A compensation row is amended instead of supersededpayroll-rls.test.tsDenied
Org A's admin reads an Org B employee by direct idrls.test.tsDenied
An employee grants themselves a rolerls.test.tsDenied
A review subject reads the individual responses about themperformance-privacy.test.tsDenied
An anonymous survey response is linked back to a personperformance-privacy.test.tsDenied
84
tables
84
with RLS enabled
166
policies
19
views, all security_invoker

Arrivals

There is nothing to buy.

Zenith HR is an internal tool for one company. No plan, no trial, no sales call. If you have an account, sign in. If you are the one setting the company up, create the organization and you become its first administrator.