Skip to content
Mirkamol
Back to home

Personal project, live with 25 users

Subscription Master

Detects your subscriptions in Gmail, reminds you before each charge and flags failed payments. A Spring Boot backend on AWS powering a React + TypeScript frontend on Vercel.

Subscription Master landing page: All your subscriptions. One calm place.

What I built

  • Built a Spring Boot backend, live with 25 users, that detects subscriptions in Gmail via Google OAuth2 and the Gmail API, trusting only SPF/DKIM/DMARC-verified billing emails, powering a React + TypeScript frontend on Vercel.
  • Replaced manual subscription entry and renewal tracking by deriving status from Gmail receipts, reminding users before each charge and flagging failed payments as Billing required, in-app, by Gmail and Web Push.
  • Protected mailbox data by encrypting Google refresh tokens with AES-256-GCM, exchanging single-use 60-second login codes for JWTs, serving emails sanitized under a strict CSP, and hard-deleting all data on disconnect.
  • Added an admin dashboard to audit Gmail detection for 25 users, with role checks that revoke access instantly.
  • Set up a GitHub Actions and Jib pipeline to AWS EC2 that fails a release unless the new container passes a health check, behind Nginx TLS with PostgreSQL on Amazon RDS.
  • Blocked 2 deploy misconfigurations in the Amazon RDS migration with JUnit tests on the Docker Compose and CI config, part of 471 tests (Testcontainers, WireMock) gating every pull request.

Stack

Backend
  • Java 21
  • Spring Boot
  • Spring Security
  • OAuth2 / OIDC
  • JWT
  • Spring Data JPA / Hibernate
  • REST APIs
  • OpenAPI / Swagger
  • Resilience4j
  • Bucket4j
  • MapStruct
  • jsoup
  • Apache POI
Data
  • PostgreSQL
  • Flyway
  • Caffeine
Integrations
  • Gmail API
  • Web Push (VAPID)
Testing
  • JUnit 5
  • Mockito
  • AssertJ
  • Testcontainers
  • WireMock
Delivery
  • Docker
  • Jib
  • Maven
  • GitHub Actions
  • AWS EC2
  • Amazon RDS
  • Nginx
Frontend
  • React
  • TypeScript
  • Vite
  • Tailwind CSS
  • TanStack Query
  • Vercel