All projects

Production app

Uplift NLS

Production HRMS app for Nevian LifeScience's workforce, built solo with Kotlin & Compose Multiplatform and live on the App Store.

Three Uplift NLS screens: the feature menu, the login screen and the daily attendance log

Overview

Uplift NLS is the HR app Nevian LifeScience’s workforce uses day to day: marking attendance, applying for leave, delegating approvals, tracking expenses and generating reports. I built it at SMAC IT Limited with Kotlin Multiplatform and Compose Multiplatform, so one codebase serves both iOS and Android. It is live on the Apple App Store.

My role

I was the sole mobile developer: I built the app across both platforms and handled the iOS release myself: code signing, provisioning and App Store submission. I worked alongside designers, backend developers and QA in an Agile team.

Problem

Nevian LifeScience needed a single HR app for its workforce on both iOS and Android, covering daily attendance with location tracking, leave and delegation, expense tracking and reporting, without maintaining two separate native codebases.

Approach & architecture

PRESENTATIONUICompose screensPRESENTATIONViewModelScreen state & eventsDOMAINUse casesBusiness rulesDATARepositoryData accesseventsstateKtor ClientREST APIRoomLocal database
Uplift NLS app architecture (MVVM + Clean Architecture)
  • Shared code with KMP + CMP. Business logic and UI are written once in Kotlin and shared between iOS and Android.
  • MVVM and Clean Architecture keep the UI, business rules and data layers separate and testable.
  • Networking with Ktor Client and Kotlinx Serialization, talking to the backend’s REST APIs.
  • Local storage with Room; image loading with Coil.
  • Location via Location Services and the Google Maps API for attendance check-ins.
  • Push notifications through Firebase Cloud Messaging on every user’s device.

Key features

  • Daily attendance with map integration
  • Apply for leave
  • Delegation
  • Expense tracking
  • Automated report generation
  • Real-time push notifications

Challenges & learnings

GPS drift indoors. Attendance check-ins happen inside office buildings, where GPS readings drift. I retried until the app got a better location fix, and validated check-ins against a geofence radius around the office instead of an exact point.

Shipping to the App Store for the first time. This was my first iOS release. I learned the full process end to end: code signing, provisioning, TestFlight and App Store submission.

iOS notifications in the background. Push notifications weren’t showing when the app was in the background or closed. I fixed this by sending the correct notification payload format and setting up the notification and Firebase Messaging delegates properly in the iOS app.

Screenshots

  • Uplift NLS login screen with username and password fields
    Sign in
  • Feature menu listing My Team, My Attendance, E-Reclaim, Delegation, Review Attendance, Review Leave and Review Travel Expenses
    Feature menu
  • Daily attendance log showing punch date, in and out times, working hours, location and status
    Daily attendance
  • Leave applications list with type, dates, duration and status for each request
    Leave applications
  • Apply leave form with leave category, full-day or hourly toggle, date pickers and comments
    Apply for leave
  • Add expense form with expense type, allowance type, mileage, rate and dates
    Add an expense