Lexora

A full-stack digital library system — a C# API handling authentication, inventory, and borrowing logic, paired with a Razor Pages frontend for users and admins.

No cover image yet

Project Details

Lexora is a library management system built to give smaller libraries a lightweight, fully integrated digital borrowing platform. It consists of two parts: the Lexora API (backend) and the Lexora UI (frontend), developed together as a cohesive system. The API is built with ASP.NET Core and Entity Framework Core, handling user authentication via ASP Identity and JWTs, book inventory, borrow requests, penalty calculations, and user restrictions based on borrowing history or outstanding fines. PostgreSQL provides reliable data persistence and OpenAPI (Swagger) keeps the API surface fully documented. The frontend is built with ASP.NET Razor Pages and connects directly to the API, giving both library users and administrators a clean, role-aware interface. Users can browse books, check availability, and submit borrow requests; admins manage inventory and review requests from a dedicated dashboard.

Tech Stack

C#ASP.NET CoreASP.NET Razor PagesEntity Framework CorePostgreSQLASP IdentityJWTOpenAPI (Swagger)HTMLCSS

Tags

EdTechPersonal ProjectFull-Stack

Behind the Project

Problem

Most library systems are either clunky desktop software or expensive third-party platforms that don't fit smaller libraries. I wanted to build something lightweight and self-contained — a backend that enforces borrowing rules reliably, and a frontend that feels natural for both everyday borrowers and the staff managing the shelves. The tricky part was the rules: return deadlines, outstanding fines, borrowing limits, and user restrictions that all stack on top of each other.

Approach

I separated concerns from the start: business logic (penalties, restrictions) lives in a dedicated service layer isolated from the controllers, so it can be tested independently and changed without touching the API surface. ASP Identity handled role management so I didn't have to reinvent it. On the frontend, I chose Razor Pages to keep the server-rendering close to the data layer — tying the UI tightly to the API's data contracts meant the two could evolve together without drift, and Swagger became the primary reference during frontend development.

What I learned

  • Separating business rules into a service layer pays off quickly — the borrowing logic changed several times, and isolated services made that painless.
  • Razor Pages works best when the UI maps closely to server-side actions — fighting that model adds unnecessary complexity.
  • JWT handling in a server-rendered context requires careful cookie/header strategy to avoid leaking tokens in the DOM.
  • EF Core migrations are only as good as your discipline around naming and staging them — undocumented migrations are a future maintenance headache.
  • Swagger is a first-class development tool, not just documentation — writing it upfront sped up frontend integration considerably.
  • PostgreSQL's row-level constraints caught data bugs that application-level validation would have missed.
  • Designing for two distinct user roles (borrower vs. admin) from the start saves a lot of retrofitting later.

Lawal Habeebullahi

Software Engineer/System Administrator • Building reliable systems & beautiful interfaces

© 2026 Lawal Habeebullahi. All rights reserved.