个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A pseudonymization library for AI tools
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Let your AI tools talk about people without ever naming them.
Each person becomes a stable alias like A-7K3F9Q, and only you can turn it back into a name, on your own machine.
📖 Documentation · 📖 Documentación en español
pseudonym is a pseudonymization library for programs that send data about people to a language model, such as an MCP server reading a course's submissions. Your program passes each person through it and sends A-7K3F9Q instead of "Ana Pérez"; free text loses its known names, emails, cards, IBANs and national ids on the way. The alias is an HMAC under a key that never leaves the machine, and a local encrypted directory lets the person in charge ask pseudonym whois A-7K3F9Q whenever they need to.
pseudonym whois answers offline, and nobody without the key can reverse them.You need Node.js 20 or later and an ES module project.
npm install @falkenslab/pseudonym # in your program
npm install --global @falkenslab/pseudonym # the pseudonym command, for the people who run it
import { remember, resolve, redact } from "@falkenslab/pseudonym";
const service = "[email protected]";
// Before a result reaches the model: people become aliases (one call for a whole list).
const aliases = await remember(users.map((user) => ({
service,
identifiers: { institutionalId: user.idnumber, email: user.email, serviceUserId: String(user.id) },
displayName: user.fullname,
}))); // ["A-7K3F9Q", ...]
// A write tool gets an alias back from the model.
const userId = await resolve("A-7K3F9Q", { service }); // keep it on your side
The key is created on first use, in %APPDATA%\pseudonym\ or ~/.config/pseudonym/. Back it up once with pseudonym key export.
🔌 In an MCP server, everyone in a tool's result goes through remember(), and the model reads:
[{ "student": "A-9NQWD5", "grades": { "practice1": 8.5 } }, { "student": "A-TA8D1J", "grades": { "practice1": 6 } }]
✍️ Free text keeps its meaning and loses who wrote it:
await redact("Soy Marta Quiroga, mi móvil es 612 345 678 y mi SSN 123-45-6789.", { service, countries: ["ES", "US"] });
// "Soy A-9NQWD5, mi móvil es [PHONE_1] y mi SSN [US_SSN_1]."
👩🏫 In the person's terminal, without writing code:
pseudonym whois A-9NQWD5 # who an alias is
pseudonym redact < post.txt # a text safe to paste into a chat
pseudonym reveal < answer.txt # the model's answer, with the names back
pseudonym remember --csv class.csv --only-aliases # a class export, as aliases
A complete MCP server that does all of this over a made-up course is in examples/classroom-mcp.
| Area | For example |
|---|---|
| 🧷 Aliases | remember() for one person or a list, per service or linked across services, first alias kept |
| 🔙 The way back | resolve() for write tools, pseudonym whois, reveal and resolve for the person |
| ✍️ Redaction | redact() with names from the directory, cards, IBANs and ids of ES, US, CA, DE, MX, CL, AR, BR and PT |
| 🗂️ The directory | AES-256-GCM by default, or plain JSON without a key where the OS protects the folder; safe across processes, link, forget, prune, migrate |
| 🔑 The key | Created on first use, key export, key import, key fingerprint, refuses to work if it goes missing |
| 💻 The CLI | Everything above without code, CSV in and out, --json for scripts |
The API reference and the command reference list it all.
npm install, then npm run typecheck && npm run lint && npm test; npm run docs:start previews the documentation site. The design decisions are in .minispec/, and each planned change has a note there and an issue here.
Made with 💖 by Falken's Lab Team