Cross-platform campus platform
CBU-FIND
A lost-and-found app for campus, so a missing item is posted, claimed and handed over in one place instead of scattered across group chats.
- Role
- Product Designer & Full-Stack Developer
- Status
- Completed
- Year
- 2026
- Stack
- Kotlin · Jetpack Compose · Vinext / React · TypeScript · Firebase · Cloudflare Workers · Cloudinary
Latest project update
Completed and verified the shared Android/web workflow with meaningful reports, deterministic claim acceptance, private handover conversations, message controls, report resolution, moderation and resilient error states.
01 · Context
The problem
Lost-property information shared through chats, noticeboards and word of mouth is fragmented, difficult to search and easy to miss.
The response
CBU-FIND gives Android and web users one Firebase-backed campus record for publishing reports, verifying ownership claims, opening private handover chats only after acceptance, and closing the recovery loop when an item is returned.
02 · Contribution
What I built
- 01
Designed and built the native Android experience with Kotlin, Jetpack Compose, Material 3 and adaptive light/dark themes.
- 02
Built the responsive Vinext/React web client against the same authentication, report, claim, conversation and moderation contracts.
- 03
Implemented a trusted Hono, Zod and JOSE Cloudflare Worker API for validation, rate limiting, notification queues, audit-safe errors and sensitive mutations.
- 04
Integrated Firebase Authentication, Firestore real-time listeners, Cloud Messaging, App Check and Crashlytics across the system.
- 05
Implemented short-lived signed Cloudinary uploads for report media and chat attachments while retaining compatibility with legacy URL-only records.
- 06
Created security rules, additive migration tools and automated Worker, web, Android and Firestore-rule tests.
03 · What it does
What it does
today.
04 · Screens
See it
working.
Screenshots and recordings from the real build, with the notes that belong to them.
05 · Engineering
Hard parts,
clear decisions.
Real-time reads with trusted writes
Firestore listeners preserve immediate cross-client updates, while business mutations pass through the Worker so claim races, suspensions, blocks, notifications and audit errors follow one policy.
Compatibility without destructive migration
Additive schemas and fallback reads preserve existing users, URL-only images, reports and conversations while new records gain structured assets, claims and moderation metadata.
Production behavior on free infrastructure
The backend combines Firebase Spark, Cloudflare Workers and Queues, and Cloudinary signed media while surfacing quota or connectivity failures as actionable states instead of false empty screens.
06 · Reflection
What I learned
Where it stands
I tested it with two accounts: four reports filed, reciprocal claims matched, and three-message handover conversations exchanged, all through the live web client on the same Firebase project the Android app uses.
The code