Craigslist Duplicate Listing Flagger
Free to download on every platform. Comes pre-installed on BotFone, BotPad and BotFlip — with extra free apps included.
About this app
WHAT IT DOES
This script detects and flags duplicate listings on Craigslist search results, helping you avoid seeing the same item posted multiple times. When you search on Craigslist, the script scans each listing, extracts key information (title, price, location, listing ID, and posting date), and compares listings to find duplicates. It looks for similar titles, prices, and locations, and also matches listing IDs that appear multiple times. Each suspected duplicate gets a visual badge: yellow for "Possible Duplicate" and red for "Likely Duplicate." A colored left border is also added to make duplicates stand out. An optional "Group duplicates" feature clusters duplicate listings together so you can see them side by side. The script updates dynamically as new listings load.
WHERE IT RUNS
The script runs on all Craigslist pages (*.craigslist.org). It works on search results pages, category pages, and listing grids. It supports both desktop and mobile views.
HOW TO USE
After installation, the settings panel appears on the left side of the screen with the gear emoji (⚙️). Open the panel to configure the script:
- The "Enable duplicate flagger" toggle enables or disables the script.
- Toggle "Group duplicates together" to cluster duplicate listings for easier comparison.
- Click "Refresh listings" to manually re-scan the current page.
The script works automatically—just browse Craigslist and duplicates will be flagged.
TECHNICAL SECTION — REAL MECHANISM
The script detects Craigslist search pages by checking the URL for /search/, /s/, /results/, or /browse/. It finds listings using selectors like .result-row, .result, .result-item, .listing, and .item. For each listing, it extracts the title from .title, .result-title, or .hdrlnk; the price from .price or .result-price; the location from .location or .result-location; and the listing ID from data-pid or the URL. Duplicate detection uses a similarity algorithm that compares titles (string similarity), prices (within $5), and locations. The overall similarity score is calculated and listings with a score above 0.7 are grouped as duplicates. The confidence level is determined by the number of matching criteria and the group size. A badge is created using style properties and textContent (never innerHTML) and inserted next to the title. A colored left border is also added. The grouping feature reorders the DOM to place duplicate listings together. A MutationObserver watches for DOM changes and re-scans when new listings load.
THE PANEL
The settings panel is built with BotGentz's BGPanel component. It is draggable via its header, allowing you to reposition it anywhere on the screen. The panel snaps to the left edge by default but can be moved freely. Click the gear emoji to collapse the panel into a small bubble, and click the bubble to expand it again. The panel remembers its position per page session. Press the Escape key to quickly close or minimize the panel. The panel includes a status flash bar that provides visual feedback when settings are changed or actions are performed. All settings save automatically via GM_setValue.
PLEASE NOTE
This script requires the free BotGentz browser extension to run. It does not function as a standalone Chrome extension and does not use chrome.* APIs. Craigslist frequently updates its page structure, which may affect the selectors used to find listings and extract data. If the script stops working, please check for updates. The duplicate detection is heuristic-based and may produce false positives or false negatives. The "Group duplicates" feature reorders the page DOM, which may affect the natural scroll position. The script stores only your preferences via GM_setValue. No data is sent externally—all data is stored locally in your browser. The script never reads or writes password fields, hidden inputs, or file inputs. All DOM operations use safe methods (style properties, textContent, appendChild) and never use innerHTML.