Skip to content
All projects
TypeScript·Multi-tenant HR leave management, in production

moj·GO

A multi-tenant HR leave-management app for Serbian companies. Real product, real domain rules: accrual, carryover, public holidays, and an approval chain that has to be right.

Visit the productPrivate repository
71
test files - 43 end-to-end specs, 28 unit
81
SQL migrations, schema versioned from day one
150
markdown docs: ADRs, runbooks, references

Stack

Nuxt 4TypeScriptSupabasePostgreSQLPiniaPlaywrightSentryi18n
moj·GO

This one is a commercial product running at mojgo.rs, so the repository is private. The numbers below are from the codebase itself, and I am happy to walk through the architecture or the test suite on a call.

Why this one is the real test

A leave tracker sounds simple until you write down the rules. Entitlement accrues over a year. Unused days carry over, but only some of them, and only until a cutoff. Public holidays are national but companies add their own. A request spans a weekend differently than a Tuesday. Approvals route to a manager who may themselves be on leave.

Getting that wrong means someone loses days they earned. This is the kind of domain where the tests are not ceremony.

How it is tested

43 end-to-end Playwright specs and 28 unit test files. The end-to-end weight is deliberate: the risky behavior in this app is multi-step and role-dependent - an employee submits, an admin approves, a balance changes - and that only holds together in a real browser against a real database.

The e2e suite includes visual snapshot tests across desktop and mobile, so a layout regression fails CI rather than reaching a user.

Engineering practice on display

  • 81 SQL migrations. Every schema change is a reviewable, replayable file. Types are regenerated from the live schema (pnpm db:types), so the database is the source of truth for TypeScript, not a hand-maintained parallel model.
  • 150 markdown documents - architecture decision records, runbooks, email template references. The decisions are written down where the next person looks.
  • Seeded demo data - realistic tenants, employees, and requests, all tagged is_demo, so the app can be demonstrated and tested without touching real records.
  • Bilingual (Serbian / English) from the start, because retrofitting i18n is how you learn not to retrofit i18n.
  • Sentry on client and server, plus accessibility and screenshot CI workflows.

Let’s build something that lasts

Hiring a senior engineer or architect for a remote team? I work across EU and US time zones - tell me what you're building.

Newsletter

I write about software architecture, PHP, Vue, TypeScript, and developer experience. No spam, unsubscribe anytime.

Copyright © 2026. All rights reserved.