How this was built
Every claim below is one this prototype can be held to.
Is the ballot actually fair?
the entrant who was fastest
what a fair draw looks like
always the two fastest entries
Entering first is worth 0.17 of a place out of 53, which is inside a ±0.30 margin. Entry order against draw order correlates at −0.003.
What is real and what is this app's own
- Timetables, fares, rakes, PNRIndian Railways' own feed
- Seat availability, leg by legIndian Railways' own feed
- Live running positionIndian Railways' own feed
- Booking, ballot, Tatkal racethis app's proposal, never a real ticket
This is a proposal for IRCTC, not a rival to it
IRCTC runs the reservation system for the largest railway network in the world, and it does the part that is genuinely hard: issuing real tickets against real inventory, every minute of every day. Nothing here replaces that, competes for it, or claims to do it better.
This addresses one gap: when a train comes back sold out, the traveller is told no and left to work out the rest themselves. Often the answer exists anyway, on another train or in a berth free over part of the route and sold again for the rest. Finding it needs a per-leg view of inventory, which is a layer that sits on top of a booking system rather than inside it.
The problem was sourced, not assumed
Every feature traces to a cited pain point: payment failures with no explanation, CAPTCHA and manual forms losing the Tatkal race to bots, an unexplained waitlist, cluttered UI, opaque refunds, and per-leg vacancy that no interface surfaces. Pulled from Reddit, app-store reviews, news coverage and independent UX teardowns.
Six things were wrong and got corrected6
- Chart preparation timing. A guessed “4 hours before departure”, corrected to the real 10 hours.
- TDR refunds. An invented “~50% deduction” corrected to “full refund, 60–90 days slower”, which is itself still wrong for Tatkal. See below.
- Cancellation refunds, the biggest one. General quota’s time tiers (72h/24h/8h) were being applied to every booking. Real Tatkal is harsher: a confirmed or RAC Tatkal ticket gets no refund at all on voluntary cancellation, whenever you cancel. Only a still-fully-waitlisted PNR is refunded. Since this prototype is Tatkal-scoped, that was the wrong rule for every cancellation it handled.
- The advance booking window. Stated as 120 days, true until 31 Oct 2024; Indian Railways cut it to 60 days from 1 Nov 2024 to curb hoarding, since around 21% of 61-to-120-day-out bookings were being cancelled.
- The waitlisted-PNR refund. Described as a true zero-deduction refund. It is auto-cancelled and refunded minus the same flat clerkage charge (about ₹60, or ₹60 + GST for AC) any cancelled e-ticket incurs.
- GST in the fare breakdown. The 5% on AC classes was computed on just the reservation and superfast charges, understating it roughly twentyfold.
Contrast is measured, not eyeballed4.62:1 worst pass
Designed toward GIGW 3.0 / WCAG 2.1 Level AA, the standard mandated for Indian government digital services under the Rights of Persons with Disabilities Act, 2016. Independent passes in a real browser walked every element that renders its own text across 11 page states, light and dark, at the correct threshold for each element’s size and weight.
Four rounds found real failures every time: eighteen fixes, including an entire top navigation that dropped to 2.3:1 while hovered, which no static sweep could have caught because it only existed under the cursor.
Two boundaries, since this is the honesty page: this is criterion 1.4.3 specifically, not a full Level AA audit; and a few conditional surfaces were verified by checking their colour pairs rather than by rendering them in place, which proves the pair is safe, not that the component renders it on the background assumed.
The ballot is a proposal, and its fairness claim is measured
Making the citizen faster helps, but a race is structurally unwinnable against a script. The token ballot removes the race instead of trying to win it. It takes the counter token system Indian Railways adopts from 1 August 2026 and models it for the online channel, where the automated agents actually are.
The draw uses real commit-reveal cryptography and your own browser can re-derive it, so “this was fair” is checkable rather than asserted. One part is honestly simulated: the server seed is derived from the window id rather than being a real secret, because this prototype has no shared datastore. A real deployment would take it from a public randomness beacon or a VRF. The verification chain is real; the secrecy of the seed is the mocked part.
The figures above are pooled across four widely separated sets of windows, and measured by driving the ballot engine itself. An earlier version reproduced the engine by hand, drifted out of step with its random stream, and published numbers wrong in the reassuring direction.
What the live feed can and cannot answer
Availability, timetables, rakes, fares, live position and PNR all come from Indian Railways’ own feed. The leg-by-leg check asks it about each stretch of a train separately, which is what turns “sold out” into “sold out between these two stations, and open between those two”.
What no public feed carries, IRCTC’s included, is berth-level occupancy: which particular berth is free. This app used to draw that anyway, from a seeded random number generator, behind a “modelled” label. It no longer does: that chart was deleted rather than relabelled.
The booking flow, the token ballot and the Tatkal race remain this app’s own, and always will, because nothing outside IRCTC can issue a real ticket.