Changelog
A record of what shipped across all Deliverty Hub applications.
May 31, 2026
v2.19.0
Added
- Backend Billing packages — added plans, organization subscriptions, rolling usage periods, invoice generation, and limit enforcement for tasks, customers, agents, and warehouses
- Backend Unified invoice payments — subscription invoices now create organization-paid payment records with
paymentPurpose,payerType, and online gateway preparation - Backend Cash settlements — added outstanding agent cash balances, settlement history, and accountant settlement wallet transactions
- Backend Driver location list — added
GET /agents/locations/currentfor organization-scoped live driver rows without density aggregation - Dashboard Billing workspace — added billing overview, invoice tables, plan management hooks, and invoice cash/online payment actions
- Dashboard Cash settlement screen — dispatchers can review outstanding agent balances and record received cash from
/payments/cash-settlements - Dashboard Task fee visibility — task detail now shows saved delivery fees, route distance breakdowns, matched rules, recalculation, and payment status updates
- Mobile Fee collection flow — drivers can see delivery fees, total customer cash due, and confirm collect-on-delivery fee collection from task detail
- Docs Billing package guide — added platform documentation for subscription packages, usage limits, renewal invoices, invoice payments, and invitation codes
Changed
- Backend Task creation now consumes billing usage before creating standalone tasks or job child tasks, returning limit details when an organization exceeds its package
- Dashboard The operations map sidebar now separates task and driver tabs with independent filters, driver status badges, and live driver selection support
- Mobile Upgraded the Expo and React Native stack, moved splash configuration to
expo-splash-screen, and refreshed task/home/profile UI spacing - Platform Added local development infrastructure helpers for Postgres, Redis, MinIO, and
misetask shortcuts
Fixed
- Backend Cash task responses now expose numeric
amountvalues for parent and child tasks so frontend cash totals can render consistently - Backend Wallet payments and refunds now reject invalid non-customer payment purposes before mutating customer balances
- Mobile Wallet history now labels delivery-fee, cash-task, and accountant-settlement sources instead of falling back to generic credit/debit text
Removed
- Backend Removed the H3 agent density module, density snapshots, density jobs, and density E2E coverage in favor of current driver location data
- Dashboard Removed the standalone
/agents/densitypage and density hook from the dashboard navigation surface
May 28, 2026
v2.18.0
Added
- Backend Realtime SSE streams — added authenticated organization and current-user streams at
/realtime/organizations/:organizationId/eventsand/realtime/me/eventswith heartbeat delivery - Backend Realtime event bridge — task, assignment request, agent location, and density events now publish through a shared external event contract for SSE consumers
- Mobile Foreground realtime updates — added a React Native SSE client that refreshes assigned tasks, task status changes, and pending assignment requests without polling
- Docs Socket to SSE migration notes — added internal source maps, open questions, and rollout guidance for replacing Socket.IO delivery paths
Changed
- Dashboard Task lists, attention panels, density updates, and heatmap refreshes now subscribe through the shared SSE client instead of component-owned Socket.IO listeners
- Mobile Pending assignment requests now depend on realtime invalidation and local notifications instead of the previous fixed polling interval
- Mobile Google Play listing assets were refreshed with updated app icon, feature graphic, and six phone screenshots sized for Play Console upload
Fixed
- Backend Accepted automatic assignment requests now move tasks directly to
ACCEPTED, record task history, and emit status-change events in the same flow - Backend Agent capacity checks now count only
ASSIGNED,ACCEPTED, andIN_TRANSITtasks, avoiding stale timeline reservations from completed or cancelled work - Backend Task cancellation validation now allows assigned or accepted tasks to be cancelled when agent relations are missing, while still requiring an agent before moving in transit
May 27, 2026
v2.17.0
Added
- Backend Job-aware customer tracking — public tracking verification now resolves parent or child task codes into the customer-authorized route tasks and returns selectable tracking task options
- Backend Route task tracking APIs — added
GET /tracking/tasksplus selectedtaskIdsupport for tracking details, location, and rating endpoints - Mobile Job route execution — task details now show ordered route stops, sticky current-stop actions, and automatic navigation to the next unfinished stop after completion
- Mobile Driver localization foundation — added shared translation and localized date helpers across authentication, home, tasks, requests, notifications, schedule, and profile screens
- Docs Job tracking and assignment investigations — added internal source maps, implementation notes, and open questions for customer tracking and agent job assignment notifications
Changed
- Dashboard Public tracking now lets customers switch between authorized job stops, keeps socket and polling cache keys scoped per selected task, and submits ratings for the selected delivery
- Backend Assignment request notifications now include route stop count, package count, task type, child-derived pickup and delivery addresses, action metadata, and mobile deep links
- Backend Job creation now links job-level packages to the parent job and each route child so pickup and delivery stops share the same package context
- Mobile Agent task lists now request top-level jobs with children, and assignment request cards summarize stops, packages, route addresses, and distance metadata
- Mobile Package actions now derive completion labels and guards from task type, using pickup, delivery, collection, and cash-drop semantics instead of delivery-only checks
Fixed
- Backend Tracking tokens now authorize the selected task list and reject unauthorized
taskIdaccess instead of exposing only the first verified task - Dashboard Public tracking sockets now ignore unrelated task events and invalidate the correct task, rating, and task-option queries when job stop status changes
- Mobile Assignment notification taps now prioritize the request screen through
deepLinkmetadata before falling back to task detail navigation
May 26, 2026
v2.16.1
Added
- Backend Assignment request push bridge — added an event listener that sends Novu
assignment-updatepush notifications when pending assignment requests are created or canceled - Mobile Driver assignment alerts — pending assignment requests now raise high-priority local alerts and update the app badge while the authenticated mobile app is active
- Docs Mobile push notification investigation — added internal source maps, operational checks, and open questions for the Expo/Novu notification path
Changed
- Backend Assignment and task push payloads now include stronger Android delivery metadata such as TTL, priority, and sound settings
- Mobile Android notification channels for assignment requests and task updates now use public lock-screen visibility, badge support, lights, and stronger interruption behavior
Fixed
- Backend Authenticated users can now register Expo push tokens through
POST /notifications/push-tokenwithout requiring an auto-generated notification permission
May 25, 2026
v2.16.0
Added
- Backend Task fee foundation — added task fee schema, services, and DTOs for delivery-fee tracking and future payment flows
- Backend Distance-based fee pricing — added route distance calculation modes, Mapbox-backed distance lookup, route distance caching, and task fee adjustment records
- Backend Channel API key lifecycle — added API key regeneration and enhanced API key validation for user-backed channel integrations
- Backend Contact submissions — added contact form submission workflow support for inbound customer and launch-interest requests
- Backend Main warehouse locations — added location support for marking and querying organization warehouse defaults used by dispatch and fee workflows
- Dashboard Fee management hooks — added dashboard API helpers and query hooks for task fee management
- Dashboard Location warehouse controls — added dashboard location fields and actions for main warehouse management
- Dashboard Multi-polygon zone drawing — zone create/edit maps now support multiple polygons per geographic zone, saved polygon editing, and clearer drawing controls
- Docs Fee distance and location module investigations — added internal architecture notes, implementation plans, source maps, and open questions for pricing and location work
- Docs Geographic zone investigation docs — added and refreshed internal notes covering zone architecture, decisions, risks, and follow-up testing
- Platform Codex release workflows — added Deliverty release and module-investigation skills with workspace-specific documentation and scaffolding scripts
Changed
- Backend Assignment configuration now normalizes algorithm names such as
zone-basedandZONE_BASEDto canonical factory identifiers before validation, storage, and execution - Backend
ZONE_BASEDassignment can fall back to a configured secondary algorithm when strict zone matching is disabled and no zone match or zone agent is available - Backend Fee calculation now records calculated fee events in task history so pricing decisions are visible in task timelines
- Backend Geographic zone repository helpers now route through generic repository methods so organization scoping is preserved for zone and agent-zone assignment lookups
- Dashboard Task detail screens now surface fee calculation data and timeline entries for pricing-related task events
- Dashboard Geographic zone create/edit now warns about overlapping active zones and blocks active priority conflicts before submission
- Dashboard Zone list actions now use route-aware view/edit/delete handlers, and table actions render from a fixed-position menu to avoid clipping in virtualized tables
- Landing Contact form handling, contact email copy, code structure, and link-check behavior were refreshed for the landing page
Fixed
- Backend Agent-zone assignment now verifies the target agent belongs to the same organization as the zone before saving the assignment
- Backend Active geographic zone and assignment configuration partial indexes now use the mapped
"isActive"column predicate expected by the schema - Backend MultiPolygon boundary validation now checks every polygon ring for minimum point count and closure instead of only validating simple polygons
- Backend Assignment zone metrics now apply the current organization context to zone, assignment, and execution-log queries when available
- Dashboard Table preference saving now skips duplicate writes when session and persisted table state are already synchronized
- Dashboard Dashboard lint and typecheck failures from channel and table work were cleared
- Landing Landing link checks now handle query-string URLs correctly in CI
- Platform Backend deploys no longer time out during CI deployment
May 17, 2026
v2.15.0
Added
- Backend New customer onboarding controls — added a global email-verification guard for protected business routes, skip metadata for verification-safe endpoints, and an onboarding E2E test covering register, provision, block-before-verify, resend, verify, login, and profile access
- Backend Permission seed utility — added a role-permission seeding script that scans controller actions and reconciles default role permissions for operational setup
- Dashboard Signup phone capture — registration now collects phone number and country code so new organizations are provisioned with usable contact data
- Docs Internal launch docs — added internal go-to-market planning, launch verification points, new customer onboarding investigation notes, and Novu in-app notification investigation notes
- Landing Product screenshot gallery — added a carousel/gallery for dashboard, analytics, task list, and task creation screenshots in the product tour
Changed
- Backend Registration now stores organization country code from the submitted phone region, treats already-verified email tokens as a successful verification response, and keeps resend verification available for unverified authenticated users
- Backend User lifecycle events now register their TypeORM subscriber with the active data source so Novu subscriber sync can react to user create, update, and remove events
- Dashboard Auth handling now preserves tokens when the backend returns
EMAIL_NOT_VERIFIEDand redirects unverified sessions to the check-email flow instead of clearing resend access - Dashboard Novu inbox rendering now follows React hook ordering rules, reads theme colors consistently, and exposes unread counts without hiding provider misuse
- Landing SEO metadata, hero positioning, demo CTA, pricing language, FAQ copy, and Arabic/English product copy now focus on delivery operations, dispatch, driver tracking, courier workflows, and pilot/demo conversion
- Platform Local Docker development now mounts an untracked backend config file, passes the matching Novu public application identifier to the dashboard, and starts the dashboard with the webpack dev server flag
Fixed
- Backend Notification health now reports the real Novu enabled state and returns degraded status when Novu is not configured
- Backend Query filters across users, organizations, configurations, categories, locations, and bug reports now preserve existing where clauses more safely when adding request filters
- Backend Agent location-history deletion now lives behind the repository boundary, task receipt escaping handles nullish values, and timeline repository methods consistently await database calls
- Backend Test Novu configuration no longer stores a committed secret or enables Novu by default
- Dashboard Verify-email no longer attempts duplicate verification calls during React effect re-renders
- Landing Product screenshots were cleaned to remove local debugging overlays and the gallery now initializes after partial loading and supports thumbnail, next/previous, and keyboard navigation
May 16, 2026
v2.14.0
Added
- Backend Payment operations API — added pending/status/customer lookups, online initialization, PayMob verification/webhook handling, cash and wallet processing endpoints, full-payment refunds, and payment audit-log retrieval under
/payments - Dashboard Payment operations UI — added payment detail audit logs, redacted integration data, EGP currency formatting, customer selection during payment creation, and working table/bulk actions for paid, refund, void, and delete flows
- Dashboard Channel management improvements — added a channel details sheet, API key copy controls, real bulk activate/deactivate/suspend/delete actions, and callback-driven table actions for view/edit/delete
- Dashboard Analytics charts — added dashboard task-status and task-volume charts plus task analytics status-distribution and task-type breakdown visualizations
- Mobile Courier payment handling — task detail now lets couriers confirm cash payments or charge wallet payments when a pending task payment supports direct collection
- Platform Local Docker development stack — added
docker-compose.dev.ymlwith Postgres, Redis, MinIO, backend, dashboard, docs, and migration tool services plus backend Docker config
Changed
- Backend Dashboard stats now accept an optional
organizationIdfor Super Admin organization scoping, and courier stats use organization courier membership when scoped - Backend Assignment config parsing now handles both JSON strings and object values, keeping JSONB-backed algorithm settings compatible across assignment reads and auto-assignment execution
- Dashboard Attention panel now fetches all active task statuses, scores urgency with exact deadline math, handles retryable errors, subscribes to organization-scoped tracking events, and reserves layout width on large screens
- Dashboard Task listing now uses server-side pagination counts from API responses, and task analytics queries are scoped by the selected organization context
- Mobile Assignment acceptance and task status updates now refresh the current agent cache so courier availability reflects active assignments more accurately
Fixed
- Backend Payment status transitions are now guarded, wallet payments deduct/refund customer wallet balances, failed payments trigger notification handling, and payment responses/logs redact sensitive gateway keys and tokens
- Backend API key authentication now rejects inactive channels, channel updates can safely reassign the backing user inside the update transaction, and seeded test users/organization are activated for test flows
- Backend Timeline slot cleanup now also refreshes agent availability when assigned tasks reach terminal states, with tests covering slot release and non-fatal agent refresh failures
- Dashboard Payment API calls now match backend routes and verbs for status updates, refunds, logs, and customer filtering, and Stripe was removed from the dashboard payment-gateway enum
- Dashboard Task form location selection no longer resets in a render loop when job child rows change, date-time input handling updates consistently, and status selectors stay synced with current task state
- Docs Internal investigation docs are excluded from the docs Docker image via
.dockerignore
March 28, 2026
v2.13.2
Fixed
- Dashboard Novu inbox runtime crash — resolved
Cannot read properties of undefined (reading 'request')TypeError caused by@novu/nextjs<Inbox>wrapper callinguseRouter()internally, which accesses arequestcontext that isundefinedin Next.js 16 client components; migrated all Novu imports to@novu/reactdirectly and passrouterPushexplicitly - Mobile Default fallback API base URL port updated from
3002to3010inconstants.ts
Removed
- Backend Removed unused AI tool configuration directories:
.bmad/,.augment/,.specify/,.github/chatmodes/,.github/prompts/ - Dashboard Removed unused AI tool configuration directories:
.bmad/,.specify/,.github/chatmodes/,.github/prompts/
March 19, 2026
v2.13.1
Added
- Backend Organization status enforcement — global
OrganizationStatusGuardblocks all API access for users in non-active organizations (pending, inactive, rejected); Super Admin bypasses the check - Backend
@SkipOrganizationStatusCheck()decorator for routes that inactive-org users still need (e.g., email verification resend) - Backend
organizationStatusfield added to login response (AuthResponseDto) so clients know the org state immediately at login time - Dashboard Organization Inactive page — status-specific messaging for pending, inactive, and rejected organizations with a logout button
- Dashboard Global axios interceptor catches
ORGANIZATION_NOT_ACTIVE403 errors and redirects to the inactive page automatically - Dashboard Login flow checks
organizationStatusbefore loading profile and redirects immediately if not active
March 17, 2026
v2.13.0
Added
- Dashboard Task status tabs — color-coded horizontal tab bar on the tasks page for filtering by status (All, New, Awaiting Assignment, Assigned, Accepted, In Transit, Completed, Cancelled) with live task counts per status
- Backend Courier seed migration —
1772200000000-seed-couriers.tsseeds all 4 courier plugins (Bosta, Aramex, Halan, Dreevo) with full global configuration, availability schedules, and auth settings using upsert logic - Landing Homepage redesign — new visual layout with expanded CSS styles (~213 lines), DM Sans + Outfit typography replacing Inter, and enhanced section structure
- Landing ~40 new i18n keys (Arabic + English) for expanded homepage and about page content
Changed
- Dashboard Task status filtering moved from dropdown select inside
EntityFilterto dedicatedTaskStatusTabscomponent above the filter bar - Dashboard Sidebar navigation — removed 6 task-specific shortcut links (Today's Tasks, Delivering Today, New Tasks, Urgent Tasks, Assigned Tasks, Completed Tasks) in favor of the new status tabs
- Backend Dashboard sidebar API — removed 6 task-specific navigation items and their date-range query parameters from
DashboardService - Landing About page simplified with streamlined content
- Landing Font family updated from Inter to DM Sans + Outfit across all pages
March 6, 2026
v2.12.1
Added
- Backend Hard delete organization —
DELETE /organizations/:id/hardendpoint (Super Admin only) that permanently removes an organization and all associated data (users, tasks, locations, customers, packages, payments, channels, configurations) via CASCADE delete within a transaction - Backend
OrganizationEvents.HARD_DELETEDevent emitted after permanent deletion for audit logging - Backend
frontendUrloptional field inServerConfigfor controlling email link targets - Dashboard Permanently Delete organization dialog — type-to-confirm safety dialog requiring exact organization name input before enabling the "Delete Forever" button; includes red warning banner listing all data that will be erased
- Dashboard
hardDeleteOrganizationAPI function anduseHardDeleteOrganizationmutation hook with cache invalidation - Dashboard ~16 i18n keys (Arabic + English) for the hard delete confirmation flow
Fixed
- Backend Email verification & password reset links now point to the frontend dashboard URL instead of the backend API URL — affected
auth.service.ts(verification link) andpassword-reset.service.ts(3 reset link locations) - Backend Updated
config.example.yamlwith correctfrontendUrl,passwordReset.baseUrl, andresetPathdefaults
March 6, 2026
v2.12.0
Added
- Backend Email verification system —
EmailVerificationTokenentity, repository, schema, and DB migration; endpoints for/auth/verify-emailand/auth/resend-verificationwith 24-hour token expiry - Backend Password reset flow —
/auth/password-reset/requestand/auth/password-reset/completeendpoints with secure token-based reset - Backend 3 new courier plugins — Aramex, Halan, and Dreevo implementations joining the existing Bosta plugin, completing Courier Integrations Wave 1
- Backend Courier webhook controller & service — inbound webhook endpoint for courier providers to push shipment status updates back into the platform
- Backend Courier status mapping — maps external courier provider statuses to internal
PackageStatusvalues - Backend Package status transitions map — defines valid status transition rules for the expanded package status set
- Dashboard Registration page — full sign-up form with first name, last name, email, organization name, phone number, and password with confirmation
- Dashboard Email verification pages —
/check-email,/verify-emailwith token-based verification and resend support - Dashboard Password reset pages —
/forgot-passwordand/reset-passwordwith secure token flow - Dashboard Auth API methods —
verifyEmail(),resendVerification(),requestPasswordReset(),resetPassword() - Dashboard ~45 i18n keys (Arabic + English) for registration, email verification, and password reset flows
Changed
- Backend Expanded
PackageStatusenum — from 8 to 13 statuses with task-type-specific flows:PICKING_UP,PICKED_UP,DELIVERING,COLLECTING_PAYMENT,PAYMENT_COLLECTED,DROPPING_PAYMENT,PAYMENT_DROPPED,LOST,DAMAGED; removedCREATED,PENDING_PICKUP,FAILED,OUT_FOR_DELIVERY - Backend Bosta courier plugin refactored with updated status mapping and webhook support
- Backend Courier plugin base expanded with webhook handling infrastructure
- Backend User entity — added
emailVerifiedAtfield; register DTO — addedorganizationName,phoneNumber,phoneNumberRegion - Backend Auth response DTO — added
emailVerifiedflag; login redirects unverified users to check-email page - Dashboard
PackageStatusenum and package list filters updated to match the new backend status set - Dashboard Login form — added register link and functional forgot-password link
- Dashboard Auth context — redirects unverified users to
/check-emailon login - Mobile
PackageStatusenum synced with new status set
March 5, 2026
v2.11.0
Added
- Dashboard Unified Settings hub — new
/settingspage with tabbed sidebar layout consolidating General, Organization, Profile, Branding, Localization, Map Provider, Assignment, Webhooks, and Integrations into a single settings experience - Dashboard
OrderSummarycomponent — real-time sticky sidebar on the task creation page showing live task summary (type, name, customer, location, packages, scheduling) as the user fills out the form - Dashboard ~150 i18n translation keys for the entire task creation flow — full Arabic and English coverage for all task form components, validation messages, toasts, and summary sidebar
- Dashboard
use-org-config-settingshook for organization configuration in settings pages - Landing Multi-page site architecture — new About, Contact, FAQ, Features, and Pricing pages with shared partials and consistent navigation
- Landing i18n language switching — Arabic/English toggle with RTL support across all landing pages
- Landing Custom
404.htmlerror page,robots.txt, andsitemap.xml
Changed
- Dashboard Task creation page redesign — Bosta-inspired two-column layout with horizontal pill tab selectors, compact entity creation mode toggles, and lighter card styling throughout
- Dashboard Full i18n localization of all task form components:
CreateTaskForm,TaskTypeSelector,TaskDetailsForm,EntityCreationMode,CustomerSection,LocationSection,PackageSection,JobChildTasks,TaskFormBasic - Dashboard Sidebar navigation restructured — webhooks moved under Settings, settings menu flattened to single entry point
- Dashboard Header and profile page refactored for updated navigation structure
- Backend Dashboard sidebar API — removed webhook and settings sub-navigation children (flattened to single
/settingsentry) - Docs Homepage and Getting Started updated with 5 persona types (Small Business Owner, Delivery Company, Delivery Agent, External Courier, Channel Developer) replacing the previous 3-persona layout
- Docs New CSS persona card styles for
businessandagenttypes with distinct accent colors - Landing Dockerfile updated for multi-page routing with
try_filesand custom 404 error page - Landing
index.htmlrefactored from monolithic single-page to modular multi-page architecture with shared JS/CSS
Fixed
- Backend Type safety in exception filter — cast
request.usertoRecord<string, any>fororganizationIdaccess - Backend Type safety in
GenericServiceorganization scope check — castquery.whereto avoid strict type errors
March 3, 2026
v2.10.0
Added
- Backend Task receipt printing — thermal receipt HTML generation service with single (
GET /tasks/:id/print/receipt) and bulk (GET /tasks/print/receipts?ids=) endpoints, supporting 80mm and 58mm paper widths with auto-print on load - Backend
@RawResponse()decorator — bypasses the globalResponseInterceptorAPI envelope so controllers can return raw HTML or plain text directly - Backend Location items on tasks — task queries now eagerly load
location.locationItemsfor hierarchical region display - Dashboard Print Receipt — available from task detail page, task overview, task table row actions, and task actions dropdown; opens receipt HTML in a new tab with auto-print
- Dashboard Bulk receipt printing — select multiple tasks and print all receipts in one page-break-separated document
- Dashboard Bulk courier assignment — assign an internal agent or external courier to multiple selected tasks at once via the assignment dialog
- Dashboard Bulk task confirm & cancel — fully implemented bulk status transitions (previously placeholder TODOs) with per-task error reporting
- Dashboard
LocationItemBreadcrumbcomponent — displays hierarchical location path (Country > State > City) on task detail view and quick preview panel - Dashboard
LocationItemSelectorcomponent — hierarchical region picker integrated into location forms (create task, create/edit location, customer locations) - Dashboard TanStack Query hooks for location item hierarchy (
useCountries,useLocationHierarchy) with 30-minute stale time
Changed
- Dashboard Bulk actions toolbar redesigned — flat button row replaced with a
DropdownMenuseparating normal and destructive actions - Dashboard Location edit dialog now fetches full details (including
locationItems) in the background for accurate form population - Dashboard Memoized table columns in locations and channels pages to prevent dropdown flicker on re-renders
- Dashboard
debounceutility now exposescancel();useEnhancedTablecleans up debounced save on unmount - Docs Roadmap updated — added Arrive Shipping to Wave 2 courier providers and new Fee Module section (Task Fee System, planned)
March 1, 2026
v2.9.1
Changed
- Platform Migrated from ESLint + Prettier to Biome — unified linter and formatter across all 3 apps (backend, dashboard, mobile) using
@biomejs/biomev2.4.4 with shared root config and per-app overrides - Backend Removed
.prettierrc,.prettierignore, andeslint.config.mjs; addedbiome.jsonwithunsafeParameterDecoratorsEnabledfor NestJS decorator support - Dashboard Removed ESLint config; added
biome.jsonwithcss.parser.tailwindDirectivesfor Tailwind@apply/@tailwindsupport - Mobile Added
biome.jsonwith React Native-specific linter rules (useExhaustiveDependencies,useHookAtTopLevel) - Platform All source files reformatted to Biome style — consistent import ordering, inline type imports, and standardized whitespace
Removed
- Platform Removed ESLint, Prettier, and all related dev dependencies (
eslint,@typescript-eslint/*,eslint-config-prettier,eslint-plugin-prettier,prettier) from all 3 apps
February 25, 2026
v2.9.0
Added
- Backend Wallet transaction module — full financial ledger for agents with
wallet_transactionstable, credit/debit tracking, paginated transaction history endpoint, and summary aggregation endpoint - Backend Cash task amount —
amountcolumn (decimal(10,2)) on tasks forCASH_COLLECTIONandCASH_DROPtask types - Backend Wallet transaction listener — auto-creates credit/debit transactions when cash tasks reach
COMPLETEDstatus, with balance validation to prevent negative wallets - Backend Migration
AddAmountToTasksAndCreateWalletTransactionswith foreign keys and optimized indexes onagentId,taskId,organizationId,type, andcreatedAt - Dashboard Cash amount display —
AmountCardcomponent on task detail page and cash amount section in task detail sidebar - Dashboard Cash amount input in task creation form and job child task stops with validation (required for cash task types, min 0.01)
- Mobile Wallet history screen — transaction list with infinite scroll, summary card showing total credits/debits, and transaction count
- Mobile Wallet API client (
getWalletTransactions,getWalletTransactionSummary) with TanStack Query hooks and query keys - Mobile Cash amount display on task detail screen for
CASH_COLLECTIONandCASH_DROPtasks
Changed
- Backend Task creation service and DTO validation skip customer/location requirements for cash task types (
CASH_COLLECTION,CASH_DROP) - Dashboard Task form hides customer, location, and package sections for cash task types (both standalone and job child stops)
- Dashboard
TaskDetailsFormnow acceptstaskTypeprop for conditional cash amount field rendering - Mobile
WalletCardis now tappable — navigates to wallet history screen with chevron indicator
February 22, 2026
v2.8.0
Added
- Backend Scheduled task dispatch — BullMQ delayed jobs fire at
scheduledAttime viaScheduledTaskDispatcherService, with cron-basedScheduledTaskSweepServicefallback for missed jobs (server restart, Redis flush) - Backend Agent rating stats —
getAgentRatingStats()aggregation endpoint returns average rating and total ratings per agent, injected into agent metrics response - Backend
IsFutureDatecustom validator for scheduled task date validation (evaluates dynamically, never goes stale) - Backend
findDueScheduledTasks()cross-tenant repository query withtasks_delayed_lookup_indexoptimization - Dashboard Organization branding on tracking page —
TrackingBrandingProviderrenders org logo, name, and acronym in tracking header/footer - Dashboard Tracking page i18n — language toggle (EN/AR) in tracking layout header with full Arabic translation support
- Dashboard Custom SVG tracking markers for agent and destination with proper anchor configurations
- Dashboard Rich task history actions — new action types:
reassigned,courier_assigned,schedule_updated,completed,package_added,package_removed,deleted,restored,comment_added - Mobile Matching
TaskHistoryActionenum values for all new backend history actions
Changed
- Dashboard Task detail page v2 redesign — status-driven border accents, rich activity timeline with action-specific icons and colors, improved metadata bar with created/scheduled/completed timestamps
- Dashboard Agent map components migrated from raw Leaflet imports to provider-agnostic
DelivertyMap/DelivertyMarker/DelivertyPopupabstraction - Backend Task creation now emits events after transaction commits (not inside) and handles auto-assignment for job-type tasks
- Backend Task courier service cancels pending scheduled dispatch jobs when tasks are assigned (internal, external, or auto)
- Backend Tracking response DTO enriched with additional task and organization fields
- Mobile Task timeline enhanced with action-specific icons, color coding, proper actor name resolution, and reason display
- Mobile Task detail screen refetches rating data after task completion;
useTaskRatingusesstaleTime: 0
Fixed
- Dashboard Mapbox marker drift on zoom — popup content was inflating marker element dimensions, breaking
anchor="center"calculation; icon now wrapped in fixed-size container with absolute-positioned popup
February 22, 2026
v2.7.0
Added
- Dashboard Full i18n localization — all 46 dashboard pages converted to use
useTranslation()with 800+ new translation keys in English and Arabic - Dashboard Translation interpolation —
useTranslation()now supports{placeholder}tokens for dynamic values (e.g.,t('common.noItemsFound', { entity: 'zones' })) - Dashboard i18n coverage for all shared components: global search, organization selector, table pagination, toolbar, bulk actions, and export dialog
- Dashboard i18n coverage for webhook components: webhook list, logs, and stats
- Dashboard Extracted
TrackingPageContentclient component for i18n-compatible agent tracking page - Docs Updated roadmap — v2.5 and v2.6 sections reflect shipped status with detailed feature breakdowns
Changed
- Dashboard
useTranslation()hook signature updated — second parameter now accepts either a fallback string or an interpolation params object - Dashboard All page headers, form labels, filter options, status labels, table columns, and action buttons now use translation keys instead of hardcoded English strings
Fixed
- Backend TypeScript type cast in
GenericRepository.applyOrganizationOptions()— resolved strict type checking error withFindOptionsWhere
February 18, 2026
v2.6.0
Added
- Backend Timeline slot reservation system — atomic
reserveSlot(),releaseSlot(), andcheckCapacity()for agent and courier scheduling with organization scoping - Backend
TimelineItemTypeenum distinguishingagentvscouriertimeline scopes, with dedicated controller endpoints for schedule queries and availability checks - Backend
TimelineSlotListener— event-driven slot cleanup when tasks reach COMPLETED or CANCELLED status - Backend Capacity-aware assignment —
TaskAgentServiceandTaskCourierServicenow check timeline capacity and reserve slots before confirming assignment - Backend Location seed migration — hierarchical location data for Egypt (27 governorates + districts), Qatar (8 municipalities + areas), and UAE (7 emirates + areas)
- Backend Task
estimatedDurationfield for timeline slot sizing (falls back to 60 min for scheduled tasks, 24h for ASAP) - Dashboard Agent schedule component — week-view timeline with capacity usage display, slot cards linking to tasks via sqid-encoded URLs
- Dashboard Polyline abstraction layer —
DelivertyPolylinewith Leaflet and Mapbox GL adapters for route visualization - Dashboard
useZoneDrawing()hook — dual-provider zone polygon drawing with click-to-add vertices, drag-to-edit, undo, and preview line - Dashboard Sqid encoding utility — obfuscated URL-safe IDs replacing raw numeric IDs in routes
- Dashboard Timeline API client and React Query hooks (
useAgentSchedule,useAgentAvailability,useCourierSchedule) - Mobile Home screen redesign —
ActiveTaskHerowith map preview and progress stepper,MetricsRow,StatusPill,QuickActionsBar, andIdleHeroCard - Mobile Schedule screen with
DaySelectorandScheduleSlotCardcomponents backed byuseMySchedule()hook - Mobile Structured logger service with environment-aware log levels replacing
console.logacross the app - Mobile
useNetworkStatus()hook for online/offline state management via NetInfo
Changed
- Backend
GenericRepository— newapplyOrganizationWhere()andapplyOrganizationOptions()methods for cleaner organization filtering across all query methods - Backend
ChannelRepositorynow properly scoped by organization in custom query methods - Dashboard Zone draw map refactored from 600+ lines to ~270 using provider-agnostic
useZoneDrawing()hook - Dashboard Upgraded to Next.js 16, React 19.2, nuqs 2, react-leaflet-cluster 4
- Dashboard ESLint migrated to flat config with
typescript-eslintdirect integration - Mobile API client rewritten with structured logging and improved
isValidToken()helper for robust token validation - Mobile Root layout updated with WebSocket event polyfills for Novu Hermes compatibility
Fixed
- Backend Organization isolation in timeline queries — prevents cross-org data leaks via composite index filtering
- Backend Race condition in concurrent slot reservations — unique partial index on
metadata->>'taskId' - Backend Timeline slots not released on agent reassignment — old slot now explicitly released before new reservation
- Backend Non-fatal timeline failures no longer block assignment workflows (try-catch with logging)
- Dashboard Zone drawing compatibility — now works with both Leaflet and Mapbox via duck-type provider detection
- Dashboard Removed Turbopack from dev/build scripts (unstable in Next.js 16)
- Mobile Token refresh edge cases — properly handles
'undefined'and'null'string tokens - Mobile Network state not initialized at app startup — now subscribes via
useNetworkStatus()in root layout - Mobile Accessibility improvements — added ARIA roles, labels, and hints to
Button,ConnectionStatus, and new home components
February 17, 2026
v2.5.1
Added
- Backend BROADCAST assignment algorithm — sends assignment requests to multiple agents simultaneously, first-accept wins
- Backend LOAD_BALANCED assignment algorithm — weighted scoring model balancing proximity vs even workload distribution
- Backend Batch active task count query (
countActiveTasksForAgents) for efficient multi-agent workload lookup - Backend Algorithm-specific configuration passthrough — org config params (e.g.,
maxConcurrent,loadBalanceWeight) flow to algorithms viaTaskData.algorithmConfig - Dashboard Assignment settings page with algorithm selector, config forms, and history for all 5 algorithms
- Dashboard Profile page redesign with summary card and improved change password form
Fixed
- Backend
currentTaskCountwas hardcoded to 0 when mapping candidate agents — now fetched via batch query - Backend Retry service now skips retry when active pending requests still exist for a task (prevents redundant re-broadcasts)
February 16, 2026
v2.5.0
Added
- Dashboard Provider-agnostic map abstraction layer (
DelivertyMap) — supports Leaflet and Mapbox GL with automatic provider switching per organization - Dashboard
AddressAutocompletecomponent — debounced typeahead address search via backend geocoding API with "Locate me" browser geolocation - Dashboard Unified
LocationFormFieldscomponent — replaces duplicated location form logic across locations page, customer locations, and task creation - Dashboard Map provider settings page — configure Leaflet, Mapbox, or Google Maps per organization
- Dashboard Contact person and phone fields in task inline location creation ("Create With Task" mode)
- Dashboard Multi-result forward geocoding (
geocodeAddressMultiple) for richer address search results
Changed
- Dashboard
LocationMaprewritten — replaced raw Leaflet CDN loading (~285 lines) withDelivertyMapabstraction and native draggable markers - Dashboard
useGeocodehook rewritten — now uses backend geocoding API instead of broken browser geolocation placeholder - Dashboard All dashboard map components (active deliveries, task heatmap, task list sidebar) migrated to provider-agnostic abstractions
- Dashboard Locations page and customer locations dialogs now use
LocationFormFieldsfor consistent form experience
Fixed
- Dashboard Task marker icon 404 errors — corrected URLs from
.pngto.svgand added missing icon entries for job, cash collection, and cash drop - Dashboard Location preview map not rendering in task creation — fixed CSS height chain in
MapViewcomponent - Dashboard Location preview blank for locations without stored coordinates — added auto-geocoding fallback via backend API
February 12, 2026
v2.4.0
Added
- Backend Unified
task-status-changednotification workflow — replaces 3 separate per-recipient workflows - Backend Admin recipients now include all Super Admins (cross-org) plus Organization Admins (scoped)
- Dashboard Real-time unread notification count in sidebar via
useUnreadCount()hook - Mobile Push notification badge count on the Notifications tab
- Docs Changelog and Upcoming pages added to documentation site
Changed
- Backend Consolidated notification workflows from 24 down to 13
- Backend Subscriber ID format standardized to
user_${id}across all trigger points - Dashboard Notification inbox now wrapped at layout level via
NovuDashboardProvider
Fixed
- Backend Novu bridge endpoint crash during discovery phase — added
safe()helper for undefined payload access - Backend Task notification listener now correctly reloads task relations for CREATED/ASSIGNED events
- Backend Event payload shape mismatches that caused silent notification failures
January 28, 2026
v2.3.0
Added
- Backend Novu notification integration — in-app, email, SMS, and push channels
- Backend User lifecycle listener for automatic Novu subscriber sync on create/update/delete
- Dashboard
<Inbox />component from@novu/nextjswith built-in bell icon and notification list - Mobile
NovuProviderintegration withuseNotifications()anduseCounts()hooks - Mobile Notification badge component using real-time WebSocket counts
Changed
- Backend Task event payloads now use typed interfaces (
TaskCreatedPayload,TaskStatusChangedPayload, etc.) - Docs Documentation site migrated from MkDocs to static HTML/CSS/JS
January 10, 2026
v2.2.0
Added
- Backend OpenTelemetry observability — Jaeger tracing, Prometheus metrics, Grafana dashboards
- Backend
@Trace(),@TraceBusiness(),@TraceDatabase()decorators for custom spans - Backend Winston logging with trace correlation
- Dashboard Live agent tracking on map via Socket.IO (15-second intervals)
Fixed
- Backend Swagger circular dependency bug with TypeScript enums — switched query DTOs to
@IsIn() - Dashboard Organization context not clearing on logout — localStorage cleanup added
December 18, 2025
v2.1.0
Added
- Backend External courier plugin system with
ICourierPlugininterface - Backend Payment module — COD tracking, online payments, 17 currencies
- Dashboard Payment management views with status filters and reconciliation
- Mobile COD collection flow with payment confirmation screen
Changed
- Backend Assignment module now supports 6 algorithms (added predictive and zone-based)
- Dashboard Analytics page redesigned with date range filters and chart components
November 20, 2025
v2.0.0
Added
- Platform Multi-tenant architecture — full organization isolation via
AsyncContextService - Backend
GenericRepositorywith automaticorganizationIdfiltering - Backend Channel integration module — REST API + webhook event system
- Backend Webhook signature verification (HMAC-SHA256) with replay protection
- Dashboard Next.js 15 admin panel with Shadcn/ui component library
- Dashboard Permission-based UI rendering with
<PermissionGate> - Mobile Deliverty Driver app — Expo 54 / React Native for delivery agents
Removed
- Backend Legacy single-tenant data layer — replaced by organization-scoped repositories