Developed by Anders Lynge Ravnsbæk
Reveries is a personal hobby project that I am developing in my spare time alongside job hunting. The project serves both as a way to maintain and expand my coding skills and as an opportunity to experiment with new technologies, best practices, integrations, and design patterns that can strengthen my skills and competencies as a developer.
It is therefore both a learning project and a product I personally want to use to support my passion for reading books and one I look forward to putting into use.
Reveries aims to be a digital book hub where you can build and organize your own collection in the form of a virtual bookshelf.
The goal is to create a platform that makes it easier to get an overview of the books you own, provides insights into your reading habits, and presents metadata and statistics about which books you have read and which are still waiting to be explored - and who knows what future features will be implemented.
The project is being developed as a fullstack application, hosted on a Raspberry Pi and accessible through my private network. This makes it a complete learning environment, covering everything from backend and database to frontend and deployment.
For easier creation of books in the system, a book scanner has been made to make it faster and easier to add all the books in your shelf. The scanner scans the ISBN barcode on the book, and the backend quickly retrieves the book metadate from the external APIs.
The plan for the project is outlined below. The choice of technologies is primarily driven by the desire to gain hands-on experience with widely used and relevant tools from the real world, not necessarily because they represent the most optimal solution for this particular application.
-
Backend
- C# / .NET API
The business logic is developed with a focus on following SOLID principles and Clean Architecture to ensure scalable and maintainable code. - Dapper
Used as a micro-ORM instead of EF-Core to gain more control over SQL and create a closer connection between code and database. - External APIs - ISBNDB and Google Books
Integration with external APIs that provides book data, allowing new titles to be added quickly with rich metadata.
- C# / .NET API
-
Frontend
- TypeScript and React
A modern and responsive interface built with React to gain practical experience with one of the most widely adopted frontend libraries.
- TypeScript and React
-
Database
- PostgreSQL
Chosen to build experience with one of the most popular relational databases, also widely used in large-scale projects.
- PostgreSQL
-
Cache
- Redis
Implemented to optimize response times and provide a faster, more responsive user experience. Using a Cache-Aside strategy, data is cached in memory and refreshed from the database when needed.
- Redis
-
CI/CD
- Docker and GitHub Actions
Pipelines automatically package new builds into Docker images and deploy them to the Raspberry Pi, ensuring the application always runs the latest version.
- Docker and GitHub Actions
Below is an ER diagram of the current entities in the project.
The diagram provides an overview of the tables, their relationships, and their fields. It serves as the foundation for the database schema implementation and helps keep the structure organized as the project grows.
erDiagram
authors {
int id PK
uuid domain_id UK
varchar normalized_name UK
varchar first_name
varchar last_name
timestamp date_created
}
author_name_variants {
int id PK
int author_id FK
varchar name_variant
boolean is_primary
}
books {
int id PK
uuid domain_id UK
varchar title
varchar isbn13 UK
varchar isbn10 UK
int publisher_id FK
int series_id FK
int series_number
varchar publication_date
int page_count
text synopsis
varchar language
varchar edition
varchar binding
text image_url
text image_thumbnail
decimal msrp
boolean is_read
decimal height_cm
decimal width_cm
decimal thickness_cm
decimal weight_g
timestamp date_created
}
publishers {
int id PK
uuid domain_id UK
varchar name UK
timestamp date_created
}
genres {
int id PK
varchar name UK
timestamp date_created
}
books_authors {
int book_id PK, FK
int author_id PK, FK
}
books_genres {
int book_id PK, FK
int subject_id PK, FK
}
books_dewey_decimals {
int book_id PK, FK
int dewey_decimal_id PK, FK
}
dewey_decimals {
int id PK
varchar code UK
timestamp date_created
}
series {
int id PK
uuid domain_id UK
varchar name UK
timestamp date_created
}
authors ||--o{ author_name_variants : "has"
authors ||--o{ books_authors : "writes"
books ||--o{ books_authors : "written by"
books ||--o{ books_genres : "categorized as"
genres ||--o{ books_genres : "categorizes"
books ||--o{ books_dewey_decimals : "classified as"
dewey_decimals ||--o{ books_dewey_decimals : "classifies"
publishers ||--o{ books : "publishes"
series ||--o{ books : "contains"