Project
EP Linker
Tech used
A browser bookmarklet that automatically scans hockey articles for player names, matches them against the EliteProspects database, and inserts profile links directly into the editor — without the journalist ever leaving their workflow.

EP Linker is a browser bookmarklet built for hockey journalists and editors, designed to eliminate the manual work of finding and inserting EliteProspects profile links into articles. It runs entirely from the bookmarks bar — no browser extension, no installation — and works across WordPress, Ghost, Google Docs, Substack, Webflow, and Contentful.
Clicking the bookmarklet injects a script into the current page that scans the article for player names and surfaces a small panel listing every detected player, each with a link to their EliteProspects profile. The editor reviews the list, unchecks any false positives, and clicks to insert all links in one go. A manual search fallback handles edge cases where a name was spelled differently or wasn't detected automatically.
The name detection pipeline runs server-side via a Next.js API route. It extracts Title-Case 2–3 word sequences from the page's text content using a sliding token window, strips HTML, collapses cross-sentence boundaries to prevent spurious cross-paragraph name pairings, and runs each candidate against a Typesense search index with bounded concurrency. Matches are filtered with exact whole-word comparison after diacritic normalization, then deduplicated by profile ID and pruned to remove prefix-shadowed candidates — preventing shorter matched names from appearing alongside a longer, more specific match for the same person.
A separate /detect endpoint powers the manual search flow, running parallel player and staff queries against Typesense and applying a looser relevance filter suited to single-name lookups. A /track endpoint logs each linking session — which player and staff profile IDs were linked — to a Supabase table keyed by organization UUID, providing usage analytics per org.
Google Docs receives dedicated handling: because the editor renders on a canvas rather than editable DOM, the bookmarklet reads player names from the clipboard instead of scanning the page, and guides link insertion step by step through the native Google Docs link dialog.
The bookmarklet itself is generated server-side and encoded as a javascript: URL scoped to the organization's UUID, so each org gets a unique bookmarklet that attributes all link events back to their account.