Inspiration
The Trucker Path brief asked us to help Maria and John, two small-fleet dispatchers, make smarter decisions in less time. We spent the first ninety minutes reading r/Truckers threads, FMCSA detention data, and Trucker Path's own app store reviews instead of coding.
Two patterns came up repeatedly. The first: dispatchers do not need more dashboards, they need fewer phone calls. A small-fleet dispatcher loses roughly $45,000 a year in uncollected detention because documenting and recovering those charges takes calls she never has time to make. The second: when she does try to work proactively, her tools make her assign loads from memory. Nothing stitches together HOS clocks, driver location, fatigue, language, and current load into one view she can act on.
Every other team at this hackathon was going to build an inbound chat copilot. We decided to build the opposite. A workspace that already knows what Maria needs to do next, and a voice agent that dials out on her behalf when the answer is a phone call.
What it does
Relay is a dispatch cockpit with voice as the highest-leverage surface. Nine integrated pieces:
1. Live fleet dashboard. A real-time map (Leaflet + OpenStreetMap) showing every load in Color-coded routes, driving/stopped/exception fleet status, exception cards pinned to the top with HOS-left and revenue-at-risk.
2. Load detail drawer. Click any load, get the full picture: driver profile, truck number, language (EN, ES, PA), HOS drive remaining with progress bar, fatigue level, route, broker, and action buttons. Call receiver. Check in on driver. Update broker.
3. HOS-aware load assigner with AI reasoning. Unassigned loads get ranked candidates. Each candidate shows a confidence score and explicit "not eligible" reasoning: "Insufficient HOS for the haul," "Driving, don't pull off the road," "Off duty." When no driver qualifies, the recommendation is honest: re-check roster or post to the load board. We show our work because dispatchers will not trust a black box.
4. Detention escalation with Dispatcher. When a driver sits more than two hours at a receiver, the load card goes red and shows a live billable timer. One click fires an outbound ElevenLabs call. Maya introduces herself as calling on behalf of the dispatcher, cites the rate confirmation terms, and routes the detention invoice to AP. Full transcript captured.
5. Detention recovery billing dashboard. A running weekly tally of recovered detention dollars. Per-load breakdown with base rate, detention amount, invoice status (SENT, PAID, DRAFT). This is the number that turns Relay from a nice-to-have into a revenue line item.
6. Document management. Every completed load has PODs, rate confirmations, and bills of lading attached. Click to preview in-app, download as PDF, or attach to the detention invoice for dispute.
7. Call audit log with escalation routing. Every Maya call is logged with purpose (detention_escalation, broker_check_call, driver_checkin, driver_proactive_checkin), outcome (resolved, escalated, voicemail, failed), duration, and summary. Calls that Maya escalates route to Maria's personal number, The human is the backstop, not the front line.
8. Driver roster with fatigue and language.all drivers with live status, HOS drive bars, fatigue (low, moderate, high), language tag, current load, last check-in time. Spanish and Punjabi speakers are flagged because they drive the IVR language routing.
9. Broker CRM with update preferences. Every broker has a preferred channel for load updates: call, SMS, or email. The 3pm batch broker check-ins use this to pick the right medium per contact. Acme Logistics wants a call, CH Robinson wants an email, Echo Global wants a text.
Three voice flows drive the action:
- Detention escalation. One-click outbound call to the receiver. Professional escalation on the dispatcher's behalf. Auto-drafted invoice.
- Batch broker check-calls. At 3pm, ten parallel calls fire to every active broker with a structured status update based on rate confirmation data and live GPS.
- Multilingual driver IVR. One inbound number. Auto-detects English, Spanish, or Punjabi. Extracts location and status into structured JSON, updates the dashboard live.
How we built it
Two developers, Claude Code, 36 hours.
Frontend. Next.js 14 with React and Tailwind, deployed on Netlify (relay-trucker.netlify.app). Nine pages: dashboard, loads, completed loads and billing, call log, drivers, brokers, plus modals for load detail, load assignment, and document preview. Leaflet for the map with OpenStreetMap tiles via CARTO. Custom color tokens for status, fatigue, and HOS bars.
Backend. FastAPI in Python, hosted on Supabase (Postgres) for loads, drivers, brokers, trucks, calls, transcripts, invoices, and documents. Row-level security on tenant data. WebSockets for dashboard live updates with a one-second polling fallback for conference WiFi.
Voice stack. ElevenLabs Agents Platform for ASR, TTS (Flash v2.5 at sub-75ms for telephony), and turn-taking. Claude Sonnet as the agent LLM via ElevenLabs' bring-your-own-LLM because tool-heavy conversations need real reasoning. Twilio for inbound and outbound numbers plus parallel call fan-out.
Agent tools. Server-side tools the agent calls mid-conversation: fetch_rate_con, fetch_load_context, log_detention_event, generate_invoice_pdf, update_load_status, escalate_to_human. Post-call webhooks write to Supabase with full transcripts, timestamps, and confidence scores.
Load assignment scoring. A weighted function over HOS drive remaining, deadhead miles, driver-load type fit, fatigue level, and home-base alignment. Claude generates the human-readable reasoning strings that appear in the UI ("Insufficient HOS for the haul") from the raw signals.
Document pipeline. PODs and rate cons render from Supabase storage with a React preview layer. PDF generation for detention invoices uses @react-pdf/renderer and embeds call metadata (transcript reference, timestamps, rate-con line items).
Navpro Trucker Path API. We got as much data as we could from the navpro api. We built a TruckerPathAdapter interface matching the documented contract and used Samsara's sandbox for live GPS and HOS data. Swapping in NavPro is a 30-minute change once credentials arrive.
Challenges we ran into
The load scoring was harder than the voice. HOS math has genuine edge cases. A driver with 3h 30m left can take a 200-mile haul, but not if the pickup is 90 minutes out and the appointment is in 2h. We wrote test_scoring.py early because we kept breaking it.
ElevenLabs cold starts. The first call of the day added 400 to 500 ms of latency before Maya spoke. We added a keep-alive cron pinging a test conversation every ten minutes.
Twilio caller ID verification. Every outbound number had to be pre-verified. We almost missed this at 2am and fixed it by verifying every team phone number the night before.
Conference WiFi. Pusher WebSockets dropped every ninety seconds on venue internet. We added a one-second polling fallback that kicks in after two missed pings.
Map performance with 26 live routes. Leaflet started stuttering above 20 active polylines on mobile. We switched to canvas rendering and batched the tick updates.
Spanish ASR in noisy cab audio. The driver IVR misrecognized "Llegué" as "Llego" about a third of the time. We added a phonetic hint list and accuracy climbed to 95 percent.
Document preview without blowing the bundle. Rendering PDFs in-page with react-pdf pulled in a huge dependency. We moved the preview to server-generated image thumbnails with lazy loading.
Parallel outbound call rate limits. Ten simultaneous calls failed silently on a free Twilio trial number after call seven. Upgrading the number plus throttling to four concurrent fixed it.
Accomplishments that we're proud of
Nine product surfaces shipped in 36 hours, each functional end-to-end on real data rather than static mockups.
The load assigner explains itself. "Not eligible because insufficient HOS" does more for dispatcher trust than any confidence score alone. Every AI decision in Relay ships with a human-readable reason.
The billing dashboard turns the detention feature into a weekly dollar number ($4,827.50 recovered). That is the metric that moves Relay from demo to line item.
A call log that routes escalations to a human phone number. Every row in the log shows purpose, outcome, and who the backstop is. Maya is not pretending to be autonomous, she knows when to hand off.
Per-broker update preferences. Acme wants a call, CH Robinson wants an email, Echo wants a text. Ten extra minutes of data modeling, and the 3pm batch check-ins feel considered instead of spammy.
Multilingual support cost ten extra minutes of ElevenLabs configuration and zero additional compute. Spanish and Punjabi drivers are flagged in the roster and routed correctly by the IVR. Highest ratio of effort to impact we shipped.
Maya's outbound agent prompt took eleven rewrites to sound professional. She introduces herself as calling on behalf of the dispatcher, cites the rate confirmation by number, and offers two concrete next steps. She does not say "as an AI."
What we learned
Building the cockpit was harder than building the voice. Voice is two APIs and a good prompt. The dispatcher workflow is nine surfaces that all need to stay in sync, and sync is where most TMS products break.
AI reasoning is a UX problem more than an ML problem. The scoring function matters less than the string that explains it. "Insufficient HOS for the haul" beats "0.23 confidence" every time.
Mocking data is not cheating when the mock is faithful to the real contract. The TruckerPathAdapter pattern let us build against production shapes without production access.
Outbound voice is a different product than inbound. Inbound reacts to user intent. Outbound holds a goal, handles objections, and knows when to escalate. Most of our prompt time was cutting, not adding.
The ecosystem play matters as much as the product. Trucker Path is in acquisition mode after their April TruckLoads and Truckstop integration. A project that plugs into their surface gets read very differently than a standalone tool.
What's next for Relay
Weeks 1 to 2. Trucker Path partnership conversation and NavPro API credentials. Replace Samsara sandbox with the real driver-side feed.
Weeks 3 to 8. Pilot with ten Dispatch Portal customers. Single target metric: dollars of detention recovered per dispatcher per month. We want a number we can take into an acquisition conversation.
Weeks 9 to 12. In-app upsell on Dispatch Portal. Target 1,000 paying fleets at $15 per truck per month.
Product roadmap beyond pilot.
- Rate confirmation OCR with auto-populated load creation, so drivers and dispatchers stop rekeying
- Parking intelligence inside the driver IVR: "There is open parking at Love's exit 142, twelve miles ahead," powered by Trucker Path's live availability feed
- Broker-facing agent that closes the loop on check-calls and handles rebooks when a driver times out
- A lane-pricing insights page using Trucker Path's historical load data to flag when a broker's offer is below market
- An outbound agent that books loads rather than just servicing them. That is when Relay stops being an add-on and becomes a category.

Log in or sign up for Devpost to join the conversation.