Skip to main content
Trayd — AI Companion for the Trades hero image

Built for the people who fix what breaks.

Product
Trayd — AI Companion for the Trades

Built for the people who fix what breaks.

A bilingual AI companion for residential HVAC contractors — estimate builder, diagnostic AI, callback scheduler.

EN + ES
Languages
$0
External Capital
Phoenix Metro
Market
Beta Live
Status
Problem

The challenge

The residential trades — HVAC, plumbing, electrical — are a $500B+ industry running largely on clipboards, group texts, and spreadsheets. The software solutions that exist were designed for office workers: complex UI, English-only, cloud-dependent, and priced for enterprise procurement.

The Phoenix metro area alone has thousands of residential HVAC contractors, many of them small owner-operated businesses with bilingual teams. They need tools that work the way they work — fast, offline-capable, bilingual, and built around their actual job: diagnosing systems, writing estimates, booking callbacks.

The specific problems: estimates written in the field get lost before follow-up; crews switch between English and Spanish mid-conversation but tools don't; technicians need diagnostic guidance without slow jobsite connections; callbacks fall through without a lightweight CRM a field tech will actually use.

Approach

How we built it

Bilingual from day one: not a translation layer bolted on later. Every UI element, every AI response, every notification authored in both English and Spanish. Language toggles at the session level — a crew member can switch languages without logging out.

Mobile-first, offline-capable: technicians use phones, not laptops. Every core workflow (estimate creation, diagnostic lookup, callback scheduling) works with degraded connectivity. AI companion, not AI replacement: the AI provides reference documentation, suggests follow-up questions, and drafts estimates based on technician notes.

Stack: Next.js (PWA with service worker for offline), FastAPI backend with Spanish/English prompt templates, Supabase (auth + data with RLS for multi-tenant team accounts), Resend for transactional email, AWS S3 for invoice/estimate PDF storage. Bootstrapped pre-seed with no external capital.

Architecture

System map

How the pieces talk to each other.

Trayd AI Companion ArchitectureA bilingual mobile app routes user voice and text through a central AI agent, which dispatches to estimate-builder, diagnostic, and callback-scheduling tools, persisting outcomes to a CRM.Mobile AppiOS / AndroidVoice InputEN / ESText InputchatBilingual AI Agentintent + dispatchEstimate Builderline-item pricingDiagnostic Toolsymptom flowCallback Schedulercalendar slotsPhoto AnalysisvisionCRMlead + ticketspeechtexttool callpersistresponseINPUTUSER ↔ AGENTWRITE TO CRM
Built UI

Selected screens

Real product surfaces from the engagement — not stock illustrations.

Trayd dispatch board listing 32 jobs across 11 crews in 4 regions
1 / 2

Dispatch board — 32 jobs today, 11 crews scheduled, regional load balanced live.

Evidence

What it actually looks like

Architecture diagrams, CI runs, and dashboards from the engagement — not stock illustrations.

ArchitectureCI/CD
Push → lint → typecheck → unit → contract → E2E → staging deploy → smoke → prod. Every gate blocks the merge. Every prod deploy is rollback-ready in 30 seconds.
Push → lint → typecheck → unit → contract → E2E → staging deploy → smoke → prod. Every gate blocks the merge. Every prod deploy is rollback-ready in 30 seconds.
TerminalGitHub Actions
A real workflow run from the Trayd repo. Test matrix across Node versions, parallelized job graph, all green — the boring screenshot that lets you sleep at night.
A real workflow run from the Trayd repo. Test matrix across Node versions, parallelized job graph, all green — the boring screenshot that lets you sleep at night.
Build

What shipped

Bilingual UI (EN/ES) — all copy, labels, AI responses, and notifications. AI diagnostic companion — natural-language symptom input, structured system guidance output. Estimate builder — field-input form → branded PDF → email delivery.

Callback scheduler — lightweight CRM for follow-up management. PWA with offline mode for core workflows. Beta deployment to initial Phoenix-area HVAC contractors.

Outcome

Results

Beta live with initial cohort of Phoenix-area HVAC contractors. 100% bilingual coverage from first public release — no "coming soon" for Spanish. Estimate-to-callback workflow tested and validated by actual contractors.

Zero external capital required to reach beta: fully bootstrapped.

Bilingual-from-scratch is an engineering discipline, not a translation afterthought. Building it into the architecture (prompt templates, UI copy management, locale routing) from day one is significantly less work than retrofitting it. Trayd validated that small trades businesses will adopt software if it matches their actual workflow.

References

Talk to people on this work.

No fabricated quotes. Reference contacts are shared during discovery, with both parties' consent.

Reference available

Engineering lead

Fintech · 5 years

Worked alongside on production trading systems for 5+ years. Available for technical reference calls — code quality, on-call discipline, incident behavior.

Reference call shared during discovery, both consenting.
Reference available

Founder

Studio engagement

Engaged Sage Ideas for a Ship + Operate combination. Willing to talk about scope discipline, timeline accuracy, and what handoff actually looked like.

Reference call shared during discovery, both consenting.
The contractor opens the app on a roof in July. If it takes more than one tap to write an estimate, it doesn't get used.
// build log · entry 04
Honesty

What almost happened.

Every project has near-misses. Decisions that, if we'd kept going, would have shipped a hole. The list below is the diff between the version that almost made it to prod and the version that did.

// near-miss · 01
diff
-
beforeBilingual UX was going to live behind a settings toggle. EN by default, switch to ES in preferences.
+
afterThe whole UI auto-detects from device locale and exposes a one-tap toggle in the top bar. The diagnostic AI accepts mixed Spanglish input — "el unit no enfría" works.
$
costTwo extra weeks on the language model side. Daily active users in the Spanish-first segment doubled in beta.
// near-miss · 02
diff
-
beforeEstimate builder was going to require a stable internet connection. HVAC techs in attics and crawlspaces would lose drafts.
+
afterOffline-first with a service worker, IndexedDB queue, and sync-on-reconnect. Estimates draft, save, and finalize without a connection.
$
costThree weeks of SW + conflict-resolution work. Zero lost estimates in field testing.
From the repo

Inline excerpts.

Trimmed, but real. These are the patterns that made the system survive Stripe retries, multi-tenant queries, and a Discord bot that won't hallucinate positions.

Bilingual diagnostic prompt
typescript
// lib/diagnose.ts — production excerpt
const DIAGNOSTIC_SCHEMA = z.object({
  likely_cause: z.string(),
  next_check: z.string(),
  parts_needed: z.array(z.string()),
  est_time_minutes: z.number(),
  language: z.enum(['en', 'es']),
})

export async function diagnose(symptoms: string, locale: 'en' | 'es') {
  const res = await openai.chat.completions.create({
    model: 'gpt-4o',
    response_format: { type: 'json_schema', json_schema: SCHEMA },
    messages: [
      { role: 'system', content: SYSTEM[locale] },
      { role: 'user', content: symptoms },
    ],
  })
  return DIAGNOSTIC_SCHEMA.parse(JSON.parse(res.choices[0].message.content!))
}
// One model, two languages. The output keys are locked so the UI always knows where to put the answer.
livebuild 29be8ec2026-06-11 06:38Z
// solo studio// no analytics resold// every commit human-reviewed