Independent Projects
Independent projects
Products and experiments I conceived, designed, and built independently, outside of employer work. Work done for employers is described under experience, and published research under writing.
AI Product · Independently Created
Havable: When the answer is no, what then?
A child picks something off the shelf and the label says no. Every allergy app answers that and stops. Havable scans what they picked up and then does the part that actually takes the time: alternatives on this shelf, or a recipe whose ingredients you can buy on the same trip. No model is involved in the allergen decision. Built end to end.
- Role
- Product · Design · Builder
- Context
- Built end to end
- Status
- Live, with a public repository
The problem
The founding account is my own, as a parent of a child with peanut and tree nut allergies, and it is marked as one account rather than dressed up as research. Reading the label is twenty seconds. What comes after it is the part that takes minutes: a disappointed child, and a parent searching the aisle unaided for something he would actually want. Existing apps optimise the reading and stop at the verdict.
My role
Product · Design · Builder. I framed the problem, made the architectural decision the whole product rests on, ran the research that failed, killed my own business model on the numbers, and built and deployed it.
What it does
- Scans a product and returns one of four verdicts against a saved allergy profile. None of the four is the word “safe”.
- Offers three ways out rather than one: something that looks like what they wanted, something of the same kind, or a recipe with an allergen-checked shopping list.
- Ranks visually similar products using multimodal embeddings, while the allergen filter runs as set logic over a curated lexicon — learned ranking, deterministic gating.
- Shows the source and the age of every result, because we do not write the ingredient data and cannot vouch for it.
What it deliberately does not do
- No model touches the allergen decision. A false “unsafe” costs a snack; a false “safe” is anaphylaxis in a child. There is no exchange rate between those, so there is no threshold to tune — only a gate.
- It never says a food is safe. It says what the label declares, and that the packet is the final word.
- It withholds rather than guesses. Failing closed costs 18.7% of the catalogue, and that cost is stated rather than hidden.
- The one generative step writes cooking notes, never the recipe — the retrieved recipe keeps its citation and licence, and every ingredient the model proposes is re-checked by the same lexicon.
Outcome
Deployed and running, with 169 tests and a CI check that fails the build if the SQL filter ever admits a product the gate withholds. The research I built to validate which substitution type kids actually prefer turned out to be useless — ask a six-year-old the same question twice and the answer changes a third of the time — so the product ships all three and lets usage data settle it. A competitive review turned up a nonprofit-backed incumbent already doing substitution, which narrowed what I can claim but did not kill it. False-Safe Rate is still undefined; the golden set has no human labels yet, and reporting zero would be a lie with a number attached.
AI Product · Independently Created
SiftReviews: Is This Review Worth Trusting?
Highlight a review and SiftReviews quotes the phrases that make it read formulaic, and the ones that read first-hand. The site check is verified against Google Safe Browsing, the writing reading is a model estimate, and the two are shown separately so you know which is which. Built end to end.
- Role
- Product · Design · Builder
- Context
- Built end to end
- Status
- Live on Chrome Web Store
The problem
Reviews are where a shopper finds out what the product page will not say, and a lot of them now read the same way. Whether a machine wrote one is a dead end: a generated review can describe a real purchase, and a person can write three sentences that say nothing. The useful question is which phrases are doing the work.
My role
Product · Design · Builder. I framed the problem, designed the scoring model and system boundaries, and built it.
What it does
- Manifest V3 Chrome extension with a FastAPI backend.
- Highlight a review, a comment, or a paragraph and scan only that. Selections under 200 characters are declined rather than scored.
- Returns the phrases behind the reading, quoted from the passage, so the reader can disagree with the same lines the model used.
- Site safety and passage reading are labelled by how they were produced, one verified against Google Safe Browsing, one a model estimate.
What it deliberately does not do
- The score prompts a closer look. It is not a verdict, and it is not a moderation decision.
- AI-content detection is probabilistic. It is never presented as proof of authorship.
- Low-confidence results display as low-confidence rather than rounding to a clean number.
- On a highlighted passage no combined score is produced, because averaging a site safety flag with a passage reading gives a number that describes neither.
Outcome
A published Chrome extension with a live API and a public repository, plus a documented evaluation: a harness that runs a labelled set through the production prompt.