Disclosure
What's real here, and what's made up
This is a concept prototype, so a good deal of it is theatre. Below is the itemised version — what genuinely works, what data is invented, and which real systems we deliberately never touch. We would rather you found this page than found the seams yourself.
The single most important line on this page: the citizen-facing browser prototype makes no network requests of any kind. Not to the Income Tax Department, not to UIDAI, not to a bank, and not to us. Everything in that UI is computed in your own browser from invented data compiled into the page. An additive local Spring Boot service and load harness exist for owned engineering evidence; the UI does not call them, and they do not contact official systems.
01What actually works
Not simulated — this is real code doing the real thing, and it would behave the same way against live data.
- Works
The core citizen flow in English, हिन्दी and தமிழ்
The filing path, its facts, status messages, and the main dashboard surfaces use the typed dictionary rather than a translated veneer over an English skeleton. A missing Hindi or Tamil key fails the build; the separate engineering disclosures remain English by declared design. Your choice survives a reload.
- Works
Indian number formatting
Lakh and crore grouping via the platform's own Intl support with en-IN, hi-IN and ta-IN locales, forced to Latin digits. ₹4,20,000 groups correctly in all three languages — we did not hand-roll this.
- Works
The refund state machine
An actual state machine with named holds. Clearing a hold advances the state through legal transitions only; you cannot reach 'credited' with an unresolved bank failure. This is the part of the product we most want judged.
- Works
Provenance on every figure
Each income fact carries its reporting entity, that entity's registered identifier, and the date it was filed. The data behind it is invented; the modelling of it is not, and it is the structure the real portal is missing.
- Works
Your progress surviving a closed tab
Journey state is mirrored into your browser's local storage under wapsi_active_id, wapsi_active_data and wapsi_lang. Close the tab, come back, and you are where you left off. The reviewer console can clear it.
- Works
Dictation, where the browser has it
The microphone on the dispute and reply fields uses the browser's own speech recognition, in Indian English, Hindi or Tamil to match your chosen language, with text appearing as you speak. Where the browser has no recognition — Firefox for Android, Opera Mini, roughly one browser in eight — it falls back to a worked example and says on screen that what you are seeing is an example rather than your voice. Worth knowing: Chrome's implementation sends audio to a remote service, so this is a no-API-key choice, not an offline one.
- Works
A reproducible demo
Sandbox identities come from a seeded generator, so the same seed produces the same person, figures, and bank details — a reviewer's identity screenshot can match ours. Mock dictation text and browser event IDs are intentionally interaction-local, not evidence of a live service.
- Works
Reduced-motion and keyboard support
prefers-reduced-motion: reduce collapses every animation. Focus is visibly outlined throughout.
02What is invented
All of it, and by construction rather than by accident. Nothing here was scraped, copied, or derived from a real person's records.
- Invented
Every PAN begins DEMP
The fourth character of a real PAN encodes the holder's type, so DEMP cannot occur naturally. The custom sandbox generator is constrained to the same prefix, which means an auto-generated identity can never collide with a real person's PAN.
- Invented
Bank routing codes
Format-valid IFSC strings that correspond to no real branch — KAVC0001183, GOMT0000714, GODG0004417, DECU0834471. Bank names are real institutions because the scenario needs to be recognisable; no account number, real or masked, belongs to anyone.
- Invented
The three people
Sunita Devi, Rakesh Kumar and Priya Sharma do not exist. Their employers, brokers, salaries, notices and grievances are written to embody documented failure modes — a mis-tagged intraday trade, a set-off against a demand never served, a stale routing code after a bank merger.
- Invented
Verification codes and reference numbers
The one-time code is printed on screen because there is nothing to send it to. Document reference numbers are invented but correctly shaped, because the fact that a letter without one is officially void is a real and under-known protection.
- Invented
No Aadhaar number appears anywhere
Not a real one, not a fake one, not a masked one. Mobile numbers use a reserved-looking 90000 000NN pattern. No payment details and no health data.
03Systems we never touch
Each of these is a real dependency the live portal has. We model the shape of the interaction and the ways it fails. We do not call any of them, and could not.
- Never contacted
UIDAI — identity verification
Real e-verification uses an Aadhaar one-time code or a bank-issued electronic verification code. We show the flow, the waiting state, and the crucial fix: the session is held open while a code is outstanding instead of expiring underneath you.
- Never contacted
TRACES and the reporting chain
The annual information statement, the taxpayer information summary and the tax-credit statement are where prefilled figures actually come from. Ours are compiled into the page.
- Never contacted
NPCI — bank account validation
Whether an account can receive a refund is a live check against the banking network. We simulate both outcomes, including the one the real portal handles worst: a branch absorbed by a merger, leaving a routing code that validates but cannot be paid.
- Never contacted
Notice issuance and the reference registry
Letters are modelled, not fetched. Nothing we display was issued by anyone.
04Not built
Things we planned, said we would do, or that a reviewer might reasonably expect. Listing them costs us something, which is rather the point of the page.
- Not built
Voice anywhere except the two free-text fields
Dictation works on the dispute reason and the notice reply. It does not fill in an amount, navigate a screen, or complete a return end to end by voice — which is what a citizen who cannot read the form would actually need, and is the largest single gap between this prototype and the product it argues for.
- Not built
Any language model
Notice explanations and draft replies are deterministic templates written by hand, not generated. The code puts them behind a single interface so a model could be dropped in without touching a screen, but today there is no model, no key and no inference.
- Not built
A connected production server, database, or account
The citizen UI is deliberately browser-only: its demo return state lives in per-browser storage, so reviewers cannot watch one another's refund advance. An additive local Spring Boot service and load harness now live under backend/ and loadtest/ for exact-money, asynchronous submission, idempotency, and owned-load evidence. They are not connected to this Next.js UI, do not persist production data, and do not contact official systems.
- Not built
Real filing, in any sense
Nothing is submitted anywhere. Sending a return in this prototype writes a value to your own browser.
05What making it real would take
Not a rewrite. The gap is access and assurance, not architecture — which is the argument the next page makes in detail.
- Never contacted
A canonical store of income facts, with provenance as a first-class field
The department already holds every figure it asks citizens to retype. What is missing is one authoritative record per fact carrying who reported it, under which identifier, when, and which correction supersedes it. Almost everything this prototype does well follows from that one structure.
- Never contacted
Authorised intermediary status
Identity verification, account validation and return submission are all gated. This is a permissions and audit problem, not an engineering one.
- Never contacted
Consent, retention and audit obligations
Handling real records means a lawful basis for processing under the Digital Personal Data Protection Act, defined retention, and an audit trail per access. None of that is modelled here, because we hold no one's data.
If you find something on this page that turns out to be wrong, that is a bug of the worst kind and we would want to know. An honest account of a prototype is worth more than a flattering one.