Dark indigo field with three soft lights in violet, coral, and cyan — one per platform

Freelance Cross-Platform Developer

Jul 2025 - Dec 2025

Self-Employed | July 2025 - December 2025 | Toronto, ON

Career break between General Motors (Jun 2025) and PolarisMail (Jan 2026) — run as a self-directed product sprint in cross-platform engineering.

Overview

Instead of coasting between roles, I gave myself the brief that usually goes to an entire squad: take a product from idea to production, alone. Over six months I designed, built, and operated a cross-platform consumer app for cheese enthusiasts — a single Kotlin codebase running on Android, iOS, and desktop — along with the backend, infrastructure, and delivery pipeline behind it. The Kotlin Multiplatform depth built here fed directly into my current role as a Senior KMP Developer.

Key Responsibilities and Achievements

Cross-Platform Product Engineering

  • Architected the app with Kotlin Multiplatform (KMP) and Compose Multiplatform (CMP): one implementation, three platforms, zero feature drift
  • Bet early on the next-generation Android stack — Navigation 3, Paging 3, Metro DI, Ktor Client, Coil, Haze — adopting these libraries while they were still new and forming the firsthand opinions most teams don’t yet have
  • Kept the UI adaptive and native-feeling across form factors, from phones to resizable desktop windows

Full-Stack Ownership

  • Designed and built the product’s REST API with Kotlin/Spring Boot on PostgreSQL
  • Containerized the backend with Docker and self-hosted the deployment — owning the ops story, not just the code

Engineering Rigor as a Team of One

  • Set up GitHub Actions CI/CD running unit tests and Paparazzi screenshot tests on every change, so quality was enforced by the pipeline rather than by memory
  • Designed and shipped this portfolio site as well: a bilingual Hugo site deployed on Cloudflare Pages with custom security middleware
  • Used Claude Code and Mistral Vibe CLIs as light-touch assistants — deliberately kept to a supporting role, since the goal was to learn the frameworks and libraries firsthand rather than delegate that learning

Technical Stack

Languages
Kotlin
Frameworks
KMPCMPSpring Boot
Backend
PostgreSQLDockerself-hosted deployment
Libraries
Navigation3Paging3Ktor ClientCoilHazeMetro DI
CI & Testing
GitHub ActionsPaparazziUnit Testing
AI Tooling
Claude CodeMistral Vibe (light use)
Web
HugoCloudflare Pages

Challenges and Solutions

Challenge 01 Shipping one UI to Android, iOS, and desktop without settling for a lowest-common-denominator experience
Solution
Shared the entire UI with Compose Multiplatform while keeping it adaptive per form factor, and locked cross-platform rendering down with Paparazzi screenshot tests
Challenge 02 Betting on brand-new libraries (Navigation 3, Metro DI) with little community guidance to lean on
Solution
Went straight to source code and release notes, prototyped aggressively, and kept each library behind clean architecture boundaries so any bet could be swapped out cheaply
Challenge 03 Covering product, mobile, backend, and infrastructure as a single person
Solution
Let automation do the team’s job: Dockerized Spring Boot services, a self-hosted deployment, and a GitHub Actions pipeline gating every change

Impact

  • Delivered solo what typically takes a cross-functional team: product design, mobile, backend, and infrastructure
  • Built production-grade KMP/CMP expertise ahead of the curve — the direct springboard to my current Senior Kotlin Multiplatform role
  • Proved full-stack range, from Compose UI down to Dockerized Spring Boot services on self-managed infrastructure