diff --git a/CHANGELOG.md b/CHANGELOG.md index f980fd9..e433327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,25 @@ through a browser store and has not been submitted. No surface is stable. ## [Unreleased] +### Removed + +- **Annotations, entirely.** The daemon's `annot` module, the `/_control/annotations` routes, + the extension's content script, and the two npm dependencies it pulled in. souta's call, and + the right one: a site that wants notes should have notes built into it, and this product's + job is to let you see that site working. + What it bought is a property rather than a saving. **The daemon has no write path to a + remote** — not "writes are restricted", absent. The SFTP requests it can issue are `OPEN`, + `CLOSE`, `READ`, `OPENDIR`, `READDIR` and `REALPATH`, and the only open flag it defines is + `FXF_READ`; `RemoteFs` has no `append` or `mkdirs` to call. + The extension lost its only content script with it, so it no longer runs in, reads from, or + modifies the sites it opens, and it dropped the `scripting` permission and the + `http://*/*` optional host permission. It now asks for `proxy`, `storage` and + `http://127.0.0.1/*` and nothing else. The bundle went from ~152 KB to ~14 KB, of which the + 138 KB content script was parsed on every page load. + Also gone with it: `--author` and `[server] author`, which existed only to name a log; + `Entry.owner` and the `longname` owner parse, which existed only to check one; and + `SECURITY.md`'s two sections about what was written and who a log belonged to. + ### Fixed - The extension was never attached to a release automatically. `release-assets.yml` diff --git a/PRIVACY.md b/PRIVACY.md index 3c0d372..e972c41 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -20,19 +20,13 @@ In `chrome.storage.local`, which is local to your browser profile: | aliases | the alias names the daemon reported, e.g. `docs`, `cluster` | The control token is the piece worth singling out. It lives in the extension's service worker -and is never handed to a content script, because a page served from an alias origin is code -from the remote host and the extension treats it as untrusted. That is why annotating asks the -worker to act rather than acting inside the page. +and nothing else ever holds it, because a page served from an alias origin is code from the +remote host and the extension treats it as untrusted. ## What it reads -On a page under your configured suffix, and on no other page: - -- **the page's URL**, which is how the extension knows which document a note belongs to -- **the page's text**, when it places a note — anchoring means finding the quoted words again, - which cannot be done without reading them - -Both stay in the browser except as described next. +Nothing on any page. The extension has no content script: it does not run in, read from, or +modify the sites it helps you open. What loads is the site, unchanged. ## Where anything goes @@ -40,9 +34,9 @@ To `http://127.0.0.1:`, and nowhere else. That is your own daemon, on machine. It passes what it is given to the SSH host you configured, over your own SSH connection, as the account you already had. -A note you write is therefore stored on your host, in a file beside the document, under your -own name. Nobody else receives it and nobody else can, because there is no intermediary to -receive it. +Nothing is written to your host. The daemon has no write path: the SFTP requests it can issue +are `OPEN`, `CLOSE`, `READ`, `OPENDIR`, `READDIR` and `REALPATH`, and the only open flag it +defines is read. You can check rather than take this on trust: `extension/src/background.ts` contains exactly one `fetch`, in `callDaemon`, and its URL begins `http://127.0.0.1:`. @@ -60,20 +54,14 @@ one `fetch`, in `callDaemon`, and its URL begins `http://127.0.0.1:`. it. Without it you would configure the browser's proxy by hand instead. - **`storage`** — remembers the four things above, so you do not retype a 64-character token on every page. -- **`scripting`** — registers the annotation script at runtime, for your configured suffix - only. At runtime precisely so the extension need not declare a match pattern covering every - site: the suffix is yours to choose, and anything declared in advance would have to be broad - enough for any choice you might make. -- **`http://127.0.0.1/*`** — talking to your daemon. -- **`http://*/*`, optional, requested when you click Connect** — the narrowest pattern that - can be *declared* ahead of time, because your suffix is not known until you connect. What is - actually *requested* is `http://*./*`, and that is what the browser asks you to - approve. Declining leaves reading working and annotation off. +- **`http://127.0.0.1/*`** — talking to your daemon. It is the only host the extension is + allowed to reach, and there is no optional permission to grant later: it never asks to run + on the sites you open. ## Removing it -Uninstalling deletes everything in the table above with it. Notes already written are files on -your own host and stay there; delete them as you would any other file. +Uninstalling deletes everything in the table above with it. Nothing of yours is left behind +anywhere else, because nothing of yours was written anywhere else. ## Questions diff --git a/README.md b/README.md index b554856..3be33ab 100644 --- a/README.md +++ b/README.md @@ -261,17 +261,14 @@ cached, so a seek does not pull the whole file and does not evict the page bodie make revisits free. `If-Range` is never honoured, because the only validator on offer is weak and the whole representation is the specified answer to that. -Annotations are per-author append-only logs beside the document, so two people annotating -one page write to different files and neither can lose the other's work. They are reachable -from the control API directly, - -``` -curl -H "x-ssh-browser-token: $TOKEN" -X POST --data '{"doc":"docs/index.html","op":"add","body":"a note"}' http://127.0.0.1:7391/_control/annotations -``` - -and the extension draws them. Highlights use the CSS Custom Highlight API and the panel is a -closed shadow root, so the document is never modified — no wrapper elements, no `