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
11 changes: 3 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Every released version has a [GitHub Release](https://github.com/devpeer-net/website-blocker/releases)
carrying the exact `.zip` that is uploaded to the Chrome Web Store, its SHA-256, a build
provenance attestation, and a tree digest you can regenerate from an installed copy to
provenance attestation, and a content digest you can regenerate from an installed copy to
check that the store is serving that same build. See [docs/RELEASING.md](docs/RELEASING.md)
for how a release is cut and how to verify one.

Expand All @@ -12,15 +12,10 @@ full semver, because Chrome rejects pre-release suffixes such as `1.1.0-rc.1`.

## [Unreleased]

### Changed

- The extension name and store summary are the final listing copy:
`Website Blocker - Block Distracting Sites, Private & Simple`. The toolbar tooltip stays
plain `Website Blocker`.

## [1.0.0] — 2026-08-08

First release.
First release. Published to the Chrome Web Store as
`Website Blocker - Block Distracting Sites, Private & Simple`.

### Added

Expand Down
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,23 @@ switching blocking off — and keeps everything else frictionless.

## Install

Not yet on the Chrome Web Store. Take the zip from the
[latest release](https://github.com/devpeer-net/website-blocker/releases/latest) — or build
it yourself:
**[Website Blocker on the Chrome Web Store](https://chromewebstore.google.com/detail/website-blocker-block-dis/ilkclodiadkjmnclbkghbnbhnplnfhia)**

You do not have to take the store's word for what it is serving. Every release publishes a
content digest, and [`scripts/verify-install.mjs`](scripts/verify-install.mjs) checks the
installed extension against it — see [Releases](#releases).

Or run it unpacked, from the zip on the
[latest release](https://github.com/devpeer-net/website-blocker/releases/latest) or from
source:

```bash
pnpm install
pnpm build
```

Either way, open `chrome://extensions`, turn on **Developer mode**, choose **Load
unpacked**, and select the `dist/` folder (or the unzipped release).
Then open `chrome://extensions`, turn on **Developer mode**, choose **Load unpacked**, and
select the `dist/` folder (or the unzipped release).

Two settings are worth changing right after installing:

Expand Down
12 changes: 9 additions & 3 deletions legal/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,15 @@ as a single public object on S3:
https://website-blocker-extension.s3.us-east-1.amazonaws.com/privacy.html

`bucket-policy.json` is the policy applied to that bucket. It grants anonymous
`s3:GetObject` on exactly that one key — the bucket is not listable and no other object is
readable — and denies everything over plain HTTP, so the policy the listing cites cannot be
tampered with in transit.
`s3:GetObject` on exactly that one key; the bucket is not listable and no other object is
readable.

There is deliberately no deny-non-TLS rule. The usual reason for one is confidentiality or
integrity of something worth intercepting, and this is a public document whose entire
content is already world-readable. The URL given to the Web Store is `https://`, so that is
what anyone actually follows. Blocking plain HTTP would buy a defence against an attacker
who can already MITM the connection but only wants to reword a privacy policy — which is
not a threat worth a rule that can fail closed later.

aws s3api put-bucket-policy --bucket website-blocker-extension \
--policy file://legal/bucket-policy.json
Expand Down
15 changes: 0 additions & 15 deletions legal/bucket-policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,6 @@
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::website-blocker-extension/privacy.html"
},
{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::website-blocker-extension",
"arn:aws:s3:::website-blocker-extension/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
4 changes: 3 additions & 1 deletion scripts/verify-install.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,9 @@ function report(label, digest, count, extra = '') {
console.log(`${label.padEnd(10)} ${digest} (${count} files${extra})`)
}

if (import.meta.url === pathToFileURL(process.argv[1]).href) main()
// argv[1] is undefined under `node -e` and in some loaders, and pathToFileURL throws on
// undefined — which would crash package.mjs's import rather than skipping the CLI.
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) main()

function main() {
const options = {}
Expand Down
Loading