個人 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