# DocAdenice Web Clipper Extension Browser extension (Chrome + Firefox, Manifest V3) that clips web pages into DocAdenice. ## Prerequisites - Node.js 20+ - pnpm 10.4.0 (`npx --yes pnpm@10.4.0`) - A running DocAdenice instance ## Install & dev build ```bash # From repo root npx --yes pnpm@10.4.0 install # Start extension dev mode (hot-reload via @crxjs/vite-plugin) npx --yes pnpm@10.4.0 --filter @docadenice/extension-clipper dev ``` The `dist/` folder is auto-created and refreshed. ## Load in Chrome (dev) 1. Open `chrome://extensions` 2. Enable "Developer mode" (top right) 3. Click "Load unpacked" -> select `apps/extension-clipper/dist/` ## Load in Firefox (dev) 1. Open `about:debugging#/runtime/this-firefox` 2. Click "Load Temporary Add-on" 3. Select `apps/extension-clipper/dist/manifest.json` ## Production zip for Chrome Web Store ```bash npx --yes pnpm@10.4.0 --filter @docadenice/extension-clipper build cd apps/extension-clipper/dist zip -r ../docadenice-clipper.zip . ``` Submit `docadenice-clipper.zip` in the Chrome Web Store dashboard. ## Generate a clipper token 1. Log into your DocAdenice workspace. 2. Go to **Settings > Clipper tokens**. 3. Click **Generate token**, set a label and expiry. 4. Copy the token — it is shown only once. 5. Open the extension popup -> **Settings** tab. 6. Fill in: - **DocAdenice URL**: e.g. `https://your-docadenice.example.com` - **Clipper token**: paste the token from step 4 - **Default workspace ID**: UUID of your workspace - **Default space ID**: UUID of the target space 7. Click **Save**. ## Usage - Click the extension icon on any page -> fill in title + optional parent page -> **Clip page**. - Right-click on a page or selection -> **Clip to DocAdenice**. ## Tests ```bash npx --yes pnpm@10.4.0 --filter @docadenice/extension-clipper test ``` ## Security design - HTML selections are sanitized by DOMPurify in the content script before leaving the page. - The server applies a second sanitization pass via the Tiptap pipeline. - Tokens are stored as bcrypt hashes in the database; the plaintext is returned only at creation time and is not persisted or written to application logs by the ClipperTokenService.