Fly Post: An MVP in ~5 weeks with a team of three developers


- Роль
- Fullstack Developer, project lead
- Команда
- Me and 2 frontend developers
- Срок
- About 5 weeks, March – April 2025
- Статус
- MVP handed over to the client
What I did
- Design and the UI kitFigma mockups of the key desktop and mobile screens and a UI kit: buttons, fields, badges, cards. The developers built the screens from my components.
- Architecture and backendChose the stack, described the API contract in Swagger and wrote the REST API in NestJS. Set up the infrastructure: Docker, a VPS and GitLab CI.
- FrontendThe Vite and TypeScript skeleton, an MSW mock server, localization, sign-in and sign-up forms with a confirmation code, the Leaflet map.
- TeamBrought in two frontend developers, set their tasks in git issues, defined the project structure and the code style, reviewed their code.
Context and starting point
Business
A private client was launching piggyback delivery of documents and small parcels to another city or country. The flight crew, flight attendants and pilots, is flying that route anyway: they pick up the mail at the airport, drop it off at the destination and get paid for it.
For the sender it is faster than courier services, for the crew it is a side income. The service is internal, access to it is granted.
The situation
Before the service, such deliveries were arranged by hand, through acquaintances and chats. The project started from scratch.
The goal
in the shortest possible time and on a small budget. The load is low, so the stack is simple: Vue 3, NestJS and PostgreSQL.
Process, architecture and decisions
The parcel flow
The service has two roles: the sender creates a parcel, a courier from the crew takes it on their flight.
- 01ShipmentThe sender creates a parcel for shipment
- 02FlightThe courier enters their flight, for example from Moscow to Paris
- 03AirportThe courier picks up the mail at the departure airport
- 04DeliveryDrops the parcel off at the destination and gets paid for the delivery
Architecture
I chose NestJS to have one language with the frontend: TypeScript and shared contract types on both sides. For a team of three on a short deadline this is faster.
- CLIENTSPA
Vue 3 on Vite, Pinia, Vue Router, Tailwind and daisyUI. Localization is laid in with vue-i18n, ru/en.
- APIREST in NestJS
The contract is described in Swagger, the sender and courier roles are checked by guards.
- DATAPostgreSQL
The main database with backups.
- INFRADocker on a VPS
The frontend, NestJS and PostgreSQL run in containers, GitLab CI builds the images and rolls them out to the server.
The map and the interface
Points on the map stay readable even when there are many of them. I built the map on Leaflet with custom SVG markers, clusters, zoom and geolocation buttons, and the address search with suggestions works through Nominatim from OpenStreetMap.
The order's path is shown step by step in a nested collapsible status timeline. Forms have masks and validation, the confirmation code is entered in 4 cells with a resend timer.
On the phone the navigation moves to a bottom tab bar, the shipments table scrolls sideways with a pinned actions column, the details panel and the map open full screen.
Integrations
- Telegram bot · sign-in code
- Nominatim · OpenStreetMap
подключал я
The courier enters flights by hand, no schedule API was connected. Courier payouts through a payment service were planned, the MVP does not have them.
Data security
The service stores users' personal data. Sensitive fields are encrypted in the application before they are written to the database, the connection goes over HTTPS, the database is backed up. Sign-in is by a code from the Telegram bot, access is split by the sender and courier roles.
Quality and releases
Three developers were writing one frontend in a few weeks, so I set the rules right away: the folder structure is described in the README, ESLint checks the code style, all code goes through cross-review.
The backend got unit tests, the frontend got component snapshot tests on Vitest and @vue/test-utils, which were written by AI agents.
After the repository moved to GitLab we set up GitLab CI: it builds the Docker images and rolls them out to the VPS automatically.
- build Docker images
- deploy VPS
There was no formal process: calls and messages with the client directly, tasks for the developers in git issues, no sprints.
Challenges
A frontend without a backend
- Проблема
- The deadline was tight, the frontend had to start right away, and there was no backend yet.
- Решение
- I gave the team the API contract in Swagger, and in the first week set up the frontend skeleton and an MSW mock server.
- Итог
- Two developers built the screens against the contract without waiting for the API, the backend went in parallel. The MVP was built in about 5 weeks.
Phone sign-in without SMS
- Проблема
- The phone number has to be confirmed, and an SMS provider charges for every message. For an MVP on a small budget this matters.
- Решение
- The confirmation code comes through a Telegram bot. On the frontend there is a phone mask, a role choice, sender or courier, and code entry in 4 cells with a resend timer.
- Итог
- The bot is free, and the crews are on Telegram anyway, so the code arrives where it is convenient for them.
Metrics and results
- ~5 wkto the MVP, frontend and backend in parallel
- 3developers on the team
- 2roles: sender and courier
The client accepted the MVP. The project never reached launch, so there are no usage metrics.
Need an MVP in a few weeks or a service with a map and roles?
I will do the design, the frontend and the backend, bring in a team if needed and take the MVP through to handover.