Skip to main content
Portfolio
Back to Portfolio
Urban Bicycle Rental System · Addis AbabaLive · Production

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

Node.jsExpress.jsReactMongoDBDockerNginxJWT
Addis Bike Rental Platform
Operations dashboard — live revenue, payment health, and fleet metrics
Operations dashboard — live revenue, payment health, and fleet metrics
IoT device control — remote lock/unlock, telemetry, and GSM signal monitoring
IoT device control — remote lock/unlock, telemetry, and GSM signal monitoring
The Problem

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.

System Architecture

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.

Admin Dashboard

React SPA with fleet map, bike status board, rental history, user management, and financial reporting.

ReactReact QueryChart.js
REST API

Business logic layer handling rental lifecycle, billing computation, inventory management, user auth, and reporting aggregations.

Node.jsExpress.jsJWT
Database

MongoDB document store for bikes, stations, users, and rental session records. Indexed for dashboard query performance.

MongoDBMongoose
Infrastructure

Docker-containerized application with Nginx reverse proxy, deployed on a managed VPS for cost-effective city-scale operations.

DockerDocker ComposeNginx
My Contributions
  • 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.

Engineering Challenges

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.

Results & Impact

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

Key Takeaway

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.