尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Interactive patent claim chart: scores claim elements against prior art with hand-written TF-IDF. Next.js, React, TypeScript.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Live demo: claimchartexplorer.vercel.app
An interactive claim chart for patent review. A patent claim is split into its elements, and each element is scored against passages from prior-art patents. The chart is shaded by how strongly the prior art covers each element, so a reviewer can spot an uncovered element (the start of a novelty argument) in seconds instead of reading every reference end to end.
Built with Next.js 16 (App Router), React 19, TypeScript and Tailwind CSS. The matching is a hand-written TF-IDF + cosine similarity engine in TypeScript, served from a Next.js API route. No external AI API is used.
| Annotated claim | ASCII patent figure | Dark mode |
|---|---|---|
Patent attorneys build claim charts by hand. They break a claim into elements ("[1a] displaying information identifying the item…") and search prior-art documents for passages that disclose each one. The chart that results shows, element by element, whether the prior art covers the invention. An element with no matching prior art is where the argument for novelty starts.
The demo uses real, public USPTO patent text:
The scorer finds strong prior art for retrieving stored purchaser data, generating the order and fulfilling it (elements 1d–1f). It finds no strong match for 1b, the "single action" order request, which is the part of the claim that made it novel.
src/
├── data/claimChart.json # claim elements + prior-art passages (verbatim patent text)
├── lib/
│ ├── types.ts # shared TypeScript types for the data and the API response
│ ├── tfidf.ts # tokenizer, stemmer, sentence splitter, TF-IDF, cosine
│ ├── matcher.ts # scores every element against every reference
│ └── highlight.ts # splits text into highlighted / plain segments
├── app/
│ ├── api/match/route.ts # GET /api/match → scored chart as JSON
│ ├── page.tsx # Server Component: page shell + header
│ └── layout.tsx
└── components/
├── ClaimChartExplorer.tsx # Client Component: fetches data, owns state
├── ClaimText.tsx # the claim, each element underlined by coverage
├── PatentFigure.tsx # ASCII "FIG. 1" drawing of the claimed method
├── ChartTable.tsx # the grid, with roving-tabindex keyboard navigation
├── PassagePanel.tsx # side panel with highlighted passage
├── SummaryBar.tsx # coverage sentence + list of gaps
└── strength.ts # fills/underlines for strong/partial/weak, score formatting
lib/tfidf.ts, lib/matcher.ts)order, and "identifier" and "identification" to ident.idf = ln((1 + N) / (1 + df)) + 1. Rare words ("cart", "purchaser") get high weight, and common ones ("computer") get low weight.term count × idf.page.tsx is a Server Component. It renders the static header on the server and mounts <ClaimChartExplorer />, a Client Component ("use client"). That component:
/api/match in a useEffect, with an AbortController so a stale request never updates state;loading | error | ready), so TypeScript only allows reading data once it has loaded;ChartTable, PassagePanel and SummaryBar as props. The children report clicks back up through callback props (onSelect, onClose, onJump).The API route only reads a bundled JSON file. With Next.js Cache Components, it is prerendered at build time and served as a static response.
The goal is to look like a working research tool, not a landing page. Every visual choice has a reason in the subject:
The claim leads. The page opens with the patent claim itself, annotated with coverage, because that's the thing a patent reviewer actually reads.
Type from the patent office's world. Public Sans for the interface and Merriweather for patent text, the two typefaces of the US Web Design System the USPTO belongs to. The serif appears only on text quoted from patents, so the typeface tells you whose words you're reading.
Color encodes one thing. Neutrals are USWDS cool grays on white. Match strength is an ordered scale, so it uses a single blue hue, light to dark. Weak cells have no fill, so gaps read as empty. Each fill clears 2:1 against the page and all text on it clears 4.5:1. Dark mode flips the scale so "strong" stays the most prominent.
No decoration. No eyebrow labels, numbered sections, all-caps or mono text, or gradients. Headings are sentence case, corners are 2px, and gridlines exist because it's a table.
A background from the patent itself. Behind the header is Fig. 1A of US 5,960,411, the patent's drawing of the original 1-Click button beside the old "Add it to your shopping cart" button, which is the contrast claim element 1g is about. It has a 3px blur at 18% opacity and fades out before the chart. 18% is the ceiling: after the blur the darkest stroke is about 70% strength, and at 18% every text color over it still clears 4.5:1 in both modes. Dark mode inverts the line art.
All tokens live in src/app/globals.css.
TF-IDF compares words, not meaning, so a few things are out of reach:
Natural next steps: embedding-based similarity, letting users paste their own claim and references, and exporting the chart as a table for a brief.
Requires Node.js 20.9 or later.
npm install
npm run dev # http://localhost:3000
Other scripts:
npm test # Jest + React Testing Library
npm run typecheck # tsc --noEmit
npm run lint
npm run build # production build
__tests__/ contains 23 tests:
tfidf.test.ts: stemming, tokenizing, sentence splitting around "FIG." and "U.S. Pat. No.", IDF ordering, and cosine edge casesmatcher.test.ts: picks the right passage and sentence, handles elements with zero overlap, threshold buckets, and checks the sample datahighlight.test.ts: highlighting keeps the original text intactroute.test.ts: GET /api/match returns well-formed JSONClaimChartExplorer.test.tsx: loading → chart, click to open and Escape to close the panel, opening a passage from the claim text, arrow-key navigation, the gap list in the summary, error + retry, and the empty statemain then redeploys automatically.This project is deployed at claimchartexplorer.vercel.app. Deployment-specific URLs (the ones with a random suffix) are behind Vercel Authentication by default; share the production domain instead.
Patent text and the Fig. 1A drawing are from USPTO documents via Google Patents. Scores measure word overlap only and are not a legal opinion.