← Back to home@ciceroyang

dsh-privacy-guard

DeepSeek Harness 发送前隐私检查:在你把手机号、身份证号、银行卡号或 API 密钥发给模型之前提醒你,并支持一键打码。

Stars
0
Language
JavaScript
Created
Sep 17, 2026
Updated
Sep 17, 2026

Introduction

dsh-privacy-guard

A send-time privacy reminder for DeepSeek Harness: before you hand a phone number, an ID number, a card number or an API key to a model, a strip appears under the composer and offers to mask it.

Built for people who are not security professionals. It does not lecture, it does not block the send, and it stays completely silent until the text actually matches something.

What it catches

ruleseveritynote
private-keyhigha PEM private-key header
api-keyhighsk-, ghp_/gho_/ghu_/ghs_/ghr_, github_pat_, AKIA, AIza, xox?
id-cardhigh18-digit ID number, checksum verified
bank-cardhigh13-19 digits with optional spaces or dashes, Luhn verified
phone-cnmediummainland mobile number
emaillowemail address
ipv4lowdotted-quad IP address

The two checksum-verified rules exist because their shapes are common in innocent data. A 16-digit order number that looks like a card, or a long numeric id that looks like an ID number, does not fire.

Install

Requires Node.js 20 or newer and a DeepSeek Harness web profile.

dsh plugin --profile web add github:ciceroyang/dsh-privacy-guard#v0.1.1

One command installs the package and mounts it: the manifest declares dsh.bundle, so the profile adds the package to its loader tree, and the browser half is served from exports["./client"].

From a local checkout instead, mount it by hand:

ln -sfn "$PWD/dsh-privacy-guard" ~/.dsh/profiles/web/node_modules/dsh-privacy-guard
# then in ~/.dsh/profiles/web/cordis.patch.yml
- insert:
    - id: privacy-guard
      name: dsh-privacy-guard

The web profile reloads the patch live; refresh the page afterwards.

No build step: the browser bundle is committed and served as-is.

What it does not do

  • It does not send anything anywhere. The scan runs in your browser, on the draft text, with no network call and no storage write. Uninstalling the plugin removes every trace of it.
  • It does not block the send. You stay in charge: mask it, or press send anyway.
  • It is not a guarantee. Pattern matching finds the shapes it knows. A secret it has never seen the shape of will pass. Treat it as a second pair of eyes, not as a data-loss-prevention system.

Notes

  • Masked samples only ever show a two-character prefix and a two-character suffix. The middle never reaches the screen, the logs or the DOM.
  • "Ignore" silences the strip for the current draft only; editing the draft brings it back.
  • Rules live in lib/patterns.js as plain data. Adding one is a data change plus a test.

Test

node build.mjs && node --test

CI also rebuilds the bundle and fails if the committed lib/client.js differs from its sources.

Licence

MIT. Maintained by @ciceroyang.