# Recall Desk

Canonical: https://www.four30.co/blog/recall-desk
Project type: App
Author: Tony Blount
Published: 2026-09-22
Category: project
Tags: product-recalls, ai-agents, email-automation, web-scraping
Event: Convex All Gas Hackathon, 2026
Our role: Solo build by Tony Blount
Stack: Convex, OpenAI, Firecrawl, AgentMail, React, TypeScript
Live: https://www.recalldesk.store
Source: https://github.com/mrtblount/recall-desk
Demo: https://www.recalldesk.store/demo.mp4
Image: https://www.four30.co/projects/recall-desk/cover.webp

A web app that checks US consumer product, food and drug recalls against what you bought, emails you on a match, and drafts the claim for you to approve.

Recall Desk is for people who want to know when something they own has been recalled. It checks your purchases against US consumer product, food and drug recalls, emails you on a match, and drafts the claim for you to approve. Convex runs the backend, OpenAI reads receipts and judges matches, Firecrawl reads remedy pages, and AgentMail carries the email.

## Why it exists

Tony built it solo for the Convex All Gas Hackathon, held August 25 to September 22, 2026. The brief asked for everyday apps, with the sponsors' tools doing real work. Every line was written for the event, starting August 30, with Claude Code as the coding agent.

The build log puts the aim in one line: forward your receipts once, and never miss a recall on something you own.

## What it does

Anyone can open the public board without an account. It lists the newest recalls from CPSC, FDA and USDA-FSIS, with photos, a running count and search.

![The public board: a search box above three CPSC recall cards from November 5, 2026, with photos, hazards and remedies.](https://www.four30.co/projects/recall-desk/board.webp "The public recall board in November 2026, tracking 2,083 recalls.")

Signed-in users add what they own four ways: a receipt photo, pasted text, a typed-in item, or a receipt forwarded to their own Recall Desk address. OpenAI reads each receipt into items, down to model numbers, UPCs and the NDC on a pharmacy label. The extractor is told never to return patient or card details, and photos are deleted once read.

When a purchase matches, the app emails an alert. If the manufacturer has a remedy page, it becomes a checklist prefilled from the receipt. One click drafts the claim email, which the user edits and approves before anything is sent. The manufacturer's reply threads back onto the claim.

![A sample claim dialog: an illustrative claim for an active recall, an example draft message and a preview approval button.](https://www.four30.co/projects/recall-desk/sample-claim.webp "The sample claim on the public page. It uses a real active recall, and nothing is sent from it.")

## How it works

The interface began as a landing design Tony generated with ChatGPT, then was ported into React and wired to live data. Behind it, one Convex deployment runs the whole backend and hosts the app. A cron checks the feeds every two hours. USDA-FSIS answers the deployment with HTTP 403, so that feed comes in through Firecrawl.

Matching runs in two stages. Full-text search and UPC and NDC lookups pick at most six candidate recalls per item. One OpenAI call then judges them and writes a rationale with a confidence score. At 0.7 or higher, the user gets an email. A match scored below that shows on the desk as a possible match.

On a match, Firecrawl renders the remedy portal and OpenAI pulls out the steps and required fields. On the Louisville Ladder portal, a plain HTTP request gets 57 characters. Firecrawl gets 2,501, enough to extract four steps and eight required fields.

A link from that page becomes the checklist's main button only after three checks. It must be a web address, appear word for word in the scraped page, and share the portal's domain. The rule came out of a 22-agent adversarial code review. It keeps a model's guess or a planted link off the button.

```ts title="convex/remedySanitize.ts"
  if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return "";
  if (!markdown.includes(claimUrl)) return "";
  if (baseDomain(parsed.hostname) !== baseDomain(page.hostname)) return "";
  return claimUrl;
```

Every OpenAI call checks a hard budget first: $5 a day, $70 in total. One item's full loop, from receipt photo to drafted claim, costs about $0.002 to $0.003.

## Where it stands

Recall Desk is live at [www.recalldesk.store](https://www.recalldesk.store). On November 6, 2026 the crons were still running and the board tracked 2,083 recalls. Sign-ups are open, capped at 1,000 accounts. The code is public under the MIT license.

> [!NOTE] Claim emails are still gated
> Recall alerts go to each account's own address. Claim emails to manufacturers still pass an allowlist Tony controls, so a claim goes out only to an address on that list.

## Related

- [Custom Apps](https://www.four30.co/custom-apps.md)
- [AI Agents](https://www.four30.co/ai-agents.md)

---

Four30 Studios · Apps & Agents for modern businesses. Tony Blount is Owner and Executive Director of Four30 Studios.
Book a conversation: https://www.four30.co/contact
Index for agents: https://www.four30.co/llms.txt
