Inspiration Getting a driving licence in Ireland means going through four separate websites (theorytest.ie, ndls.ie, rsa.ie and drivingtest.ie) and a long wait for the practical test. In August 2023 the national estimated wait for a car test invite reached 30.4 weeks, and Co. Cork peaked at 37 weeks. The RSA publishes this data openly, but it sits in CSO tables that learners never see. We wanted one place that tells a learner what to do next and how long they're likely to wait, using real numbers rather than forum guesses.
What it does My Driving Journey (PassRate Éire) guides a learner through the three stages of an Irish driving licence. It adapts to their county, preferred test centre, transmission and current stage.
Stage 1, theory test: booking links, official study material, rules-of-the-road flashcards, and a directory of approved driving instructors (ADIs) filtered by county and test centre. Stage 2, learner permit and EDT: a tracker for the 12 Essential Driver Training (EDT) lessons step-by-step guides to the test manoeuvres technical checks how RSA testers grade faults Stage 3, practical test: the learner's county wait against the national average 3- and 6-month wait forecasts with a likely range activity at their test centre historical trends and pass rates by age group test-route guides for the Wilton centre in Cork A chatbot on every page: it answers questions like "how long is the wait in Cork?" from the same data as the dashboard, so its numbers always match. It stays on Irish driving test topics, says it isn't official RSA advice, and points to rsa.ie for anything legal or official. It can run on Claude or fully offline on a local Ollama model. Guest mode: everything works without an account. Signing up saves the profile and chat history, and the guest profile carries across automatically. How we built it Started from a Streamlit prototype, then rebuilt it as a full web app while keeping the original running. Backend: FastAPI. It imports our existing pandas data loader directly, so the API and the original app read the same cleaned data from four RSA/CSO tables: ROA37: county waiting times ROA32: test centre activity ROA05: national annual trends ROA07: pass rates by age Frontend: Next.js (App Router) with TypeScript, Tailwind, shadcn/ui and Recharts. It's designed for phones first. Accounts: SQLAlchemy on SQLite, bcrypt-hashed passwords, and logins held in an httpOnly cookie. Forecasting: we wrote a damped-trend exponential smoothing model (Holt's method), fitted per county with an 80% likely range. Chatbot: Answers stream to the browser as they're written. With Claude, the model calls 8 data-lookup tools that use the same functions as the dashboard. With a local Ollama model, each question also carries a snapshot of the relevant figures, so even models that can't call tools answer from real data. Daily message limits are stored in the database. Challenges we ran into Messy source data: the CSO CSVs come with byte-order marks, blank unpublished cells and inconsistent headers. The 74 MB centre-activity file took about 20 seconds to parse, so we cache the cleaned tables. Small local models and tools: a 1B model sometimes printed a tool's definition instead of calling it, and llama3 can't call tools at all. Putting a data snapshot in the prompt solved this. A database lock: saving each chat reply as it streamed ran into a SQLite lock, which delayed saved replies. We release the request's database connection before streaming starts and run SQLite in WAL mode. Rate limiting behind a proxy: client IPs arrive through a proxy header, which a guest could fake to reset their limit. We had to decide which proxy to trust. Keeping two apps consistent: we made the new dashboard's numbers match the original Streamlit app exactly, and we test that. Accomplishments that we're proud of The dashboard and the chatbot give the same numbers as the original app, checked automatically against the raw CSVs. The chatbot works completely offline on a laptop, with no API key. It works well on a phone, and an automated accessibility scan finds no serious issues in light or dark mode. The full guest-to-account journey works end to end, with no data lost along the way. 51 backend tests, plus end-to-end browser checks. What we learned Grounding matters more than model size: an 8B local model given the right numbers answered more accurately than a smaller model left to call tools on its own. Forecasts need humility. Irish test waits swing a lot, so the honest answer is a range: for Cork in six months, roughly 3 to 21 weeks around a central estimate of 12.2. Open government data is valuable but rarely usable as it comes; most of the work is cleaning it and making it understandable. What's next for My Driving Journey Fresh data: pull new figures straight from the CSO's PxStat API instead of downloaded CSVs. National coverage: extend the ADI directory and test-route guides beyond Cork and the Wilton centre. Alerts: tell learners when the wait in their county drops. Irish-language version. Deployment: host it on Postgres behind a proper reverse proxy. PassRate Éire is not affiliated with the Road Safety Authority.
Built With
- anthropic-api
- bcrypt
- claude
- fastapi
- jwt
- llama3
- next.js
- numpy
- ollama
- pandas
- plotly
- pytest
- python
- radix-ui
- react
- shadcn/ui
- sqlalchemy
- sqlite
- streamlit
- swr
- tailwind-css
- typescript
- uvicorn