Privacy-preserving housing applications with David
Our grantee, David, built a Noir library to prove the French 2D-Doc format, then used it for an app that proves your income bracket and French citizenship without disclosing more information about you.

Applying for housing in France often means providing sensitive personal information, such as your full income or ID details.
Our grantee, David, thought there had to be a better way. So he built zkTenant.
🚀 Tired of oversharing personal data just to rent an apartment?
— teddav (@0xteddav) April 9, 2025
Meet zkTenant, a @NoirLang -powered app that lets you prove your income & French citizenship without revealing sensitive info.https://t.co/FEkCsjTNAD
🧵
The zkTenant app
On the zkTenant app, you scan your French ID and yearly tax certificate to prove your identity and that you earn enough money to rent a given apartment.
In their podcast together, previous grantee Rute told Alex that your prospective landlord shouldn’t need to know how much you spend for bills when you provide your current address. We believe that in the same way, your prospective landlord might need proof that you earn enough to live in their apartment but doesn’t need to know exactly how much money you earn. This information should be yours and yours only.
Based on these conversations, David set out to build proofs of French ID and income that would preserve privacy, using Noir and the 2D-Doc signatures found on French official documents.
2D-Doc is a signature scheme used by the French government and various companies for documents like invoices, tax returns, identification papers, insurance documents, and so on. This is exactly the kind of use case we love and why digital signatures matter so much!
David’s zkTenant app works like this:
- Enter your personal information: first name, last name, year of tax return and taxable revenue
- Scan your French ID card 2D-Doc barcode to prove identity information in-browser
- Scan your tax returns 2D-Doc barcode to prove income information in-browser
- Generate proof that you can rent this apartment!
- Once the proof is generated, you can send it to the landlord for verification. In zkTenant, this last step is simulated so you can verify the proof yourself.

The tdd.nr Noir library
For all this to work, the first step was to build a library that verified 2D-Doc signatures in the browser without relying on a server that you’d need to trust.
This is harder than it sounds, as our other grantee Vlad found out when benchmarking in-browser p256 ECDSA proving systems! Client-side proofs are very hard to generate as they often use more RAM than WASM allows; fortunately, Vlad found that it could be done with Noir.
Thanks to Vlad’s benchmark, choosing Noir was a no-brainer. This library extracts information from any 2D-Doc barcode for easy Noir proving, and you can use it for any French-signed administrative document:
The proofs were massive, though, and nearly impossible to generate on an everyday device. Fortunately, David found a way to fragment them into smaller proofs using recursion.

He leveraged that experience to build a public tutorial that you can use if you also want to optimize proving times:
Just released a repo showing how to recursively verify a proof in @NoirLang ! The docs were missing some details, so I broke it down clearly and made it work with UltraHonk.
— teddav (@0xteddav) March 26, 2025
I hope it helps! ❤️https://t.co/jCMzWvNtWV
Leveraging Hylé for zkTenant
Proof composability
Proof composability on Hylé means that you don’t need to verify both documents recursively. You can send your identity 2D-Doc and your income 2D-Doc signature in the same blob transaction, and we’ll know the same person sent both.
This is especially useful if you want to change the logic of your contracts. For example, if you want to prove your passport instead of your ID tomorrow, you can rewrite it without touching any other component of the application.
Privacy
Want the privacy of ZK and the trustlessness of blockchain? You’re in the right place.
With Hylé, you scan your 2D-Doc and generate a Noir proof in-browser without ever sending the original document to a server. The signed document becomes a private input, and only the hashed verified data goes onchain.
Possible next steps
There is so much that still needs to be done with zkTenant! You can start by adding more sources of information, such as payslips rather than tax returns or passports instead of IDs.
This second suggestion is important: currently, only people with French ID cards issued post-2021 can scan their 2D-Doc. Adding passport support would make this much more inclusive, allowing anyone to prove their identity and benefit from the privacy they deserve rather than needing to be French and to have recently renewed their ID.
If we wanted to make this app prod-ready, we’d also have one next step: the French government uses about a hundred different keys for signing documents. To keep the circuit lean, we’ve chosen the most popular 25%, but this can lead to random fails. Therefore, for a proper consumer app, we should write four circuits that fall back on each other. It’s not a huge effort; we just figured it wasn’t worth it for this grant project; feel free to add it yourselves to the repo!
Finally, you could start making more nationally signed documents compatible with zkTenant. For instance, you could take ATCUD-signed tax returns for a Portuguese version of the application, and so on!
Want to build unchained applications and explore what ZK can do with us? Check out our grants program and reach out if you have any questions!