Changelog
A record of what shipped across all Deliverty Hub applications.
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