Career OS is a career counsellor that Indian students in Class 10–12 can talk to: a voice agent interviews them, books a real session on their Google Calendar and writes a report from the transcript. I built it alone over eight days in June 2026, and it is live at careeros.abhashchakraborty.tech.
What it is
A student signs in with Google and has a ten-minute voice conversation about what they are preparing for, what they want to study and what worries them. Those answers become a counselling case. From there they can chat about it, book a 60-minute voice session with the AI counsellor, and get a report with colleges, exams and an action plan.
Why it mattered
The facts a Class 12 student needs are spread across exam bodies like NTA and JoSAA, rankings like NIRF, and regulators like UGC and AISHE. A human counsellor who has read all of it is expensive. A chatbot that guesses a cut-off is worse than nothing, because the student will plan around the wrong number. So the counsellor had to answer only from data it could trace to an official source, and say so when it had none.
What I built
Everything in the repo is mine: the Next.js app, the Convex backend, the Python voice worker, the ingestion pipeline and the Docker setup.
- commits, all mine
- 46
- agent tools
- 10
- Convex tables
- 20
- web tests passing
- 53
The voice agent is a LiveKit Agents worker in Python: Silero VAD, Deepgram for speech to text, an OpenAI model with ten function tools, and Cartesia for the voice, with OpenAI's voice as a fallback. It knows the student's case, the last report and the recent conversation.
The backend is Convex with Better Auth for Google sign-in. Every query the browser can call takes the user from the auth token, never from an id the browser sends, and every case, session, transcript and report checks ownership.
The knowledge pipeline fetches only allowlisted official sites, keeps the raw pages as snapshots, validates them, and refuses to publish a release until I approve a review file by hand. The agent's tools can only read published records.

What was hard
Keeping a talking model on topic. Students will ask a voice agent anything, and some will try "ignore your instructions". I didn't want the model to decide that. Every turn first goes through fixed patterns for prompt injection, role changes and off-topic requests, and a match gets a refusal sentence written in code, before the language model sees it. The cost is the odd false positive, where a normal sentence trips a pattern. I accepted that: a polite refusal is cheap, and a counsellor that can be talked out of its rules is not.
An onboarding the model can't fake. Models like to finish tasks. If the agent could pass in the final answers itself, it could invent a missing one to wrap up. So each answer is saved through a validated tool call as the student gives it, and the tool that completes onboarding takes no arguments. The backend re-reads the saved answers and refuses unless all eight are real: blanks, "skip" and impossible gap years are rejected.
Bookings that survive a "no". The first version handed scheduling to Cal.com. I replaced it with my own booking on the Google Calendar API, which meant handling permissions myself. Calendar access is asked for only at the first booking, and the reservation is written to Convex before the calendar call. If the student denies access, or revokes it later, the session stays booked and an ICS file is offered instead.



Where it is now
Career OS is live, and its health check answers. Everything past the landing page needs a Google account, so the screens above use a made-up student. Every push to main runs lint, type checks, 53 Vitest tests and a Python security suite, then publishes images for the web app, the agent and the ingestion job to GitHub's container registry. I don't have usage numbers to share yet.
