Backend & data
Palimia
A personal cultural library with a catalog normalized on the server, separate private data and explainable recommendations.
Technical decision
How it works
Provider catalogs are normalized on the server and kept separate from personal data.
- Provider catalogs
- Server-side validation and normalization
- Shared catalog
- Personal library and choices
In this case study
My contribution
I develop Palimia independently, using Next.js and strict TypeScript. My work includes:
- modeling the catalog and personal library with PostgreSQL and Prisma;
- validating and normalizing provider data on the server before import;
- explainable recommendations, personal data export, and account deletion;
- unit, component, PostgreSQL, and Playwright tests that support development.
The technical choices and limitations below describe the work in progress.
Inside the application
These screenshots show the application running locally in dark mode, with its French interface, 12 tracked movies, and 9 calculated suggestions. Titles and posters come from TMDB; ratings, favorites, and progress are demonstration data.
View an interface detail
A personal cultural library
I started Palimia out of enthusiasm for technology and because my cultural tracking was scattered across several tools. I wanted to bring it into an application useful to me and others, building it myself.
Palimia brings movies, TV series, and video games together in one personal space. Its goal is to replace scattered lists with a private library where every work keeps its status, progress, rating out of ten, favorite state, and personal notes.
The main journey starts with searching a catalog supplied by external providers, continues with adding a work to the library, and leads to personal tracking and statistics. The application is designed as a cultural profile that can expand over time without mixing catalog data with each user’s private choices.
A deliberately gradual scope
The planned first beta focuses on movies, TV series, and video games. The data model and some integrations also anticipate anime, manga, and books, but these media remain outside the scope of this first beta.
Developed social features — public profiles, reviews, lists, and relationships — also remain disabled. The product therefore stays centered on a private tracker. Recommendations are implemented: each suggestion includes understandable reasons explaining why it was selected.
Two choices that shape the project
Keep one coherent application
The project is a modular monolith built with Next.js and strict TypeScript. PostgreSQL and Prisma support the catalog, provider references, and personal states, while Better Auth handles authentication. Provider calls remain server-side, and their data is validated and normalized before import.
Separate catalog data from personal data
For example, repeating a provider import should find the same catalog work while preserving each person’s ratings and progress. Idempotent imports and the data separation address this requirement.
This architecture gives each work a shared identity without flattening the characteristics of each media type. Imports are designed to be idempotent and safe under concurrency, while data provenance stays separate from the ratings, progress, and lists created by users.
Users can also export their personal data or delete their account. These flows are part of the application’s current implementation.
Validation and current limitations
Palimia is in development, with no public launch. Free access is planned, with an optional support button. Hosting is planned on my future homelab; deployment and validation on that infrastructure remain to be completed.
The repository includes unit, component, PostgreSQL, and Playwright tests, alongside security, privacy, and release checks. Its deployment architecture is prepared, but evidence from a target environment — configuration, migrations, backup and restore, monitoring, staging tests, and release checks — is still incomplete. These local checks describe the project’s engineering state; they are neither a production release nor user metrics.