Skip to main content
all case studies
PRODUCT// case study

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.

Role
Design + build + operate
Client
Sage Ideas (Internal)
Category
Product
Status
Beta Live
Trayd — AI Companion for the Trades hero

Languages

EN + ES

External Capital

$0

Market

Phoenix Metro

Status

Beta Live

Living architecture

Surface ⇄ System

Trayd is presented as both the product people touch and the operating system underneath it: UI, data model, integration path, evidence, and outcome.

Build an AI product
  1. 01Visible productScreenshots and product frames show the user-facing surface without pretending concept art is production proof.
  2. 02Operating architectureThe case includes a system map so the architecture is visible, not buried in prose.
  3. 03Evidence registerMetrics, build logs, diagrams, CI artifacts, and links separate actual work from agency theater.
  4. 04Commercial pathThe page routes qualified buyers toward a matching build, automation, or lab entry.

// scroll to x-ray the build

Trayd product surfacesurface
CI/CDsystem
Push → lint → typecheck → unit → contract → E2E → staging deploy → smoke → prod. Every gate blocks the merge. Every prod deploy is rollback-ready in 30 seconds.

case flow

Surface ⇄ System

ProblemProductSurface2 screensSystemmappedProof4 metricsRouteservice
A case study should prove both layers: the surface people see, and the system that keeps the product alive after launch.

Trayd operating map

The diagram is intentionally simplified: it shows the buying logic and operating path, not a decorative fantasy architecture.

client

Sage Ideas (Internal)

category

Product

evidence

2 assets

Proof board

Receipts before claims.

This page separates shipped surface, system map, real metrics, and available artifacts so the work can be inspected instead of just admired.

proof assets

4

Screens, gallery, artifacts

screens

2

Real product surfaces

artifacts

0

Available during discovery

Primary evidence

Built for the people who fix what breaks.

Languages

EN + ES

Languages

EN + ES

External Capital

$0

Market

Phoenix Metro

Status

Beta Live

Surface

Product screenshots and interface frames show the user-facing layer. If real assets are unavailable, the page says so instead of dressing mockups as production proof.

System

Architecture diagrams, build logs, and artifacts make the hidden operating layer visible to technical buyers.

Explore the Lab entry for Trayd
motion proof maptrayd · real-system storyboard
LeadEN / ESQualifytrade intentQuotescopeSchedulehandoffFollow-upnurture

Bilingual trades system loop

Surface, system, proof, route.

This storyboard turns the case study into a moving operating map: the buyer sees what was built, where the system lives, and which proof points are actually available.

languages
EN + ES
surface
mobile-first
handoff
operator
01// the problem

What was broken.

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.

02// the approach

How it was built.

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.

03// architecture

The 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
04// the numbers

Measured, not asserted.

The real figures from the engagement, printed verbatim. Bars are scaled against the largest comparable magnitude in the set — a secondary cue, never the source of truth.

metric · valuescale 0 – 0
Languages
EN + ES
External Capital
$0
Market
Phoenix Metro
Status
Beta Live
05// 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
01 / 02

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

06// evidence

What it actually looks like.

Architecture diagrams, CI runs, and dashboards from the engagement.

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.
07// the build log

What shipped.

The verbatim ship record, given timeline structure.

  1. log · entry 01

    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.

  2. log · entry 02

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

08// the outcome

What it proved.

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. This is the diff between the version that almost made it to prod and the version that did.

// near-miss · 01diff

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 · 02diff

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. The patterns that made the system survive retries, multi-tenant queries, and a bot that won't hallucinate.

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 a1556e22026-06-19 03:29Z
// solo studio// no analytics resold// every commit human-reviewed