Inspiration

Anyone who has phoned a university admin office knows the drill. Press one, press three, fourteen minutes of hold music, a transfer, explain it all again, and then the line drops so you start over. At NUST in Windhoek the same handful of questions come in every day, most with one line answers already sitting in the student's own record. Proof of registration for a bank. Can I still drop this subject. Why are my results withheld. We wanted to fix the waiting rather than make the queue shorter.

What it does

A callback first front door for university admin offices. Students leave a question in fifteen seconds and hang up. An AI agent calls them back and resolves it, or routes it to the right person with the full context attached.

Behind that, the query is captured once and travels with the case into the call, the structured result, and any escalation, so nobody explains anything twice. Cases live in a database rather than a queue, so an unanswered call retries on its own and the student never loses their place. And a caller who is not the student, or who wants something that needs a signature, never reaches a call at all.

How I built it

FastAPI and Postgres on the backend, React on the front, deployed across Netlify, Render and Neon. A reasoning agent reads the question against the student record and a curated set of the university's own documents, decides what to look up, searches more than once if the first pass misses, and then either writes a grounded briefing or concludes the case needs a human. CALL-E takes it from there: it plans the call, dials, holds the conversation, adapts to whatever the student actually says, and returns a structured result we act on.

The division of labour matters. CALL-E does the talking. Ringback does the thinking, and it has to finish thinking before the phone rings, because there is no way to intervene mid call.

Challenges I ran into

CALL-E only dials out, which meant the original idea of an AI answering the switchboard was impossible. Inverting it into a callback turned the constraint into the product.

Getting the agent to say NUST instead of "Noost" took several attempts. The text to speech engine was reading it with Germanic phonetics, probably because of the surrounding Namibian place names, and the fix was respelling it phonetically as Nahst.

The hardest problem was stopping the agent from inventing plausible answers. Asked about study permits, it once produced confident specifics about ministries and approval letters from a document that mentioned immigration in a single sentence. Thin coverage read as coverage. Fixing that meant judging whether retrieved material actually answers the question, not just whether something came back.

Accomplishments that I'm proud of

When a caller asked where to park on campus, something the system knows nothing about, it said so plainly instead of guessing. On a phone call that matters more than it sounds, because nobody can scroll back and check what they were told.

When someone rang claiming to be a student's father and asked for her fee balance and her results, Ringback never placed the call. It routed the case to a named person with the reason attached and disclosed nothing. Knowing when not to call turned out to be the most interesting part of the build.

What I learned

A confidently wrong answer read aloud is far worse than a wrong answer on a screen. There is no citation, no scrollback, and the person acts on what they heard. That single fact shaped almost every decision, from refusing to read a full statement over the phone, to treating "I do not have that, the right office will follow up" as a success rather than a failure.

We also learned that the interesting engineering in a voice product is not the voice. It is everything that has to be decided before the phone rings.

What's next for Ringback

A USSD short code so students on feature phones with no data can open a case by dialling a short number, which matters a lot outside the capital. Connectors to real student record systems behind the interface we already built for it.

And the one we most want to build: an escalation loop where Ringback calls the office on the student's behalf, gets the answer, then calls the student back with it. The system does the transfer instead of the person.

Built With

Share this project:

Updates