Page Assist 隐私政策深度解读:本地优先架构下的数据安全边界与浏览器权限机制
【免费下载链接】page-assistUse your locally running AI models to assist you in your web browsing项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist
Page Assist 是一款"本地优先"的浏览器 AI 助手扩展,通过本地运行的 Ollama、LM Studio 等模型为网页浏览提供 AI 能力。本文以仓库根目录 PRIVACY.md 为骨架,结合扩展清单配置与源码实现,逐项解读其隐私承诺、浏览器权限的真实用途、Page Share 功能的数据边界以及本地存储机制,帮助开发者与用户准确判断该扩展的数据流向与安全边界。
数据收集:零遥测的本地优先设计
根据 PRIVACY.md 中的 Data Collection 一节,Page Assist 的核心隐私承诺是:
Page Assist is committed to user privacy and does not collect any user data. All operations and data storage occur locally within your browser.
即:扩展不收集任何用户数据,所有操作与数据存储都发生在浏览器本地。这意味着不存在用户画像、行为分析或使用统计等后台数据上报机制——从隐私设计上看,它属于"本地处理 + 本地存储"的纯客户端架构。
这一承诺与项目定位一致:项目的核心能力(Ollama、OpenAI 等)均指向用户自行配置的模型服务端点,扩展本身只充当浏览器与模型之间的"桥"。
浏览器权限逐项解析:每项权限都有明确用途
扩展需要若干浏览器权限才能正常工作。这些权限在构建配置 wxt.config.ts 中按目标浏览器分别声明,Chrome(MV3)与 Firefox(MV2)权限集略有差异。逐项说明如下:
Chrome(Manifest V3)权限
const chromeMV3Permissions = [ "storage", // 本地存储:保存设置与聊天历史 "sidePanel", // 侧边栏 UI:在浏览器侧边栏中打开聊天界面 "activeTab", // 当前活动标签:读取当前页面、截图等 "scripting", // 脚本注入:聊天网页(chat-with-webpage)功能 "declarativeNetRequest", // 声明式网络请求:修改本地服务器请求头,规避 CORS "action", // 工具栏按钮:点击扩展图标打开 Web UI "unlimitedStorage", // 无限制本地存储:保存聊天历史 "contextMenus", // 右键菜单:在页面右键菜单中触发扩展操作 "tts", // 文本转语音:朗读 AI 回复 "notifications" // 系统通知:向用户推送完成/错误通知 ]Firefox(Manifest V2)权限
const firefoxMV2Permissions = [ "storage", "activeTab", "scripting", "unlimitedStorage", "contextMenus", "webRequest", // 拦截/修改网络请求 "webRequestBlocking", // 同步阻塞式请求处理,用于修改请求头 "notifications", "http://*/*", // 访问任意 HTTP 站点 "https://*/*", // 访问任意 HTTPS 站点 "file://*/*" // 访问本地文件 ]与 PRIVACY.md 的对应关系
PRIVACY.md 中列出的权限与 wxt.config.ts 中的声明一一对应:
- Notifications:用于提供系统通知,对应
notifications权限。 - Website Content Access:聊天网页功能需要读取当前页面内容,对应
activeTab与scripting权限,以及 Chrome 侧host_permissions中的http://*/*、https://*/*、file://*/*(见 wxt.config.ts)。 - Unlimited Storage:在浏览器本地保存聊天历史,对应
unlimitedStorage权限。 - Active Tab:确保扩展在当前标签页处于激活状态,并用于获取截图等操作,对应
activeTab。 - Scripting:为聊天网页功能注入脚本,对应
scripting。 - Web Requests:修改本地服务器的请求头以避免 CORS 问题——这是最关键的技术细节。由于本地模型服务(如 Ollama 的
localhost:11434)默认不携带Access-Control-Allow-Origin响应头,浏览器直连会触发 CORS 拦截,扩展通过declarativeNetRequest(Chrome)或webRequest/webRequestBlocking(Firefox)为本地请求改写请求头。注意:这些请求头修改仅作用于本地模型服务端点,而非用户访问的任意网站。
从源码结构看,与本地模型服务通信相关的请求头清理逻辑位于 src/utils/clean-headers.ts,可佐证网络请求处理的粒度。
Page Share 功能:显式触发的数据共享边界
PRIVACY.md 专门说明 Page Share(网页分享)功能的数据边界。Page Share 允许用户将聊天记录生成公开分享链接(类似 ChatGPT Share),其完整使用与自托管说明见仓库根目录 page-share.md。
隐私承诺的三层保障
PRIVACY.md 对 Page Share 的约定如下:
- 仅显式连接时才发生数据共享:默认情况下聊天记录只存在于本地,只有当用户主动点击分享、向分享服务器发起请求时,数据才会离开浏览器。
- 提供自托管选项:默认分享服务托管在 pageassist.xyz,但用户可以自建服务端(Railway 或 Docker 两种方式,详见 page-share.md),实现数据完全自控。
- 分享内容可永久删除:已生成的分享链接可随时从服务器删除,删除后服务器不保留任何数据。
源码中的实现印证
分享流程在 src/components/Common/ShareModal.tsx 中实现,关键调用链如下:
- 用户点击分享后,扩展从本地存储读取分享服务地址(
getPageShareUrl,定义于 src/services/ollama.ts),并组装聊天消息。 - 通过
POST {api_url}/api/v1/share/create将owner_id、格式化后的消息列表和标题发送到分享服务器(ShareModal.tsx)。 - 分享成功后,分享链接
{api_url}/share/{chat_id}会被复制到剪贴板,并调用saveWebshare把title、url、api_url、share_id保存到本地 IndexedDB(src/db/dexie/helpers.ts),供后续在"分享管理"页面查看和删除。
分享管理页面位于 src/components/Option/Share/index.tsx,其中:
- 用户可修改分享服务地址,开启"Webshare 模式"时,扩展会先通过
verifyPageShareURL对目标地址发起GET /api/v1/ping探测,确认服务可用后才保存(见 src/utils/verify-page-share.ts)。 - 删除操作通过
POST {api_url}/api/v1/share/delete携带share_id与owner_id通知服务端删除,成功后同步删除本地记录(index.tsx)。
由此可见,PRIVACY.md 中"可永久删除、删除后不留存"的承诺在实现上是有服务端与本地双层删除动作支撑的。同时也应理解:分享链接一旦生成并被他人访问,内容在传播层面便不再受用户控制,因此分享前应确认聊天内容适合公开。
数据存储:全部落在浏览器本地
PRIVACY.md 的 Data Storage 一节明确:
- 所有聊天历史与设置均存储于浏览器本地;
- 除非用户显式发起,数据不会被传输到外部服务器;
- 用户对自己的数据拥有完全控制权。
从仓库实现看,Page Assist 使用 Dexie(IndexedDB 封装)作为本地数据库。聊天历史、知识库、MCP 配置、向量索引等数据表定义位于 src/db/dexie/schema.ts,数据库入口在 src/db/index.ts。例如saveWebshare、getAllWebshares、deleteWebshare、getUserId等本地数据操作集中在 src/db/dexie/helpers.ts,而设置项则通过浏览器storage区域(src/services/action.ts 中可见new Storage({ area: "local" })的使用模式)持久化。
这意味着:卸载扩展、清除浏览器站点数据,或手动删除 IndexedDB 中的记录,即可彻底清空本地数据——用户可以完整掌控自己的数据生命周期。
第三方服务:零分析、零追踪
PRIVACY.md 明确声明:Page Assist 不集成任何第三方分析或追踪服务。从仓库结构看,项目也未引入诸如 Sentry、Google Analytics、Mixpanel 之类的埋点依赖(package.json 中的依赖均为功能实现所需)。唯一可能发生的"对外传输"场景,就是用户主动配置的外部模型 API(如 OpenAI)或显式发起的 Page Share 分享请求,而这些都在用户明确授权范围内。
隐私政策的更新与联系渠道
- 政策更新:PRIVACY.md 保留按需更新隐私政策的权利,若发生重大变更会通知用户。开发者与用户可关注仓库中该文件的变更记录。
- 联系方式:如对隐私有疑问,可在项目 GitHub 仓库提交 issue,或通过邮件
me@n4ze3m.com联系作者。
小结
Page Assist 的隐私模型可以概括为一句话:本地处理、本地存储、显式分享。它的浏览器权限虽然覆盖面较广(读取页面、修改请求头、无限制存储等),但每一项都能在 wxt.config.ts 与对应源码中找到明确的、服务于本地 AI 功能的用途;唯一涉及数据外发的 Page Share 功能也通过"默认关闭 + 显式触发 + 可自托管 + 可删除"四重机制把用户数据边界掌控权交还给了使用者。对于在意数据隐私、希望用本地模型完成网页 AI 辅助任务的用户而言,这是一个在透明度和可控性上设计得相当克制的方案。
【免费下载链接】page-assistUse your locally running AI models to assist you in your web browsing项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考