OpenJek is a ride-hailing web app built with Laravel 12. It supports rider booking, driver matching, order lifecycle tracking, and Stripe Connect onboarding for drivers.
App URLs
- Main app: https://openjek.com.test
- Dashboard:
/home - Profile:
/profile - API docs (Scramble):
/docs/api
Core Features
Rider
- Search pickup and dropoff addresses (OpenStreetMap Nominatim).
- Pick locations directly from map center pin.
- Get fare estimates before booking.
- Book rides and track active ride status.
- Cancel rides.
- View order history from dashboard with tabs:
ActivePastDate Range
Driver
- Switch between rider and driver modes.
- Select active vehicle.
- View incoming compatible orders.
- Match incoming orders.
- View assigned driver orders.
- Preview route on map.
Profile
- Update account details.
- Manage vehicles.
- Start Stripe Connect onboarding for payouts.
Tech Stack
- PHP 8.5+
- Laravel 12
- Alpine.js
- Tailwind CSS v4
- Vite
- PostgreSQL + PostGIS (via Magellan)
- Redis + Horizon
- Laravel Sanctum (token auth)
- Stripe Connect
Setup
Prerequisites
- PHP 8.5+
- Composer
- Node.js + npm
- PostgreSQL with PostGIS enabled
- Redis
Install
composer install npm install cp .env.example .env php artisan key:generate php artisan migrate
Or run the bundled setup script:
Run Locally
Use one command for app server, queue worker, logs, and Vite:
Or run only frontend dev server:
Build frontend assets:
API Overview
Authentication uses Sanctum bearer tokens.
Auth and User
POST /api/personal-access-tokensloginDELETE /api/personal-access-tokenlogoutPOST /api/usersregisterGET /api/usercurrent userPUT /api/usersupdate profilePUT /api/users/modeswitch rider/driver mode
Orders
GET /api/orderslist ordersPOST /api/orderscreate orderGET /api/orders/{uuid}order detailPOST /api/orders/{uuid}/cancelcancel orderPOST /api/orders/{uuid}/matchdriver match orderPOST /api/orders/{uuid}/pickupmark pickupPOST /api/orders/{uuid}/completecomplete orderPOST /api/orders/{uuid}/reviewsubmit review
Order list filters (GET /api/orders)
role=driverfor driver assigned ordersrole=driver_incomingfor matchable incoming ordersstatus=active|pastfor rider history tabsfrom=YYYY-MM-DD&to=YYYY-MM-DDfor rider date range filtervehicle_typeoptional vehicle filter
from and to are interpreted using X-Timezone request header.
Fare and Driver Tools
GET /api/calculate-farePOST /api/vehiclesPOST /api/driver/stripe/onboarding-linkPOST /api/stripe/webhooks/connect
Testing and Quality
Run tests:
php artisan test --compactRun code formatting:
vendor/bin/pint --format agent
Notes
- If frontend changes are not visible, run
npm run devornpm run build. - The app is served by Laravel Herd at
https://openjek.com.test.