Inspiration
All of us are students, and we kept doing the same thing: pasting a paragraph about ourselves into a chatbot before asking anything useful. Our goal, our exams, how much time we actually have. The next day we'd do it again. Worse, nothing we practised ever changed the advice. You could bomb a mock interview question and the "plan" would look exactly the same tomorrow.
We wanted something closer to a mentor who remembers. Not just what you said, but why you decided it. If you told it "college exams come before GATE prep", it should still respect that two weeks later.
What it does
MindMate keeps a memory you can actually open and read: your goals in priority order, decisions with the reason behind each one, skills backed by evidence, and weaknesses it has seen in practice. Every item can be edited or deleted, and deleted items never reach a prompt again.
Our demo persona is Meera, a second-year CSE student aiming for an AI/ML internship. With MindMate she can:
- paste an internship posting and see how well she fits, scored against the evidence she has, not the skills she claims;
- see her skill gaps ranked by how much they matter for that role;
- follow a 14-day plan that fits her daily time;
- answer mock-interview questions and get graded.
The part we care about most is the loop. If Meera answers two model-evaluation questions badly, MindMate records a weakness. One bad answer isn't enough; we didn't want it overreacting. Then when her week gets busy and she drops from 60 to 30 minutes a day, the plan is rebuilt: model-evaluation practice moves to day one, nothing goes over 30 minutes, and the explanation tells her exactly which memory caused each change.
MindMate never submits or sends anything for you. It only drafts.
How we built it
The backend is FastAPI with PostgreSQL (SQLite locally) and Alembic migrations. Every memory item gets a reference ID like weakness#1 or decision#2, and anything that cites a reference is checked against the database before we use it.
The AI side is ten agents on NVIDIA Nemotron through Nebius Token Factory. Nemotron 3 Nano does the extraction work (reading your profile, pulling requirements out of a posting, suggestions). Nemotron 3 Ultra does the judgement work (fit, skill gaps, planning, grading practice answers, writing practice questions, explaining replans). Token Factory being OpenAI-compatible meant one client and one endpoint for all nine, and we could test every agent offline against a fake client.
The frontend is React, TypeScript, Vite and Tailwind, hosted on Vercel. The backend runs as a Docker web service on Render, with a Render PostgreSQL database; the models themselves run on Nebius Token Factory, so we didn't have to host or scale any GPUs. Every model call shows up on an AI Activity page with the agent, the model ID and how long it took.
Challenges we ran into
- Models invent things. The planner would happily cite memory that didn't exist. Every agent now validates its JSON against a schema and retries once with the error. Any output citing an unknown reference gets rejected.
- Our own matcher was wrong. We built a small evaluation set, and the first run showed our code crediting "Deep learning" for "Machine learning fundamentals" and "Java" for "JavaScript". That was our bug, not the model's. It would have inflated every fit score.
- A bug that looked like a network failure. Some responses were built by middleware, before CORS headers were added, so the browser threw them away. The UI said "Could not reach the server" when the server had answered fine. It took a while to see that.
- Replans erased progress. After the first replan the screen said "0 of 11 tasks done". Completed tasks now carry over into each new plan version.
- The README didn't work from a fresh clone. An empty
DATABASE_URLin.env.examplecrashed setup. We only caught it by cloning the repo into a clean folder and following our own instructions. - Three people, three branches, fifteen days. Merging frontend, backend and AI work without overwriting each other took real coordination.
Accomplishments that we're proud of
- The whole loop works end to end: weak answer → recorded weakness → busy week → new plan that cites why.
- Every number in the app can be traced back to an input.
- When the model isn't available, MindMate says so on screen instead of passing off a fallback as AI output.
- Over 200 automated tests, including the full backend suite on PostgreSQL in CI, plus a smoke test that fails the deployment if any answer isn't a real Nemotron response.
What we learned
Letting the model decide everything makes a demo look smart and a product untrustworthy. Splitting the work, judgement and explanation from the model and decisions from code, made both better. We also learned to build an evaluation set early, because it found bugs we would never have noticed by clicking around. And to test our setup the way a stranger would, from a fresh clone.
What's next for MindMate
Live opportunity search instead of a curated list, a short daily brief, calendar integration so the plan knows when you're actually free, and more agents on the same memory, starting with exam preparation. We also want to measure Nemotron Ultra against Nano on our evaluation set and use the results to decide which agent runs on which model.
Built With
- adaptive-learning
- ai-agents
- alembic
- docker
- fastapi
- large-language-models-(llms)
- nebius-token-factory
- nvidia-nemotron
- persistent-memory
- personal-ai
- postgresql
- prompt-engineering
- python
- react
- render
- sqlite
- tailwind-css
- typescript
- vercel
- vite
Log in or sign up for Devpost to join the conversation.