Work in progress!
A full‑stack web application for creating and sharing bookshelves.
Each bookshelf can store a collection of books with title, author, and additional details.
Visitors can browse public bookshelves, while owners can create, edit, and manage their own collections.
Frontend: React + TypeScript + TailwindCSS + Vite
Backend: Kotlin + Spring Boot + PostgreSQL + Flyway + Gradle
Infrastructure: Docker + GitHub Actions
For the best developer experience, performance, and instant hot-reloading, the database runs in Docker while the backend and frontend run natively on your local machine.
You will need the following installed on your machine:
- Java 21 (LTS) – developed with Eclipse Temurin 21.0.8
- Node.js 22+ – developed with Node.js 22.13.0
- Docker Desktop / Engine – used to run the PostgreSQL database
You will need three terminal instances (or run the database in the background).
The project uses a local PostgreSQL database managed via Docker Compose. Local credentials (postgres/password) are hardcoded in the Spring Boot dev profile, so no database .env configuration is required!
From the root of the project:
docker compose -f docker-compose.dev.yml up -dNote: Database schema migrations are handled automatically by Flyway when the backend starts.
Run the Spring Boot application using the included Gradle wrapper. It will automatically connect to the local Docker database.
cd backend
./gradlew bootRun --args='--spring.profiles.active=dev'The backend will be available at http://localhost:8080
When running the backend natively via ./gradlew, Spring Boot DevTools will automatically restart the server whenever compiled .class files change.
If you are using IntelliJ IDEA, it does not compile files automatically on save by default. To enable seamless hot-reloading:
- Open File → Settings → Build, Execution, Deployment → Compiler
- Enable Build project automatically
With this enabled, IntelliJ will compile your code in the background the moment you save a file, instantly triggering a Spring Boot DevTools restart.
Tip: Even if you prefer to write code in VS Code or another editor, you can keep IntelliJ open in the background to handle the automatic compilation!
Run the Vite development server. It proxies API requests to the local backend.
cd frontend
npm install
npm run devThe Frontend will be available at http://localhost:5173
- Stop the frontend and backend terminal processes using
Ctrl + C. - Stop the PostgreSQL database:
docker compose -f docker-compose.dev.yml down(Tip: If you ever want to completely wipe your local database and start fresh, run docker compose -f docker-compose.dev.yml down -v to destroy the Docker volume).
All three services (database, backend, frontend) run in Docker. The frontend is built at image build time with the provided environment variables baked in.
You will need the following installed on your server:
- Docker Desktop / Engine – used to run all services
Copy the example environment file and fill in your values:
cp .env.example .envOpen .env and fill in all empty fields — each field has a comment explaining its purpose and any requirements.
From the root of the project:
docker compose up --build -d- The frontend will be available at your server's IP or domain (as set in
FRONTEND_URLin.env) - The backend API will be available on port 8080 of your server's IP or domain (as set in
VITE_SERVER_URLin.env)
Note: Database schema migrations are handled automatically by Flyway when the backend starts.
docker compose down(Tip: If you ever want to completely wipe the production database and start fresh, run docker compose down -v to destroy the Docker volume. This will permanently delete all data.)