Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ Versioning while remaining pre-1.0.

## [Unreleased]

- No changes yet.
- Adds an original, provenance-documented extension icon and production icon
declarations without changing browser permissions.
- Prepares bilingual Chrome Web Store listing, privacy, permission, reviewer,
submission, screenshot, and promotional materials.
- Prepares deterministic 0.4.1 candidate artifacts while leaving the tracked
published Zotero update manifest on v0.4.0.

## [0.4.0] - 2026-08-20

Expand Down
15 changes: 15 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,21 @@ The extension does not upload Zotero library data. A separately installed
translation-server may fetch the public page URL supplied to it; users should
review that project's behavior independently.

All project data handling occurs on the user's computer. Data is not sent to
the maintainer, sold, used for advertising or profiling, or used for credit,
insurance, employment, or other unrelated purposes. This includes the public
web-page metadata, current page URL, local pairing token, and local connection,
index, and match state described in this policy.

## Chrome Web Store and remote code

Chrome is the target browser for the planned Chrome Web Store listing. The
production extension does not use remote code: it does not load remote scripts,
evaluate remotely obtained content, download code for execution, or allow a
remote configuration to control code execution. The companion Zotero add-on at
localhost and the optional translation-server at localhost are local services,
not remote code.

The first public-alpha support policy formally gates only CNKI Chinese and MDPI
article-detail live pages. CNKI English and CNKI batch behavior are
experimental, and ScienceDirect is best effort when publisher access controls
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Paper Library Checker compares metadata from supported scholarly pages with your

> Alpha software: site coverage and installation details may change before the first stable release.

Chrome Web Store submission is being prepared. The extension is not yet listed there.

Zotero is a registered trademark of the Corporation for Digital Scholarship. This independent project is not affiliated with or endorsed by the Zotero project.

## Why use it?
Expand Down
2 changes: 2 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Paper Library Checker 将受支持学术页面的元数据与本地 Zotero 9 文

> Alpha 软件:在首个稳定版本发布前,站点覆盖范围和安装细节可能发生变化。

正在准备 Chrome Web Store 上架,目前尚未在该商店发布。

Zotero 是 Corporation for Digital Scholarship 的注册商标。本独立项目与 Zotero 项目没有关联,也未获得 Zotero 项目的认可或背书。

## 为什么使用?
Expand Down
Binary file added browser-extension/icons/icon128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added browser-extension/icons/icon16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added browser-extension/icons/icon32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added browser-extension/icons/icon48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 14 additions & 2 deletions browser-extension/manifest.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
{
"manifest_version": 3,
"name": "__MSG_extensionName__",
"version": "0.4.0",
"version": "0.4.1",
"description": "__MSG_extensionDescription__",
"default_locale": "en",
"icons": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
},
"permissions": ["storage"],
"host_permissions": [
"http://127.0.0.1:23119/*",
Expand All @@ -16,7 +22,13 @@
},
"action": {
"default_title": "__MSG_actionTitle__",
"default_popup": "src/popup.html"
"default_popup": "src/popup.html",
"default_icon": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
},
"content_scripts": [
{
Expand Down
14 changes: 12 additions & 2 deletions browser-extension/src/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ function connectionMessage(status, payload) {
return optionsI18n.t("connectionFailed", status);
}

function isCompatibleAddonVersion(addonVersion, extensionVersion) {
return typeof addonVersion === "string" && typeof extensionVersion === "string" &&
addonVersion === extensionVersion;
}

async function testConnection() {
try {
var endpoint = validateEndpoint(document.querySelector("#endpoint").value.trim());
Expand All @@ -92,7 +97,8 @@ async function testConnection() {
var payload = await response.json().catch(() => ({}));
if (!response.ok) throw new Error(connectionMessage(response.status, payload));
if (payload.indexReady !== true) throw new Error(optionsI18n.t("indexNotReady"));
if (typeof payload.version !== "string" || !payload.version.startsWith("0.3.")) throw new Error(optionsI18n.t("unexpectedAddonVersion"));
var extensionVersion = chrome.runtime.getManifest().version;
if (!isCompatibleAddonVersion(payload.version, extensionVersion)) throw new Error(optionsI18n.t("unexpectedAddonVersion"));
setStatus(optionsI18n.t("connectedVersion", payload.version), false);
} catch (error) {
setStatus(error.message, true);
Expand All @@ -116,4 +122,8 @@ if (typeof document !== "undefined") {
load().catch((error) => setStatus(error.message, true));
}

if (typeof module !== "undefined" && module.exports) module.exports = { connectionMessage, validateEndpoint };
if (typeof module !== "undefined" && module.exports) module.exports = {
connectionMessage,
isCompatibleAddonVersion,
validateEndpoint
};
1 change: 1 addition & 0 deletions browser-extension/src/popup.css
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dd {
}

dd[data-state="good"] { color: #176b32; }
dd[data-state="missing"] { color: #164b86; }
dd[data-state="warning"] { color: #8a5200; }
dd[data-state="error"] { color: #a40000; }

Expand Down
6 changes: 4 additions & 2 deletions browser-extension/src/popup.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@

function renderPageState(documentObject, pageState) {
const state = uiState.normalizePageState(pageState);
const good = [uiState.PAGE_STATES.SAVED, uiState.PAGE_STATES.NOT_SAVED].includes(state);
const good = state === uiState.PAGE_STATES.SAVED;
const missing = state === uiState.PAGE_STATES.NOT_SAVED;
const warning = [uiState.PAGE_STATES.POSSIBLE_MATCH, uiState.PAGE_STATES.NOT_CHECKED,
uiState.PAGE_STATES.CHECKING, uiState.PAGE_STATES.CHOOSE_ITEM].includes(state);
setText(documentObject, "pageState", i18n.t(uiState.messageKeyForPageState(state)), good ? "good" : warning ? "warning" : "error");
setText(documentObject, "pageState", i18n.t(uiState.messageKeyForPageState(state)),
good ? "good" : missing ? "missing" : warning ? "warning" : "error");
const checkButton = documentObject.querySelector("#checkPage");
if (checkButton) checkButton.disabled = state === uiState.PAGE_STATES.UNSUPPORTED;
}
Expand Down
2 changes: 1 addition & 1 deletion docs/protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ hook would be needed for that stronger guarantee.
Authenticated response:

```json
{ "ok": true, "version": "0.4.0", "indexReady": true }
{ "ok": true, "version": "0.4.1", "indexReady": true }
```

### POST /check
Expand Down
8 changes: 8 additions & 0 deletions docs/releasing.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ does not authorize a tag, release, merge, or visibility change.
- Compare downloaded artifact checksums with CI output before creating a GitHub
Release. Publication is a separate maintainer action.

### Chrome Web Store order

1. Publish GitHub v0.4.1 and its companion Zotero XPI first.
2. Verify the downloaded XPI and Chrome extension ZIP hashes.
3. Upload the browser ZIP to the Chrome Web Store only after those artifacts exist.
4. Submit the listing, privacy practices, permission reasons, and reviewer instructions.
5. Add a store installation link to the READMEs only after the listing is actually live.

## Rollback

Keep the previous reviewed XPI and extension ZIP plus checksums. If a regression
Expand Down
16 changes: 16 additions & 0 deletions docs/test-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,19 @@ the metadata-only release step.
| Popup connection and index | Show `Connected` and `Ready` | PASS (2026-08-20) |
| Single controlled-page check | **Check this page** returns a normal page state | PASS (2026-08-20) |
| Unhandled exceptions | No unhandled exception during the minimal smoke | PASS (2026-08-20) |

## 0.4.1 minimal Chrome/Zotero smoke

The maintainer exercised the 0.4.1 candidate with dedicated Chrome and Zotero
profiles while capturing the reviewed Chrome Web Store screenshots. This was a
targeted smoke, not a repeat of the full release matrix.

| Test item | Actual result |
| --- | --- |
| Zotero add-on version 0.4.1 | PASS (2026-08-24) |
| Zotero connected | PASS (2026-08-24) |
| Index ready | PASS (2026-08-24) |
| Saved page check | PASS (2026-08-24) |
| Not-saved page check | PASS (2026-08-24) |
| Options test connection | PASS (2026-08-24) |
| Unhandled error | NONE (2026-08-24) |
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "paper-library-checker",
"version": "0.4.0",
"version": "0.4.1",
"private": true,
"description": "A local-first browser extension and third-party Zotero add-on for checking scholarly articles against a local library.",
"license": "Apache-2.0",
Expand Down
3 changes: 2 additions & 1 deletion scripts/public-export-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
"browser-extension",
"zotero-plugin",
"test",
"tools/manual-verification"
"tools/manual-verification",
"store-assets/chrome-web-store"
]
}
27 changes: 27 additions & 0 deletions store-assets/chrome-web-store/ASSET_PROVENANCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Asset provenance

The icon was generated by the maintainer with ChatGPT from an original text
prompt. No third-party image was used as input. It does not copy or modify the
Zotero, Chrome, Edge, or any other software icon. Its design theme is “paper
page + check mark.” The maintainer chose to distribute it with this project
under the project's Apache-2.0 license.

## SHA-256

- Input PNG: `332ed97604f9cb112f77eea3c882fd92509a4d4231eb3fa92c687a913d387fec`
- Cleaned 1024 × 1024 master: `6aea26f1f329ef93a0224fd5e3bfb5318ff04b873b548047c843d6ede9d9b3ab`
- 16 × 16: `7cb062adabd0a83fb1d221f9efa2db0915d829635b9a261b67020d02ccd3f48e`
- 32 × 32: `ee0e790551e5526498d7431f88c42ef21169a0fd1d87e2a55bc832ecc0002120`
- 48 × 48: `398875a00fe90f5f50439ec115ace47ea1108b4efece42372aaab034ec276609`
- 128 × 128/store icon: `ef4294654d2a6dc8e1027b62642ab158307eab2940de42ca6fca76a1e65719a4`

## Processing

ImageMagick 7.1.1-21 Q16-HDRI was used for one-time processing. The source was
decoded, converted to standard sRGB RGBA PNG, stripped of EXIF/text and other
unnecessary metadata, cleaned of near-transparent pixels outside the subject,
trimmed and centered on a transparent 1024 × 1024 canvas with about 7% safe
margin, and encoded without ancillary PNG chunks. Production sizes were
exported from the master with Lanczos resampling. RGB-only light sharpening and
pixel-aligned 16/32 pixel output were used for small-size clarity; the artwork,
core colors, and composition were not redrawn or changed.
30 changes: 30 additions & 0 deletions store-assets/chrome-web-store/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Chrome Web Store submission assets

This directory contains the maintainer-owned listing material for the planned
Chrome Web Store submission of Paper Library Checker 0.4.1. It is part of the
public source export but is deliberately excluded from the production browser
extension ZIP.

- `source/icon-master-1024.png` is the cleaned archival master.
- `store-icon-128.png` is the store listing icon.
- `promo-small-440x280.png` is the small promotional tile.
- `screenshots/en` contains three reviewed 1280 x 800 captures from the real
extension UI using dedicated browser and Zotero profiles. The optional
`screenshots/zh_CN` directory is reserved for a future localization enhancement;
Simplified Chinese screenshots are not a blocker for the initial submission.
- The listing, privacy, permission, reviewer, provenance, and submission files
are copy-ready working material. The Chrome Web Store dashboard remains a
maintainer-only step.

The minimal Chrome/Zotero smoke used while capturing the English screenshots
passed. Chrome Web Store upload and review submission have not started. The
reviewer XPI link remains pending until GitHub Release v0.4.1 is published and
its checksum is verified.

Paper Library Checker is an independent project and is not affiliated with or
endorsed by Zotero, Google Chrome, Microsoft Edge, or their publishers.

The listing constraints were checked against Chrome's official documentation:
[listing guidance](https://developer.chrome.com/docs/webstore/best-listing),
[dashboard listing fields](https://developer.chrome.com/docs/webstore/cws-dashboard-listing),
and [image requirements](https://developer.chrome.com/docs/webstore/images).
43 changes: 43 additions & 0 deletions store-assets/chrome-web-store/listing.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Chrome Web Store listing — English

## Store name

Paper Library Checker

## Summary

Check whether papers on supported scholarly sites are already in your local Zotero library.

## Description

Paper Library Checker is an alpha, local-first companion for Zotero. On
supported scholarly article pages, it reads public bibliographic metadata and
checks that metadata against the user's local Zotero library. It can display
Saved, Possible match, Not saved, or Unrecognized so the user can decide
whether to save the item.

Requirements:

- Zotero 9.0.x.
- The companion Paper Library Checker Zotero add-on.
- Zotero and the add-on must be running; Offline is expected when they are not.

The extension does not save papers and does not replace Zotero Connector. It
does not upload the user's Zotero library. There is no telemetry, advertising,
or developer-operated server. Matching and pairing stay on the user's computer.

Chrome is the target browser for this Chrome Web Store listing. Microsoft Edge
can usually install extensions from the Chrome Web Store, but not every Edge
environment is guaranteed.

Current support boundaries remain unchanged: CNKI Chinese article details are
supported and tested; CNKI English and CNKI list/reference checks are
experimental; ScienceDirect is best effort when site access controls replace
the article page; MDPI article details are supported and tested, but MDPI
References are not supported. Other manifest-listed scholarly sites use
experimental or best-effort generic metadata extraction. A listed domain is not
itself a promise of verified support for every page.

Paper Library Checker remains alpha software. It is an independent project and
is not affiliated with or endorsed by Zotero, Google Chrome, Microsoft Edge,
or their publishers.
37 changes: 37 additions & 0 deletions store-assets/chrome-web-store/listing.zh-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Chrome Web Store 商店文案 — 简体中文

## 商店名称

Paper Library Checker

## 简短说明

检查受支持学术网站上的论文是否已存在于本地 Zotero 文献库中。

## 详细说明

Paper Library Checker 是一个仍处于 alpha 阶段的本地优先 Zotero 配套工具。
它读取受支持学术文章页面中的公开书目信息,并与用户电脑上的本地 Zotero
文献库进行匹配,显示“已保存”“可能匹配”“未保存”或“无法识别”,帮助用户
决定是否保存条目。

运行要求:

- Zotero 9.0.x;
- 配套的 Paper Library Checker Zotero 附加组件;
- Zotero 及该附加组件需要保持运行;未运行时显示“离线(Offline)”属于预期行为。

本扩展不会保存文献,也不会替代 Zotero Connector;不会上传用户的 Zotero
文献库;没有遥测、广告或开发者运营的服务器。匹配和配对均在用户电脑上完成。

Chrome 是本次 Chrome Web Store 上架的目标浏览器。Microsoft Edge 通常可以
安装 Chrome Web Store 扩展,但不能保证所有 Edge 环境都兼容。

现有支持边界保持不变:CNKI 中文文章详情页已支持并完成测试;CNKI 英文页和
CNKI 列表/参考文献检查为实验性;ScienceDirect 在访问控制替换正常文章页面时
仅为尽力支持;MDPI 文章详情页已支持并完成测试,但 MDPI References 不支持。
manifest 中列出的其他学术网站使用实验性或尽力支持的通用元数据提取;域名被列出
本身并不表示承诺支持该网站的所有页面。

Paper Library Checker 当前仍是 alpha 软件。本项目是独立项目,与 Zotero、
Google Chrome、Microsoft Edge 及其发布方没有关联,也未获得其认可或背书。
28 changes: 28 additions & 0 deletions store-assets/chrome-web-store/permission-justifications.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Chrome Web Store permission justifications

The 0.4.1 permission set is unchanged from 0.4.0.

## `storage`

Stores ordinary extension settings and the local pairing credential. The
pairing token is stored in `chrome.storage.local` and is not sent to the
maintainer.

## `http://localhost:23119/*` and `http://127.0.0.1:23119/*`

Connect to the companion Paper Library Checker Zotero add-on on the same
computer for health, indexing, and authenticated local-library matching.

## `http://localhost:1969/*` and `http://127.0.0.1:1969/*`

When the user enables it, connect to a separately installed translation-server
on the same computer to extract public bibliographic metadata from the current
public page URL.

## Explicit scholarly-site matches

The manifest explicitly lists scholarly sites where the content script may
read public bibliographic metadata from the current article page and display a
local match result. The extension does not request `<all_urls>`, collect browsing
history for the developer, intercept all network requests, or modify browser
settings. It does not request `tabs` or `activeTab`.
Loading
Loading