Fujimod
Try your camera firmware in the browser and build Fujimod SD boot files.
Search trains, explore routes and stops, and book Indian Railways tickets.
Translation pending
LifestyleTypeScript · JavaScriptGitHub @SpeshulOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Improved IRCTC-style train booking site (college final project)
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Final-year college project. Search Indian Railways trains, explore every route and stop on a map, and book tickets up to checkout.
Requires Node.js 22.13+ (uses the built-in node:sqlite, no native modules or cloud database).
npm install
npm run dev
Open http://localhost:3000. On first run predev downloads the open dataset and builds data/rail.db (about 2 seconds).
Demo login: demo / demo1234 (seeded automatically, with two saved passengers).
Rebuild the train database (stop the dev server first on Windows, since it locks the file):
npm run data
/plan): "Weekend in Goa from Pune for 2, under ₹4000, leave Friday evening" becomes
ready-to-book itineraries there and back, labelled best price / fastest / most likely confirmed. Vague wishes work too
("somewhere in the hills from Delhi for 3 days"): the AI suggests destinations, and only those with real trains are shown.
The AI (Gemini, hedged with Groq) only reads the request. Trains, fares and availability come from the timetable and booking engine,
and the dates are calculated in code. A return trip books as one checkout ("Going" / "Coming back"). The voice assistant can launch it
("Pune se Goa weekend trip plan karo")./explore): every place one direct train reaches from your station, on a map coloured by journey
time, filterable by hours, fare per person, station size and overnight trains, with a "Surprise me" button and a full
table for screen readers. Built entirely from the timetable (src/lib/explore.ts).src/lib/sun.ts, standard solar formulas).
It says which side to sit on for shade, when sunrise or sunset happens and on which side, and draws a left/right timeline./wallet), like IRCTC's eWallet: a ₹2,000 welcome credit, top-ups through Razorpay (test
mode), one-tap payment for held seats, and instant refunds to the wallet when a wallet-paid ticket is cancelled.
Every change is written to a ledger in the same transaction as the balance, so the history always adds up.Targets WCAG 2.2 AA; every main page passes an automated axe-core audit with zero violations, including with all display settings switched on.
<html lang="hi">.
The voice assistant defaults to Hindi speech when the site is in Hindi./accessibility.src/i18n/en.ts holds every English string; src/i18n/hi.ts is typed against it, so a missing Hindi string fails
the build. Strings use {name} placeholders, and plurals use key.one / key.other.lang cookie stores the choice (src/app/actions/locale.ts). Server components call getT(), client
components call useT().hi-IN when the site is in Hindi.success@razorpay (or failure@razorpay) or card 4100 2800 0000 1007.CNF/B3/34/LB), RAC or
waitlist number. Berths keep groups together, honour preferences and give seniors a lower berth. Each train
gets a 10-digit PNR./verify/<PNR>, which says
whether the ticket is genuine and still valid. PNR status page (/pnr) for anyone with the PNR.MAKE_WEBHOOK_URL: every issued ticket is POSTed there as JSON, so a Make.com scenario can email it.Keys (in .env.local): RAZORPAY_KEY_ID (must be rzp_test_...) and RAZORPAY_KEY_SECRET.
Tap the orange mic button (bottom right, every page) and speak in English, Hindi or Hinglish:
It can search, choose trains and fill passenger details. It can never pay; that is always the user's click.
How it works: browser speech recognition (Chrome/Edge, en-IN or hi-IN) turns speech into text. A language model
turns the text into a structured intent (src/lib/voice/llm.ts). The site resolves that against its own data, such as
station names to codes or "cheapest" to a train (src/lib/voice/resolve.ts). The page then performs one of a fixed set
of actions (src/components/voice/). Providers: Google Gemini first, Groq as backup, and an offline rule parser
(src/lib/voice/rules.ts) if neither is available, so voice keeps working with no keys or no quota.
Setup: put your keys in .env.local in the project folder (template included, never committed), then restart:
GEMINI_API_KEY=... # free at https://aistudio.google.com
GROQ_API_KEY=... # optional backup + speech-to-text for Firefox/Safari, free at https://console.groq.com
rail.db (timetable, read-only) is rebuilt from the datameet data during npm run build and shipped with every
route (outputFileTracingIncludes in next.config.ts).TURSO_DATABASE_URL and TURSO_AUTH_TOKEN are
set; without them it falls back to a local data/app.db file. Tables and the demo account are created on first use.bom1, vercel.json), next to the Turso database, so each query takes a few milliseconds.loadSales), then works out every
train and class in memory.GEMINI_API_KEY, GROQ_API_KEY, RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET,
TURSO_DATABASE_URL, TURSO_AUTH_TOKEN, APP_URL (the site's https address, used in ticket QR codes).scripts/build-data.mjs raw JSON -> data/rail.db (stations, trains, stops)
src/lib/db.ts SQLite connections: rail.db (read-only reference) + app.db (users, sessions, bookings)
src/lib/rail.ts station/train search, route segments, nearby stations, connecting journeys
src/lib/fare.ts fare engine (client-safe, also used for live totals in the form)
src/lib/availability.ts simulated seat inventory + confirmation probability
src/lib/booking.ts validation rules, seat holds, booking records
src/lib/search.ts search service shared by pages and the JSON API
src/app/api/* JSON endpoints: stations, trains, search, availability
src/i18n/* English/Hindi dictionaries and translation helpers
src/lib/planner.ts AI trip planner: request parsing (lib/ai.ts) + itinerary search
src/lib/explore.ts direct-train reachability from a station
src/lib/sun.ts sun position and which-side-gets-the-sun analysis
Every page's state lives in the URL (/search?from=NDLS&to=HWH&date=...), and search is exposed as a JSON API. The Phase 2 voice assistant will drive the site through these.
| Real (datameet/railways, CC0) | Derived / simulated |
|---|---|
| 5,184 trains, numbers, names, types | Running days (source has none; daily for most, from name hints like "Weekly") |
| 8,990 stations with GPS coordinates | Per-stop distance (great-circle, scaled to official train distance) |
| 415k stop records with timings | Untimed stops interpolated from distance |
| Train classes | Fares (modelled on IR's fare structure) and seat availability (deterministic per train/date/class) |
About 2% of trains (91, mostly Durontos) have no halts marked in the source data (every row has arrival = departure). Their stops are inferred from how often other trains halt at each station; checked against trains that do mark halts, this matches real halts about 75% of the time. These train pages say the stop list is estimated.
The source data dates from around 2016, so some newer trains (e.g. Vande Bharat) and renumberings are missing.