Case study
Avoda
Time Tracking, Team & Payroll Platform
Role
Scope
Stack
What I built.
- 01
Build and maintain both the web app and the server behind it, usually delivering each feature end to end, from how the data is stored to the page people click through.
- 02
Sign-up and login by email and password, Google sign-in or a one-time code, with password reset and account deletion.
- 03
Organisations invite members as admins, managers or employees, and each role sees and can do different things.
- 04
Clients, projects and tasks with status, priority and estimated hours; timers with session history, desktop screenshots, and alerts when a timer is left running.
- 05
Timesheets and weekly reports for reviewing and approving tracked hours, with timesheets and payroll exported to CSV and PDF.
- 06
Pay rates by role with per-project overrides and an audit trail, feeding payroll runs that are calculated from tracked hours and can run automatically on a schedule.
- 07
Leave requests with manager approval, balances, accrual rules, notice periods and an email at every step.
- 08
Every change goes through a reviewed pull request with automated checks and an AI-assisted review, then a staging release before it goes live; errors in production are reported automatically.
- 01
Backend on NestJS 11 with code-first GraphQL (Apollo Server 4), Prisma 6 on PostgreSQL, and Redis pub/sub behind GraphQL subscriptions.
- 02
Own the Prisma schema (about 28 models) and its migrations, across organisations, timers and timer events, screenshots, rates and rate audit logs, payroll and leave.
- 03
Better Auth with JWT, Google OAuth, OTP, password reset and audit-logged account deletion; guards and decorators enforce organisation scoping and admin, manager and employee roles.
- 04
Business logic for the timer lifecycle, rate resolution (role default, then project override), payroll by pay frequency, pay type and rate unit, PTO accrual with notice-period validation, and weekly hour limits.
- 05
Scheduled jobs for daily automated payroll, timer health alerts every 30 minutes, OTP cleanup and soft-deleted user cleanup; screenshots stored in S3; Handlebars email templates.
- 06
Frontend on React 19, Vite, Tailwind 4 and shadcn, with Apollo Client and GraphQL Codegen keeping it type-safe against the schema; React Hook Form validation mirrors the backend DTO rules, and jsPDF and PapaParse handle the exports.
- 07
Storybook, Vitest and Playwright on the frontend, Jest and Supertest on the backend; rate limiting, Winston logging, a health endpoint and Sentry on both ends.
- 08
The API is shared with a Tauri desktop app, so schema and resolver changes stay backward-compatible; GitHub Actions run the tests and an AI-assisted review on every pull request, then deploy to staging and production.