Camply — Campus Social Platform
Web + MobileA web + mobile platform where university students create activities and find each other: real-time chat, map view and a content-based recommendation engine.

The Problem
University students struggle to find people with shared interests on campus: needs like "we need 3 more for a football match" get lost in WhatsApp groups, and cross-department socializing barely happens. Existing social platforms aren't campus-specific and are open to fake accounts.
Camply solves this with two core ideas: registration restricted to
.edu.tr university emails (every user is a verified student) and
activity-centered matching (people meet through events, not profiles).
Architectural Decisions
1. One language on every layer: JavaScript. The backend (Node.js + Express), web (React) and mobile (React Native + Expo) are all written in the same language. A deliberate choice for solo development speed: the same validation logic is reused on all three sides, and context-switching cost drops to zero. A monolith-first, API-first architecture was chosen; web and mobile consume the same REST API.
2. Trust designed as the core of the product. The critical risks in a campus app are fake accounts and harassment. Solved in layers:
.edu.trrequirement + email verification links generated withcrypto.randomBytes, valid for 24 hours- Password hashing with bcrypt (10 salt rounds), 7-day JWT sessions
- UUIDs instead of sequential IDs — profiles can't be enumerated via
GET /users/1, /users/2... - Parameterized SQL in every query (injection protection)
- Location privacy: the map shows only an approximate neighborhood; the exact address is visible only to participants
- Democratic moderation: the group leader can't remove anyone alone;
removal requires a vote with thresholds scaled to group size (double
voting is blocked by a database
UNIQUEconstraint)
3. Recommendation engine: explainable scoring instead of an ML model. Rather than training a machine learning model for "recommended for you", I built a content-based, rule-weighted scoring engine (0–100 match score):
+40 activity category matches the user's interest category
+10 title/description mentions one of the user's interests
+10 organizer rating ≥ 4.0 (trust bonus)
+15 a participant from the user's department (social proximity)
+10 less than 80% full / -20 completely full
+5 starts within 48 hoursTwo concrete wins from this choice: negligible compute cost (50 candidates × simple rules) and every recommendation is explainable — each card shows the real reason, like "matches your Software interest". As data grows, the same interface can be swapped for a learning model.
4. Real-time chat: Socket.io with per-room authorization. WebSockets
replace polling for messages. The critical detail is security: the JWT is
verified when the connection is established, and every join_room request
re-checks against the database that the user actually participates in that
activity — holding a token doesn't grant access to every room.
5. Data model: a normalized 10-table schema. Activity-participant-
rating-message relations are normalized in PostgreSQL; messages are indexed
by activity_id, participants by user_id, ratings by rated_id. A nightly
node-cron job closes expired activities to keep data fresh.
Results & Status
The project is under active development. Roadmap: notification system, advanced AI matching, and a gradual move to microservices as data volume grows.
The biggest lesson: when building with limited resources, choose the sustainable and explainable solution over the flashiest one. The rule-based recommender delivered the same product experience without weeks of ML infrastructure — and it can show users the answer to "why this recommendation?".