5 Lessons From Building a Lost & Found System as My Capstone
My capstone project was a community platform for reporting and recovering lost items — built with Laravel, Vue.js, and Inertia.js. It sounds simple, but it taught me more about real-world development than any tutorial.
1. Model the flow before you build the screens
The first version I sketched had two screens: report an item and browse items. The moment I mapped the actual user journey — report, verify, claim, close, feedback — the "simple" system became five states with different permissions per state. Drawing the state machine first saved me from rebuilding the schema halfway through.
2. Real-time updates are a UX feature, not a tech checkbox
Item statuses needed to update without a page refresh. The instinct is to reach for WebSockets immediately, but polling the Laravel API on a sensible interval was dramatically simpler and completely adequate at this scale. Use the simplest tool that meets the requirement.
3. Role-based access control shapes everything
- Separate flows for students, teachers, and administrators meant the auth layer influenced every controller, not just one "login" page.
- Laravel's middleware made policy rules declarative — a good model for reasoning about permissions.
- Testing each role's access path early (who can edit a claim? who can close a report?) prevented authorization bugs.
4. Searchable categories beat a free-text dump
The early UI had one big list. Users needed to filter by category, location, and status. Adding a structured category system with search made the tool actually usable for recovery — a reminder that data modeling is product design.
5. Document the handoff
Capstones get evaluated by people who did not build them. A short README with the architecture, setup steps, and demo account details made the difference between "works on my machine" and a project people can actually run and judge.
Building systems that real users interact with — even at university scale — is where the lessons stick. The state machines, the role matrices, and the polling-versus-WebSocket decision all show up in my paid work now.