Marketplace + Manager app
Rodaku
Rent a scooter in Bali, straight from the local shop.

The problem
Scooter rental in Bali runs on trust and a handshake. A shop that keeps your passport as a deposit is almost normal, and the scooter in the photo is not always the one at the counter. Most small shops have no website, so a traveller has little to go on beyond a price and a few pictures.
What I built
Two products on one codebase. For travellers, a fast server-rendered website with each shop's own fleet, prices and rules, in English and Bahasa Indonesia. For shops, Rodaku Manager: an installable app where requests, calendar and fleet sit in one place. A shop signs up with one WhatsApp message and puts a bike online with three photos. Under both sits a short list of promises, like one listing per licence plate and no passport as a deposit, that the build checks before anything ships.
Rodaku connects travellers with the small scooter rental shops of Bali. A traveller looks at a shop's real bikes and sends it a booking request. The shop answers from its own phone, in an app that speaks Bahasa Indonesia. Rodaku takes no commission and never holds the rental money; shops pay a flat monthly fee. I built both sides, the public website and the Manager app, on one codebase.
What makes it notable
A request, not a booking
A request holds no bike and blocks no dates, so several can arrive at once. The shop accepts one, which reserves the bike and declines the requests that clash. The renter follows it on a private status link. WhatsApp only tells the shop something is waiting; the deciding happens in the app.
One listing, one licence plate
Every listing is locked to a single plate. If the photos show a red Scoopy with a scuffed fairing, that is the bike at the counter. A shop that says it keeps a passport or KTP as security cannot publish at all, because the check runs before a bike can go live.
A claim needs proof before it shows
Every trust claim on the site is registered with the mechanism behind it, an owner and a way to complain. A claim without those cannot render, and the build fails. That keeps the six public promises true as the product changes.
Rodaku Manager, in the shop's language
The shop app installs from the browser and speaks Bahasa Indonesia. It has five tabs: today, calendar, fleet, money and shop. There is no password and no emailed code. The shop sends one WhatsApp message from its own number, and that number is the account.
Snap & List
A bike goes online with three photos: front, side and the STNK registration card. A vision model reads them, the shop confirms the plate itself, and anything the model is unsure about is flagged for a person instead of guessed.
Built to be found, and to be cited
Every public page is server-rendered with structured data that search engines and AI assistants can read straight off the page. Ten renter guides answer the questions travellers actually ask. A build gate refuses third-party hosts on public pages, and the data sits on servers in Jakarta.
Tech stack
- Next.js 16
- React 19
- TypeScript
- Installable web app (PWA)
- PostgreSQL 18
- postgres-js
- Raw SQL migrations
- Hexagonal architecture
- Append-only ledger
- Vitest
- Playwright
- WhatsApp Cloud API (Meta)
- Midtrans
- Google Vertex AI (vision)
- Remotion
- Higgsfield
- Google Cloud Run (Jakarta)
- Cloud SQL
- Cloudflare
- GitHub Actions
Gallery
The website




The website on a phone



The Manager app
Example data: a fixture shop, not a live one. Plates and prices are covered.



Frequently asked questions
Rodaku is a scooter rental platform for Bali. Travellers look at a local shop's own bikes and send it a booking request. The shop answers, the traveller pays the shop, and Rodaku takes no commission on the rental.