Skip to content
Nikesh Khatri
All work

HR & Payroll

May – Aug 2026

At Goodwish

Client work — described generically

Attendance & Payroll SaaS

Biometric punches in, legally-correct Nepali payslips out — multi-tenant, with hardware on the other end.

September 2026 salary breakdown for a demo employee: Rs 145,000 gross, minus a late-arrival penalty, the 11% SSF contribution and income tax, leaving Rs 114,218 net.
A salary structure plus the month’s attendance becomes a payslip with Nepal SSF and progressive TDS withheld.

Role

Backend and frontend engineer across four repositories

Stack

  • Django
  • DRF
  • PostgreSQL
  • React
  • Vite
  • TypeScript
  • Tailwind CSS
  • Docker
  • ReportLab
  • Vitest

Evidence

Commits
402
Repositories
4
Evidence range
May – Aug 2026

The problem

What this had to solve.

Organisations across Nepal — offices, schools, institutions — record attendance on fingerprint and RFID devices, then re-key the results into spreadsheets to compute salary. Every step is manual and every organisation has different shift rules. Payroll also has to satisfy Nepali statute: progressive income-tax slabs, SSF and SST contributions, and an accountant who must sign off before anything is disbursed.

Architecture

How it actually works.

Punch to payslipArchitecture
Attendance terminals push logs on their own schedule, so ingestion is authenticated, throttled and idempotent — a duplicated punch cannot become a duplicated day of pay. Everything downstream is deterministic: shift rules, overtime policy, then Nepal's statutory tax and contribution bands, held until an accountant signs off.UNTRUSTED INPUTSTATUTORY RULESADMS / RFIDdevice pushIngestauth · throttleShift rulescalendar · leaveOvertimepolicyTax engineslabs · SSF · SSTSign-offaccountantPayslipPDFprogressive slabs · SSF / SSTBikram Sambat dates

Attendance terminals push logs on their own schedule, so ingestion is authenticated, throttled and idempotent — a duplicated punch cannot become a duplicated day of pay. Everything downstream is deterministic: shift rules, overtime policy, then Nepal's statutory tax and contribution bands, held until an accountant signs off.

What I built

My contribution.

  • 01

    Built a multi-tenant attendance and payroll platform covering employee, student, guardian, shift, calendar, leave, overtime and payroll workflows.

  • 02

    Implemented Nepal-specific payroll rules including income-tax slabs, SSF/SST handling, overtime policy and accountant sign-off controls.

  • 03

    Integrated ADMS/RFID attendance devices and hardened device endpoints with authentication, throttling, environment-managed credentials and security regression checks.

  • 04

    Developed tenant self-service branding, role-based portals, superadmin tenant controls and cross-organisation oversight dashboards.

  • 05

    Improved frontend maintainability by splitting large pages into reusable components and code-splitting routes.

The hard part

Hardware that does not care about your API design

ADMS attendance terminals are not well-behaved HTTP clients. They push logs on their own schedule, retry aggressively, duplicate records, and speak a fixed protocol you cannot change — and they sit on the open internet in whatever office bought them. The endpoint therefore had to be permissive about what it accepted and strict about what it trusted: device-level authentication, throttling to survive a terminal stuck in a retry loop, credentials moved into the environment rather than the codebase, and idempotent ingestion so a duplicated punch does not become a duplicated day of pay. I added security regression tests around that endpoint specifically, because it is the one door in the system a stranger can knock on.

Interface

What it looks like in use.

Income tax slab table with twelve FY 2082/83 bands for single and married filers, from 1% to 39%, each with an effective-from date.

The effective-dated, marital-status-specific tax bands behind the TDS line.

Shift settings: a 10:00 AM to 6:00 PM shift, a 15-minute grace period, a 1:00 to 1:30 PM break, Monday to Friday work days and a Rs 300 late penalty.

Shift timings, grace windows, breaks and penalties are set in one place and feed straight into payroll.

Three ZKTeco biometric terminals, two online and one offline for two days, each with its branch, location and a masked serial number.

ZKTeco terminals push punches over ADMS, and each device’s heartbeat is tracked per branch.