Addis Bike Rental Platform
A complete bicycle rental platform for Addis Ababa, managing the full rental lifecycle across multiple city stations. The system includes a web admin dashboard for fleet operators, handling bike inventory, user accounts, rental sessions, and financial transactions — replacing entirely manual station management processes.
Client
Addis Bike
My Role
Full Stack Developer
Timeline
2023
Status
Live · Production



Addis Bike was managing a growing city fleet with spreadsheets and manual check-in forms. There was no unified view of station inventory, no automated billing, and no audit trail for disputes. Operators needed a system they could use from day one with no learning curve — and it had to be accurate enough to be the financial record of truth.
A deliberately structured monolith with clean internal separation between API, business logic, and data access — chosen over microservices because the scale didn't justify the operational overhead, and a single deployable unit is easier for a small ops team to own. Docker packaging ensures consistent deployments across environments.
React SPA with fleet map, bike status board, rental history, user management, and financial reporting.
Business logic layer handling rental lifecycle, billing computation, inventory management, user auth, and reporting aggregations.
MongoDB document store for bikes, stations, users, and rental session records. Indexed for dashboard query performance.
Docker-containerized application with Nginx reverse proxy, deployed on a managed VPS for cost-effective city-scale operations.
- 1
Built the complete platform as a solo developer — API, admin dashboard, database schema, and production deployment.
- 2
Designed the rental session state machine: reserved → active → completed / disputed, with atomic transitions and full audit logging for every state change.
- 3
Implemented the station inventory system: real-time bike availability per station, low-stock alerts, and visual fleet status board for operators.
- 4
Built the financial reporting module with daily, weekly, and monthly revenue aggregations plus CSV export for accounting reconciliation.
- 5
Containerized the application with Docker Compose and deployed to production with Nginx reverse proxy and HTTPS termination.
Concurrent Bike Availability — Preventing Double-Booking
Two users at the same station can attempt to rent the same bike simultaneously. Solved with optimistic locking on the bike document — the rental transaction checks and updates availability atomically; concurrent attempts fail fast and prompt the client to select a different bike.
Rental Session State Machine
A rental spans multiple states: reserved, active, completed, disputed. Each transition must be auditable for financial disputes. Implemented state validation guards that prevent illegal transitions, with an immutable audit event logged on every state change.
Multi-Role Access Control
Station operators, fleet managers, and super admins each needed different views and permissions. Implemented JWT-based RBAC with middleware-level enforcement on every route — authorization logic centralized rather than scattered across handlers.
City-scale fleet management across multiple stations in Addis Ababa
Complete rental lifecycle automation eliminating all manual tracking
Financial reporting module replacing manual accounting reconciliation
Zero data migration issues on production deployment — running live from launch day
“Architecture decisions should match team size and operational maturity, not resume ambitions. Choosing a well-structured monolith over microservices for this project was the right call — it shipped faster, was easier to debug, and the small ops team could own the full system without specialized Kubernetes knowledge.”