DashKart docs

Changelog

Every DashKart release and what changed.

[1.0.1] - 2026-10-24 — Packing rounds, van unlock, phone API

Added

  • Integration API for phones and other scripts (docs/INTEGRATION.md): client exports ClockIn, ClockOut, IsOnDuty, GetDuty, GetStores, CanUseRemoteDuty, OpenTablet, event dashkart:client:dutyChanged, server exports IsOnDuty, GetDuty. Config.Rider.remoteDuty (off by default) allows clocking in / out away from the store; a remote clock out is refused with an active order or a rental out.
  • Big orders are packed in rounds (owner): the basket is split into bags by catalog weight at accept; the rider packs the first orderBag.carry bags (their shelves only, or a pack at the pickup point), loads them into the van, comes back and packs the next ones. Replaces the packed bags that waited on the store floor and the “Take bags” step (found live: at shelf stores the pickup point can be a back room nobody visits). Server-checked: a round can only start with empty hands; leaving with bags still to pack warns, and the order completes only with every bag delivered.
  • Van unlock: riders rent the van (and see bulk orders) only after Config.Rider.rental.van.unlockDeliveries completed deliveries (default 25, server-checked). The duty point shows a locked option with the requirement, and the rider is notified the moment it unlocks.
  • Debug commands /dk_bulkorder (bulk order at your store now) and /dk_setdeliveries <n> (van unlock testing).

Fixed

  • The free tablet on clock-in failed silently when the inventory was full (only a console warning). The player is now told to make room and clock in again.
  • Big orders: after the last bag the customer walked away and left the earlier bags on the ground by the door. They now bend down, pick them up (Config.Assets.anims.customerPickup) and leave with a bag in each hand.

[1.0.0] - 2026-10-23 — First public release

Added

  • Tablet map follows the real road network (captured with /dk_mapdump, built with tools/build_roads.js), with A* routing to the store and the customer.
  • DashKart rider tee as add-on clothing in dashkart_props (collections mp_m_dashkart / mp_f_dashkart), addressed by collection in Config.Rider.uniform.
  • Debug commands dk_clothcheck and dk_clothtry to diagnose add-on clothing in game.
  • Delivery bag step (Config.Rider.orderBag): after packing, put the order into the delivery bag on the rental scooter (or the back of the van) with the target, and take it out again at the customer’s door; the handover only appears once it is out. Riding with the order in hand lowers the rating (server-detected, one warning). The tablet shows the step.
  • Target bridge: vehicle options (AddVehicleOptions / RemoveVehicleOptions) for ox_target, qb-target and the TextUI fallback.
  • Debug command dk_bagdebug: shows why the delivery bag target does or does not appear.
  • Big orders on the van: packed into several bags by basket weight (Config.Rider.orderBag.bagCapacity, max 5). Packed bags wait on the store’s pickup counter (“Take bags”), the rider carries two per trip (second bag in the left hand), loads them into the van where they stay visible in the cargo area (Config.Assets.vanCargo, /dk_cargopos), and hands them over trip by trip; the customer sets them down by the door and the order completes with the last bag. Server-counted (counter / hand / van / delivered). The delivery target grows by extraMinutesPerBag per extra bag; the tablet shows loading / unloading progress.
  • Migration 004: dk_orders.target_minutes, so the tablet history judges on time with the order’s own target. The migration runner now skips ALTER TABLE ... ADD COLUMN for existing columns (MySQL 8 has no IF NOT EXISTS).
  • Debug commands dk_cargopos (van cargo position) and dk_bagpos2 (left-hand bag).
  • Opening delivery bag: new models dk_delivery_bag_body + dk_delivery_bag_lid (in dashkart_props, archetypes added to dk_props.ytyp). Stowing or taking out the order turns the rider to the bag, opens the lid, reaches in, moves the order bag between hand and bag halfway, then closes it; the order bag is visible inside while stowed. The van opens its rear doors instead. /dk_lid <angle> tunes the opening (debug mode).
  • Delivery box position for the vanilla faggio.

Changed

  • Branding: DashKart is published by MBTH Studios (resource author, startup log line, README, a credit line in the tablet settings).
  • Delivery bag: the logo and wordmark on the back face are 20% smaller.
  • Delivery bag colour: lime (#66B81F, matches the lime rental scooter and dk_delivery_box_lime) instead of Dash Teal; lining, stripes, trims and the logo are unchanged.

Added

  • Van unlock: riders rent the van (and see bulk orders) only after Config.Rider.rental.van.unlockDeliveries completed deliveries (default 25, server-checked). The duty point shows a locked option with the requirement, and the rider is notified the moment it unlocks.
  • Debug commands /dk_bulkorder (bulk order at your store now) and /dk_setdeliveries <n> (van unlock testing).

Fixed

  • Big orders: after the last bag the customer walked away and left the earlier bags on the ground by the door. They now bend down, pick them up (Config.Assets.anims.customerPickup) and leave with a bag in each hand.
  • Rider tee rebuilt from Rockstar’s base tee model with a correctly mipmapped texture.
  • Polish pass (server): writes queued during resource stop are sent before the resource is gone (DB.Drain, one transaction); a van run ends when its character logs out; bags stowed in a replaced rental count as lost instead of reappearing; two NPC orders can no longer pass the open-order cap at once; one free tablet per character per day; clock in/out no longer posts to the Discord stores channel; debug map-dump / drop-audit events go through the Net gateway (and a bad map value no longer shifts every road segment); /dk_storecash goes through PayoutService; admin cancel audit logs the state before the cancel; fines use Config.Accounts.fine.
  • Polish pass (client): the tablet can no longer open twice (second prop stuck in the hand); the bag’s lid and the order inside are removed with the rental after a disconnect; ending an order no longer hides other prompts (e.g. return vehicle); bag options stay hidden until the server answered; props are not mounted when the rental ended during its spawn; hand props of a running stow animation are removed on resource stop; customers without a door heading face the rider, then idle; the return-vehicle prompt no longer stalls while the server answers; failed requests show “Something went wrong” instead of “Slow down”.
  • Polish pass (tablet): replies for a store or filter that is no longer shown are dropped; a failed first load shows “Try again” instead of an endless skeleton; owner/admin live orders and the earnings history use each order’s own delivery target; the queue is refreshed on open; “bags left at the store” hint; cancel confirmation buttons stacked (no overflow); offer bar uses the server’s offer time; Hindi / Telugu text is counted in characters, not bytes (a long reason was rejected and flagged); new rider rating shows “-”; zero ledger amounts show no “+”; negative margins in pink; accessible toast and sound switch; bezel colours are tokens.
  • Big orders: bags left on the store counter were easy to miss (found live). They now have a beacon above them, driving away from the store with bags still there plays a warning sound and notification, and the tablet hint turns pink.
  • Translations: “phone” -> tablet, admin (not staff) cancellations, rating in the delivered message, Hindi / Telugu wording fixes.
  • Customers at the door sometimes stood in the air until the rider came close: the ped now waits for the ground collision, is placed on the ground, and only then starts its idle animation.

Docs

  • Invisible tee: FiveM streams add-on clothing only for Argentum+ keys or servers with 10 slots or fewer (README troubleshooting, docs/ASSETS.md).

[0.9.0] - 2026-10-22 — P5 Polish (internal, never published)

Added

  • DashKart delivery box (dk_delivery_box, our own model and texture) mounted on the rental scooter; per-model positions in Config.Assets.vehicleProps, tuned live with /dk_boxpos in debug mode.
  • Rider stats in the tablet: on-time streak with progress to the next streak bonus, star rating with partial stars, on-time / late tag and time taken on every recent delivery, streak milestone celebration (calm, honours reduced motion).
  • Log retention: dk_logs rows older than Config.Database.logRetentionDays (default 30) are purged once a day in small batches. Orders and the money ledger are never purged.
  • Migration 003: indexes for owner ledger paging, rider history, store overview and the admin log viewer.
  • Buyer docs: rewritten README, docs/CONFIG.md (every config key), docs/ITEMS.md, docs/ASSETS.md, docs/CUSTOM_FRAMEWORK.md.
  • node tools/package.js builds the release zip (rebuilds the UI, checks debug is off and locales match).

Changed

  • Debug mode is off by default and switched on per server with setr dashkart:debug "true"; no file edit needed for test servers.
  • Store purchase, sale, deposit and withdraw now move player money through PayoutService, using Config.Accounts.payout instead of a hardcoded bank account.
  • Exploit flags are throttled per player (every flag still counts toward kicks), so a modified client cannot flood the logs or the Discord exploit channel.
  • Integer arguments outside the 32-bit range are rejected by the net gateway.

Added

  • Van unlock: riders rent the van (and see bulk orders) only after Config.Rider.rental.van.unlockDeliveries completed deliveries (default 25, server-checked). The duty point shows a locked option with the requirement, and the rider is notified the moment it unlocks.
  • Debug commands /dk_bulkorder (bulk order at your store now) and /dk_setdeliveries <n> (van unlock testing).

Fixed

  • Big orders: after the last bag the customer walked away and left the earlier bags on the ground by the door. They now bend down, pick them up (Config.Assets.anims.customerPickup) and leave with a bag in each hand.
  • Van run and restock races: a store sold or a balance spent while the van spawned could restock nearly free; restock orders are now locked per store and re-checked after the spawn.
  • Renting twice during the scooter spawn took two deposits and left an extra vehicle; ending duty during the spawn left an orphaned vehicle.
  • A player dropping during clock-in kept a ghost session; declining arbitrary order ids grew memory.
  • Reopening the tablet quickly could run two position feeds; a customer walking away after handover could be left behind on resource stop.
  • The tablet map no longer re-renders twice a second while the rider stands still.

[0.5.0] - 2026-10-20 — P4 Owner dashboard, admin panel, Discord logs

Added

  • My store app in the tablet: overview with a daily sales/costs chart, live orders, stock, restock, staff and ledger. Managing works remotely with the tablet item (Config.Ownership.tablet.remote); cash moves stay at the counter by default.
  • Admin panel (/dashkart admin, ace dashkart.admin or an admin group): economy, stores (assign/remove owner, balance adjust, stock), live orders with force-cancel and optional compensation, riders, logs. Every call re-checks admin rights and is audited.
  • Discord webhooks per channel with a queue (10 embeds per request, 429 retry-after, retries on server errors) and a test button.

[0.4.0] - 2026-10-20 — P3 Tablet NUI

Added

  • DashKart tablet (React + TypeScript + Vite + Tailwind + Framer Motion): Home, Orders, Active order, Earnings and Settings screens, night and day themes, English / Hindi / Telugu with the Baloo type family bundled locally.
  • 10-minute delivery dial, live map (store, customer, your position and heading, real scale bar), status steps, event banners, shelf checklist, call-customer countdown, in-tablet cancel confirmation.
  • Usable item dashkart_tablet (ox_inventory export dashkart.useTablet; usable item on ESX/QBCore/QBox), F6 opens it when owned, free tablet on first clock-in; tablet prop + animation while open.
  • Earnings history (last 10 deliveries) and per-player theme / sound settings.
  • docs/ITEMS.md with item definitions for every supported inventory.

Fixed (live test)

  • The tablet page covered the whole game with a dark screen (CSS color-scheme: dark makes FiveM’s browser paint an opaque backdrop); removed.

Changed

  • The F6 ox_lib menu is now a fallback (Config.Tablet.enabled = false).
  • The rental scooter model can be set from server.cfg: setr dashkart:scooter "model" (default stays faggio).

[0.3.0] - 2026-10-20 — P2 Stores, ownership & economy

Changed

  • Economy: customers pay basket + delivery fee to the store; rider pay is the store’s payroll % of that plus speed/streak bonuses. Stores now make a profit (typical order: revenue 196, rider 83, goods 99, store +14).
  • City-owned stores follow the payroll % in config.

Added

  • Store office at the counter: buy/sell stores, balance deposit/withdraw, prices within limits, payroll %, staff hire/fire, staff-only mode, 24 h overview, transactions.
  • Hired staff get first pick on new orders (20 s).
  • Wholesale warehouse: restock by delivery (fee, delayed, persisted) or van run (no fee, timed, deposit); presets or custom cart; shelf capacity limits.
  • Migration 002 (dk_restock_orders).
  • Dev commands: /dk_setowner, /dk_storecash, /dk_tpstore wholesale.
  • Deliveries must be made on the DashKart rental: no accepting orders without one; arrival and handover need it within 40 m (Config.Rider.requireRental).

Fixed (live test)

  • Owners got no notification when a wholesale delivery arrived (QBox player list lookup); online players are now found via the native player list.
  • Repeat restock orders placed before earlier ones arrived overfilled the shelves and wasted money: planning now counts stock already on the way, and any units that still don’t fit on arrival are refunded to the store (with their share of the fee).

[0.2.3] - 2026-10-20 — Shelf picking

Added

  • Shelf-picking packing style: markers on the shelves that hold the order’s items, E to pick with a grab-and-bag animation and a paper bag in hand; the last shelf completes packing. Server-validated per shelf (position, timer, order ownership, no repeats or skips).
  • /dk_shelf (debug + admin): record shelves where you stand, show/list/remove/clear, export as config. Saved to data/shelves.json.
  • Stores without shelves keep the single pickup-point packing.

[0.2.2] - 2026-10-20 — Faster orders

Changed

  • Order pacing: first order ~5 s after clocking in or finishing a delivery (Config.Npc.readyOrderDelay), free riders never wait more than 30 s (maxIdleWait), demand checked every 15 s, higher default store rates.

Added

  • Van unlock: riders rent the van (and see bulk orders) only after Config.Rider.rental.van.unlockDeliveries completed deliveries (default 25, server-checked). The duty point shows a locked option with the requirement, and the rider is notified the moment it unlocks.
  • Debug commands /dk_bulkorder (bulk order at your store now) and /dk_setdeliveries <n> (van unlock testing).

Fixed

  • Big orders: after the last bag the customer walked away and left the earlier bags on the ground by the door. They now bend down, pick them up (Config.Assets.anims.customerPickup) and leave with a bag in each hand.
  • Restarting the resource forfeited riders’ rental deposits; they are now refunded in full.

[0.2.1] - 2026-10-20 — Live test fixes

Added

  • Van unlock: riders rent the van (and see bulk orders) only after Config.Rider.rental.van.unlockDeliveries completed deliveries (default 25, server-checked). The duty point shows a locked option with the requirement, and the rider is notified the moment it unlocks.
  • Debug commands /dk_bulkorder (bulk order at your store now) and /dk_setdeliveries <n> (van unlock testing).

Fixed

  • Big orders: after the last bag the customer walked away and left the earlier bags on the ground by the door. They now bend down, pick them up (Config.Assets.anims.customerPickup) and leave with a bag in each hand.
  • Database deadlock between store balance updates and ledger inserts (lost a balance change): all background writes now run through one serial queue with deadlock retry; awaited writes retry too.
  • Riders could wait 5+ minutes for an order: Config.Npc.maxIdleWait (90 s) now guarantees an order for a free rider with an empty board.
  • Riders waiting at the store were treated as AFK after 5 minutes: threshold raised to 10 minutes and riders are told when orders pause/resume.

[0.2.0] - 2026-10-20 — P1 Rider loop + NPC order engine

Added

  • Rider job: clock in/out at the store counter, uniform per gender (hooks for appearance resources), F6 rider menu (rebindable).
  • Rentals: scooter or van, spawned server-side with keys and fuel; deposit (cash then bank), refund minus damage at the return spot; abandoned/destroyed rentals forfeit the deposit (+ fine).
  • NPC order engine: demand curve (in-game hour via GlobalState.currentTime, rider factor, per-store rate, idle floor), weighted hour-boosted basket templates, 72 default delivery points across Los Santos and Blaine.
  • Order flow: queue (accept/decline, expiry), server-timed packing with bag prop, GPS route, customer ped at the door only when nearby, handover with animations.
  • Variety events: big tip, no answer (call + partial pay), wrong gate (real door nearby), rude customer, bulk (van).
  • Server-side rating (time vs 10-minute target, vehicle damage during the trip, event) feeding rider stats and streaks.
  • Payouts funded by the store (payroll %, base, per km, speed bonus, late penalty, streak bonus), tips, shortfall subsidy, hourly cap, diminishing returns, daily NPC budget, daily economy report to Discord.
  • Anti-farm: server tracker (arrival, teleport detection), route-time plausibility, pack timer checks, cooldown after flagged deliveries, delivery timeout.
  • Stock reservation model and server-store auto-restock.
  • Locales en/hi/te for the whole rider job (109 keys).

[0.1.1] - 2026-10-20 — Dev tools

Added

  • /dk_bridgetest (debug + admin only): live PASS/FAIL smoke test of every bridge function (framework, inventory, notify, target, vehicle keys, fuel) with a final X/Y summary; money and items net zero.
  • /dk_tpstore <id> and /dk_tpdrop <index> debug teleports.
  • Config.DebugTest (test item, cleanup time) and Config.Assets.vehicleTypes.

Security

  • Debug commands, their net event and client handlers are not registered when Config.Debug = false.

[0.1.0] - 2026-10-20 — P0 Scaffold

Added

  • Resource manifest (Lua 5.4, OneSync, ox_lib, oxmysql; escrow ignores config, locales, custom framework template).
  • Config skeleton: main, assets, stores (3 defaults), Indian catalog (50 items), NPC engine, economy, rider, wholesale, promos (V2), webhooks.
  • Locales: en, hi, te.
  • Bridges with auto-detect + startup log: framework (QBox, QBCore, ESX, custom template), inventory (ox, qs, codem, core, qb, native), target (ox, qb, TextUI), vehicle keys (qbx, qb, wasabi, MrNewb, none), fuel (ox, Legacy, cdn, ps, native), notify (ox, framework). Interface validation on start.
  • Versioned migrations (dk_schema_version) with 001 initial schema.
  • Net gateway: per-player token-bucket rate limiting, argument schemas, exploit flagging.
  • OrderService with server-enforced state machine and source-agnostic producer interface; NpcDemand (V1) and PlayerOrders (V2 stub) producers.
  • Logger with batched DB writes and queued Discord webhooks.