September 28, 2026
Karirku โ Workplace Super App.
Mobile ยท Backend ยท FrontendAn employee management and online attendance platform: an Android app for selfie + GPS check-ins, and a web dashboard for shifts, leave, overtime, payroll, reimbursements, and office finance.

Description
Karirku is a “workplace super app” for small and medium businesses. Employees check in and out from their phone with a selfie and their location, while owners and managers set schedules, approve leave, and issue payslips from a web dashboard โ no more manual recaps in Excel.
It is made of three parts: a Flutter Android app (iOS later), a NestJS API, and a React + Vite dashboard, plus a static marketing site with a bilingual help center.
Background
Many small businesses in Indonesia still track attendance on paper or in spreadsheets, then rebuild the same numbers at the end of every month for payroll. Most HR products are priced for larger companies. Karirku starts with attendance โ the daily habit โ and grows into finance from there, with a free tier for up to 20 employees.
Goal
Build one account that can belong to several businesses, with attendance that is hard to fake, and an architecture where new modules (finance, payroll, and more) can be added without large refactors.
Features
- Attendance: check-in/out with selfie and GPS, office radius per location, time zones per business, and full attendance history.
- Schedules: shift templates, weekly and per-date schedules, and shift swaps with approval.
- Requests & approvals: leave, sick days, overtime, and attendance corrections (forgotten check-in/out), each with an approval flow.
- Holidays: business holidays plus an import of Indonesian national holidays.
- Team attendance: today’s overview, period recaps, and Excel export.
- Finance: payroll and payslips, reimbursements (approve, then mark as paid), and office income/expense tracking with monthly reports.
- Businesses & roles: create a business or join one with a code (owner approval), custom roles with granular permissions, member aliases, and announcements.
- Accounts: email/password with email verification, Google sign-in, passkeys (WebAuthn), password reset, and account deletion.
- Notifications: in-app bell and push notifications (FCM), plus an activity log as an audit trail.
- Platform admin panel for a read-only, cross-business overview.
Technologies
- Flutter (Dart) for the Android app, with localization (Indonesian/English).
- NestJS (TypeScript) with one module per feature, so adding a feature means adding a module.
- MySQL 8 + Prisma 7, chosen for ACID transactions since the app handles money.
- React 19 + Vite + TanStack Query for the dashboard, built as a static SPA (no Node process on the server).
- JWT access + refresh tokens,
@simplewebauthn/serverfor passkeys, S3-compatible storage for selfies, and Firebase Cloud Messaging for push.
Technical Decisions
The backend is the single source of truth for business rules โ attendance windows, shifts, leave, overtime, corrections, holidays, and payroll โ and the app and dashboard only display them. Users are global accounts, and every request runs inside an “active business”, so one person can work for several businesses and switch between them.
Push notification text is generated on the server and kept in sync with the app’s localization files, so the same event reads the same way in the bell, the push, and both languages.
What I Learned
Attendance looks simple until you add shifts that cross midnight, time zones, corrections, and holidays. Writing the rules down first and keeping them in one place (the backend) made the app and dashboard much easier to build.
Notes
The source code is private. Visit karirku.com to see the product.

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.