← Back to Projects Web and Software

Shelfwise – Personal Reading Companion

A React and GraphQL powered personal library to track books, capture notes, auto summarize reflections and surface genre based recommendations inside a clean reading dashboard.

Quick Insights:

Introduction

Shelfwise is a personal library application that helps me track my reading and capture lightweight reflections. Each entry includes a title, genre, author and notes. The app highlights a single current selection and presents the notes summary and suggested next reads side by side.

The project is built as a small full stack system: a React.js frontend with Apollo Client talks to a Node and Express backend that exposes a GraphQL API. Data is stored in memory for easy demo and testing, which keeps the focus on schema design, resolver logic and UI flow rather than infrastructure.

Architecture and GraphQL design

Shelfwise uses GraphQL as the main boundary between the React frontend and the Node backend. The main screen needs a mix of base data and derived data: raw notes, a BERT based summary and a list of similar books. GraphQL lets the UI fetch all of that in a single, strongly typed query.

Why GraphQL fits this project

Summarisation and recommendations

Representative GraphQL schema snippet

// backend/schema.js (excerpt)

const BookType = new GraphQLObjectType({
  name: "Book",
  fields: () => ({
    id: { type: new GraphQLNonNull(GraphQLID) },
    title: { type: new GraphQLNonNull(GraphQLString) },
    genre: { type: new GraphQLNonNull(GraphQLString) },
    notes: { type: GraphQLString },

    notesSummary: {
      type: GraphQLString,
      resolve: (book, args, ctx) =>
        ctx.services.summarizer.summarizeWithBert(book.notes),
    },

    recommendations: {
      type: new GraphQLList(BookType),
      resolve: (book, args, ctx) =>
        ctx.services.recommender.similarBooksByCosine(book),
    },
  }),
});

// Query { books, book(id: ID!) } and Mutation { addBook(...) } sit on top
// of this type and are used by the React UI via Apollo Client.

The Book type exposes both stored fields and derived fields. React components can request title, genre, notesSummary and recommendations in one query, while the backend hides the BERT based summarisation and cosine similarity logic inside services.

Key outcomes and learnings

Shelfwise is a small but well rounded project that combines UI work, schema design and lightweight ML to improve the reading experience.