This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle.
What I Built
Two catalog rows can describe almost the same thing with different words. They can also describe different things with almost the same words. A tool that quietly deletes the second row gets both cases wrong.
Catalog Twins finds pairs worth reviewing. It compares English listing descriptions with an open MiniLM model running in the browser, then places the two descriptions side by side. The seller makes the decision.
No automatic deletion.
The intended user is a small resale or collectibles seller preparing a catalog export. A practical product would save the review step between importing inventory and publishing it. The reason to pay would be less manual comparison without sending an unpublished inventory to a hosted AI API. That is a product hypothesis, not a report of a customer purchase: this prototype has no paying users or confirmed revenue.
eBay's duplicate-listing policy is one concrete reason to review inventory carefully. The app does not decide whether a listing complies with that policy; descriptions alone cannot establish that two physical items are identical.
Demo
The demo includes eight fictional records. Press Find duplicate candidates, let the model finish downloading, and read the comparison cards. The first run needs an internet connection for runtime and model files; no account, AI key or credit card is required.
Two browser runs compared all 28 pairs and returned six candidates at a cosine threshold of 0.80, taking about seven and nine seconds. Those figures describe this synthetic sample. They do not measure accuracy on a seller's real inventory or guarantee the same speed on another device.
The closest pair in that run was a blue ceramic teapot described in two ways: cosine 0.963, against a shared-word baseline of 0.583. The embeddings found a connection that exact-word matching made weaker.
The more useful test was the mistake.
The chipped teapot and a similar one described as having no chips also scored 0.825, above the default threshold. That pair stays visible with both condition descriptions. The model has identified related language; it has not proved the objects are interchangeable. Showing that limitation is why the result is a review card rather than a merge button.
Code
The repository contains the static interface, the browser inference module and a separate comparison module. Run node --test test.mjs for seven checks covering strict catalog parsing, input limits, malformed vectors and safe rendering. These tests exercise the surrounding software; the deployed demo exercises the actual model.
How I Built It
Muse produced the initial source bundle. Codex reviewed it, corrected the implementation and tested it. AI tooling also generated this write-up; the DEV disclosure is Fully Autonomous. No personal seller story, testimonial or human editing claim is attached to it.
The core is Xenova/all-MiniLM-L6-v2, served as q8 ONNX weights through Transformers.js 3.8.1. The model revision is pinned in the source. Mean pooling produces an embedding for each short description, and cosine similarity ranks the review pairs. A separate normalized-text check identifies matching text, while a shared-word score provides a simple comparison baseline.
The original prototype skipped malformed rows. The reviewed version rejects them before inference, because silently dropping inventory is a poor way to help someone check inventory. It also rejects repeated IDs and restricts each batch to 100 short listings to keep browser work manageable.
Loading errors return an error message and no candidates. The interface does not substitute keyword matching and call it AI.
Why Does Open Innovation Matter?
The open model does the essential work. Without its embeddings, Catalog Twins loses the semantic comparison that distinguishes it from a text-equality check.
Browser inference avoids an inference bill for every catalog and lets a seller inspect the matching logic. The app sends no listing text to a server. Hugging Face and jsDelivr still receive the normal requests needed to download model assets and library code, so this is not a claim of a network-free first run.
The model and Transformers.js retain their Apache-2.0 licenses; the app source uses MIT. The fixed model revision and visible scores make the result easier to reproduce and inspect. Open access to weights helps keep the inference step independent of a paid provider, while human review remains necessary for the physical-product decision.
All sample listings are fictional. No client catalog or identifying data appears in this project.
Top comments (0)