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
90 changes: 83 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,86 @@
# Nope — 見たくないもの見せません
# Nope — Hide what you don't want to see

**日本語は下にあります。** [日本語セクションへ](#nope--見たくないもの見せません)

![Nope cat-ear mascot with the kitepon.dev endorsement](assets/brand/nope-github-hero.png)

## In 5 seconds

Nope is a Chrome extension that hides sources and words you do not want to see, on the supported search and list pages. You choose those sources or keywords yourself, instead of leaving the page layout to the site.

The UI follows the browser language: Japanese for `ja*`, English otherwise (`docs/adr/0001-ui-locale.md`).

## Current distribution

**v2.0.1 is live on the Chrome Web Store.** Install from the [Chrome Web Store](https://chromewebstore.google.com/detail/bodffbgmcokkhlibiehhelefknmbiaaf). The public source and this README are available now.

Developers who want to inspect the source should use **Develop and test** below. Load unpacked is a developer check, not the install path for people using the product.

## How to use it

1. On a supported search or list page, block a source you do not want to see.
2. Choose whether blocked cards become a placeholder or disappear and collapse.
3. Open the Nope popup from the Chrome toolbar to manage sources by site, Yahoo News keywords, and the display mode.

Keyword blocking is only on Yahoo News and Yahoo! JAPAN. Other surfaces block by source.

## Before and after

Before (the source is unblocked):

![AliExpress search results showing product cards](docs/evidence/r5-smoke-restored.png)

After (the same search page, with that source replaced by the Nope placeholder):

![AliExpress search results with the target source replaced by the Nope placeholder](docs/evidence/r5-smoke-blocked.png)

Only cards whose source can be identified are hidden. Cards that the site DOM no longer exposes, or whose source cannot be resolved, stay visible.

## Seven service groups, eight surfaces

![Nopeの猫マスコットとkitepon.dev endorsement](assets/brand/nope-github-hero.png)
| Service group | Surfaces | What you can block |
|---|---|---|
| AliExpress | Search results, product page | Store |
| Rakuten Ichiba | Search results | Shop |
| Yahoo! Shopping | Search results | Store |
| Yahoo Auctions | Search results | Seller |
| Amazon.co.jp | Search results | Marketplace seller |
| YouTube | Search results, Home | Channel |
| Yahoo News group | Yahoo News, Yahoo! JAPAN | Publisher, keyword |

Nope is a free Chrome extension. It does not cover every website or every surface on the sites above.

## Privacy, permissions, limits

- The only API permission is `storage`. Each service is declared in `content_scripts[].matches` so the feature can run on that surface.
- Blocked sources, display mode, and Yahoo News keywords are stored in `chrome.storage.sync`. Source-resolution cache is stored in `chrome.storage.local`.
- The extension does not send browsing data or block settings to developer analytics, tracking, or a backend. When a source must be resolved, it sends a public identifier only to the site you are already viewing.
- AliExpress JSONP responses run in that site's `MAIN` world. The Chrome Web Store remote-code declaration is therefore "yes".

Read the [privacy policy](docs/store/privacy.md). Report surface bugs in [Issues](https://github.com/kitepon/Nope/issues). Japanese and English reports are accepted. There is no promised reply window.

## Develop and test

```sh
node --test test/
node scripts/pack.mjs
```

`scripts/pack.mjs` rebuilds a ZIP and a stable unpacked tree in `dist/` with the manifest, runtime source, popup, icons, locale catalogs, and mascot images. Developers can load that unpacked tree in Chrome.

Store-listing copy is in [docs/store](docs/store/). Per-site adapters are in [src/adapters](src/adapters/). Locale selection is in [docs/adr/0001-ui-locale.md](docs/adr/0001-ui-locale.md).

## License

[MIT License](LICENSE)

---

# Nope — 見たくないもの見せません

## 5秒でわかる

Nopeは、見たくない発信元や言葉を、対応する検索結果・一覧から隠す日本語UIのChrome拡張です。Webサービス側に委ねていた表示を、発信元またはキーワード単位で自分で選び直せます。
Nopeは、見たくない発信元や言葉を、対応する検索結果・一覧から隠すChrome拡張です。UIはブラウザ言語に従います(`ja*`は日本語、それ以外は英語)。Webサービス側に委ねていた表示を、発信元またはキーワード単位で自分で選び直せます。

## 現在の配布状態

Expand Down Expand Up @@ -44,7 +120,7 @@ Nopeは、見たくない発信元や言葉を、対応する検索結果・一
| YouTube | 検索結果 | チャンネル |
| Yahooニュース群 | Yahoo!ニュース・Yahoo! JAPAN | 出版社・キーワード |

NopeはChrome向け、日本語UI、無料の拡張です。すべてのWebサイトやすべての表示面には対応しません。
NopeはChrome向け、無料の拡張です。すべてのWebサイトやすべての表示面には対応しません。

## プライバシー・権限・制限

Expand All @@ -53,7 +129,7 @@ NopeはChrome向け、日本語UI、無料の拡張です。すべてのWebサ
- 開発者のanalytics、tracking、backendへ閲覧情報やブロック設定を送信しません。発信元解決が必要な時だけ、閲覧中の対象サービス自身へ公開識別子を送信します。
- AliExpressのJSONP応答は同サイトの`MAIN` worldで実行します。このためChrome Web Storeのremote code申告は「はい」です。

詳しくは[プライバシーポリシー](docs/store/privacy.md)を読んでください。対応面の不具合は[Issue](https://github.com/kitepon/Nope/issues)で報告できます。日本語で受け付け、返信期限や英語supportは約束しません。
詳しくは[プライバシーポリシー](docs/store/privacy.md)を読んでください。対応面の不具合は[Issue](https://github.com/kitepon/Nope/issues)で報告できます。日本語と英語で受け付けます。返信期限は約束しません。

## 開発・テスト

Expand All @@ -62,9 +138,9 @@ node --test test/
node scripts/pack.mjs
```

`scripts/pack.mjs`は、manifest、実行時source、popup、icons、マスコット画像だけを含むZIPとstable unpacked面を`dist/`へ再生成します。配布物はChromeのLoad unpackedで開発者が確認できます。
`scripts/pack.mjs`は、manifest、実行時source、popup、icons、locale catalog、マスコット画像だけを含むZIPとstable unpacked面を`dist/`へ再生成します。配布物はChromeのLoad unpackedで開発者が確認できます。

設計・Store申告の詳細は[docs/store](docs/store/)を、対応サイトごとの実装は[src/adapters](src/adapters/)を参照してください。
設計・Store申告の詳細は[docs/store](docs/store/)を、対応サイトごとの実装は[src/adapters](src/adapters/)を、locale契約は[docs/adr/0001-ui-locale.md](docs/adr/0001-ui-locale.md)を参照してください。

## ライセンス

Expand Down
10 changes: 9 additions & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
# Security policy

If you think Nope has a vulnerability, is using a permission it should not, or is sending browsing data somewhere it should not, do not put details in a public Issue. Use GitHub private vulnerability reporting to the repository owner when that feature is available.

If private reporting is not available, file an Issue with the smallest summary needed to reproduce the problem. Do not include cookies, auth tokens, browsing history, block lists, URL query strings, or full-page screenshots.

English and Japanese reports are accepted. There is no promised response or fix window.

---

Nopeの脆弱性、意図しない権限利用、閲覧情報の送信が疑われる事象は、公開Issueに詳細を書かず、repository ownerへGitHubのprivate vulnerability reportingが利用可能な場合はそちらから報告してください。

private reportingが利用できない場合は、再現に必要な最小限の概要だけをIssueで知らせてください。Cookie、認証トークン、閲覧履歴、ブロック対象、URLのquery、画面全体のスクリーンショットは掲載しないでください。

日本語での報告を受け付けます。返信期限や修正期限は約束しません。
日本語と英語での報告を受け付けます。返信期限や修正期限は約束しません。
14 changes: 14 additions & 0 deletions _locales/en/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extName": {
"message": "Nope — Hide what you don't want to see",
"description": "Extension name in Chrome and the Web Store"
},
"extDescription": {
"message": "Hide content from sources and keywords you choose, on the supported search and list pages.",
"description": "Extension description in Chrome and the Web Store"
},
"extTitle": {
"message": "Nope",
"description": "Toolbar button tooltip"
}
}
14 changes: 14 additions & 0 deletions _locales/ja/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extName": {
"message": "Nope — 見たくないもの見せません",
"description": "Chrome とストアに出す拡張名"
},
"extDescription": {
"message": "指定した発信元やキーワードをもとに、検索結果や一覧から見たくないコンテンツを隠します。",
"description": "Chrome とストアに出す拡張の説明"
},
"extTitle": {
"message": "Nope",
"description": "ツールバーボタンのツールチップ"
}
}
8 changes: 7 additions & 1 deletion assets/store/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@ Chrome Web Storeへそのまま入力する完成素材。2026-08-15のChrome We
| `screenshot-03-manage.png` | 1280×800 / 8-bit RGB | 実extension popupの表示モード、発信元、キーワード管理 | `b5a0ec4c274b6a2f1eaa4c61d0f5589a4adc20c5b4040a7a9142c9262e1ad070` |
| `screenshot-04-display-modes.png` | 1280×800 / 8-bit RGB | 同一検索面のplaceholder / collapse実画面比較 | `79072d638e233b92a8be0ea420e1fded5771956f4af400500d762f92978f40b3` |
| `screenshot-05-supported-and-private.png` | 1280×800 / 8-bit RGB | 7サービス群・8対応面、Nope専用account、開発者serverへの送信境界 | `8ff8e687bc187885a8901455acda28139c8d1cb7b06bc9433e63d69675f496da` |
| `en/screenshot-01-placeholder.png` | 1280×800 / 8-bit RGB | English caption overlay on the same placeholder capture | generated 2026-08-24 |
| `en/screenshot-02-block-source.png` | 1280×800 / 8-bit RGB | English caption overlay on the same product-page capture | generated 2026-08-24 |
| `en/screenshot-03-manage.png` | 1280×800 / 8-bit RGB | English caption overlay and English popup chrome | generated 2026-08-24 |
| `en/screenshot-04-display-modes.png` | 1280×800 / 8-bit RGB | English caption overlay on the same display-mode comparison | generated 2026-08-24 |
| `en/screenshot-05-supported-and-private.png` | 1280×800 / 8-bit RGB | English supported-surfaces and privacy boundary card | generated 2026-08-24 |
| `small-promo-440x280.png` | 440×280 / 8-bit RGB | Nope product identityを主役にしたsmall promo | `67a177a591e67b4e2b3b74d6d65302826b0c1a6e96c614b239a3ca7cd301a722` |
| `en/small-promo-440x280.png` | 440×280 / 8-bit RGB | Same identity, English slogan | generated 2026-08-24 |
| `store-icon-128.png` | 128×128 / 8-bit RGBA | 現行iconを96×96で中央配置、四辺16px透明padding | `97fb9cb09d14f28c4512bea706dfc63206c6c7ac03f805e2b4af930e78c9ee08` |

## 制作境界
Expand All @@ -22,4 +28,4 @@ Chrome Web Storeへそのまま入力する完成素材。2026-08-15のChrome We
- 5枚目のprivacy表現は「Nope専用account不要」「開発者serverへ送信しない」とし、発信元解決で閲覧中のサービス自身へ通信する事実を同じ画面に残した。「通信なし」にはしていない。
- product identityはNope mascotと禁止記号を先に置いた。mascot内の`kitepon.dev`は承認済みmaster endorsementであり、新しい合成logoは作っていない。

raw captureはRootSitePromotionの`scripts/capture-nope-store-raw.mjs`、Store用書出しは同`render-nope-store-assets.mjs`で再現する。v2.0.1の完成素材はChrome Web Storeで一般公開済み。このREADMEの更新だけではライブCWSへの再提出にならない。marquee(Featured / ワイド)は作成しない。
raw captureはRootSitePromotionの`scripts/capture-nope-store-raw.mjs`、Store用書出しは同`render-nope-store-assets.mjs`で再現する。英語captionと英語popup/promoは`scripts/render-en-store-assets.py`で、同じraw captureと現行ブランド色から書き出す。AliExpressのホストUIは2026-08-15の日本語ページのまま。v2.0.1の完成素材はChrome Web Storeで一般公開済み。このREADMEの更新だけではライブCWSへの再提出にならない。marquee(ワイド掲載用)は作成しない。
Binary file added assets/store/en/screenshot-01-placeholder.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 assets/store/en/screenshot-02-block-source.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 assets/store/en/screenshot-03-manage.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 assets/store/en/screenshot-04-display-modes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 assets/store/en/small-promo-440x280.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 28 additions & 0 deletions docs/adr/0001-ui-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# ADR 0001 — UI locale selection

Date: 2026-08-24 (JST)

## Status

Accepted for the English-first catalog. Later locales add a catalog; they do not change this selection rule unless a later ADR replaces it.

## Context

The shipped UI was Japanese-only. `default_locale` / `_locales` had been added once and removed as YAGNI (`docs/evidence/t1-manifest.md`). Real installs are not Japan-only. There is no options page, onboarding flow, or context menu. User-visible strings live in the popup, injected page controls, toasts, error badges, and the manifest name / description.

## Decision

1. **Shipped catalogs**: `en` (default) and `ja`.
2. **Selection source**: Chrome UI language via `chrome.i18n.getUILanguage()` when the extension API exists; otherwise `navigator.language`.
3. **Matching**: `ja` and `ja-*` (including `ja_JP`) select Japanese. Any other tag, including empty or missing, selects English.
4. **Manifest**: `default_locale` is `en`. Name, description, and toolbar title use `__MSG_*__` so Chrome can show the matching catalog on `chrome://extensions` and the Web Store.
5. **Runtime**: `src/i18n.js` (`CB_I18N`) is the lookup used by popup and content scripts. This repo has no build step, so the full UI catalog lives in that file. `_locales/*/messages.json` holds the three manifest keys and must stay identical to `CB_I18N.MESSAGES`.
6. **Later locales**: add `_locales/<locale>/` and a `CB_I18N.MESSAGES` catalog. Until a catalog ships, unmatched languages stay on English.
7. **Out of scope**: no Featured / marquee / wide listing treatment; no install-count or user-number claims; no live Chrome Web Store scrape or submit from agents.

## Consequences

- Japanese UI remains for `ja*` browsers.
- English is the fallback and the manifest default.
- Tests pin `selectLocale` and require every Japanese key to have a non-empty English string.
- Popup `lang` follows the selected catalog. Dates in the popup use `ja-JP` or `en`.
Loading
Loading