All projects

Full-stack

SMACian

A LinkedIn-style networking app for current and former SMAC employees. Compose Multiplatform frontend, plus a Spring Boot backend I built and deployed.

Architecture of SMACian: a Compose Multiplatform mobile app talking to a Spring Boot REST API with JWT, backed by PostgreSQL, deployed with Docker Compose, Nginx and HTTPS on Oracle Cloud via GHCR

Overview

SMACian is an internal networking app that connects current and former SMAC IT employees. Members can sign in, build a profile with their career history, post to a shared newsfeed, like and comment, and search for colleagues. I’m building it end to end: a Compose Multiplatform app for Android and iOS, and the Spring Boot backend behind it.

My role

I’m the sole developer on SMACian, covering the mobile app, the backend API, the database and the deployment pipeline.

Problem

Current and former SMAC IT employees had no dedicated place to stay connected, share updates or find each other’s career history once someone moved on. SMACian gives them a private, LinkedIn-style network of their own.

Approach & architecture

PRESENTATIONUICompose screensPRESENTATIONViewModelScreen state & eventsDOMAINUse casesBusiness rulesDATARepositoryData accesseventsstateKtor ClientSpring Boot REST API
SMACian app architecture (MVVM + Clean Architecture)

Mobile app

  • Compose Multiplatform for a single Kotlin UI on Android and iOS.
  • Clean Architecture with MVVM/MVI, so screens react to a single state and business logic stays independent of the UI.
  • Koin for dependency injection; Ktor Client and Kotlinx Serialization for the API layer.

Backend

  • Spring Boot (Kotlin) REST API with PostgreSQL.
  • JWT authentication with access and refresh tokens, and role-based access.

Deployment

  • Docker Compose runs Nginx, the API and the database on an Oracle Cloud VM, with HTTPS at Nginx.
  • GitHub Actions builds the Docker image, publishes it to GHCR, and deploys it to the VM over SSH.
GitHubSource codeGitHub ActionsBuild Docker imageGHCRImage registrydeploy · SSHpull imageORACLE CLOUD VMDOCKER COMPOSENginxReverse proxy · HTTPS (Let's Encrypt)Spring Boot APIKotlin · JWT authPostgreSQLPersistent volumeMobile appAndroid · iOSHTTPS
SMACian server deployment

Key features

  • Authentication with role-based access
  • Profiles with a career history timeline
  • Newsfeed with posts, likes and comments, loaded with paginated infinite scroll
  • User search

Challenges & learnings

JWT auth with token refresh. The Spring Boot backend issues a short-lived access token and a longer-lived refresh token, so users stay signed in without every request carrying a long-lived credential.

Paginated infinite scroll. The newsfeed endpoints return posts page by page (page and size), and the Compose list requests the next page as the user nears the bottom.

Deploying it myself. Docker Compose runs the Spring Boot app and PostgreSQL together, with environment variables and a persistent volume for data. Nginx sits in front as a reverse proxy with HTTPS from Let’s Encrypt. Getting traffic through meant opening ports in both Oracle Cloud’s security lists and the VM’s own firewall. GitHub Actions builds the Docker image on every push, publishes it to GHCR, then deploys to the VM over SSH, where the new image is pulled and restarted.

What’s next

Planned, not yet built:

  • Real-time chat over WebSockets
  • Push notifications
  • A company announcements board