DEV3 Basketo – Grocery Delivery Platform with Picker & Rider Apps (Laravel + Flutter)

A self-hosted quick-commerce grocery platform on Laravel 12 and Filament 4: express and scheduled slots, weighed items, substitutions, dark-store picking, rider dispatch with delivery codes, wallet and Plus, plus Flutter customer, picker and rider apps.

by DEV3 TechnologiesVerified Author(0) 0 sales 0 viewsUpdated 04 Nov 2026

Video tour. Pick a section below to browse 120 screenshots in 42 sections.

Basketo is a quick-commerce grocery delivery platform you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4, with three Flutter apps on the same REST API. Customers order from the nearest dark store, pickers collect the basket aisle by aisle, and riders deliver it against a four-digit code. One installation holds the public shop, an admin panel, a store panel for pickers and three apps: customer, picker and rider.

No live demo: the 120 grouped screenshots and the two video tours above show the web shop, the admin and store panels and all three apps. Install it with the bundled demo data (the fictional city of Bayhaven) to try every role on your own server.

Built around how groceries are actually sold

  • Weighed and unit items: loose produce is priced per kilo with a weight step; packed goods are sold by unit. A customer picks a weight and sees the price for it.
  • Express and scheduled delivery: an express promise in minutes, plus scheduled windows with their own fee and capacity per dark store. Full slots are shown as full, and unpaid card orders release their stock and slot after 30 minutes.
  • Substitution choice per line: closest match, ask me, call me, or no substitute. Swaps wait for the customer's decision until packing, and the admin has an approvals queue.
  • Pay for what is picked: a lighter weight, a cheaper substitute or a missing item is refunded to the wallet after packing. A heavier weight is absorbed, up to 10% over for loose items.
  • Recipes to basket: change the servings and every ingredient lands in the basket. Combos price themselves when the full set is present.
  • Smart search: synonyms, brand and category matches and a "did you mean" for typos.
  • Basketo Plus and referrals: memberships with a lower free-delivery minimum and a member discount, wallet top-ups and referral rewards.

Inside the dark store

  • Stock per hub with zone, aisle and bin, batches with expiry dates and first-expired-first-out deduction, write-offs, suppliers and purchase orders that can be drafted from low stock.
  • The pick queue shows express orders first with SLA timers. The pick list is sorted by zone and aisle, with a simulated barcode scan, weight entry, a substitute sheet and a missing button. Then pack with bag and cold-bag counts and hand over with the rider's pickup code.
  • Pickers can use the /store web panel on a hub tablet or the picker app.

Riders and dispatch

  • Orders are offered to the nearest free rider, re-offered when an offer expires, and a rider can hold two active jobs at most. Admins can also dispatch by hand.
  • The rider app has an online toggle, an offer card with a countdown, a route to the store and then to the customer, the pickup code, a delivery-code pad, cash collection, earnings and trip history.
  • Riders earn base pay, a per-km rate and the whole tip into an earnings wallet; cash in hand is settled in the admin.

Admin

Operations (orders, live map, dispatch, riders, refunds, substitution approvals), catalogue, inventory, marketing (offers, combos, coupons, banners, CMS pages), customers and Plus plans, reports with CSV export, and platform tools: payments, wallets and ledger, tax, currencies, push log, service zones, roles, audit log and backups. A 3D live-city widget on the dashboard shows hubs and riders.

The three apps

  • Customer: onboarding, location check, aisles, search, products with a weight or unit stepper, recipes, basket with substitution preferences, slot picker, checkout, live tracking, orders and reorder, wallet, Plus, referrals.
  • Picker: queue with SLA rings, pick list by zone, scanner view, weigh produce, substitute, pack and handover.
  • Rider: online home, offers, navigation, delivery-code drop, earnings and trips.
  • All three run in light, dark and Arabic right-to-left, and each has an offline demo mode that needs no server.

Also included

English and Arabic (right to left) on the web, panels and apps; a web installer; demo and empty install modes; a REST API with an OpenAPI file; roles and an audit log; a 3D produce-basket hero on the marketing page with a poster for reduced motion.

Quality checks

Basketo 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the packaged build: static analysis (Pint clean, Larastan level 6 with 0 errors), 108 Pest tests with 1176 assertions, a front-end budget of 35.2 KB gzipped JavaScript and CSS on the public page (the three.js chunk loads lazily), migrate and seed on MySQL 8 and SQLite, a headless browser pass over 71 pages and flows, an installer test from the zip, and a secret scan. The Flutter apps have 36 (customer), 21 (picker) and 21 (rider) tests, and each passed its analysis and build gates.

Good to know

  • Payments, SMS and push were not tested with live accounts. Stripe, Razorpay and PayPal drivers, FCM and APNs push, and Twilio and Vonage SMS are present, but the default is a simulated gateway and the tests and screenshots use it. Try your own sandbox keys before taking real orders.
  • The apps were not tested on physical phones. They were run in simulators and built and driven headless against the demo server. Store submission, signing and device testing are yours to do.
  • Apps and real payments: the apps' card sheet is simulated. With a real gateway configured, the API returns a payment_url and nothing is credited until the gateway confirms, so you need to open that URL from the app or add your gateway's SDK.
  • App-to-server coverage: all three apps were built in real mode and driven headless against a running server, including sign-in, and every API call returned 200. Flows that change data (checkout, picking, delivery) are covered by backend API tests, not by tapping through the app interface.
  • Maps are illustrations. The maps are offline, key-free drawings with simulated rider positions; the apps also include an OpenStreetMap mode. Wire in real location tracking and a routing provider for live use.
  • Barcode scanning is simulated in the web store panel and in the picker app's scanner view.
  • Catalogue text is single-language. The interface is English and Arabic; products, banners and recipes are in the language you enter them.
  • Costs: you need your own hosting, mail and SMS providers, and app-store accounts for the apps.
  • No hosted demo: you see the product through screenshots and video, and by installing it.

How it's built

Architecture, stack, key decisions and the quality gates DEV3 Basketo passed before release.

The engineering behind Basketo: a Laravel 12 and Filament 4 backend on a shared DEV3 core, a stock and slot model per dark store, money that follows what was actually picked, a dispatch sweep for riders and three Flutter apps that share one API contract.

The problem it solves

Grocery delivery is hard in ways a normal shop is not. Stock lives in a specific dark store, in a specific aisle and bin, and some of it expires. A customer orders two kilos of tomatoes, but the picker's bag weighs 2.1. A product is out of stock and the customer wanted a swap, or did not. A delivery slot has a capacity, and a card order that is never paid must not hold it forever. The money has to follow what was really picked, not what was ordered, and three different people (customer, picker, rider) each use a different screen on the same order.

The product had to answer all of that without the buyer needing a platform team: a self-hosted install on ordinary PHP hosting, with apps that can be tried offline and then pointed at the server.

Architecture and approach

Basketo is a Laravel 12 application with Filament 4 for the admin panel (/admin), a store panel for pickers and managers (/store) and the customer account (/account), plus a Blade storefront with a small JavaScript layer. Everything that is not about groceries comes from the shared dev3/laravel-core package: the installer, settings, payments, wallets and ledger, tax, roles, audit log, push and OTP.

Orders, slots and stock

  • One order lifecycle. Orders move through placed, confirmed, picking, packed, dispatched and delivered, with cancelled and refunded as exits; each line has its own status (pending, picked, substituted or missing).
  • Stock per hub. Inventory is a store-by-product record with on hand, reserved, zone, aisle and bin. Packing deducts stock first-expired-first-out from dated batches.
  • Slots with capacity. Checkout reserves a slot and stock; a scheduled job cancels card orders left unpaid for 30 minutes and releases both.

Money that follows the basket

  • Card money goes through one payment flow and the configured gateway. Wallet credit, memberships and orders apply only when the gateway confirms payment; instant capture happens only on the simulated gateway, from the API.
  • Prices include tax. A picking adjustment refunds only the discounted share the customer actually paid, and cash-on-delivery adjustments reduce the amount to collect.
  • Every amount is an integer in cents, and wallet movements go through an immutable ledger.

Dispatch

A packed order is offered to the nearest free rider. A scheduled sweep re-offers expired offers and dispatches packed orders that nobody took, and a rider can hold two active jobs at most. Pickup and delivery are guarded by codes.

Three apps, one contract

The customer, picker and rider apps are Flutter projects on a shared dev3_flutter_core package. Each has a demo mode with an in-app mock that mirrors the REST contract, and a real mode switched with --dart-define. App tokens carry only their own app's ability, so a picker token cannot open rider routes. The apps are tested against JSON captured from the live server.

3D and motion

The marketing page uses a lazy-loaded three.js scene: a produce basket over a low-poly city and a scooter on a glowing route, with a poster and a reduced-motion still. The admin dashboard has a live-city widget. Both stay out of the critical path of the shop pages.

Quality gates and results

Basketo 1.0.0 passed all seven release gates of the DEV3 Laravel suite, run against the packaged build:

  • Static analysis: composer validate, Pint clean, Larastan level 6 with 0 errors, and a syntax check of 344 PHP files.
  • Tests: 108 Pest tests with 1176 assertions, including checkout, fulfilment and wallet money-path suites.
  • Front-end budget: 14.0 KB of JavaScript and 21.2 KB of CSS gzipped on the public page, 35.2 KB in total against a 180 KB budget; the three.js chunk loads lazily.
  • Migrate and seed: the demo and empty seeders run on MySQL 8 and on SQLite.
  • Headless browser pass: 71 pages and flows checked.
  • Installer test: the zip unzips cleanly and the wizard installs with demo data and signs in as admin.
  • Secret scan: clean across the archive.

The Flutter apps ran their own gates: 36 tests for the customer app and 21 each for the picker and rider apps, each with analysis and builds passing.

Limits: real payment gateways, SMS and push were not run against live accounts, and the apps were not tested on physical devices. The listing's Good to know section has the full list.

Tech stack

Area Technologies
Backend Laravel 12, Filament 4 panels, REST API with OpenAPI file, Scheduler and queue, Per-app token abilities
Grocery engine Slot and stock reservation, Batches, first-expired-first-out, Substitution preferences, Picking adjustment refunds, Dispatch sweep, Pickup and delivery codes
Apps Flutter customer app, Flutter picker app, Flutter rider app, dev3_flutter_core, Offline demo mode
Frontend Blade, Tailwind CSS, Vite, three.js hero, Arabic RTL
Data MySQL 8 / MariaDB, PostgreSQL / SQLite, Integer cents, Immutable wallet ledger, Deterministic demo seeders
Integrations Stripe, PayPal, Razorpay drivers, FCM and APNs push drivers, Twilio and Vonage SMS drivers, Simulated gateway default

Inside the build

Signature 3D hero: A woven basket of fresh produce floats over a low-poly city while a scooter rides its glowing route. Signature 3D hero — A woven basket of fresh produce floats over a low-poly city while a scooter rides its glowing route.

Scroll-driven story: The camera drops from the basket towards the city as the second beat explains who picks your order. Scroll-driven story — The camera drops from the basket towards the city as the second beat explains who picks your order.

Guides & articles

Practical guides and engineering write-ups for DEV3 Basketo.

Grocery delivery script: following one basket from slot to doorstep

Last updated
Grocery delivery script: following one basket from slot to doorstep: DEV3 Basketo

Most grocery delivery demos stop at the basket. The hard part comes after checkout, when someone has to find eggs in an aisle, weigh the tomatoes, deal with a missing item and hand a bag to a rider. This guide follows one order through DEV3 Basketo, a self-hosted platform on Laravel 12 and Filament 4 with Flutter apps, in the order things actually happen.

The Basketo shop home: express promise, offers, aisles, combos and recipes for the nearest dark store

Minute 0: the customer builds a basket

The shop knows which dark store serves the customer's address. Loose produce is sold by weight, so the customer chooses an amount and sees the price for it; packed goods are sold by unit. Recipes add every ingredient in one tap and scale with the number of servings. Search understands synonyms and suggests the closest product when a word is misspelt.

Sold by weight: the customer chooses a weight and sees the price for it

Each line also carries a rule for what to do if it is unavailable: closest match, ask me, call me, or no substitute.

Minute 1: a slot with a capacity

Checkout offers an express delivery or a scheduled window. Windows have their own fee and capacity per store, and a full one is marked as full. Paying by card, wallet or cash on delivery are all options. A card order that is never paid is cancelled after 30 minutes by the scheduler, and its stock and slot are released.

Delivery slots: windows with their own fees and capacity, with full slots shown clearly

Minute 10: picking in the dark store

The order lands in the store's pick queue, express orders first, with an SLA timer. The pick list is sorted by zone and aisle so the picker walks the store once. The picker scans a barcode (the scanner is simulated in the web panel and in the app), types the weight for loose items, and either substitutes or marks an item missing. Then comes packing with the number of bags and cold bags.

The picker's list sorted by zone and aisle, with scan, weights, swaps and missing items

What the picker does decides what the customer pays. A lighter weight, a cheaper substitute or a missing item is refunded to the wallet, and if a discount applied only the share actually paid comes back. A heavier weight or a dearer substitute is absorbed, with loose items picked up to 10% over the ordered weight. When the customer's rule was "ask me", the swap waits for their decision until packing.

Minute 20: the rider

When the order is packed, it is offered to the nearest free rider. Offers expire and are re-offered; a scheduled sweep dispatches orders nobody took. The rider collects with the store's pickup code, follows the route and finishes the job by entering the customer's four-digit delivery code. For cash orders, the cash is recorded against the rider and settled later in the admin.

Video tour of Basketo

What to check in any grocery platform

  • Slots: are capacity and unpaid holds handled?
  • Weights: can the final charge differ from the order, and who absorbs the difference?
  • Substitutions: does the customer choose, and is there an approvals queue?
  • Picking: is the list sorted by location, and does stock deduct first-expired-first-out?
  • Handover: are there codes at pickup and at the door?
  • Apps: is there a picker app and a rider app, or only the customer one?

Limits worth knowing

Basketo ships with a simulated payment gateway; Stripe, Razorpay and PayPal drivers, push and SMS providers are included but were not run against live accounts. The apps were built and driven headless and in simulators, not on physical devices, and maps are illustrations with simulated rider positions. Version 1.0.0 was checked with 108 Pest tests, and the customer, picker and rider apps have 36, 21 and 21 tests. The listing's Good to know section covers the rest.

Frequently asked questions

The complete source code (version 1.0.0) as a download from your account, with the setup and usage guides shown on this page. You can modify the code to suit your product.

Buying guides: Laravel scripts with Filament panels and a web installer · Next.js or Laravel for a SaaS script?

More from this author

View all

Related in Web Scripts & Software

View all