P/N 03Case studyEpoka University, graduation project

Ritema — Loyalty Program Platform
A loyalty and rewards platform for local businesses. Businesses manage customers, points, rewards and coupons, and customers collect and redeem benefits by QR code in a mobile app. My solo graduation project, built and documented end to end.
- Role
- Solo full-stack software engineer
- Team
- Solo
- Duration
- One semester
- Year
- 2026
- Stack
- Java · Spring Boot · Spring Security · JWT · MySQL · Redis · Flutter · Dart
Outcomes
Solo
Full-stack build, from API and database to mobile app
On time
Delivered with full documentation by the graduation deadline
QR
Instant point collection and reward redemption
Problem
Local businesses rarely have a loyalty program that is easy to run. Paper stamp cards get lost, and large commercial platforms are expensive and complex. Ritema gives a small business a simple way to reward returning customers, and gives customers one app to collect points and redeem rewards.
Constraints
A solo project with a fixed graduation deadline, covering backend, mobile app, database and full written documentation. Security mattered from the start, because points and coupons have real value.
Architecture
A Spring Boot API secured with Spring Security and JWT manages businesses, customers, points, rewards and coupons. MySQL stores the core records and Redis caches frequently read data. A Flutter mobile app lets customers collect points and redeem rewards by scanning QR codes.
4 parts, 3 connections.
- N01 — Flutter app
- N02 — Spring Boot API
- N03 — Redis cache
- N04 — MySQL
- Flutter app to Spring Boot API, JWT
- Spring Boot API to Redis cache, cache
- Spring Boot API to MySQL, records
Key decisions
Stateless JWT authentication with Spring Security, so every request is verified and the API can scale without server-side sessions.
QR codes for collecting and redeeming points instead of manual codes, which keeps the interaction at the counter fast and simple.
Redis as a cache in front of MySQL for frequently read data, to keep the app responsive.
Core features first, extras later. With one developer and a fixed deadline, I protected the complete earn-and-redeem flow and scheduled smaller features after it.

Results
Delivered a complete, working product and its full documentation on time for graduation, built entirely by me across backend, mobile app and database.
The screens below are the customer app, from sign-in to the wallet and profile. Customers earn Beats at each place and build a standing there, from First Beat to Known by Name. Across every place they build an access status, from Active to Crown, which the membership card shows beside a QR code. Rewards arrive as coupons and limited-time Drops that are claimed in the app and shown at the counter, and every Beat earned or spent stays on record in the wallet's ledger. Swipe a strip, or use its arrows.

Sign in

Welcome

Home

Next level

Places

Map

Your standing

Coupons

Menu

House rules

Community and hours

Contact and map

Reserve a table

Rate a place

A menu item

A Drop

A live Drop

Claim it

Redeem a coupon

Wallet

Places in rhythm

Ledger

Membership card

Profile
Reflection
I would add automated end-to-end tests for the redemption flow and a web dashboard for business owners. I would keep the discipline of defining the core flow first and protecting it from scope creep.