✦Overview
Bouncy Beaver was my first large fullstack project, built together with a classmate. The goal: a platform for managing ships in a port, assigning vessels to berths and tracking every container across three states: being loaded, awaiting inspection, or ready to unload.
Our lecturers gave us a deliberately vague brief. No wireframes, no feature list, no hard constraints. Just a problem space and a deadline. For both of us it was the first time we had to define an MVP ourselves and figure out what "done" actually looks like.
✦Starting from nothing
Before writing a single line of code we used AI to sketch out what the product could be. That gave us a shared vocabulary and a rough picture of the system. From there we sat down together and mapped out every entity, every relationship, and every user flow on paper.
The upfront investment paid off. We defined our MongoDB collections and data shapes early and barely touched them after that, even as requirements shifted around us.
✦Stack
We built a mono-repo: Vue 3 + Vite on the frontend with Nuxt UI for components, and NestJS on the backend serving a GraphQL API backed by MongoDB through TypeORM. Firebase handled authentication.
The split was clean: Vue owned the UI and routing, Nest owned all business logic.
NestJS was a first for me. Coming from a C# and .NET background, the module system felt familiar in spirit but different in practice. Working through those differences, dependency injection, decorators, guards, taught me more than any tutorial would have.
✦Business logic first
This project was the first time I had to think seriously about what the software actually does at a domain level. What does a ship need to know about its berth? What changes when a container moves from "loading" to "under inspection"?
Getting those rules right before building them into the code made everything downstream easier.
✦Role-based access
Three types of users, three different experiences.
- Schipper (captain): sees their own ship, manages their containers
- Backoffice: oversees arrivals, departures, and inspections across the port
- Admin: full access, user management, configuration
No shared dashboards, no feature flags. The roles are baked into the architecture, each with its own entry point and its own set of responsibilities.
✦What I took away
Bouncy Beaver taught me that the most important decisions in a project happen before you open your editor. A clear domain model, an agreed MVP, and a data shape you believe in are worth more than any framework feature.
