Vlad Ilie
movelo — a marketplace for bike rental companies, rebuilt in 2026
Prototype · Marketplace · Next.js

movelo — a marketplace for bike rental companies, rebuilt in 2026

movelo.ro ↗
2 weeks ago
•••
6 min read

Context

After a year of building online rentals for a single e-bike business, I wondered what it would look like for many rental companies at once. movelo is the answer: a Romanian marketplace where you pick a city, a pickup time and a duration, and see bikes from every company renting there. The first version was a prototype, built mostly in 2023. In October 2026 I rebuilt it almost from scratch, using everything I had learned from the rental projects that came after it.

The problem

Small rental companies each need the same things: bookings, card payments, invoices, emails and a record of their bikes. Building them separately for every company doesn't scale. A shared platform, though, has to answer a few hard questions: how does the customer pay the company directly rather than a middleman; who issues the invoice; and how do you make sure the same bike isn't rented twice when two customers pay in the same second?

What I built

Under the hood

The 2026 rebuild moved the project to Next.js 16 with server actions, React 19 and Prisma 7 on PostgreSQL. Sign-in uses better-auth with no passwords: an email magic link, with optional Google and Facebook. Every write goes through a single layer that validates the input, checks permissions against the active company and records the action in the audit log. Order statuses follow a state machine declared once, so an order can't skip steps.

Availability is built on PostgreSQL time ranges and an exclusion constraint, with row locking when units are reserved. Time is always calculated in Romanian local time, and money through a small class of its own that splits partial refunds exactly. The public catalog is cached and refreshed on every change made in the panel, so city pages are static and only availability is calculated live.

Tests cover the time, money and availability functions, the payment processors and invoices, and integration tests run on a real PostgreSQL database, including 20 simultaneous bookings for a single bike, of which exactly one must succeed. Playwright tests walk the full flow, from choosing a city to payment, handover, return and the sales report, on desktop and mobile.

Status

A working prototype, around 570 commits, nearly 200 of them in the 2026 rebuild. It hasn't been launched with real companies and customers. Many of its pieces live on in the rental projects I've built since, and some came back into it from those projects, such as the Oblio integration.

Stack

Next.js 16, React 19, TypeScript, PostgreSQL (Supabase), Prisma 7, better-auth, next-intl, Tailwind CSS 4, shadcn/ui, zustand, zod, react-hook-form, React Email, Brevo, EuPlătesc, Stripe, Oblio, Supabase Storage, Umami, Cloudflare Turnstile, Vitest, Playwright, Vercel.

Technologies:

  • Next.js
  • PostgreSQL
  • Prisma
  • better-auth
  • EuPlătesc
  • Stripe
  • Oblio

Share on: