Inspiration
A student survey looks harmless. But a school, an age, and one rare answer can point to a single real student. Researchers need this data. Students deserve to stay hidden. Most cleaning tools ask you to upload the file to their cloud first, so to protect the data, you have to give it away. We thought that was backwards. We wanted a tool that cleans the file on your own computer, where it never leaves.
What it does
PrivacyForge finds and hides personal data in your files. You upload a file. It shows you everything it found: names, student IDs, emails, phone numbers, and the quiet clues that together point to one person. You choose how to hide each kind:
- Tokenize: swap an ID for a safe stand-in that stays the same across the file, so the data still links up.
- Redact: remove names and emails completely.
- Generalize: turn an exact age into a range, like 20–24.
Then it checks its own work. If anything personal is still there, the export is blocked. You only get a file once it passes.
Everything runs on your machine. No cloud. No account. Your data never leaves.
How we built it
We wrote the plan before the code. In Kiro we wrote the requirements, the design, and a task list first, then built in small steps and tested each one.
- Backend: Python and FastAPI. It reads the file, runs five layers of detection, and locks the real values in an encrypted vault (AES-GCM).
- Safety gate: a check step that must pass before any export.
- Frontend: Next.js, TypeScript, and Tailwind. Seven pages walk you from upload to a clean file.
- Tests: 49 automated tests to keep every fix honest.
Kiro's memory held our decisions across sessions, so we never lost track of why we built something a certain way.
Challenges we ran into
Speed. Our real test file has 20,731 rows. Cleaning it took 446 seconds, over seven minutes. We measured and found the cause: the vault saved the whole file to disk on every single change. We changed it to save once at the end.
$$\frac{446\ \text{s}}{0.82\ \text{s}} \approx 544\times \text{ faster}$$
It now changes 66,749 values in under one second.
Lost projects. A restart wiped every project, and the app got stuck on one that no longer existed. We now save projects to disk, and the app checks that a project is real before showing it.
A hidden-space bug. Our start script slipped invisible spaces into the vault key, so the vault could not be opened. It took a while to see, because you can't see a space.
Accomplishments that we're proud of
- It never leaves your computer. Privacy by design, not by promise.
- 100% precision, zero false alarms in our benchmark. It doesn't hide things that aren't personal.
- 87.5% recall with just the built-in layers. We say so honestly, and the optional language layer closes the gap.
- A safety gate that refuses to export an unsafe file.
- 544× faster on a real 20,000-row dataset.
What we learned
- Plan first. Writing specs before code kept us from building the wrong thing.
- Measure, don't guess. The speed fix was obvious once we saw where the time really went.
- Privacy is layers. A name is easy to spot. The quiet clues are what really expose a person, and they take the most care.
- Be honest about limits. A privacy tool you can't trust is worse than none, so we report what we miss.
What's next for PrivacyForge
- More file types: Excel, JSON, and plain text.
- Turn on the language layer by default to catch the names we miss today.
- A plain-language report that shows what was hidden and why.
- A one-click installer, so anyone can run it without the command line.
Built With
- claude
- gpt
- kiro
- next.js
- python
- typescript
Log in or sign up for Devpost to join the conversation.