ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenDesign 隐私与遥测架构解析:本地优先、双层遥测与可审计的数据脱敏实现

OpenDesign 隐私与遥测架构解析:本地优先、双层遥测与可审计的数据脱敏实现 OpenDesign 隐私与遥测架构解析本地优先、双层遥测与可审计的数据脱敏实现【免费下载链接】open-design Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. ️ Local-first desktop app. ️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images video — real files, HTML/PDF/PPTX/MP4 export. Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode 20 CLIs via BYOK.项目地址: https://gitcode.com/gh_mirrors/opend/open-designOpenDesign 是一款本地优先local-first的开源设计工作台其桌面端与 Web 端围绕数据留在本机的原则构建了完整的隐私体系。本文以仓库根目录的 PRIVACY.md 为纲领结合apps/web/src/analytics、apps/daemon/src中的真实源码与路由实现系统讲解 OpenDesign 的两类遥测产品分析 vs 安全可靠性、收集范围与豁免清单、脱敏机制会话回放掩码、before_send清洗钩子、传输链路PostHog / Langfuse / 遥测中继、匿名 ID 生命周期、数据删除语义以及 BYOK 密钥的处理方式。读完本文你将能清晰回答OpenDesign 到底收集什么、为什么收、如何脱敏、如何关闭、如何删除并能在源码层面逐行验证每一个隐私承诺。一、设计总纲本地优先 两类遥测OpenDesign 的隐私模型建立在一个明确的产品事实上项目、生成文件与 BYOK API 密钥全部保存在用户本机。即使遥测服务完全不可达本地项目与文件工作流依旧可用只有依赖模型的服务才需要运行时或你所选择的服务提供商在线。这一承诺在 PRIVACY.md 中作为开篇声明也是理解整套遥测架构的前提——遥测只是锦上添花的质量信号而非产品运行的必需依赖。在此基础上OpenDesign 将遥测明确划分为两个类别类别默认状态可否关闭用途产品分析与质量追踪Product analytics quality traces默认开启可在Settings → Privacy关闭或收窄产品使用统计、运行质量评估安全与可靠性遥测Safety reliability telemetry在配置了遥测目标telemetry destination的构建中始终开启不可由通用分析开关关闭崩溃、启动失败、流中断等产品健康诊断两类遥测在源码中是物理分离的两条通道产品分析通道受用户同意开关控制telemetry.metrics/telemetry.content而安全可靠性通道在 apps/daemon/src/analytics.ts 中通过captureSafety接口刻意跳过同意检查——该文件的注释明确指出safety/reliability events … intentionally BYPASS the users analytics consent toggle. The product policy is: we always retain ground-truth stability data even for opted-out users并要求产品侧在Settings → Privacy的文案中如实说明这一例外。对于 Fork 与开发构建由于没有遥测目的地凭据如POSTHOG_KEY两类遥测都不会发送。这一点在源码中有双重保证daemon 侧 createAnalyticsService 在POSTHOG_KEY未设置时直接返回NOOP_SERVICE所有入口均为 no-opweb 侧 getAnalyticsClient 在/api/analytics/config返回enabled:false, key:null时返回null且不会加载posthog-js。二、产品分析默认开启首启横幅与双重开关产品使用遥测默认开启opt-out模式。首次运行时应用会展示隐私披露横幅在你执行任何其他操作之前明确告知收集范围并要求你在Share与Dont share之间做出选择。选择 Share 保持产品分析开启选择 Dont share 则关闭所有可选通道。此后你可以随时通过Settings → Privacy改变决定。在源码层面这一默认开启的语义落在 daemon 的应用配置中。查看 apps/daemon/src/app-config.ts 可以看到当保存的配置中完全没有telemetry字段全新安装、披露前状态时程序会填充默认值telemetry: { metrics: true, content: true }——即两个可选通道默认均为开启。daemon 的analytics.ts在每次捕获时还会防御性地二次核验这一配置if (appCfg.telemetry?.metrics ! true) return即使未来某个请求错误携带了分析头daemon 也会在捕获前丢弃事件apps/daemon/src/analytics.ts。Settings → Privacy中对应两个可选控制项Anonymous metrics匿名指标——运行次数、Token 用量、错误率、耗时以及产品交互事件、页面跳转、Web 性能与隐私掩码会话回放。Conversation and tool content对话与工具内容——用于质量评审的提示词、助手回复、工具输入/输出、prompt 栈上下文与附件/产物清单元数据内容会被截断并清洗已知携带产物内容的工具载荷会被替换为脱敏标记redaction markers。该通道要求指标与内容两个开关同时开启才会生效。这一双开关门控在 Langfuse 追踪模块中有明确实现查看 apps/daemon/src/langfuse-trace.ts其头注释写道 Privacy gates are layered:prefs.metricsis the master switch, andprefs.contentis required for Langfuse traces because this sink is used for turn-quality evals. If either is off, no network call is made.——即 Langfuse 作为质量评估 sink只有在两个开关同时打开时才会收到数据。前端的开关即时生效web 端 AnalyticsProvider 暴露setConsent(granted)App.tsx通过useEffect监听config.telemetry?.metrics用户切换开关后立即调用applyConsent无需等待下一次刷新。对应实现见 apps/web/src/analytics/client.ts关闭时调用posthog.opt_out_capturing()与posthog.reset()前者是全局闸门——不仅停止显式capture()还同时停止 autocapture、$pageview、$pageleave、$exception、web vitals 与 dead clicks后者清除 localStorage 中持久化的ph_*_posthog条目防止旧的distinct_id在后续操作中被重新拼接。三、收集什么匿名指标、会话内容与安全诊断3.1 匿名指标通道当可选共享开启时应用可能向 Open Design 团队发送匿名指标run 计数、token 用量、错误率、耗时产品交互事件、页面跳转、Web 性能数据以及隐私掩码的会话回放privacy-masked session replay。回放的掩码策略在 apps/web/src/analytics/client.ts 中由三层规则构成按覆盖面从大到小maskTextSelector: *——将所有文本节点掩码为星号提示词、生成产物文本、模型名、项目标题等任何未来新增的文本面都被自动覆盖maskAllInputs: true——掩码所有input/textarea的值提示词输入框与 BYOK 密钥字段都被抹空blockSelector: iframe——完全屏蔽所有内嵌 iframe产物预览的 FileViewer iframe 与插件内嵌渲染的 HTML 以惰性占位符呈现recordCrossOriginIframes: false作为额外保险。因此提示词、密钥、项目文本与生成的预览不会作为可读屏幕内容被记录。3.2 对话与工具内容通道该通道包含你的提示词、助手回复、工具输入、工具输出、prompt 栈上下文以及质量评审所需的附件/产物清单元数据。内容在发送前会截断与清洗单条输入上限INPUT_MAX_BYTES 64 * 1024输出上限同为 64KB工具输入/输出各8 * 1024字节单批硬上限HARD_BATCH_MAX_BYTES 1024 * 1024见 apps/daemon/src/langfuse-trace.ts已知携带产物内容的工具载荷会被替换为脱敏标记该通道同时要求 metrics 与 content 两个开关开启见上文 3.2 的双开关门控。3.3 独立于开关之外安全与可靠性遥测无论上述开关状态如何配置了遥测目标的构建仍可能发送有界、已清洗的诊断信息覆盖浏览器/daemon 异常、白屏、长任务、资源或 SSE 失败、卡死 run、生命周期失败以及 daemon 启动前就崩溃的打包应用。典型字段包括产品版本/渠道、OS/运行时事实、失败阶段、错误类型/消息/堆栈、耗时。安全通道的实现细节值得关注daemon 侧captureSafety在无installationId时使用合成匿名 IDdaemon-anon-时间戳-随机串见 apps/daemon/src/analytics.ts致命退出路径会先await captureSafety再调用shutdown()确保崩溃事件进入 posthog-node 本地缓冲后才 flush同一文件 apps/daemon/src/analytics.ts。路由侧/api/observability/event端点请求体限制 64kb直接调用captureSafety用于浏览器/daemon 异常上报apps/daemon/src/routes/telemetry.ts。致命处理器installFatalTelemetryHandlers监听uncaughtException/unhandledRejection在 1 秒超时内尽力 flush 后退出apps/daemon/src/routes/telemetry.ts。清洗保证主目录路径、URL 查询字符串、输入文本等已知敏感字段在发送前被清除。$exception事件中的绝对文件系统路径会被重写为app://前缀的相对路径如/Applications/Open Design.app/Contents/Resources/...→app://apps/web/src/foo.tsx实现见 apps/web/src/analytics/scrub.ts。安全上报是 best-effort 的永远不会阻塞核心工作流或失败进程的退出。四、绝不收集什么不可逾越的底线PRIVACY.md 明确列出四类绝对不收集的数据每一类都能在源码中找到对应的工程保障生成产物文件的内容——会话回放的blockSelector: iframe阻止了产物预览 iframe 的 DOM 被序列化Langfuse 追踪中已知携带产物内容的工具载荷会被替换为脱敏标记。BYOK API 密钥、认证 Token 与其他存储凭据——密钥仅存储在本地并被本地 app/daemon 使用见 apps/daemon/src/analytics.ts 对应章节不作为遥测字段发送scrub.ts对input/textarea的$el_text、attr__value、attr__placeholder、attr__aria_label一律清除apps/web/src/analytics/scrub.ts。隐私掩码会话回放中的可读提示词、项目或产物文本——maskTextSelector: *将每个文本节点掩码为星号。内容开关关闭时的对话/工具内容——双开关门控保证任何单一通道都无法单独触发内容上报。关于 IP 地址需要特别澄清遥测事件载荷有意不包含源 IP 字段自由文本内容的清洗规则也会移除 IP 地址模式但作为任何 HTTPS 请求接收方网络服务天然能看到连接来源 IP配置的 PostHog 服务可能将其用于国家/地区等地理信息增强。PRIVACY.md 明确指出不要将anonymous理解为传输层无法观察到 IP 地址。五、传输链路PostHog、Langfuse 与遥测中继产品事件、掩码回放与安全/可靠性事件通过配置的PostHogingestion 端点发送浏览器安全事件可能直接走 PostHog 的公开 ingestion API确保常规分析客户端加载之前发生的错误不丢失。当 metrics 与 content 共享同时开启时详细的 run 质量追踪通过 OpenDesign 遥测中继telemetry relay发送到Langfuse维护者的 smoke-test 配置也可直接使用 Langfuse 凭据。公开的客户端/中继配置不会暴露团队的私有写入凭据。源码中的传输细节默认 hostdaemon 侧DEFAULT_HOST https://us.i.posthog.comPOSTHOG_HOST可覆盖apps/daemon/src/analytics.tsLangfuse 默认https://us.cloud.langfuse.comapps/daemon/src/langfuse-trace.ts。环境变量门控POSTHOG_KEY可选POSTHOG_HOST、OPEN_DESIGN_TELEMETRY_RELAY_URL、LANGFUSE_PUBLIC_KEY/LANGFUSE_SECRET_KEY。任一缺失即整体降级为 no-op——这是Fork 与开发构建不发遥测的工程根基。双端身份统一web 端通过x-od-analytics-*HTTP 头device_id、session_id、client_type、locale、request_id等把身份传递给 daemondaemon 用同一device_id作为 PostHogdistinct_id使双端事件落在同一 person 记录上apps/daemon/src/analytics.ts。去重键web 与 daemon 对同一事件使用相同的$insert_id服务端据此合并重复计数apps/web/src/analytics/client.ts。最佳努力原则所有传输都是 best-effort分析服务不可用不会把遥测失败变成产品失败——web 端所有 capture 入口都是 fire-and-forget 且吞掉异常daemon 端client.on?.(error, () undefined)抑制库内部错误噪音。六、匿名 ID随机、不透明、可旋转对可选分析应用生成一个随机、不透明的安装 IDinstallationId用于聚合相关事件它不由你的姓名或邮箱派生。安全/可靠性路径在可用时使用匿名安装/设备标识早期启动失败时可能使用合成的进程/命名空间标识daemon-anon-*。实现要点daemon 首次需要时会生成 UUID 并写入 app-configapps/daemon/src/routes/telemetry.tsinstallationId字段定义见 apps/daemon/src/app-config.ts/api/analytics/config仅在用户同意后返回installationIdapps/daemon/src/routes/telemetry.tsweb 端将installationId作为 PostHogbootstrap.distinctID优先于本地生成的 UUIDapps/web/src/analytics/client.ts这样 daemon 端捕获与 web 端捕获落到同一 person 记录切换开关会执行reset()清空旧身份applyIdentity在 ID 轮换时先reset()再identify()新 ID确保新会话与已删除的旧身份完全解耦apps/web/src/analytics/client.ts。七、删除你的数据旋转、停用与保留策略Settings → Privacy → Delete my data执行三项操作轮换本地匿名 ID——daemon 重新生成installationIdweb 端applyIdentity将 PostHog 身份切换到新 ID禁用可选 metrics/content 通道——等价于关闭两个开关不影响不关闭安全/可靠性例外通道、不召回已收到的事件、不同步抹除处理方的历史记录。已接收的遥测数据按适用保留策略自然老化age out。语义上的精确边界值得强调删除操作是去关联de-identification 停止采集而非服务端即时擦除。这与业界对本地匿名 ID 无法远程撤回的普遍认知一致。八、BYOK密钥留在本机你为编码 Agent 与模型提供商配置的 API 密钥存储在本机由本地 app/daemon 调用所选提供商时使用。它们不是遥测字段也绝不会发送给 Open Design 团队。工程保障来自两方面其一密钥仅存在于本地配置与 daemon 进程中遥测载荷的字段清单如 MCP 分析属性白名单 apps/daemon/src/routes/telemetry.ts中不存在任何密钥字段其二即使密钥曾出现在 DOM 中如输入框scrub.ts与maskAllInputs也会在事件与回放中将其抹除。九、OpenDesign AMR第一方产品族内的共享OpenDesign AMR 是 OpenDesign 官方的第一方模型服务。由于两者属于同一团队运营的同一产品族为提供、连接与改进组合体验双方可能按需共享信息——例如识别你来自 Open Design、帮助你完成初始设置、保持产品协同工作。这种共享发生在自有产品之间而非与无关第三方涉及的数据仍遵循本文所述的各项控制。在客户端代码中可看到对应的联合键AMR 登录后的user_id作为唯一跨项目连接键注册到 PostHogapps/web/src/analytics/client.ts退出登录时注销该参数避免事件携带过期账户 ID。十、文档与实现同步变更如何自行审计PRIVACY.md 声明该文档跟踪已发布应用的数据处理行为遥测行为变化时页面同步更新。这也意味着仓库本身就是一份可审计的隐私实现清单建议的验证路径同意门控apps/daemon/src/app-config.tstelemetry.metrics/telemetry.content默认值与持久化→ apps/daemon/src/analytics.ts捕获前二次核验、captureSafety例外→ apps/web/src/analytics/provider.tsxsetConsent/setIdentity即时生效。脱敏单点apps/web/src/analytics/scrub.tsbefore_send单一审查点元素链清洗、URL 清洗、堆栈路径重写与 apps/web/src/analytics/client.ts会话回放三层掩码。传输与门控apps/daemon/src/langfuse-trace.tsLangfuse 批次构建、字节上限、双开关门控与 apps/daemon/src/routes/telemetry.ts/api/analytics/config、/api/observability/event、致命处理器、MCP 分析属性白名单校验。通过对照 PRIVACY.md 与上述文件你可以独立验证每一个隐私声明在实现层面的落点——这正是本地优先、可审计的遥测设计对开发者最直接的价值。结语OpenDesign 的隐私体系可以概括为三个关键词本地优先数据默认留在本机遥测仅作质量信号、双层分离可关闭的产品分析 vs 不可关闭但严格脱敏的安全诊断、可审计的实现单一清洗审查点、双开关门控、环境变量门控与匿名 ID 旋转机制全部暴露在开源仓库中。对使用者而言掌握Settings → Privacy中的两个开关、首启横幅的 Share/Dont share 选择与 Delete my data 的语义边界即可完整控制自己的数据流向对开发者而言这条从配置、路由到捕获的调用链本身就是一份高质量的隐私工程参考实现。【免费下载链接】open-design Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. ️ Local-first desktop app. ️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images video — real files, HTML/PDF/PPTX/MP4 export. Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode 20 CLIs via BYOK.项目地址: https://gitcode.com/gh_mirrors/opend/open-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表