acilox / solutions / tend
🛠️ AI Products & Marketplaces

Tend

AI-native managed marketplace for home services — one app for plumbing, electrical, cleaning, painting, beauty, appliance repair. Photo + sentence → diagnosed JobScope → transparent quote → vetted pro, with leakage defense at the core.

0
Composable AI pillars
0
Service categories scaffolded
<60s
Photo → diagnosed quote
0
API keys to run the demo

Why this exists

Home services is a globally fragmented, trust-sensitive market still run on phone calls and word-of-mouth. The managed-marketplace model wins by owning the whole experience — vet, train, price, insure, guarantee — but its existential risk is leakage (the failure that killed Homejoy). Tend is built against that from day one: leak-resistant category anchor, in-app message scan, platform-bundled insurance + outcome guarantee, one-tap rebook-your-pro. And it puts AI where the incumbents still run classical optimization plus one ML model — four composable AI pillars share a single typed JobScope contract.

How it's wired together

customer

gates pros

post-job actuals

photo

sentence

address

Pillar 1 — Intake
multimodal diagnosis
VLM / keyword + rules

JobScope
typed contract
category · severity · urgency
skill · duration · price band
safety flags · confidence

Pillar 2 — Matching
filter · linear score · Hungarian
per-factor breakdown

Pillar 3 — Pricing
price book × capped multipliers
robust-z anomaly

Pillar 4 — Trust
KYC · no-show · leakage · quality
HITL review queue

booking
+ outcome guarantee
+ identity-verified pro

Tend architecture overview

How it works, end-to-end

  1. Pillar 1 — AI Intake & Diagnosis (the wow demo)

    Customer text + optional photo → typed JobScope (diagnosis, severity, urgency, safety flags, skill, parts, duration, price band, confidence). Mock-first keyword classifier + rule-based escalation today; flips to a multimodal LLM filling the same schema via TEND_USE_LLM_INTAKE.

  2. Pillar 2 — Smart Matching & Dispatch

    Hard-constraint filter (license, skill, capacity, Haversine radius) → transparent linear scorer with per-factor breakdown (ETA, rating, reliability, skill, workload, prior-customer). Linear factor contributions are exact Shapley values — the explanation surface is faithful, not post-hoc.

  3. Pillar 3 — Dynamic Pricing & Quote Intelligence

    Price book × capped multipliers (complexity, urgency, time-of-day, supply/demand, pro tier) + robust-z anomaly detection. Surge clamped to the region's [floor, cap] band — no trust-destroying surprise bills. Every multiplier shows as a line item.

  4. Pillar 4 — Trust & Safety (leakage is existential)

    KYC + liveness onboarding, logistic no-show prediction, post-job multimodal quality, and — the existential one — in-app leakage scan (phone/email/payment-app/coordination phrases). Warn-first / escalate-on-repeat. Every REVIEW verdict routes to an HITL queue, never silent auto-ban.

  5. Composes via a single JobScope contract

    Intake produces it; Pricing and Matching consume it; Trust gates the pros Matching ranks. Post-job actuals feed back to recalibrate scopes, price bands, and pro reliability — one self-reinforcing loop.

  6. Booking lifecycle ties the pillars to the real world

    A guarded state machine carries each job requested → matched → accepted → en_route → in_progress → completed → rated, with cancelled / no_show off-ramps. Every move is validated against an explicit allow-table (illegal transitions raise, never corrupt) and appended to an auditable per-booking history. Run it end-to-end with `tend booking "..."` — diagnose, quote, match, then walk the full lifecycle, zero API keys.

The choices that matter

Decision

Mock-first AI providers, flip per pillar

Every pillar is a Protocol with a deterministic mock default and a per-pillar use_* flag for a real model. Same JobScope schema, no downstream rewrites. The demo runs end-to-end with zero API keys; flipping a pillar to a real LLM is one env var.

Mock heuristics aren't as accurate as a real LLM on hard edge cases. Acceptable for POC; the flip-to-real path is the production path.

Decision

Anchor on leak-resistant categories

Recurring + trust-heavy + commodity services (weekly cleaning) drift off-platform — that's what killed Homejoy. Tend leads with episodic, specialist, equipment-dependent work (AC repair, plumbing, electrical, deep clean, salon) where the platform's guarantee/insurance/parts-sourcing can't be replicated offline.

TAM is smaller than "all home services" — but the survivable share is higher. Recurring categories are offered with platform-bundled value (pro rotation, insurance) to keep them on-platform.

Decision

Multi-region by design (Region dataclass)

Currency, locale, taxonomy pack, surge caps, take rate live in a Region object — adding a market is a config entry, not a code change. Demo seeds UAE/Gulf (Justlife is the regional comp); US and India are configured and ready.

Per-region taxonomy packs are scaffolded but not deeply tuned. Acceptable for POC; first-market launch hardens the seed region's pack.

Decision

SSR Jinja + HTMX over a single-page app

For a customer/pro/ops surface this size, HTMX gives instant interactivity (the diagnose form returns a fully-rendered scope+quote+match fragment in one round-trip) without the SPA tax. One FastAPI service, no separate frontend build.

Next.js will likely re-enter the picture for the consumer mobile app. The backend contract (JSON APIs) is already there for that swap.

Built on

Python 3.12FastAPI + uvicornPostgres 16 + PostGIS (geo matching)pgvector (intake embeddings)SQLAlchemy 2 + AlembicSSR Jinja + HTMX + AlpineTyper + Rich (CLI)pytest (103 tests, lint clean)