Independence doesn’t end at checkout.
Sightline lets a blind shopper buy by voice, hear exactly what they will pay, check the parcel with a phone camera, and get the money back through PayPal when it is wrong. Money waits for the check.
The 60-second path
Try it with the Speech Viewer on
Shop as Maya. The Speech Viewer panel simulates what a screen reader says on every screen, and lists every announcement the app makes.
Check the numbers
Every number below is read from a result file written by a script in the repository, on every page load.
Go to the numbersVerify a payment receipt yourself
Each payment decision is signed. The page re-checks the hash and the Ed25519 signature on load; the repo has an offline verifier.
Open a real receipt
Watch the whole lifecycle run
One button runs every step for real on the PayPal sandbox: voice request, readback, two-key confirmation, PayPal hold, the wrong size shipped, the camera check and the money back. Then Demo Store’s own agent reads the signed evidence and answers inside the store’s policy, and Maya’s agent reads her the offer and its reasons. You hear what Maya hears.
What the agents did on the latest demo order
The latest order from the lifecycle run: Harbor knit crew-neck sweater. Every step, from the voice request to PayPal’s last word, with who did it (the buyer, the buyer’s agent, the store’s agent, store staff or PayPal), the tool used, whether a model or fixed rules decided it, and PayPal’s own ids and statuses.
Showing the latest 6 of 20 steps.
The store’s agent: Sent it without staff, because it is inside the store policy: Offer a replacement.
You: Declined the offer. The case stayed open.
The store’s agent: Read the signed evidence pack. Its fingerprint and signature check out, and the check inside says the item does not match.
The store’s agent: Proposed: Release the $36.72 hold. Demo Store's shipping record shows it sent size L instead of the size M that was ordered.
The store’s agent: Released your $36.72 hold through PayPal. You were never charged.
Authorization 2XS81722GF5889200: voided, as PayPal answered.
The store’s agent: Sent it without staff, because it is inside the store policy: Release the $36.72 hold.
Every step comes from the order’s audit log, where each line is chained to the one before it with a hash. PayPal ids and statuses are PayPal’s own, as PayPal answered or as a verified PayPal webhook said.
Numbers, read from the result files
0 of 60
trick listings that got a wrong or unconfirmed payment through
Baseline: A shopping agent without the payment check: 50 of 60
Wrong means the amount, payee or quantity. Simulated, without calling PayPal.
0 of 140
phrases that were not a “yes” but passed as one
Baseline: Listening only for key words: 82 of 140
The first of the two confirmation checks, on phrases written after it was built.
0 of 100
double taps, retries and lost replies that charged twice
Baseline: Before we handled lost PayPal answers: 10 of 100
Simulated, without calling PayPal.
62 of 75 (82.7%)
made-up product facts caught before you heard them
Baseline: With no fact check: 0 of 75
Measured on scripted test answers.
121 of 210 (57.6%)
wrong items the camera check caught
Baseline: A general image-matching model: 194 of 210 (92.4%)
Synthetic renders: it answered “not sure” for 283 of 420 pairs (67.4%). The baseline also flags 189 of 210 correct items (90.0%) as wrong.
33% (15 of 45)
stores where Tab alone could not reach “Add to cart”
A dialog that traps keyboard focus counts as blocked.
The Checkout Barrier Index and its dashboard.
All 59 results, with intervals, scripts and negative results
Shopping agent, live model
Live model finishes with the right tool
8 of 8
Shopping agent, live model
Model lines the grounding check stopped before speech
1 of 14
Shopping agent, live model
Time for an agent turn, median and slowest
1.6 s, 6.5 s
Shopping agent
Wrong model moves the loop refuses (made-up id, unsaid filter or memory, unasked readback)
7 of 7
Shopping agent
Agent lines with a claim the listing does not make, stopped before speech
2 of 2
Shopping agent
Agent lines the listing backs, kept
2 of 2
Shopping agent
Safety checks held (budget, no wool, no team gear, no other size, no order without asking, memory only proposed)
6 of 6
Shopping agent
Listings shown in another size than the "size M" asked for
0 of 15
Shopping agent
Team or fan merchandise in the top three
0 of 21
Shopping agent · negative result
Top-three listings that name their colour
11 of 21
Shopping agent
Amounts in money answers that are not in the orders
0 of 14
Checkout Barrier Index
Median axe-core violations per product page (distinct WCAG A/AA rules failed)
4
Checkout Barrier Index
Stores where keyboard-only traversal could not reach add to cart within 150 Tabs
9% (3 of 33)
Checkout Barrier Index
Stores where Tab alone could not reach add to cart, counting a dialog that held focus as blocked
33% (15 of 45)
Checkout Barrier Index
Stores with at least one button that has no accessible name (home or product page)
35% (21 of 60)
Checkout Barrier Index
Most common failing rule: color-contrast
60% of stores (36 of 60)
Checkout Barrier Index
Sampled stores that refused or timed out for an honest, rate-limited, read-only crawler
24 of 100
Checkout Barrier Index
Sightline path: product facts, readback and payment reachable by voice and keyboard on all 60 items; no store UI needed
By design
Spoken purchase confirmation
False confirms, key-1 phrase matcher, held-out utterances
0 of 140
Spoken purchase confirmation
False confirms, key-1 phrase matcher, 200-utterance development fixture
0 of 126
Spoken purchase confirmation · negative result
Intended confirmations the matcher rejects, held-out utterances
39 of 71 (54.9%)
Spoken purchase confirmation · negative result
Background speech or misrecognition that yields an exact allowed phrase
6 of 6 confirmed by key 1
Spoken purchase confirmation
False confirms, key-1 matcher, development and held-out combined
0 of 266
Duplicate orders
Scenarios that end with more than one PayPal order (100 duplicate-prone scenarios, current payment policy)
0 of 100
Duplicate orders · negative result
Same 100 scenarios before the fix (lost PayPal answer released the hold and the buyer heard "nothing was charged")
10 of 100
Duplicate orders
Repeats of one confirmation (double-click, triple confirm, resend after timeout, re-say, two tabs) that end in a second order
0 of 90
Duplicate orders
Resend after a lost PayPal response, same confirmation: second order created
0 of 10
Duplicate orders
Lost PayPal response, buyer buys again on a new readback within minutes: second order created
0 of 10
Duplicate orders
Lost PayPal response, buyer buys the same item again after the 10-minute duplicate window: second order created
0 of 10
Duplicate orders · negative result
Same probe before the unknown-outcome block (hold kept, duplicate check looks back 10 minutes only)
10 of 10
Duplicate orders
Buyer comes back after a lost PayPal response, then would buy again: second order created
0 of 10
Grounded answers
Answers with one invented claim that the grounding guard catches
62 of 75 (82.7%)
Grounded answers
Fully supported answers the guard wrongly blocks
0 of 75
Grounded answers
F1 of the guard as a detector of unsupported answers
0.91
Grounded answers · negative result
Weakest category: invented delivery date
8 of 12 caught
Grounded answers · negative result
False statements made by negating a listed fact that pass the guard
10 of 10
Adversarial listings (red team)
Payment breaches across 60 adversarial listings, Sightline flow
0 of 60
Adversarial listings (red team)
Breaches when the injected amount, payee and quantity are forced into the payment intent
0 of 60
Adversarial listings (red team)
Worst attack card for Sightline (all 6 cards tied)
0 of 10
Adversarial listings (red team)
Contradictory colour: orders for a colour other than the one the buyer asked for
0 of 10
Adversarial listings (red team) · negative result
Contradictory colour, buyer confirms without listening: orders the gate lets through
10 of 10
SightBench: does the parcel match?
Mismatches flagged on the frozen test split, Sightline
121 of 210 (57.6%)
SightBench: does the parcel match?
Matching items wrongly called a mismatch (false alarms), Sightline
4 of 210 (1.9%)
SightBench: does the parcel match?
Pairs where Sightline answered "not sure" (abstained)
283 of 420 (67.4%)
SightBench: does the parcel match?
Accuracy when Sightline gives an answer (match or mismatch)
132 of 137 (96.4%)
SightBench: does the parcel match?
Secondary metric, added after the first test run: mismatches where Sightline names the difference (mismatch, or "not sure" with the right module disagreeing)
148 of 210 (70.5%)
SightBench: does the parcel match? · negative result
False-alarm twin of the secondary metric: matching items called a mismatch or given any disagreeing reason
100 of 210 (47.6%)
SightBench: does the parcel match?
First test run (unfitted thresholds, 2026-11-08): mismatches flagged / false alarms / not sure
7/210 · 6/210 · 407/420
SightBench: does the parcel match? · negative result
Navy delivered for black (or black for navy) in dim light: mismatches caught by Sightline
0 of 7
SightBench: does the parcel match?
Wrong size delivered: caught by Sightline
44 of 53
SightBench: does the parcel match?
Different model or damage marks: caught by Sightline
model 43 of 52, damage 32 of 52
SightBench: does the parcel match? · negative result
Colour check gave up ("heavy colour cast") on wood tables and plank floors
109 of 113
SightBench: does the parcel match?
POST /verify latency on the dev laptop, p50 / p95
6.11 s / 8.28 s
Store agent: policy, invented facts, choice
Store-agent replies offered or auto-sent outside the store policy
0 of 370
Store agent: policy, invented facts, choice
Invented facts in store-agent reasons that reach the buyer
0 of 218
Store agent: policy, invented facts, choice
Grounded store-agent reasons kept by the check
60 of 60
Store agent: policy, invented facts, choice
Model picks of a reply the policy does not allow that get sent
0 of 30
Store agent: policy, invented facts, choice
Rule-based fallback (no model) picks a reply a fair store would
20 of 20
Store agent: policy, invented facts, choice · negative result
Invented claims with no amount, size, colour, date or number that pass the check
40 of 40
What is connected on this server
- PayPal sandbox (Orders v2, Vault, Payments, tracking, Disputes, webhooks): live. Every payment, hold, capture, void and refund.
- Claude (agent, confirmation check, vision, case writing): live. Shopping agent for open requests, second confirmation key, free questions, size-tag reading.
- Channel3 product data: live. Real products and variants, searched with the Demo Store catalog; Demo Store catalog alone otherwise.
- Deepgram speech to text: not connected. Streaming voice input; browser speech otherwise.
- KERNEL cloud browsers: not connected. Reading store pages (the Barrier Index crawl ran on a local browser).
- Vision service: live. Colour, the size tag read twice, the product and damage.
What we do not claim
- It has not yet been tested with blind users. That is the next step.
- Opening a PayPal case for a buyer by API is a sandbox capability; in production buyers file in PayPal’s Resolution Center.
- Orders go to a sandbox Demo Store at the listed price, not to the real retailer.
- Colour in dim light is unreliable; we publish that error rate and the app says “not sure”.
- Maya and Raj are demo personas, not customers. No medical, legal or financial advice.
Sandbox access and running it yourself
No sign-up is needed: “Shop as Maya” uses a seeded demo account. If PayPal’s window appears, sign in with a PayPal sandbox buyer account of your own, made in PayPal’s developer dashboard. We do not publish login details. To run locally: clone the repository, copy .env.example to .env.local, then run pnpm install && pnpm db:up && pnpm db:migrate && pnpm dev.