About this demo

What is real, what is simulated.

This is a hackathon prototype. It is not a government service, it is not connected to any government portal, and nothing filed here reaches a public authority. What follows is the whole of it, including the parts that do not work yet.

All of it, on one screen

How it is actually built

AI workshopopenssession cookieper route checkredacted contextspoken, redactedno strong matchauthority + §6(1)authority lookupdraft readyverified addressservedreply · fee · transfermutationsstrong match → published replysame filing pipelinerequestEvents · clockEventsreply analysis§19(1) → §19(3)append eventsappendEventreview and explicit confirmation/requests/[ref]schema + fallbackcitizen reviewsfiles the appealin process renderprint and postmailed_physicallyposting_failed → retryidentity omitted/report aggregatesCitizenGuided · Classic · Spokenthree ways to askNext.js 16 · React 19Server Components: readsroute handlers: mutationsAuthopaque cookieusers + sessionsPII gateserver side redactionbefore models, before filingDohraavcontext awarearchive matchingDrishtiauthority routingand follow up questionsLekhak§6(1) draftcitizen editableSamvaadspoken interviewer, into the same filing pipelineModel APIschema validated outputdeterministic fallbackRouting directorycurated authoritiesand address bookFile requestPOST /api/requestsvalidate + idempotency keyPublic Information OfficerPOST /api/officerreply · fee · transfer · noticeEvent sourced corerequestEvents → projectState()clockEvents → computeClock()hydrate(): state + dueAt on readdeemed refusal and publicationare derived, never storedVishleshreply analysis§19(1) first appealdraft with groundsvishlesh_19_3§19(3) second appealto the InformationCommissionCitizen decides and filesno appeal is filed automaticallyNeon PostgresDrizzle · serverless HTTPrequestEvents · clockEventsrtiRequests · replies · appealsagentInvocations (audit)authorities · directorySignalsPDFin process renderand downloadPingenoptional print and posttriggered in after()Public authorityreceives the physical filingNotificationsappendEvent writes bothstate and inboxRequest workspace/requests/[ref]reply · timeline · deadlinethe citizen's working viewAnonymous / publicunauthenticatedthrough Server ComponentsPublic archive/report · live request andreply aggregatespolicy controlled publicationPostal lane invariantEntered only when no online channel exists and the fee is settled.Accepted → mailed_physically. Failure → posting_failed, retry or PDF fallback.Acceptance is not delivery: the clock follows the filing, not the courier.Model invariantsEvery model backed capability has a deterministic fallback.agentInvocations records model or fallback provenance per call.No draft is ever filed without explicit citizen confirmation.

Guided filing12 hops. It plays itself, or take it over by clicking any box.

Guided filing

Nothing on the map is aspirational. Every box names a route, a table or an agent that exists in this build, and the dashed boxes are the two rules the code holds to rather than hopes for: a deterministic fallback behind every model backed step, and a postal handoff that is never allowed to move the statutory clock.

Complete architectureOpen full size
The complete AskAdhikar architecture: a citizen and the web app on the left, the four assistants of the AI workshop across the top, the event sourced core and Neon Postgres through the middle, the public information officer and the postal lane to the right, and the public archive along the bottom.

What's actually running

Real

The clock, and the record it reads

A request's state and its deadlines are not stored, they are folded from an event log on every read by a pure function that touches no database and no network. Nothing writes a due date directly, so every one of them can be checked against the Act rather than believed.

The database

A real, persistent Postgres database, not an in-memory simulation that resets on reload. Signing up creates a real account; filing writes a real row that's still there tomorrow.

Deemed refusal

Section 7(2) is a transition in the state machine, not a notification somebody has to remember to send. It fires on its own the moment the deadline is checked.

The Act

Every section reference on this site is real, and cited where it is relied on: 5(2), 6(3), 7(1) to 7(6), 11, 19(1), 19(3), 19(6), 20(1).

The model, honestly labelled

Routing, drafting and reply analysis are each attempted through a language model first. If a call fails for any reason, that agent falls back to deterministic logic instead of guessing, and the interface always discloses which one actually answered.

Dohraav, before anything else runs

The archive is shortlisted for requests that look close, then the model reads the shortlist and says which of them is actually the same question, however differently it was worded. A confident match stops the pipeline and points to the existing answer instead of drafting a duplicate.

Vishlesh, reading a reply

Once a reply exists, it's read against the original question and the exemptions actually cited, and rated on how strong an appeal would be. It never states a refusal is unlawful, only how the grounds look, and why.

The officer side

Real reply dispatch (no refusal without a cited clause), section 7(3) fee demands, section 6(3) transfers, and section 11 third-party notices, all writing to the same live requests a citizen sees.

The physical lane

For an authority with no working online channel, a real, correctly formatted PDF of the request generates on demand. Posting it is wired to a real courier adapter, honestly labelled unconfigured. It will never report a fabricated “sent”.

Notifications

Every state change on a request, whether a reply, a fee demand or a deadline reached, writes a real, in-app notification. Filing also emails the applicant a copy of their own application, with the signed PDF attached and the postal outcome stated. With no email provider configured it records that nothing was sent rather than reporting a receipt that was not. Mobile push is still disclosed as not built.

What isn't there yet

Simulated, or not built

Every person and every request

All accounts and requests on this instance are created for demonstration. Any resemblance to a real applicant is accidental.

Payment

No money moves. The fee is displayed because getting it wrong can have an application rejected, but nothing is ever charged.

The directory behind the numbers

The authority and department directory behind every routing decision was assembled by hand, and is a fraction of what exists. An officer can confirm a listing and a citizen can flag one, but most entries are still unverified by anyone. The fees are thinner still: 1 of 36 come from an official rule, and the rest are what aggregators claim, or ₹10 because nothing better was found.

Automated tests

None ported to this rebuild yet. Correctness currently rests on the clock module being copied unmodified from a tested build, plus manual verification against the live database.