Senova · Context Wallet

Ask, don't take.

Every other site takes your data to personalize. A Senova site asks — and your device answers with the smallest possible answer. The rest never leaves.

The inversion

A site publishes a few declared questions with closed answer sets. Your browser holds your own context in a private wallet (IndexedDB, on this device). An on-device model reads your wallet and the question and computes the minimum sufficient answer: budget_tier = growth. Three words cross the boundary. The salary, the notes, the identity — never.

The answer channel IS the schema. Each question declares 2–6 values. The pipe can only carry one of them (or unknown). Minimal disclosure is structural, not a promise.
The model proposes; you dispose. Before anything is shared, a consent card shows the exact value that would leave — the literal string — and you can share it, change it, or decline.
Decline is invisible. "No wallet," "empty wallet," and "the user said no" are indistinguishable to the site. It can't punish declining because it can't detect it.
The default render is the real page. No JS, no wallet, no consent → the complete, normal page. Personalization is progressive enhancement.

What it proves

In M1, nothing touches any server — including Senova's. Personalization happens entirely in the page. The questions log on your device is a complete, readable answer to “what do websites want to know about me?” — the ledger nobody has ever had.

The open-devtools challenge

Open the demo, open DevTools → Network, and answer the questions. Watch the page rearrange. Then look at the network tab: zero POSTs, zero cookies set. The page personalized and nothing left your device. That tab is the whole pitch.

Open the live demo →