Android · React Native · Commission-Free
LocalKart localkart

The shop on your street,
in your pocket.

LocalKart is a hyperlocal, commission-free marketplace. It connects customers with the kirana and grocery shops already around them — the shopkeeper lists products and sets their own prices, packing charge, delivery charge and delivery radius. Customers browse nearby shops, compare them by price, distance and delivery, and place Cash-on-Delivery orders straight with the shop.

No commission No listing fee Cash on Delivery 1 app · 2 roles 57 API routes Live tracking Laravel 11 React Native
57API routes
2Roles, one app
7Order states
0%Commission
LocalKart customer home — shops near you, ranked by distance and delivery
LocalKart live order tracking — arriving-by pill and typed status timeline
What it is

One app, two sides of the same street.

A single mobile app opens into a different experience depending on who signed in. Customers get a full quick-commerce storefront; shopkeepers get a lightweight console to run their listing and their orders. A shopkeeper can also flip into customer mode to shop from other stores — same account.

Customer side

A full quick-commerce storefront

  • Discover — nearby shops ranked by distance, delivery cost and what's open
  • Search — one query across every nearby shop's catalogue, filter & sort
  • Compare — each shop's price, packing charge and delivery quote for your address before you commit
  • Cart & checkout — one order is from one shop; Cash on Delivery
  • Track — live map with the driving route, plus a status timeline that updates as the shop moves the order
  • Reorder — repeat a past order in one tap
Shopkeeper side

A lightweight console for the shop

  • Register a shop — name, location, logo & banner; goes live once approved
  • Products & variants — pack sizes, prices, stock, ordered photos
  • Delivery rules — free radius, max radius, packing charge, distance-band pricing
  • Today dashboard — the day's orders and revenue at a glance
  • Order queue — move each order through its lifecycle; the customer is notified at every step
  • Shop as a customer — switch modes without a second account
Roles live on the user record — customer, shopkeeper, admin. Admins run the platform from a separate Blade web panel.
What's in the box

Every capability is built
and running in v1.0.0.

Not a prototype — a complete hyperlocal commerce flow, end to end, from a GPS pin to a delivered Cash-on-Delivery order.

📍
Location-first discovery
Set your spot by GPS, by dragging a map pin, or by typing an address — reverse-geocoding fills in your city and state. Shops that can't deliver to you are filtered out.
GPS / map pinReverse-geocodeDelivery filter
🔎
Cross-shop search
A MySQL full-text index powers one search across every nearby shop. Results carry the shop, price, distance and delivery status; a filter sheet sorts by price, distance or delivery charge.
MySQL FULLTEXTOne querySort by total
🧮
Real delivery quotes
Before checkout, each shop returns a live quote for your coordinates: distance (Haversine), whether it's inside the free radius, which pricing band applies, and the packing charge on top.
HaversineFree-radius checkPer-shop quote
🗺️
Live order tracking
An in-app Google map with leaf markers for the shop and the delivery address, the actual driving route drawn as a road-following line, and a distance / ETA pill — plus a typed status timeline.
Driving routeDistance / ETAStatus timeline
🔔
Push notifications
Firebase Cloud Messaging (HTTP v1) sends a real push each time the shopkeeper advances the order — confirmed, being packed, out for delivery, delivered. Tapping it opens tracking.
FCM HTTP v1Per-step pushDeep link
🛒
One-shop cart rule
A cart holds items from a single shop. Adding from a different shop prompts an explicit "start a fresh cart?" — no silent clearing, no multi-shop checkout to reconcile.
Single shopExplicit prompt
🏪
Shopkeeper console
Product CRUD with variants and ordered images, a "Today" dashboard of orders and revenue, an order queue enforcing the legal status transitions, and shop logo / banner uploads.
Variants & stockToday dashboardLegal transitions
🔁
Reorder
From order history, "Reorder" rebuilds the cart from a past order in one tap — the same shop, the same items and pack sizes, ready for a fresh delivery quote and checkout.
One tapFrom history
🔑
Passwordless login (ready)
OTP sign-in — phone via Firebase Phone Auth, email via a server-sent 6-digit code — is fully built end to end. It ships hidden behind password login for now, switched on when billing lands.
Firebase Phone AuthEmail OTPFeature-flagged
How an order moves

Seven states. Only the
legal transitions are allowed.

The same table drives the shopkeeper's status buttons and the customer's timeline. Each forward step fires the customer notification shown underneath.

1
pending
Order Placed
Customer confirms Cash on Delivery. Stock is held.
2
confirmed
Order Confirmed
"Your order has been confirmed."
3
packing
Being Packed
"Your order is being packed."
4
ready_for_delivery
Ready for Delivery
"Your order is ready."
5
out_for_delivery
Out for Delivery
"Your order is out for delivery." Tracking map goes live.
6
delivered
Delivered
Terminal state. Cash is collected at the door.
×
cancelled
Cancelled
The one non-forward state — e.g. the shop was closed when confirming.

Every transition is written to an order_status_histories row with a timestamp — that's what the customer's timeline reads back. Illegal jumps are rejected by the same transition table on the server.

Pricing model

How delivery is priced —
and why the platform is free.

Each shop configures three numbers — a free-delivery radius, a maximum radius, and a packing charge — plus any number of distance bands. When a customer asks for a quote, the server walks this ladder for their exact Haversine distance from the shop.

The delivery-charge ladder

Distance > max_delivery_radiusNot available
Distance within free_delivery_radiusDelivery ₹0
Otherwise — falls into a matching delivery_rule bandBand's charge
Inside max radius but no band covers it (mis-configured)Not available

Packing charge is always added on top when delivery is available. Distance is Haversine, computed in PHP — no spatial database extensions needed.

★ The platform takes nothing

No commission. No listing fee. No registration fee.

There's no commission on the order, no fee to register a shop, and no charge to list a product. The shopkeeper keeps the item price and the delivery charge in full; the customer pays the shop directly in cash.

0% commission ₹0 to register ₹0 to list Shopkeeper keeps everything Cash, direct to the shop
⚡ End to end
A single order, start to finish
Two units — a Laravel API and one React Native app — carry an order from a GPS pin to a delivered Cash-on-Delivery bill.
1
Customer sets their location — GPS, map pin, or typed address. The app stores coordinates plus a reverse-geocoded city and state.
2
They browse or search — GET /shops and GET /search return only shops that are approved, open, and able to deliver to those coordinates, each with a price and distance.
3
They open a product and add to cart — pick a pack size (variant), POST /cart/items. If the cart already holds another shop's items, the app asks before clearing.
4
Checkout shows the real total — GET /shops/{shop}/delivery-quote for the delivery address gives item total + packing + delivery. Payment method: Cash on Delivery.
5
Order is placed — POST /orders runs one transaction: creates the order and items, decrements stock, writes the first status row, empties the cart.
6
Shopkeeper works the queue — each PUT /orders/{order}/status is checked against the legal transition table, logged with a timestamp, and pushes a notification to the customer.
7
Customer tracks it — the tracking screen polls every 12 seconds while the order is in flight, draws the driving route between shop and address, and advances the timeline.
8
Delivered — or reordered. On delivery the order goes terminal. From order history, "Reorder" rebuilds the cart from a past order in one tap.
Under the hood

A Laravel API, one React Native app, and a Blade admin panel.

The schema is deliberately forward-compatible: online payments, coupons, wallets, ratings and delivery-partner accounts aren't built, but nothing in the data model blocks them.

Backend — backend/ · REST API + admin
🅛
Laravel 11
Framework — /api/v1
🔐
Sanctum tokens
API authentication
🗄️
MySQL + FULLTEXT
Cross-shop search index
🧭
57 routes
The whole API surface
📐
Haversine in PHP
Distance — no spatial DB
🔔
FCM HTTP v1
JWT → OAuth push
📱
Firebase Identity Toolkit
Phone OTP verify
✉️
SMTP
Email OTP codes
Mobile app — mobile/ · one app, role-based navigation
⚛️
Expo SDK 57
Runtime · RN 0.86
🟦
TypeScript
Language
🧭
React Navigation 7
Role-based navigation
🔄
TanStack Query 5
Server state
🐻
Zustand
Local state
🗺️
react-native-maps + Directions
Tracking map & route
🎞️
Reanimated 4
Animation
🔤
Manrope + Material Symbols
Type & icons
The data model — 14 tables
userscustomer / shopkeeper / admin; one shop per shopkeeper
shopsname, location, logo, banner; visible only when approved
shop_delivery_settingsfree radius, max radius, packing charge
delivery_rulesdistance bands → a delivery charge
categoriesshared catalogue taxonomy with images
productsbelongs to a shop and a category
product_variantspack size, price, stock
product_imagesordered photos per product
carts / cart_itemsone active cart per customer, one shop
orders / order_itemssubtotal, packing, delivery, total; COD
order_status_historiesevery transition, timestamped
customer_addressessaved delivery addresses
device_tokensFCM tokens for push
notificationsin-app notification feed
What's inside

The real app, customer and shopkeeper.

Warm off-white ground, emerald primary, bold Manrope headings and iOS-style rounded frames — a unified design system across both roles.

LocalKart splash
Splashlocalkart · "shops on your street"
LocalKart location permission
LocationFind shops that actually deliver
LocalKart location selection map
Pin your spotMap + "14 shops deliver here"
LocalKart shops near you
DiscoverShops near you, ranked
LocalKart cross-shop search results
Cross-shop searchOne query, price + delivery compared
LocalKart shop storefront
StorefrontSticky category nav, add to cart
LocalKart product detail with pack-size variants
Product detailPack sizes, delivery, COD
LocalKart cart with single-shop bill
CartSingle-shop bill: item + packing + delivery
LocalKart checkout — address, summary, COD
CheckoutAddress, total payable, Cash on Delivery
LocalKart order tracking timeline
Order trackingArriving-by pill + typed timeline
LocalKart orders — current and past
OrdersCurrent & past · Track / Reorder
LocalKart shopkeeper Today dashboard
Shopkeeper · TodayWork queue by status, not charts
LocalKart shopkeeper order queue
Order queueConfirm · Mark ready · Mark delivered
LocalKart shopkeeper delivery setup
Delivery setupFree radius, max radius, bands, packing
LocalKart shopkeeper products with stock toggles
ProductsPack sizes, stock & visible toggles
Get the app
Download for Android.

Android 6.0+. Enable Install from unknown sources in settings. APK — no Play Store required.
Backend API live · Laravel 11 · /api/v1 · 57 routes.

This is a preview build. The live API base URL is not published on this page yet.

⬇ Download APK (Preview) v1.0.0 Android 6.0+ · Cash on Delivery · No commission