← All work

Client project at MeguMethod

Slevomat

I build features across Slevomat’s iOS and Android apps, move application logic into shared Kotlin code, and improve automated testing and release workflows.

Scale
70k+ monthly users
Platforms
iOS · Android
Stack
Kotlin Multiplatform · Swift · SwiftUI · Kotlin · Web views

Slevomat helps people discover experiences, travel and leisure offers, and use the vouchers they buy. I work on its mobile app as part of MeguMethod’s team. The app combines native screens with web views for offer details and payments.

Shared logic, native UI

I have moved at least 4 existing features into shared Kotlin Multiplatform code and built new features in the shared layer from the start. This includes how screens load, respond to user actions and handle errors, while the UI stays native on each platform.

Keeping this logic in one place reduces duplicated work and helps iOS and Android behave consistently. It also makes it easier for me to develop across both apps: with shared behaviour in place, I can focus on the native UI, using AI to support development on the less familiar Android side.

Accepting a gifted voucher is one example. Depending on the voucher, the app needs to open a native detail screen or a webview. I worked on moving deeplink routing decisions into shared code so both apps handle voucher links consistently, whether opened within the app, from a browser or via a push notification.

Collaboration

Slevomat is a complex product, and I particularly enjoy working through its technical challenges and product decisions with teammates.

Shoutout to Dominik, who suggested sharing ViewModels too: the code that manages screen state and user actions. Together, we worked through how to integrate a Kotlin ViewModel into iOS lifecycle while keeping navigation native on each platform. On iOS, this involved moving from MVVM to MVI architecture in the presentation layer.

Code quality and architecture

I care about code quality and clean architecture principles. When I see room for improvement, I take action:

  • Automated linting. I added SwiftLint to CI and the pre-commit and pre-push hooks, and tightened its rules to enforce consistent coding practices.
  • Architecture refactoring. I am restructuring the iOS codebase around app setup, shared infrastructure and individual features, with clear boundaries between business logic, data access and presentation. The refactor includes automated dependency checks to enforce those boundaries, making the code easier to navigate, test and evolve while laying the groundwork for modularisation.

I introduced the linting checks before AI became central to our development workflow, and now they help hold AI-generated code to the same standards.

Testing and code review

I treat automated tests as part of feature development. Shared logic lets us test common behaviour once for both platforms.

Tests also guide my review of AI-generated changes. They make expected behaviour explicit and serve as a form of documentation of product decisions.

When I joined the project, the shared Kotlin suite had just 4 meaningful tests. I pushed to make automated testing part of the team’s workflow, got the iOS test suite running and integrated tests into CI. Since then, the shared suite has grown to 1,500+ tests, and the iOS suite from zero to 140+.

Builds & Releases

I help maintain build and release tooling, including resolving conflicts between parallel CI jobs, cleaning up simulators left behind by tests, and fixing release uploads. I also built automation that updates GitLab issues as their merge requests progress.