About Nexora
Most learning platforms recommend courses using purchase history or basic keyword similarity. We wanted to solve a harder, more meaningful problem:
What if a platform could understand what a learner is genuinely trying to learn — before they ever type it into a search box?
That idea inspired Nexora, an explainable AI learning marketplace that turns real learner behavior into personalized guidance. Instead of static recommendations, Nexora watches meaningful signals — searches, course clicks, time spent, saved courses, and cart activity — and uses them to infer each learner's evolving interests.
How we built it
At the core of Nexora is a seven-node LangGraph agent:
activity_analyzer— turns raw events into a behavioral digestinterest_extractor— extracts interest signals with confidence + evidenceretrieval_node— hybrid dense (Mesh embeddings via Qdrant) + BM25 keyword search, fused with Reciprocal Rank Fusionrelevance_grader— an LLM judge scores and re-ranks candidatesretrieval_refiner— loops back to broaden the search if results are thinpersuasion_writer— writes a grounded, evidence-based recommendation narrativerecommendation_storer— persists the result and invalidates caches
Every recommendation is transparent: the "Why this recommendation?" panel shows the actual interest signals, confidence scores, and evidence behind each suggestion — nothing is hidden behind a black box.
We built the stack on FastAPI, Jinja2, PostgreSQL, Qdrant, and Redis, with every LLM call and embedding routed through a single MeshAPI gateway. Zerops hosts the live, production-style deployment, bringing the frontend, backend, database, cache, and vector search together as one working, accessible application rather than a collection of disconnected demos.
What we learned
We learned that making an AI system feel trustworthy is a harder problem than making it feel smart. A recommendation can sound confident while being poorly grounded — so we prioritized traceable evidence, visible reasoning, and honest failure states over polish alone. We also learned that resilience has to be designed in from the start: every agent node needs a deterministic fallback, because a recommendation engine that goes down when one dependency fails isn't actually usable.
Challenges we faced
- Keeping SQL and vector data in sync. Every product mutation needed a dual-write to PostgreSQL and Qdrant, including deletes and deactivations, so a removed course could never resurface in recommendations.
- Avoiding wasted or duplicate agent runs. We designed a trigger policy (first-time users, event thresholds, staleness rules) plus Redis-based locks so the graph runs only when it's actually useful.
- Graceful degradation. Mesh, Qdrant, or Redis being unreachable had to degrade recommendation quality, never availability — so every node ships with a deterministic heuristic fallback.
- Making reasoning legible, not just logged. Turning internal agent state into something a learner can actually read and trust took real UI iteration, not just backend logic.
Nexora isn't just a course catalog — it's a learning agent that watches, understands, explains, and helps every learner find their next best step.
Built With
- alembic
- bm25
- css
- docker
- fastapi
- javascript
- jinja
- langchain
- langgraph
- langsmith
- meshapi
- postgresql
- python
- qdrant
- rag
- redis
- sendgrid
- tailwind
- vector

Log in or sign up for Devpost to join the conversation.