Findly is a full-stack lost and found platform designed for university campuses. It helps students report lost and found items, uses AI to suggest possible matches, allows admins to review matches, and enables students to communicate safely after a match is confirmed.
The system includes a web admin dashboard, a mobile student application, an ASP.NET Core backend API, PostgreSQL database, Supabase Storage, Supabase Realtime chat, n8n workflow automation, and Gemini AI matching.
Traditional lost and found systems inside universities are often manual, scattered, and inefficient. Students may need to check multiple offices, ask in social media groups, or expose their phone numbers publicly.
Findly solves this problem by centralizing lost and found reports and supporting the recovery process through:
- Student registration and verification
- Lost and found item reporting
- Image upload for item identification
- AI-assisted matching
- Admin match review
- Push notifications
- Private realtime chat
- Report resolution after item recovery
This project was developed as a final-year computer science graduation project.
The system is complete as a working prototype and includes the main web, mobile, backend, database, AI matching, notification, image storage, authentication, authorization, and realtime chat workflows.
| User Role | Description |
|---|---|
| Owner | Has full access to the system and manages universities, admins, categories, students, reports, and matches |
| University Admin | Manages students, reports, and matches for one assigned university branch |
| Student | Uses the mobile app to register, report items, receive matches, chat, and resolve reports |
- ASP.NET Core Web API
- C#
- Entity Framework Core
- PostgreSQL
- JWT Authentication
- BCrypt Password Hashing
- Role-Based Authorization
- React.js
- TypeScript
- Vite
- Axios
- React Router
- React Native
- Expo
- Expo SecureStore
- Expo ImagePicker
- Expo Push Notifications
- Axios
- Supabase PostgreSQL
- Supabase Storage
- Supabase Realtime
- n8n Workflow Automation
- Gemini AI
- Register with university information
- Upload university card image
- Wait for admin verification
- Login after verification
- Report lost items
- Report found items
- Upload item images
- View possible confirmed matches
- Receive notifications
- Chat with the matched student
- Resolve recovered reports
- Login with JWT authentication
- View dashboard statistics
- Manage students
- Verify or reject student registrations
- Manage lost and found reports
- Review AI-generated matches
- Confirm or reject matches
- Manage categories
- Manage universities and admins according to role
- Backend triggers n8n after item creation
- n8n requests candidate items from backend
- Backend filters candidates before AI
- Gemini compares item details
- Matches with high similarity are saved as pending
- Admin reviews AI suggestions before students are connected
Student Mobile App
|
| Axios + JWT
v
ASP.NET Core Backend API
|
| EF Core
v
Supabase PostgreSQL Database
Admin React Dashboard
|
| Axios + JWT
v
ASP.NET Core Backend API
Image Upload Flow:
Mobile/Web → Supabase Storage → Public URL → Backend → Database
Realtime Chat Flow:
Backend saves message → Supabase Realtime detects INSERT → Mobile chat updates live
AI Matching Flow:
Backend creates item → n8n webhook → Candidate search → Gemini AI → Save pending match → Admin review
Student registers
→ Admin verifies student
→ Student reports lost or found item
→ Image is uploaded to Supabase Storage
→ Backend saves report
→ Backend triggers n8n workflow
→ n8n gets filtered candidates from backend
→ Gemini compares item details
→ Strong matches are saved as Pending
→ Admin confirms or rejects the match
→ Students receive notifications
→ Students chat privately
→ Student resolves the case after item recovery
The matching process uses two filtering stages.
Before sending items to AI, the backend filters candidates using:
- Opposite item type
- Same university
- Same category
- Open status
- Different student
- Close date range
- Candidate limit
After candidates are retrieved:
- n8n checks if candidates exist
- Gemini compares item name, description, color, location, date, category, and image URL if useful
- n8n keeps only possible matches with similarity score greater than or equal to 70%
- Backend validates the match again before saving it as Pending
Findly uses JWT authentication.
After login:
Backend verifies credentials
→ Backend generates JWT
→ Frontend stores token
→ Axios sends token in Authorization header
→ Backend validates token using [Authorize]
The JWT contains important claims such as:
- User ID
- Role
- University ID
- Student verification status
Role-based authorization separates access between Owner, University Admin, and Student.
Findly does not store image files directly in PostgreSQL.
Instead:
User selects image
→ Image is uploaded to Supabase Storage
→ Supabase returns public URL
→ Backend stores URL in database
Examples:
| Image Type | Stored In |
|---|---|
| University card image | Supabase Storage |
| Lost item image | Supabase Storage |
| Found item image | Supabase Storage |
Database stores only URLs such as:
UniversityCardImageUrlImageUrl
Chat becomes available after an admin confirms a match.
Message flow:
Student sends message
→ Backend saves message in Messages table
→ Backend creates notification
→ Supabase Realtime detects new message insert
→ Mobile chat screen updates live
Supabase Realtime is used only for live UI updates. The backend still controls message saving and validation.
Findly supports two types of notifications:
| Notification Type | Description |
|---|---|
| Database Notification | Saved in the database and shown in the mobile app |
| Expo Push Notification | Sent to the student’s phone through Expo |
Push notification flow:
Student allows notifications
→ Mobile app gets Expo push token
→ Token is sent to backend
→ Backend stores token
→ Match/message event happens
→ Backend sends request to Expo
→ Student receives phone notification
Findly
├── backend
│ ├── Controllers
│ ├── Services
│ ├── Models
│ ├── Data
│ ├── Validators
│ └── Migrations
│
├── admin
│ ├── src
│ │ ├── pages
│ │ ├── components
│ │ ├── services
│ │ └── api
│
└── mobile
├── src
│ ├── screens
│ ├── services
│ ├── api
│ ├── navigation
│ └── storage
Before running the project locally, make sure you have:
- .NET SDK installed
- Node.js and npm installed
- Expo CLI / Expo Go for mobile testing
- PostgreSQL database or Supabase project
- Supabase Storage configured
- n8n workflow configured
- Gemini API key configured
cd backend
dotnet restore
dotnet ef database update
dotnet runBackend runs on:
http://localhost:5192
cd admin
npm install
npm run devcd mobile
npm install
npx expo startThe project requires local environment configuration for the backend, admin dashboard, and mobile app.
Real secrets are not committed to this repository. Use the example files as templates.
Create local backend configuration using .NET User Secrets or a local development configuration file.
Required backend values:
ConnectionStrings:SupabaseDb
Jwt:Key
N8n:WebhookUrl
N8n:Secret
Gemini:ApiKey
Example file:
backend/appsettings.example.json
Create:
admin/.env
Required values:
VITE_SUPABASE_URL=YOUR_SUPABASE_URL
VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEYCreate:
mobile/.env
Required values:
EXPO_PUBLIC_SUPABASE_URL=YOUR_SUPABASE_URL
EXPO_PUBLIC_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEYDo not commit real secret keys, database passwords, JWT signing keys, Gemini API keys, or n8n secrets.
Real secrets, API keys, database passwords, JWT signing keys, n8n secrets, Gemini API keys, and local environment files are not committed to this repository.
The repository includes only safe placeholder configuration files such as:
backend/appsettings.example.jsonadmin/.env.examplemobile/.env.example
Private values should be stored locally using .NET User Secrets, .env files, or deployment environment variables.
- Deploy backend and admin dashboard online
- Add refresh tokens
- Add stronger backend checks for unverified students
- Add stricter message participant validation
- Improve AI matching with weighted scoring
- Add read receipts for chat
- Add advanced notification settings
- Improve image privacy and access rules
- Add analytics dashboard
Sami Farhat
Computer Science Graduate
GitHub: SF-47
Repository: Findly
LinkedIn: sami-farhat-46692641a





