Can you deploy a portfolio-grade micromobility system without running up high cloud bills or buying piles of hardware? You can. Most student projects settle for generic database forms and standard UI kits. A solid bike rental final year project needs more grit. It has to handle real operational limits like state machines, role checks, live inventory, and signed liability waivers. Reviewers want to see clean architecture and automated tests, not bare API keys pasted into a frontend.
Pick your stack early, whether you choose a JavaScript monorepo or an enterprise Java backend. Lock down your API quotas, configure automated CI pipelines, and keep your Git history clean. Here is the technical blueprint to build and audit a micromobility capstone repository in 2026.
Core Micromobility Rental Workflows: What Makes an FYP Repo Defensible
Generic e-commerce templates fall flat during capstone reviews. Evaluators want domain logic that reflects actual street operations. Your database schema and state transitions must keep rider actions completely separate from admin workflows.
Role Separation: Renters vs. Fleet Admins
Thing is, mixing renter actions with admin controls is an immediate red flag. Renters browse station hubs, inspect availability on a map, sign liability waivers, unlock bikes, file damage reports, and settle charges. Fleet managers live in a separate operational loop. They onboard vehicles, register hardware identifiers, monitor state of charge on electric units, schedule shop maintenance, adjust pricing rules, and manage geofenced station polygons.
Never expose fleet status endpoints to unprivileged user sessions. That is an instant failure during a code audit.
Telemetry and Fleet Categorization
A bike record needs far more than a brand name and an available flag. Model a realistic pilot fleet of 10 to 20 vehicles spread across 3 or 4 virtual stations:
- Classification data: vehicle type (commuter, city cruiser, cargo bike, or pedal-assist e-bike), model, brand, color, and frame serial number.
- Powertrain metrics: battery state of charge (percentage) and estimated range in kilometers based on consumption curves.
- Operational states: discrete status values (
available,reserved,active_ride,pending_inspection,in_maintenance) along with physical lock states (locked,unlocked). - Geospatial coordinates: real-time latitude and longitude values linked to a specific station or virtual dock.
- Pricing rules: unlock base fees, per-minute charges, flat hourly rates, and maximum daily caps.
[ Available ] -> ( Reserve / Lock ) -> [ Reserved ] -> ( Sign Waiver + Unlock ) -> [ Active Ride ]
^ |
| |
( Maintenance OK ) ( Dock / End Ride )
| |
+-- [ In Maintenance ] <-- ( Flag Damage / Fault ) <-- [ Pending Inspection ] <----+
Digital Liability Waivers and Checkout Integrity
Students often skip the legal flow entirely. You cannot hand over a vehicle without an executed waiver. As outlined in rental agreement frameworks documented by PDFliner, standard agreements demand clear damage inspection terms, deposit authorizations, return rules, and explicit assumption of risk.
Make this dependency mandatory in code. When a client calls POST /api/v1/rentals/:id/unlock, run four sequential validations:
- Confirm the session token belongs to an active, authenticated user.
- Ensure the bike holds an
availablestatus, or is alreadyreservedby this exact user. - Verify accepted terms of service, storing an immutable timestamp and user ID in the transaction log.
- Validate that the sandbox deposit hold or payment authorization cleared.
Architectural Decision: MERN with React Native vs. Spring Boot Enterprise Backend
Your tech stack shapes everything from sprint speed to Git structure. Most teams either build on the JavaScript MERN stack with React Native or deploy an enterprise Java Spring Boot service backed by Hibernate and SQL.
| Evaluation Metric | MERN + React Native | Spring Boot + Hibernate |
|---|---|---|
| Development Velocity | Rapid prototyping; single language (JavaScript/TypeScript) across web, mobile, and server tiers. | Moderate; requires strict entity mapping, compiled runtime verification, and explicit configuration. |
| Code Reuse | 60% to 70% shared logic across admin dashboard and rider mobile application. | Minimal cross-tier reuse; distinct runtimes for client applications and backend microservices. |
| Role-Based Security | Middleware token verification using JSON Web Tokens (JWT) and OAuth 2.0 gateways. | Declarative method-level security via Spring Security, role hierarchies, and expression-based access control. |
| Data Persistence | Document-oriented schemas (MongoDB) suited for flexible JSON telemetry and nested logs. | Strict relational normalization (PostgreSQL/MySQL) enforcing ACID guarantees and foreign key integrity. |
| Concurrency Control | Optimistic concurrency via document version keys (__v) or application-level locks. |
Native pessimistic row-level locking (PESSIMISTIC_WRITE) and transaction isolation levels. |
| Learning Curve | Low to moderate for developers familiar with modern ECMAScript standards. | Moderate to steep, driven by dependency injection containers, JPA entity managers, and ORM tuning. |
When to Choose MERN with React Native
Combining React for administrative portals with React Native on mobile cuts down duplicate engineering work. Analysis from Aalpha shows teams can share 60% to 70% of their logic across both applications. That cuts mobile build time by up to 40% compared to building separate native clients for Android and iOS.
Small teams on short deadlines benefit immediately. You can share validation schemas, coordinate helpers, and API client types inside a common folder that both apps import directly. Besides, MongoDB handles fast-changing telemetry payloads with ease, so you can append battery drops and coordinate breadcrumbs without running SQL migration scripts every other day.
When to Choose Spring Boot with Hibernate
Spring Boot makes sense when your program grades you on strict software engineering patterns, normalized schemas, and explicit transaction management.
Standard capstone architectures, like the enterprise templates cataloged by Codebun, organize rental tasks into distinct DAO, Service, and Controller layers. Spring Boot really shines when managing booking conflicts. If two riders tap reserve on the last e-bike at the exact same instant, Spring Data JPA protects you with pessimistic row-level locking:
@Repository
public interface BikeRepository extends JpaRepository<Bike, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT b FROM Bike b WHERE b.id = :id AND b.status = 'AVAILABLE'")
Optional<Bike> findByIdAndLockIfAvailable(@Param("id") Long id);
}
The database engine blocks the second write immediately. Go with MERN and React Native if speed and cross-platform mobile delivery matter most. Pick Spring Boot if your defense focuses on ACID transactions, database normalization, and formal enterprise patterns.
Geolocation and Mapping Setup: Navigating Google Maps Platform Quotas in 2026
Turns out, unmonitored map calls can blow through budgets before your first demo. Many students commit unrestricted API keys to public repositories or trigger geocoding queries inside re-rendering loops.
Google retired its legacy $200 monthly flat credit on March 1, 2025. In 2026, the Google Developers platform enforces SKU-specific quotas instead. Essentials SKUs allow 10,000 free events per month for Dynamic Maps, Static Maps, Geocoding, and Places Autocomplete sessions. The 2D Map Tiles SKU gives you 100,000 free requests per month, billing at $0.60 per 1,000 requests thereafter. Exceed those monthly thresholds and standard metered rates apply: Dynamic Maps cost $7.00 per 1,000 loads, Geocoding runs $5.00 per 1,000 calls, and Places Autocomplete runs $2.83 per 1,000 queries.
To keep your testing free and safe, use four direct safeguards:
- Restrict keys by HTTP referrer for web apps or SHA-1 fingerprints for mobile apps.
- Set hard daily quotas in the console, such as 300 calls a day.
- Configure billing threshold alerts delivered straight to your email.
- Cache station coordinates locally.
Docking hubs do not move. Save the coordinates once:
// Example: In-memory geocode caching utility to conserve API quota
const stationCoordinateCache = new Map();
export async function getStationCoordinates(stationAddress, apiKey) {
if (stationCoordinateCache.has(stationAddress)) {
return stationCoordinateCache.get(stationAddress);
}
const endpoint = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(
stationAddress
)}&key=${apiKey}`;
const response = await fetch(endpoint);
const payload = await response.json();
if (payload.status === "OK" && payload.results.length > 0) {
const coordinates = payload.results[0].geometry.location;
stationCoordinateCache.set(stationAddress, coordinates);
return coordinates;
}
throw new Error(`Geocoding failed for address: ${stationAddress} (Status: ${payload.status})`);
}
GitHub Repository Architecture, Secrets Management, and Automated CI/CD
Clean repositories show organized thinking before anyone reads the business logic. Dumping backend scripts and frontend assets into a single root directory looks sloppy. Split your code into clear workspaces instead.
Recommended Monorepo Directory Layout
bike-rental-fyp/
|-- .github/
| |-- workflows/
| | |-- backend-ci.yml
| | `-- client-ci.yml
| `-- pull_request_template.md
|-- client/
| |-- src/
| | |-- components/
| | |-- screens/
| | |-- navigation/
| | `-- services/
| |-- package.json
| `-- .env.example
|-- server/
| |-- src/
| | |-- controllers/
| | |-- middleware/
| | |-- models/
| | |-- routes/
| | `-- utils/
| |-- tests/
| |-- package.json
| `-- .env.example
|-- shared/
| |-- constants/
| `-- types/
|-- .gitignore
|-- LICENSE
`-- README.md
Secrets Management and Credential Hygiene
Add .env to your .gitignore file before running your first commit. Include a clean .env.example file with placeholder values:
# Server Environment Configuration (.env.example)
PORT=5000
NODE_ENV=development
DATABASE_URL=mongodb://localhost:27017/micromobility_fyp
JWT_SECRET=replace_with_development_jwt_secret_min_32_chars
MAPS_API_KEY=replace_with_restricted_google_maps_key
This shows reviewers exactly what configuration the app expects without leaking real credentials or database strings to public scrapers.
Continuous Integration with GitHub Actions
Automated checks prove your branches actually build and pass tests. As shown in workflow guides on freeCodeCamp, GitHub Actions can lint code, install dependencies, and run unit tests on every pull request targeting your main branches.
name: Backend Continuous Integration
on:
pull_request:
branches: [ main, develop ]
push:
branches: [ develop ]
jobs:
test-server:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
- name: Set up Node.js Runtime
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
cache-dependency-path: server/package-lock.json
- name: Install Dependencies
run: npm ci
- name: Run Static Code Analysis (Lint)
run: npm run lint
- name: Execute Automated Test Suite
run: npm test
env:
NODE_ENV: test
JWT_SECRET: ${{ secrets.CI_JWT_SECRET }}
DATABASE_URL: ${{ secrets.CI_TEST_DB_URL }}
Protect your main branch with rule sets. Require at least one peer review and a passing CI workflow before code merges. That keeps your demo branch clean.
Role-Specific Project Execution: Guidelines for Developers and Academic Evaluators
Connecting technical code milestones with thesis expectations keeps your team on schedule.
For Students and Capstone Developers
Structure your development milestones around the standard five-chapter thesis structure described by itsourcecode. Map your commits, pull requests, and releases directly to each chapter:
- Chapter 1 (Introduction and Problem Definition): Frame campus congestion and transit gaps. Map these goals directly to GitHub project epics and user personas.
- Chapter 2 (Literature Review and Benchmarking): Review existing bike-share systems and store architectural decision logs in your repository docs folder.
- Chapter 3 (Methodology and Architecture): Commit your database schemas, state charts, and reservation sequence diagrams in PlantUML or Mermaid formats.
- Chapter 4 (Implementation): Link thesis sections to merged pull requests covering role authentication, coordinate validation, and rental transactions.
- Chapter 5 (Evaluation and Defense): Cite automated test results, endpoint benchmarks, and test coverage logs generated by your GitHub Actions runs.
For Academic Evaluators and Code Reviewers
To be honest, reviewing a student repository means looking past the graphical interface. Use this five-point audit rubric to check backend quality:
- Route guards: check endpoints like
PATCH /api/v1/bikes/:id/statusto verify that admin rights are validated by backend middleware, not just hidden by frontend buttons. - Concurrency controls: inspect booking functions to confirm the database rejects simultaneous reservations on the same asset via locks or atomic operations.
- Timeout rollbacks: review state machine behavior when unlock commands fail so renters are not trapped in active billing cycles.
- Git history hygiene: run a secret-detection scanner across all historical commits to ensure database credentials and Google Maps keys were never pushed.
- Quota safeguards: verify that map components use bounding-box queries, debounced inputs, or cached coordinates rather than firing network requests on every render.
Frequently Asked Questions
Can I simulate bike GPS tracking without integrating physical IoT hardware?
Yes. Evaluators do not expect you to buy cellular trackers for a prototype fleet. A lightweight background script written in Node.js or Python can simulate hardware feeds. Feed it an array of urban waypoint coordinates and push updates across WebSockets or MQTT to your backend. You can test route tracking and geofencing reliably without soldering a single wire.
How do I prevent unexpected cloud bills during live project defense demonstrations?
Do not rely on live calls to external APIs while presenting. Seed your staging database with pre-computed station coordinates and map assets ahead of time. Set your Google Cloud daily call caps low, around 200 to 300 requests, and verify billing alert emails work. Running your live presentation against local or cached data prevents API rate limit errors and network drops.
Should a bike rental FYP include payment processing in test mode?
Yes. Complete transactions prove your rental lifecycle works from end to end. Set up a sandbox account using Stripe Elements or PayPal Sandbox. Your backend should listen for signed webhook notifications before moving reservations from pending_payment to an active rental status. Store mock charge tokens and ensure deposit holds release cleanly when riders return vehicles. Never touch live credit cards or store production API keys.
Start by scaffolding your monorepo folders, setting up strict branch protection, and pushing your sanitized .env.example file. Once your GitHub Actions workflow passes, build your core reservation state machine before touching any map UI.