Inspiration

MatchMark grew out of my own struggle writing papers. Large universities and institutes give their students and researchers plagiarism checkers. Anyone outside those institutions is left guessing whether what they’ve written is free of plagiarism.

Most of what we write comes from what we read. So I thought: what if I could check my draft for similarity against all the documents I’ve actually read? Not a paid database I can’t access, but the papers sitting on my own computer. It won’t replace an institutional checker, but it can narrow the gap between those who have access and those who don’t.

It also had to be private. An unpublished draft is exactly what you shouldn’t have to upload to someone else’s server, so MatchMark runs entirely in your browser and never sees your files.

What it does

MatchMark compares a Word manuscript (.docx) with any number of source PDFs, entirely inside your browser tab. Nothing is uploaded.

Similarity score with a Low / Moderate / High level, and every matched passage highlighted in your draft Source identification: hover or tap a highlight to see which PDF it came from, the page number and an excerpt of the matching source text Match navigator to step through passages with Next / Previous or the n / p keys Reads scanned PDFs with OCR that runs on your own device and remembers pages it has already read Fair by default: ignores the reference list (and, optionally, quoted text), and doesn't credit everyday phrasing to every source Tune matching: adjust how strict matching is, with results updating in milliseconds Accessible: numbered and patterned sources, a colour-blind-safe palette, keyboard support and a mobile layout Export the report as PDF, CSV or JSON

How we built it

Plain HTML, CSS and JavaScript (ES modules), with no framework and no backend. It's hosted as a static site on GitHub Pages. PDF.js reads PDFs, Mammoth converts the .docx, and Tesseract.js (WebAssembly) does OCR. All three are bundled with the app, so nothing loads from a CDN. Matching runs in Web Workers so the page stays responsive. The draft is cut into overlapping 13-word windows and each PDF into 11-word windows. A pair is a match when they share at least 8 distinct words in any order, which catches lightly reworded text as well as exact copies. A second check compares 3-word phrases (trigrams). To make this fast, an inverted index maps each word to the draft windows containing it, and as the PDF window slides I only update counts for the word leaving and the word entering. That turns a quadratic comparison into roughly linear work: about 90 ms for a 100,000-word PDF against a 5,000-word draft. IndexedDB caches OCR text per page, keyed by each file's SHA-256 hash, so a scan is only ever read once. 52 unit tests run on Node's built-in test runner, including checks of the fast matcher against a brute-force version.

Challenges we ran into

Speed with no server. Comparing every window against every window was far too slow in a browser tab. The inverted index and sliding counts fixed it. Scanned PDFs. I needed to spot image-only pages without decoding every image. I scan the PDF's raw bytes for image objects instead, and split long scans into page ranges so up to 8 OCR engines work in parallel. False positives. Reference lists, quotations and lone words like "the" and "of" inflated scores, so I added rules to exclude them. Telling sources apart without relying on colour. I added numbers, patterns and a colour-blind-safe palette while keeping every colour at WCAG AA contrast. Polish under time pressure. While recording my demo I caught two display bugs (a per-word outline and a clipped tooltip) and fixed them before submitting.

Accomplishments that we're proud of

It's completely private: your drafts never leave your device. On clean 200 DPI test scans, OCR in the browser takes under 1 second per page with 100% word accuracy. Every match tells you exactly where it came from, down to the page.

What we learned

How far the modern browser goes as a platform: workers, WebAssembly, IndexedDB and file access, all without a backend. The right data structure matters more than raw hardware. Accessibility is much easier to design in from the start than to add later.

What's next for MatchMark

Paraphrase detection with small on-device embedding models More formats (PDF manuscripts, .odt, plain text) and OCR languages beyond English A side-by-side view of your draft and the matching source page An installable offline app (PWA)

Built With

Share this project:

Updates

Submission history