Senior Full-Stack Developer — Complete 6 Modules on Production Logistics Platform (NestJS + Next.js + Expo)
Budget: $250 – $750 USD
About the Project
LDX is a production freight & customs platform for a Canadian/US cross-border trucking brokerage. Core is shipping — multi-tenant auth, loads, carriers, drivers, stops,
documents, messaging, customer portal, and a driver mobile app are all live. We need an experienced contractor to build out the six remaining modules, listed in priority
order.
Stack: pnpm + Turbo monorepo.
- apps/api — NestJS + Prisma + Postgres + Socket.IO (/notifications namespace)
- apps/web — Next.js 14 App Router + Tailwind v4 (LOADEX ldx-* design tokens pre-wired)
- apps/mobile — Expo React Native driver app
- paps-pars-tracker/ — already built Express microservice (port 3050): 18 scraper adapters (Zipments, BorderConnect, CFIA + 15 Canadian brokers: PCB, Livingston, Farrow,
Buckland, Cole, Willson, GHY, Deringer, Descartes, Candata, JWSmith, Hocusa, Mohawk, Bilsi, BCB), polling daemon, REST API. Freelancer integrates with it — does not rebuild
it.
---
The Six Modules to Deliver
1. Customs Operations — API + UI Build (integrates with existing tracker)
CustomsModule in apps/api/src/modules/customs/ is empty, broker page subdirectories are bare. The paps-pars-tracker sidecar exists with 18 working scrapers and a REST API.
Build:
- Prisma models: CustomsShipment, CustomsStatusSnapshot (append-only), CfiaInspection. Keys: barcode, type (PAPS/PARS), broker triple, denormalized lastStatus /
lastCheckedAt, pendingAutoDetect, unique (companyId, barcode, type).
- NestJS integration layer — axios PapsTrackerClient wrapping the sidecar's endpoints (GET /api/paps/query/:barcode, bulk query, watch list management). Boot-time resync of
active shipments back into the tracker's watch list (tracker state is in-memory; Postgres is source of truth).
- API endpoints under /customs/* (role-gated): overview, pipeline, reports, activity, scan (auto-detect across all adapters), shipments CRUD, CFIA, tracker
health/config/resync, webhook receiver at POST /webhooks/paps-status with shared-secret auth.
- 10 broker pages matching _ref/LOADEX_Customs_Operations.html (9000-line reference). Tailwind v4 ldx-* tokens + animation keyframes pre-wired.
- 8 modals: Detail Drawer, Add Customs Request, Driver Upload Preview, Override Confirm, Customer Portal Preview, Broker Compose, Add Broker, Broker Detail.
- Tracker stabilization tasks (the sidecar works but is brittle): capture the real Zipments API endpoint per README instructions, add retries + exponential backoff +
per-adapter circuit breakers, persist the watchlist (currently in-memory), add adapter health telemetry surfaced at /customs/feeds.
2. Live Tracking — Complete End-to-End
Backend foundation exists (tracking.gateway, eta.service, gps-retention.service). Broker page is a 364-line partial. Finish:
- Background GPS ingestion from the Expo mobile app → tracking pipeline (offline-queue aware)
- WebSocket fan-out to broker fleet map + customer portal tracking page
- Geofenced auto-milestone triggers (ARRIVED_PICKUP / ARRIVED_DELIVERY) with configurable radius
- Routed ETA (Mapbox / HERE / OSRM — justify your pick) replacing client-side haversine fallbacks
- Breadcrumb history + map replay on broker load detail
- Broker fleet overview at /tracking
3. Sales Module (greenfield)
No code exists. Lead → quote → booking pipeline for broker sales reps:
- Leads (contact, company, source, stage, owner, activity log)
- Quote builder with rate-confirmation PDF + email-out
- Pipeline kanban + forecast dashboard
- Reuse existing companies/users — don't duplicate CRM bits
- New SALES role alongside existing ADMIN / OPS / ACCOUNTING
4. Load Marketplace — Complete
Frontend scaffold exists (/marketplace/page.tsx, ~658 lines); no backend module. Build:
- New NestJS module with posting + bidding endpoints (brokers post, carriers bid)
- One-click "post to marketplace" from existing Load records
- Bid submission + broker accept/counter/decline
- Filters: lane, equipment, weight, pickup window, rate range
- Notification fan-out via existing notifications module
- Audit trail via existing audit module
- Polish frontend to align with agreed UX
5. Accounting — Complete + QBO
Scaffolded: accounting.service.ts 512 lines, accounting.controller.ts 173 lines, /accounting/page.tsx 1426 lines. Complete:
- AR: customer invoicing tied to delivered loads, aging buckets, payment application
- AP: carrier settlements, advance/fuel advance, detention/layover line items
- Invoice PDF generation + email-out
- QuickBooks Online sync (required): OAuth, invoice push, customer/vendor mapping, idempotent sync
- Finance reports: revenue by customer/carrier/lane, margin analysis, DSO
- Role-gated to ACCOUNTING + ADMIN
6. Issues — Complete
Scaffolded: issues.service.ts 265 lines, issues.controller.ts 123 lines, /issues/page.tsx 379 lines, test specs in place. Complete:
- Triage workflow: assignment, severity escalation, SLA tracking
- Issue types beyond OTHER — damage, overage/shortage, detention, refused, customs-hold, reefer-breach
- File attachments (photos, documents) wired to existing documents module
- Timeline integration — issue events surface in load timeline visible to customer portal
- Email + push notification fan-out via existing notifications module
- Resolution workflow with root-cause categorization for reporting
- Ops dashboard: open issues by severity, aging, owner load
---
Must-Have Skills (non-negotiable)
- 4+ years TypeScript production experience
- NestJS — modules, guards, interceptors, Prisma integration, Socket.IO gateways
- Next.js 14 App Router + Tailwind v4 (@theme, @reference)
- Prisma + Postgres — migrations, indexing, multi-tenant scoping
- Expo React Native — background location, offline queues, push notifications
- Real-time systems — Socket.IO rooms, presence, reconnection
- Financial/billing experience — invoicing, PDF generation, accounting sync
---
How to Apply
Include in your proposal:
1. One paragraph on a similar platform you shipped — multi-module monorepo, live tracking, scraper infrastructure, or accounting/QBO. No generic pitches.
2. GitHub link to NestJS or Next.js work you wrote.
3. Proposed milestone breakdown and price per module (or hourly + weekly cap).
4. Hours/week, time zone, earliest start date.
Put "ldx-stack" at the top of your proposal so I know you read this in full.
LDX is a production freight & customs platform for a Canadian/US cross-border trucking brokerage. Core is shipping — multi-tenant auth, loads, carriers, drivers, stops,
documents, messaging, customer portal, and a driver mobile app are all live. We need an experienced contractor to build out the six remaining modules, listed in priority
order.
Stack: pnpm + Turbo monorepo.
- apps/api — NestJS + Prisma + Postgres + Socket.IO (/notifications namespace)
- apps/web — Next.js 14 App Router + Tailwind v4 (LOADEX ldx-* design tokens pre-wired)
- apps/mobile — Expo React Native driver app
- paps-pars-tracker/ — already built Express microservice (port 3050): 18 scraper adapters (Zipments, BorderConnect, CFIA + 15 Canadian brokers: PCB, Livingston, Farrow,
Buckland, Cole, Willson, GHY, Deringer, Descartes, Candata, JWSmith, Hocusa, Mohawk, Bilsi, BCB), polling daemon, REST API. Freelancer integrates with it — does not rebuild
it.
---
The Six Modules to Deliver
1. Customs Operations — API + UI Build (integrates with existing tracker)
CustomsModule in apps/api/src/modules/customs/ is empty, broker page subdirectories are bare. The paps-pars-tracker sidecar exists with 18 working scrapers and a REST API.
Build:
- Prisma models: CustomsShipment, CustomsStatusSnapshot (append-only), CfiaInspection. Keys: barcode, type (PAPS/PARS), broker triple, denormalized lastStatus /
lastCheckedAt, pendingAutoDetect, unique (companyId, barcode, type).
- NestJS integration layer — axios PapsTrackerClient wrapping the sidecar's endpoints (GET /api/paps/query/:barcode, bulk query, watch list management). Boot-time resync of
active shipments back into the tracker's watch list (tracker state is in-memory; Postgres is source of truth).
- API endpoints under /customs/* (role-gated): overview, pipeline, reports, activity, scan (auto-detect across all adapters), shipments CRUD, CFIA, tracker
health/config/resync, webhook receiver at POST /webhooks/paps-status with shared-secret auth.
- 10 broker pages matching _ref/LOADEX_Customs_Operations.html (9000-line reference). Tailwind v4 ldx-* tokens + animation keyframes pre-wired.
- 8 modals: Detail Drawer, Add Customs Request, Driver Upload Preview, Override Confirm, Customer Portal Preview, Broker Compose, Add Broker, Broker Detail.
- Tracker stabilization tasks (the sidecar works but is brittle): capture the real Zipments API endpoint per README instructions, add retries + exponential backoff +
per-adapter circuit breakers, persist the watchlist (currently in-memory), add adapter health telemetry surfaced at /customs/feeds.
2. Live Tracking — Complete End-to-End
Backend foundation exists (tracking.gateway, eta.service, gps-retention.service). Broker page is a 364-line partial. Finish:
- Background GPS ingestion from the Expo mobile app → tracking pipeline (offline-queue aware)
- WebSocket fan-out to broker fleet map + customer portal tracking page
- Geofenced auto-milestone triggers (ARRIVED_PICKUP / ARRIVED_DELIVERY) with configurable radius
- Routed ETA (Mapbox / HERE / OSRM — justify your pick) replacing client-side haversine fallbacks
- Breadcrumb history + map replay on broker load detail
- Broker fleet overview at /tracking
3. Sales Module (greenfield)
No code exists. Lead → quote → booking pipeline for broker sales reps:
- Leads (contact, company, source, stage, owner, activity log)
- Quote builder with rate-confirmation PDF + email-out
- Pipeline kanban + forecast dashboard
- Reuse existing companies/users — don't duplicate CRM bits
- New SALES role alongside existing ADMIN / OPS / ACCOUNTING
4. Load Marketplace — Complete
Frontend scaffold exists (/marketplace/page.tsx, ~658 lines); no backend module. Build:
- New NestJS module with posting + bidding endpoints (brokers post, carriers bid)
- One-click "post to marketplace" from existing Load records
- Bid submission + broker accept/counter/decline
- Filters: lane, equipment, weight, pickup window, rate range
- Notification fan-out via existing notifications module
- Audit trail via existing audit module
- Polish frontend to align with agreed UX
5. Accounting — Complete + QBO
Scaffolded: accounting.service.ts 512 lines, accounting.controller.ts 173 lines, /accounting/page.tsx 1426 lines. Complete:
- AR: customer invoicing tied to delivered loads, aging buckets, payment application
- AP: carrier settlements, advance/fuel advance, detention/layover line items
- Invoice PDF generation + email-out
- QuickBooks Online sync (required): OAuth, invoice push, customer/vendor mapping, idempotent sync
- Finance reports: revenue by customer/carrier/lane, margin analysis, DSO
- Role-gated to ACCOUNTING + ADMIN
6. Issues — Complete
Scaffolded: issues.service.ts 265 lines, issues.controller.ts 123 lines, /issues/page.tsx 379 lines, test specs in place. Complete:
- Triage workflow: assignment, severity escalation, SLA tracking
- Issue types beyond OTHER — damage, overage/shortage, detention, refused, customs-hold, reefer-breach
- File attachments (photos, documents) wired to existing documents module
- Timeline integration — issue events surface in load timeline visible to customer portal
- Email + push notification fan-out via existing notifications module
- Resolution workflow with root-cause categorization for reporting
- Ops dashboard: open issues by severity, aging, owner load
---
Must-Have Skills (non-negotiable)
- 4+ years TypeScript production experience
- NestJS — modules, guards, interceptors, Prisma integration, Socket.IO gateways
- Next.js 14 App Router + Tailwind v4 (@theme, @reference)
- Prisma + Postgres — migrations, indexing, multi-tenant scoping
- Expo React Native — background location, offline queues, push notifications
- Real-time systems — Socket.IO rooms, presence, reconnection
- Financial/billing experience — invoicing, PDF generation, accounting sync
---
How to Apply
Include in your proposal:
1. One paragraph on a similar platform you shipped — multi-module monorepo, live tracking, scraper infrastructure, or accounting/QBO. No generic pitches.
2. GitHub link to NestJS or Next.js work you wrote.
3. Proposed milestone breakdown and price per module (or hourly + weekly cap).
4. Hours/week, time zone, earliest start date.
Put "ldx-stack" at the top of your proposal so I know you read this in full.