Web · 2026
REOL — a lehenga store with UPI checkout
A complete online store for lehengas on plain PHP: storefront, bag, checkout, UPI payment with proof upload, order tracking, and an admin for products, collections, orders, customers, discounts and messages. Built for shared hosting, where the honest constraint is "upload files, import a .sql, edit a .env".
Most small Indian retailers do not take cards online; they take UPI, and they confirm a payment by looking at their phone. REOL is a store built around that fact rather than around a payment gateway. A customer places an order, pays by UPI to the store's ID, uploads a screenshot of the confirmation, and a person on the admin side verifies it against their own banking app before the order moves. It is slower than Stripe and it is how the business actually runs.
The shape
Plain PHP 8 and MariaDB, no framework, no Composer, no build step. The deployment target is shared hosting, where the honest constraint is upload files, import a .sql, edit a .env, and every dependency is a thing that can go wrong on a host you do not control. It is the same discipline as this site and for the same reason.
The storefront side is products, collections, a bag, checkout, payment and tracking. The admin side is products, collections, orders, payment verification, customers, discount codes, messages and settings, behind three staff roles — owner, manager, staff — fixed in a single configuration file so that who-can-do-what is answerable from a diff rather than from a database. A seeder ships demo credentials for every role, and one console command creates the first real owner.
The comments explain why
Several comments in the codebase record a bug that has already happened once: the guest-cart merge when someone signs in with items already in their bag, the clock mismatch between PHP and the database on a host where the two are configured differently. They are written so that the next person does not delete the odd-looking line as noise, because deleting it is how the bug happens again. That is what comments are for; a comment that explains what the line does is a line that should have been clearer.
The test that matters is a crawler
There are unit tests, but the guard that matters is a smoke test that drives a real purchase end to end over real HTTP against a running dev server: it signs in as a customer and as an admin, adds to the bag, places an order, uploads a payment proof, verifies it from the admin side, and checks that every page renders. What it proves is that no route errors and that the flows connect — which is the failure mode of a store, since nobody notices a broken checkout until a customer does.
The feature set it set out to have, it has. It has not yet been launched; the day it is, the open list becomes the work.