All work
case study · P/01

oneKampus

Institutes juggle separate tools for admissions, fees, classes, exams and hiring, and none of them talk to each other. oneKampus puts all four in one product, with one login across a web app and a mobile app.

Role
Founder · sole engineer
Timeline
Oct 2026 — present · 219 commits
Platforms
Web · iOS · Android
Links
Private — demo on request

What I built, layer by layer.

backend
Spring Boot modular monolith
  • Four modules — IMS, LMS, Exams, Hiring — each with its own Postgres schema, connection pool and Flyway history
  • Single sign-on: one JWT carries institute and LMS claims, valid across every module
  • Stripe checkout with signed webhooks; S3 storage via AWS SDK v2
  • Exam engine with auto + manual grading, ranks and percentiles
  • Modulith boundary tests keep modules from leaking into each other
Java 17 · Spring Boot 4.1 · Modulith 2.0 · Security · JPA · Flyway · springdoc
frontend
Next.js web app
  • 65 pages: admin, teacher, student and parent portals
  • Full-screen proctored exam player
  • Live video interviews over WebRTC, plus recorded-answer interviews with MediaRecorder
  • HLS video lessons with hls.js
Next.js 16 · React 19 · MUI 7 · Redux Toolkit · TanStack Query
mobile
React Native app
  • 31 screens sharing the same API and login
  • Video lessons, attendance, fees and results on the phone
  • Server state cached with TanStack Query
React Native 0.88 · React Navigation 7 · react-native-video
infra
CI and deployment
  • GitHub Actions runs 34 test classes on embedded Postgres, builds Docker images, ships over SSH
  • JVM tuned for a 1 GB box (256 MB heap, C1 JIT) — measured ~410 MB under load
  • Caddy behind Cloudflare with origin certificates and real-IP rate limiting
Docker Compose · Caddy · Cloudflare · AWS Lightsail · GitHub Actions

Engineering decisions.

  1. 01A modular monolith, not microservicesOne deploy and in-process calls keep a solo-run product cheap and debuggable. Boundaries are enforced by Modulith tests instead of the network, so any module can be extracted later.
  2. 02A Postgres schema per moduleEach module owns its tables and migrations, which isolates change and makes extraction possible. The cost: no cross-schema foreign keys and four connection pools on a small server.
  3. 03WebRTC signalling over HTTP pollingPolling every second through the existing API avoided running a WebSocket server behind Cloudflare and Caddy. It trades a little latency and request load for much simpler infrastructure.

By the numbers.

counted from the repository
387REST endpoints
108JPA entities
65 + 31web pages + mobile screens
4product modules
next project · P/02site-auto-matrix →