Paper Recommendation System
Paper recommendation system based on vector embeddings and user data, featuring a graph-based interface to explore relationships between related scientific papers.

JourNet — Paper Recommendation and Discovery System
JourNet is a paper recommendation and discovery system developed during the Programming Boot Camp in Funabashi, Chiba, as part of the Tokyo Tech Academy for Leadership (TOTAL) curriculum. The project was built by a team of four: I am Isai Sotarriva, with teammates Andre Lecona Buttelli and Jianwei Wen, and our teaching assistant Sameer Deshmukh who supervised the work.
The application is split into two clear parts: a frontend (Next.js) and a backend (Python + FastAPI). The backend is the only component that holds database credentials and is responsible for enforcing authorization, validating frontend requests, and applying privacy rules — for example, editing out a username when a user elects to stay anonymous in a comment.
My role
As the project architect I designed the app architecture and deployment, implemented the recommendation system, and built the interactive graph UI that surfaces recommendations. I also implemented the frontend script that renders recommendations as an exploratory graph. Andre implemented user login and handled most of the remaining backend functionality. Jianwei created the initial Next.js template and worked on the UI. Sameer acted as our TA/supervisor.
Backend, databases and data flow
The backend is written in Python using FastAPI to expose discrete actions for the frontend. Two databases are used:
- Supabase — stores users, comments, ratings, article metadata and other app state.
- Qdrant — stores and indexes vector embeddings (we embed paper abstracts).
User interactions across the platform are tracked to build a dynamic user profile. A profile is represented as a list of (article, weight) pairs where each article points to a vector in Qdrant. Weights indicate how strongly an article should influence recommendations: interactions such as commenting increase weight, while ratings can increase or decrease it. Weights may be positive or negative.
Recommendation algorithm (high-level)
The recommendation mechanism projects the embedding space along an axis derived from the user's weighted article list. Concretely, the profile weights define a direction in the vector space; candidate articles are scored by their projection along that direction, and the system returns articles that lie furthest in the positive direction — i.e., those that best match the user's expressed interests. Qdrant is used to search the vector space efficiently for these top candidates.
Graph UI and exploration
The graph is the central UX element. When a user selects a node (an article), the system finds related articles and visualizes them as neighboring nodes. Before adding a new node the frontend checks for existing matches: if a related article already exists in the graph a link is drawn instead of creating a duplicate node. This produces a dense, navigable graph that highlights relationships and lets users discover new relevant papers through exploration.
The graph UI is interactive and supports continual refinement of the user profile: actions like commenting or rating immediately adjust article weights and therefore affect subsequent recommendations.
Implementation notes
- FastAPI endpoints are minimal and focused: authentication, profile updates, comment/rating actions, and recommendation queries. The backend validates authorization before accessing Supabase or Qdrant.
- Qdrant stores embeddings of abstracts (generated with the chosen embedding model) and serves nearest-neighbor and projection-based queries for the recommendation engine.
- Supabase stores relational app data and user-visible content; all edits that affect privacy (e.g. anonymizing a comment) are handled server-side to prevent client bypass.
Links
Live demo — JourNetProject slides (PDF)
Front-end repository (GitHub)
Back-end repository (GitHub)
Tags
Skills
<