diff --git a/THIRD-PARTY-NOTICES.txt b/THIRD-PARTY-NOTICES.txt
index 357754f5..46fe340b 100644
--- a/THIRD-PARTY-NOTICES.txt
+++ b/THIRD-PARTY-NOTICES.txt
@@ -303,3 +303,21 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+-------------------------------------------
+
+@mozilla/readability
+
+Copyright (c) 2010 Arc90 Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/docs/client-side-migration.md b/docs/client-side-migration.md
new file mode 100644
index 00000000..daa08e2e
--- /dev/null
+++ b/docs/client-side-migration.md
@@ -0,0 +1,254 @@
+# WebClipper Client-Side Migration
+
+## Overview
+
+This document tracks the experiment to remove server-side dependencies from the OneNote Web Clipper's content processing pipeline and replace them with client-side alternatives. The goal is a fully self-contained browser extension that does not rely on the OneNote augmentation/screenshot server APIs.
+
+## Server APIs Removed
+
+### 1. Augmentation API
+- **Endpoint:** `onenote.com/onaugmentation/clipperextract/v1.0/`
+- **Purpose:** Server-side article/recipe/product extraction using ML models
+- **Replacement:** Mozilla Readability (`@mozilla/readability`, Apache 2.0 license)
+- **Status:** Complete
+
+### 2. Full Page Screenshot API (DomEnhancer)
+- **Endpoint:** `onenote.com/onaugmentation/clipperDomEnhancer/v1.0/`
+- **Purpose:** Server-side Puppeteer rendering of page DOM into full-page screenshots
+- **Replacement:** Client-side renderer window with scroll-capture and canvas stitching
+- **Status:** Functional, with known issues (see below)
+
+---
+
+## Change 1: Article Extraction with Readability.js
+
+### What Changed
+- `augmentationHelper.ts` — Rewrote `augmentPage()` to use `new Readability(doc).parse()` locally instead of POSTing to the server API
+- Removed `makeAugmentationRequest()` method entirely
+- Removed imports: `HttpWithRetries`, `OneNoteApiUtils`, `Settings`, `Constants` (URL refs)
+- Added metadata mapping: Readability's `title`, `excerpt`, `byline`, `siteName`, `publishedTime` are stored in `PageMetadata`
+
+### Why Readability.js
+- Apache 2.0 license (compatible with WebClipper's MIT license; repo already has Apache 2.0 deps like pdfjs-dist)
+- Well-maintained by Mozilla, used in Firefox Reader View
+- Produces clean article HTML similar to what the server API returned
+
+### Other Related Changes
+- `clipper.tsx` — Removed `UrlUtils.onWhitelistedDomain()` check that gated augmentation mode; FullPage is now the default clip mode
+- `constants.ts` — Removed `augmentationApiUrl` constant
+- `readability.d.ts` (new) — TypeScript type declarations for `@mozilla/readability`
+- `package.json` — Added `@mozilla/readability` dependency
+- `augmentationHelper_tests.ts` — Updated tests for new local implementation
+
+---
+
+## Change 2: Full Page Screenshot with Renderer Window
+
+### Architecture
+
+The server-side approach used Puppeteer to render sanitized HTML and produce a full-page screenshot. The client-side replacement mirrors this:
+
+1. **Store HTML in `chrome.storage.session`** — The page's HTML content, base URL, and localized status text are written to session storage (avoids JSON serialization bottleneck with large payloads)
+2. **Open a renderer popup window** — An extension page (`renderer.html`) is opened at the same position/size as the user's browser with `focused: true`. Width is capped at 1280px. Zoom is forced to 100% via `chrome.tabs.setZoom`. Title bar shows localized "Clipping Page" status text
+3. **Port-based communication** — The renderer page connects to the service worker via `chrome.runtime.connect({ name: "renderer" })`. Commands (loadContent, scroll) are exchanged over this port
+4. **Renderer loads content** — Reads HTML from `chrome.storage.session`, strips `
+
+