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 calling useRouter() internally, which accesses a request context that is undefined in Next.js 16 client components; migrated all Novu imports to @novu/react directly and pass routerPush explicitly
  • Mobile Default fallback API base URL port updated from 3002 to 3010 in constants.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 OrganizationStatusGuard blocks 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 organizationStatus field 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_ACTIVE 403 errors and redirects to the inactive page automatically
  • Dashboard Login flow checks organizationStatus before 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 migration1772200000000-seed-couriers.ts seeds 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 EntityFilter to dedicated TaskStatusTabs component 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 organizationDELETE /organizations/:id/hard endpoint (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_DELETED event emitted after permanent deletion for audit logging
  • Backend frontendUrl optional field in ServerConfig for 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 hardDeleteOrganization API function and useHardDeleteOrganization mutation 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) and password-reset.service.ts (3 reset link locations)
  • Backend Updated config.example.yaml with correct frontendUrl, passwordReset.baseUrl, and resetPath defaults
March 6, 2026
v2.12.0
Added
  • Backend Email verification systemEmailVerificationToken entity, repository, schema, and DB migration; endpoints for /auth/verify-email and /auth/resend-verification with 24-hour token expiry
  • Backend Password reset flow/auth/password-reset/request and /auth/password-reset/complete endpoints 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 PackageStatus values
  • 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-email with token-based verification and resend support
  • Dashboard Password reset pages/forgot-password and /reset-password with secure token flow
  • Dashboard Auth API methodsverifyEmail(), resendVerification(), requestPasswordReset(), resetPassword()
  • Dashboard ~45 i18n keys (Arabic + English) for registration, email verification, and password reset flows
Changed
  • Backend Expanded PackageStatus enum — 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; removed CREATED, 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 emailVerifiedAt field; register DTO — added organizationName, phoneNumber, phoneNumberRegion
  • Backend Auth response DTO — added emailVerified flag; login redirects unverified users to check-email page
  • Dashboard PackageStatus enum 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-email on login
  • Mobile PackageStatus enum synced with new status set
March 5, 2026
v2.11.0
Added
  • Dashboard Unified Settings hub — new /settings page with tabbed sidebar layout consolidating General, Organization, Profile, Branding, Localization, Map Provider, Assignment, Webhooks, and Integrations into a single settings experience
  • Dashboard OrderSummary component — 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-settings hook 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.html error page, robots.txt, and sitemap.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 /settings entry)
  • 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 business and agent types with distinct accent colors
  • Landing Dockerfile updated for multi-page routing with try_files and custom 404 error page
  • Landing index.html refactored from monolithic single-page to modular multi-page architecture with shared JS/CSS
Fixed
  • Backend Type safety in exception filter — cast request.user to Record<string, any> for organizationId access
  • Backend Type safety in GenericService organization scope check — cast query.where to 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 global ResponseInterceptor API envelope so controllers can return raw HTML or plain text directly
  • Backend Location items on tasks — task queries now eagerly load location.locationItems for 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 LocationItemBreadcrumb component — displays hierarchical location path (Country > State > City) on task detail view and quick preview panel
  • Dashboard LocationItemSelector component — 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 DropdownMenu separating 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 debounce utility now exposes cancel(); useEnhancedTable cleans 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/biome v2.4.4 with shared root config and per-app overrides
  • Backend Removed .prettierrc, .prettierignore, and eslint.config.mjs; added biome.json with unsafeParameterDecoratorsEnabled for NestJS decorator support
  • Dashboard Removed ESLint config; added biome.json with css.parser.tailwindDirectives for Tailwind @apply/@tailwind support
  • Mobile Added biome.json with 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_transactions table, credit/debit tracking, paginated transaction history endpoint, and summary aggregation endpoint
  • Backend Cash task amountamount column (decimal(10,2)) on tasks for CASH_COLLECTION and CASH_DROP task types
  • Backend Wallet transaction listener — auto-creates credit/debit transactions when cash tasks reach COMPLETED status, with balance validation to prevent negative wallets
  • Backend Migration AddAmountToTasksAndCreateWalletTransactions with foreign keys and optimized indexes on agentId, taskId, organizationId, type, and createdAt
  • Dashboard Cash amount displayAmountCard component 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_COLLECTION and CASH_DROP tasks
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 TaskDetailsForm now accepts taskType prop for conditional cash amount field rendering
  • Mobile WalletCard is 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 scheduledAt time via ScheduledTaskDispatcherService, with cron-based ScheduledTaskSweepService fallback for missed jobs (server restart, Redis flush)
  • Backend Agent rating statsgetAgentRatingStats() aggregation endpoint returns average rating and total ratings per agent, injected into agent metrics response
  • Backend IsFutureDate custom validator for scheduled task date validation (evaluates dynamically, never goes stale)
  • Backend findDueScheduledTasks() cross-tenant repository query with tasks_delayed_lookup_index optimization
  • Dashboard Organization branding on tracking pageTrackingBrandingProvider renders 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 TaskHistoryAction enum 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/DelivertyPopup abstraction
  • 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; useTaskRating uses staleTime: 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 interpolationuseTranslation() 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 TrackingPageContent client 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 with FindOptionsWhere
February 18, 2026
v2.6.0
Added
  • Backend Timeline slot reservation system — atomic reserveSlot(), releaseSlot(), and checkCapacity() for agent and courier scheduling with organization scoping
  • Backend TimelineItemType enum distinguishing agent vs courier timeline 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 — TaskAgentService and TaskCourierService now 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 estimatedDuration field 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 layerDelivertyPolyline with 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 redesignActiveTaskHero with map preview and progress stepper, MetricsRow, StatusPill, QuickActionsBar, and IdleHeroCard
  • Mobile Schedule screen with DaySelector and ScheduleSlotCard components backed by useMySchedule() hook
  • Mobile Structured logger service with environment-aware log levels replacing console.log across the app
  • Mobile useNetworkStatus() hook for online/offline state management via NetInfo
Changed
  • Backend GenericRepository — new applyOrganizationWhere() and applyOrganizationOptions() methods for cleaner organization filtering across all query methods
  • Backend ChannelRepository now 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-eslint direct 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 via TaskData.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 currentTaskCount was 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 AddressAutocomplete component — debounced typeahead address search via backend geocoding API with "Locate me" browser geolocation
  • Dashboard Unified LocationFormFields component — 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 LocationMap rewritten — replaced raw Leaflet CDN loading (~285 lines) with DelivertyMap abstraction and native draggable markers
  • Dashboard useGeocode hook 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 LocationFormFields for consistent form experience
Fixed
  • Dashboard Task marker icon 404 errors — corrected URLs from .png to .svg and 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 MapView component
  • 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-changed notification 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/nextjs with built-in bell icon and notification list
  • Mobile NovuProvider integration with useNotifications() and useCounts() 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 ICourierPlugin interface
  • 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 GenericRepository with automatic organizationId filtering
  • 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