https://github.com/fabiodalez-dev/pinakes
Complete Library Management System (ILS) - Circulation, OPAC, cataloging, reservations, loans, automatic notifications, plugin system, and Z39.50/SRU server
https://github.com/fabiodalez-dev/pinakes
biblioteche books catalog cataloging circulation dewey-decimal digital-library ebooks ils isbn koha-alternative library library-catalog library-management opac open-source self-hosted
Last synced: 13 days ago
JSON representation
Complete Library Management System (ILS) - Circulation, OPAC, cataloging, reservations, loans, automatic notifications, plugin system, and Z39.50/SRU server
- Host: GitHub
- URL: https://github.com/fabiodalez-dev/pinakes
- Owner: fabiodalez-dev
- License: gpl-3.0
- Created: 2025-09-10T21:28:10.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2026-02-07T10:31:55.000Z (3 months ago)
- Last Synced: 2026-02-07T19:28:11.777Z (3 months ago)
- Topics: biblioteche, books, catalog, cataloging, circulation, dewey-decimal, digital-library, ebooks, ils, isbn, koha-alternative, library, library-catalog, library-management, opac, open-source, self-hosted
- Language: JavaScript
- Homepage:
- Size: 27.6 MB
- Stars: 55
- Watchers: 1
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Pinakes π
> **Open-Source Integrated Library System**
> License: GPL-3 | Languages: Italian, English
Pinakes is a self-hosted, full-featured ILS for schools, municipalities, and private collections. It focuses on automation, extensibility, and a usable public catalog without requiring a web team.
[](version.json)
[](installer)
[](LICENSE)
[](https://www.php.net/)

[](https://www.mysql.com/)
[](https://developer.mozilla.org/docs/Web/JavaScript)

[](https://fabiodalez-dev.github.io/Pinakes/)
---
## What's New in v0.4.8.2
### π¨ Illustrator Field, Multi-Language & BCE Dates
**New Illustrator Field:**
- **`illustratore` column** on `libri` table β dedicated field for book illustrators
- **`illustratore` role** added to `libri_autori` enum β illustrators can be linked as authors with proper role
- **CSV import support** β Illustrator column recognized and mapped during bulk imports
- **LibraryThing import** β Illustrator field extracted from LT data
- **Book form & detail page** β Illustrator displayed alongside translator in both edit form and book card
**Multi-Language Improvements:**
- **Language column expanded** from varchar(50) to varchar(255) β supports long multi-language entries (e.g., "Italiano, English, FranΓ§ais")
- **Native language names** β 25+ language names normalized from Italian to native form (e.g., "inglese" β "English", "giapponese" β "ζ₯ζ¬θͺ")
- **Multi-language display** β Book detail page shows language chips with proper formatting
**BCE Year Support:**
- **`anno_pubblicazione` now SIGNED** β range expanded from 0β65535 to -32768β32767, supporting ancient texts (e.g., The Odyssey, -800)
- **Form validation** β Book form accepts `min="-9999"` for historical works
**Installer Fixes:**
- **Session persistence fix** β Installer now uses same `storage/sessions/` path as main app, preventing session loss between steps on macOS/Linux
- **Output buffering** β Step 3 (database installation) uses `ob_start()`/`ob_end_clean()` to prevent broken redirects
**Bug Fixes:**
- **CSV import duplicate inventory numbers** β New `inventoryNumberExists()` check with automatic suffix (`-2`, `-3`, ...) prevents unique constraint violations on re-import
- **Publisher API & detail page** β Fixed phantom `e.citta` column reference, improved publisher card layout
- **Loan PDF generator** β Fixed rendering issues in loan receipt generation
- **Loans UI** β Fixed display inconsistencies in loan management views
- **Z39 Server plugin** β SRU client fixes, bumped to v1.2.1
- **Theme fallback** β Fixed edge case when selected theme is unavailable
---
## Previous Releases
v0.4.8.1 - Import Logging & Auto-Update
### π Import Logging & Auto-Update System
**Import History & Error Tracking:**
- **Import logs database** β New `import_logs` table tracks every CSV/LibraryThing import with stats, errors, and timing
- **Import history UI** β Admin panel to view past imports, filter by type/status, and download error reports as CSV
- **Import statistics** β Per-import success/failure/skipped counters with duration tracking and detailed error breakdown
- **Structured error handling** β Both import controllers now use typed error arrays (`scraping`/`validation`) instead of fragile string parsing
- **Type-safe session handling** β `$_SESSION['user_id']` properly cast to `int` to prevent `TypeError` with `strict_types`
**Auto-Update System:**
- **GitHub release integration** β Check for updates, download, and install directly from admin panel
- **Manual update upload** β Upload `.zip` packages for air-gapped environments
- **Zip Slip protection** β Path traversal validation on all archive extraction
- **Backup system** β Automatic backup before update with rollback capability
- **Database migrations** β Automatic execution of versioned SQL migrations during updates
**Security Fixes:**
- **CSRF protection** β Added `CsrfMiddleware` to manual update upload/install routes
- **No filesystem path leaks** β Update temp paths stored in session, not exposed to client
- **Cryptographic temp directories** β `random_bytes()` instead of predictable `uniqid()`
- **Orphan cleanup** β `deleteOldLogs()` now removes stale `'processing'` records older than 1 day
**Bug Fixes:**
- **Batch cover download** β Fixed HTTP 502 errors during bulk cover fetching with proper error handling and retry
- **Dewey classification display** β Hierarchy breadcrumb now renders correctly at all classification levels
- **Soft-delete consistency** β All queries on `libri` table now properly filter deleted records (`deleted_at IS NULL`)
- **Dashboard counters** β Statistics aligned with soft-delete, excluded deleted books from all counts
- **Loan status badges** β Fixed badge rendering for all loan states in history views
**Code Quality:**
- **PHPStan level 4 compliant** β All new code passes static analysis
- **Consistent error structure** β CSV and LibraryThing controllers aligned on `['line', 'title', 'message', 'type']` format
- **ISBN length validation** β `normalizeIsbn()` now rejects values that aren't 10 or 13 characters
- **Negative price rejection** β `validatePrice()` throws on negative values
v0.4.8 - Security & Data Integrity
### π Security & Data Integrity Release
**LibraryThing Import/Export Plugin** β Complete CSV/TSV import with flexible column mapping for LibraryThing data (29 custom fields)
**Critical Security Fixes:**
- **Image upload protection** β Pre-decode validation prevents OOM/DoS attacks (20MP pixel limit)
- **XSS prevention** β DOMPurify sanitization for TinyMCE content
**Critical Bug Fixes:**
- **Data loss fix** β Three LibraryThing fields (entry_date, dewey_wording, barcode) now properly saved
- **CSV import fixes** β Author data loss, statement leaks, chunk validation, JavaScript control flow
- **Rating validation** β Invalid ratings set to NULL instead of clamping
**Features:**
- Flexible column mapping with automatic detection for Primary Author, Secondary Author, etc.
- Star rating widget integration
- Chunked CSV processing with session state
- Comprehensive error handling and logging
**Automated Release System:**
- New `scripts/create-release.sh` prevents production errors
- Automatic vendor/ cleanup (removes dev dependencies)
- Built-in testing and verification
v0.4.7.2 - Minor Bug Fixes
### Minor Bug Fixes
- **Cron scripts standalone execution** β Cron jobs now load `.env` directly, working independently from web server context
- **Version display fix** β Footer now correctly shows version from `version.json`
- **Documentation improvements** β Cleanup and linting fixes across documentation files
v0.4.7.1 - Code Quality & Plugin Compatibility
### Code Quality & Plugin Compatibility
- **ESLint integration** β Frontend build now includes ESLint with strict rules
- **Plugin compatibility** β All pre-installed plugins updated to `max_app_version: 1.0.0`
- **Loan workflow stability** β Additional fixes to copy state transitions during approval/rejection
v0.4.7 - Stability & Bug Fixes
### Stability & Bug Fixes
- **Copy state protection** β Fixed issue where copy state could incorrectly change during loan approval
- **Pickup workflow refinement** β `reserved` and `ready_for_pickup` states now correctly keep copies as `available`
- **MaintenanceService improvements** β Expired pickup handling no longer resurrects non-restorable copies
---
## β‘ Quick Start
1. **Clone or download** this repository and upload all files to the root directory of your server.
2. **Visit your site's root URL** in the browser β the guided installer starts automatically.
3. **Provide database credentials** (database must be empty).
4. **Select language** (Italian or English).
5. **Configure** organization name, logo, and email notifications.
6. **Create admin account** and start cataloging.
**Email configuration**: Supports both PHP `mail()` and SMTP. Required for notifications to work (loan confirmations, due-date reminders, registration approvals, reservation alerts). Can be configured during installation or later from the admin panel.
**Post-install** (optional but recommended):
- Remove/lock the `installer/` directory (button provided on final step)
- Configure SMTP, registration policy, and CMS blocks from **Admin β Settings**
- Schedule cron jobs for automated tasks:
```bash
# Notifications every hour (8 AM - 8 PM)
0 8-20 * * * /usr/bin/php /path/to/cron/automatic-notifications.php >> /var/log/biblioteca-cron.log 2>&1
# Full maintenance at 6 AM (handles reservation/pickup expirations)
0 6 * * * /usr/bin/php /path/to/cron/full-maintenance.php >> /var/log/biblioteca-maintenance.log 2>&1
```
All frontend assets are precompiled. Works on shared hosting. No Composer or build tools required on production. All configuration values can be changed later from the admin panel.
---
## Story Behind the Name
**Pinakes** comes from the ancient Greek word *ΟΞ―Ξ½Ξ±ΞΊΞ΅Ο* ("tables" or "catalogues"). Callimachus of Cyrene compiled the *Pinakes* around 245 BC for the Library of Alexandria: 120 scrolls that indexed more than 120,000 works with authorship, subject and location. This project borrows that same missionβorganising and sharing knowledge with modern tools.
**Full documentation**: [fabiodalez-dev.github.io/Pinakes](https://fabiodalez-dev.github.io/Pinakes/)
---
## What It Does
Pinakes provides cataloging, circulation, a self-service public frontend, and REST APIs out of the box. It ships with precompiled frontend assets and a guided installer so you can deploy quickly on standard LAMP hosting.
---
## Screenshots

Admin Dashboard β Loans overview, calendar, and quick stats

Book Management β ISBN auto-fill, multi-copy support, cover retrieval

Public Catalog (OPAC) β Search, filters, and patron self-service
---
## Core Features
### Automatic Metadata Import
- **ISBN/EAN scraping** from Google Books, Open Library, and pluggable sources
- **Automatic cover retrieval** when available
- **Every field editable manually** β automation never locks you in
### Cataloging
- **Multi-copy support** with independent barcodes and statuses for each physical copy
- **Unified records** for physical books, eBooks, and audiobooks
- **Dewey Decimal Classification** with 1,200+ preset categories (IT/EN), hierarchical browsing, manual entry for custom codes, and auto-population from SBN scraping
- **CSV bulk import** with field mapping, validation, automatic ISBN enrichment, and Dewey classification from scraping
- **LibraryThing TSV import** with flexible column mapping for 29 custom fields and automatic metadata enrichment
- **Import history** β Admin panel with per-import statistics, error reports downloadable as CSV, and log retention management
- **Automatic duplicate detection** by ID, ISBN13, EAN, or title+author (updates existing records without modifying physical copies)
- **Author and publisher management** with dedicated profiles and bibliography views
- **Genre/category system** with custom taxonomies and multi-category assignment
- **Series and collections** tracking with sequential numbering
- **Barcode generation** for physical inventory (Code 128, EAN-13, custom formats)
- **Cover image management** with automatic download, manual upload, and URL import
- **Rich metadata fields** including edition, publication date, language, format, dimensions, weight, page count
- **Keywords and tags** for enhanced searchability and subject indexing
- **Custom notes and annotations** for internal cataloging remarks
### Circulation
- **Full loan workflow**: request, approval, checkout, renewal, return
- **Automatic due-date calculation** with configurable loan periods
- **Configurable renewal rules** (manual or automatic approval)
- **FIFO reservation queues** with availability alerts when items become free
- **Detailed per-user and per-item history** for audit trails
### Catalogue Mode
- **Browse-only option** for libraries that don't need circulation features
- **Configurable during installation** or via Admin β Settings β Advanced
- **Hides all loan-related UI**: request buttons, reservation forms, wishlist
- **Admin sidebar simplified** without loan management menus
- **Perfect for**: digital archives, reference-only collections, museum libraries
### Pickup Confirmation System
- **New `ready_for_pickup` state** β Approved loans enter "Ready for Pickup" before becoming active
- **Two-step workflow** β Admin approves β Patron picks up β Admin confirms pickup
- **Configurable pickup deadline** β Days allowed for pickup (Settings β Loans, default: 3 days)
- **Cancel pickup** β Admin can cancel uncollected loans, freeing copy and advancing reservation queue
- **Automatic queue advancement** β Next patron notified immediately when pickup is cancelled
- **Works without cron** β Real-time queue processing, no maintenance service dependency
- **Visual indicators** β Orange badge for "Ready for Pickup" in all loan views
- **Calendar integration** β `ready_for_pickup` periods shown in orange, block availability for other reservations
- **Origin tracking** β System tracks whether loans originated from reservations or manual creation
### Calendar & ICS Integration
- **Interactive dashboard calendar** (FullCalendar) showing all loans and reservations
- **Color-coded events**: active loans (green), scheduled (blue), overdue (red), pending requests (amber), reservations (purple)
- **Start/end markers** for easy visualization of loan periods
- **Click to view details**: user, book title, dates, and status in modal popup
- **ICS calendar export** for syncing with external calendar apps (Google Calendar, Apple Calendar, Outlook)
- **Automatic ICS generation** via maintenance service or cron job
- **Subscribable calendar URL** that stays updated with latest loans and reservations
### Email Notifications
Automatic emails for:
- New user registration
- Registration approval
- Loan confirmation
- Approaching due dates (configurable days before)
- Overdue reminders
- Item-available notifications for reservations
**WYSIWYG email template editor** with dynamic tags for record, user, and loan data.
### Public Catalog (OPAC)
- **Responsive, multilingual frontend** (Italian + English)
- **AJAX search** with instant results and relevance ranking
- **AJAX filters**: genre, publisher, availability, publication year, format
- **Patrons can leave reviews and ratings** (configurable)
- **Built-in SEO tooling**: sitemap, clean URLs, Schema.org metadata tags
- **Cookie-consent banner** and privacy tools (GDPR-compliant)
### Dewey Decimal Classification
- **1,200+ preset categories** in Italian and English loaded from JSON files
- **Hierarchical browsing** β Navigate from main classes (000-999) to subdivisions (e.g., 599.9 Mammals)
- **Manual entry** β Accept any valid Dewey code, not limited to preset list
- **Format validation** β Real-time validation of code format (XXX.XXXX)
- **Automatic population from SBN** β Dewey codes extracted during ISBN scraping are auto-added to the database
- **Multi-language** β Separate JSON files for IT/EN with full translations
- **Dewey Editor plugin** β Visual tree editor for managing classifications with import/export
- **No database table** β Data loaded from `data/dewey/` JSON files at runtime
### Auto-Updater
- **Built-in update system** β Check, download, and install updates from Admin β Updates
- **Manual ZIP upload** β Upload `.zip` release packages for air-gapped or rate-limited environments
- **Automatic database backup** β Full MySQL dump before every update
- **Safe file updates** β Protected paths (.env, uploads, storage) are never overwritten
- **Database migrations** β Automatic execution of SQL migrations for version jumps
- **Atomic rollback** β Automatic restore on error with pre-update backup
- **Orphan cleanup** β Files removed in new versions are deleted from installation
- **OpCache reset** β Automatic cache invalidation after file updates
- **Security** β CSRF validation, admin-only access, path traversal protection, Zip Slip prevention
### Physical Inventory
- **Hierarchical location model**: shelf, aisle, position
- **Automatic position assignment** for new copies
- **Barcode generation** in standard formats
- **Printable PDF labels** in multiple sizes (customizable templates)
### Digital Content
- **eBook distribution** (PDF, ePub) with download tracking
- **Audiobook streaming** (MP3, M4A, OGG) with integrated player
- **Drag-and-drop upload** or external URL linking
### Plugin System
Extend without modifying core files. Plugins can implement:
- New metadata scrapers (custom APIs, proprietary databases)
- Additional business logic (custom loan rules, notifications)
- Digital-content modules (eBooks, audiobooks, streaming)
- Import/export routines (MARC21, UNIMARC, custom formats)
Plugins support encrypted secrets and isolated configuration. Install via ZIP upload in admin panel.
**Pre-installed plugins** (5 included):
- **Open Library** β Metadata scraping from Open Library + Google Books API
- **Z39 Server** β SRU 1.2 API + SBN client for Italian library metadata with Dewey extraction
- **API Book Scraper** β External ISBN enrichment via custom APIs
- **Digital Library** β eBook (PDF, ePub) and audiobook (MP3, M4A, OGG) management with streaming player
- **Dewey Editor** β Visual editor for Dewey classification data with import/export and validation
### CMS and Customization
- **Homepage editor** with drag-and-drop blocks (hero banner, featured shelves, events, testimonials)
- **Custom pages** (About, Regulations, Events) with WYSIWYG editing
- **10 color themes** with instant switching (Sky Blue, Forest Green, Royal Purple, Sunset Orange, Cherry Red, Ocean Teal, Lavender Dreams, Midnight, Coral Sunset, Golden Hour)
- **Custom theme editor** with live preview for primary, secondary, and CTA colors
- **Logo customization** and branding
- **Centralized media manager** for images and documents
- **Event management** with dates, descriptions, and homepage display
### APIs
- **REST API** for search, availability, cataloging, and statistics
- **SRU 1.2 protocol** at `/api/sru` β standard library interoperability (MARCXML, Dublin Core, MODS export)
- **Z39.50 client** for copy cataloging from external catalogs (Library of Congress, OCLC, national libraries)
- **CSV and Excel export** for reports and backups
- **PDF generation** for labels, receipts, and reports
### User Management
- **Manual approval** of new registrations (optional)
- **Automatic card number assignment** with customizable prefixes
- **Complete per-user history** of loans and reservations
- **Self-service patron portal** with loan renewal, reservation management, and wishlists
---
## Why It Might Be Useful
- **Fast ISBN-driven cataloging** cuts manual entry to seconds per book
- **Usable public catalog** without needing a web developer or custom theme work
- **Extensible via plugins** if you want custom scrapers, integrations, or business logic
- **Self-hosted and GPL-3 licensed** β full control, no vendor lock-in, no recurring fees
- **Works on shared hosting** β no root access, Docker, or build tools required on production
---
## Plugins (Pre-installed)
All plugins are located in `storage/plugins/` and can be managed from **Admin β Plugins**.
### 1. Open Library (`open-library-v1.0.0.zip`)
- **Metadata scraping** from Open Library API
- **Fallback to Google Books** when Open Library lacks data
- **Automatic cover download** with validation
- **Subject mapping** and language normalization
- **Configurable priority** and caching options
### 2. Z39 Server (`z39-server-v1.0.0.zip`)
Implements the **SRU (Search/Retrieve via URL)** protocol, the HTTP-based successor to Z39.50, enabling catalog interoperability with library systems worldwide.
**Server Mode** (expose your catalog):
- **SRU 1.2 API** at `/api/sru` with explain, searchRetrieve, scan operations
- **Export formats**: MARCXML, Dublin Core, MODS, OAI_DC
- **CQL query parser** supporting indexes: `dc.title`, `dc.creator`, `dc.subject`, `bath.isbn`, `dc.publisher`, `dc.date`
- **Rate limiting** (100 req/hour per IP) and comprehensive access logging
- **Optional API key authentication** via `X-API-Key` header
- **Trusted proxy support** for deployments behind load balancers (CIDR notation)
**Client Mode** (import from external catalogs):
- **Copy cataloging** from Z39.50/SRU servers (Library of Congress, OCLC, K10plus, SUDOC, national libraries)
- **SBN Italia client** β Automatic metadata retrieval from Italian national library catalog
- **Dewey classification extraction**:
- SBN: Parses Dewey codes from `classificazioneDewey` field (format: `335.4092 (19.) SISTEMI MARXIANI`)
- SRU/MARCXML: Extracts from MARC field 082 (Dewey Decimal Classification Number)
- Dublin Core: Parses from `dc:subject` (DDC scheme) and `dc:coverage` fields
- **Federated search** across multiple configured servers
- **Automatic retry** with exponential backoff (100ms, 200ms, 400ms)
- **TLS certificate validation** for secure connections
- **MARCXML and Dublin Core parsing** with author extraction (MARC 100/700 fields)
**Example queries**:
```bash
# Server info
curl "http://yoursite.com/api/sru?operation=explain"
# Search by author
curl "http://yoursite.com/api/sru?operation=searchRetrieve&query=dc.creator=marx&maximumRecords=10"
# Search by ISBN (Dublin Core format)
curl "http://yoursite.com/api/sru?operation=searchRetrieve&query=bath.isbn=9788842058946&recordSchema=dc"
```
**Use cases**: Union catalogs, interlibrary loan systems, OPAC federation, copy cataloging workflows, automatic Dewey classification.
### 3. API Book Scraper (`api-book-scraper-v1.0.0.zip`)
- **External API integration** for ISBN enrichment
- **Custom endpoint configuration** (URL, headers, auth)
- **Response mapping** to Pinakes schema
- **Retry logic** with exponential backoff
- **Error logging** and debugging tools
### 4. Digital Library (`digital-library-v1.0.0.zip`)
- **eBook support** (PDF, ePub) with download tracking
- **Audiobook streaming** (MP3, M4A, OGG) with HTML5 player
- **Per-item digital asset management** (unlimited files per book)
- **Access control** (public, logged-in users only, specific roles)
- **Usage statistics** and download history
### 5. Dewey Editor (`dewey-editor-v1.0.0.zip`)
Complete Dewey Decimal Classification management system with multilingual support, automatic population, and data exchange capabilities.
**Core Features**:
- **Tree-based visual editor** β Navigate and edit the complete Dewey hierarchy (1,200+ preset entries)
- **Multi-language support** β Separate JSON files for Italian (`dewey_completo_it.json`) and English (`dewey_completo_en.json`) with full translations
- **Inline editing** β Add, modify, or delete categories with instant validation
- **Validation engine** β Checks code format (XXX.XXXX), hierarchy consistency, and duplicate detection
**Data Exchange**:
- **JSON import/export** β Backup and restore classification data for manual editing or exchange with other Pinakes installations
- **Cross-installation sharing** β Export your customized Dewey database and import it into another Pinakes instance
- **Merge capability** β Import external classifications while preserving existing entries
**Automatic Dewey Scraping**:
- **SBN integration** β When scraping book metadata from SBN (Italian National Library), Dewey codes are automatically extracted from the `classificazioneDewey` field
- **SRU/Z39.50 servers** β Dewey codes extracted from MARC field 082 when querying external catalogs (K10plus, SUDOC, Library of Congress, etc.)
- **Auto-population** β New Dewey codes discovered during scraping are automatically added to your JSON database (language-aware: only updates when source language matches app locale)
- **CSV import enrichment** β Books imported via CSV are automatically enriched with Dewey classification through ISBN scraping
**Dewey Code Format**:
- Main classes: `000`-`999` (3 digits)
- Subdivisions: `000.1` to `999.9999` (up to 4 decimal places)
- Examples: `599.9` (Mammiferi/Mammals), `004.6782` (Cloud computing), `641.5945` (Cucina italiana/Italian cuisine)
**Book Form Integration**:
- **Chip-based selection** β Selected Dewey code displays as removable chip with code + name
- **Manual entry** β Accept any valid Dewey code (not limited to predefined list)
- **Hierarchical navigation** β Optional collapsible "Browse categories" for discovering codes
- **Breadcrumb display** β Shows full classification path (e.g., "500 β 590 β 599 β 599.9")
- **Frontend validation** β Real-time format validation before submission
---
## Tech Stack
**Backend**: Slim 4.13, PHP-DI, Slim PSR-7 + CSRF, Monolog 3, PHPMailer 6.10, TCPDF 6.10, Google reCAPTCHA, thepixeldeveloper/sitemap, emleons/sim-rating, vlucas/phpdotenv.
**Frontend**: Webpack 5, Tailwind CSS 3.4.18, Bootstrap 5.3.8, jQuery 3.7.1, DataTables 2.3.x, Chart.js 4.5, SweetAlert2 11, Flatpickr 4.6, Sortable.js 1.15, Choices.js 11, TinyMCE 8, Uppy 4, jsPDF, JSZip, Font Awesome, Inter font (self-hosted).
---
## Deployment
### Apache (Shared Hosting)
Works out of the box. Two `.htaccess` files handle routing:
- **Root `.htaccess`**: Redirects to `/public/` or `/installer/`
- **`public/.htaccess`**: Front controller routing, security headers, CORS
### Nginx (VPS/Dedicated)
Copy `.nginx.conf.example` to your Nginx sites directory:
```bash
sudo cp .nginx.conf.example /etc/nginx/sites-available/pinakes
sudo nano /etc/nginx/sites-available/pinakes # Edit server_name, root, PHP-FPM
sudo ln -s /etc/nginx/sites-available/pinakes /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
---
## Support & Contact
π§ **Email**: [pinakes@fabiodalez.it](mailto:pinakes@fabiodalez.it)
π **Issues**: [GitHub Issues](https://github.com/fabiodalez-dev/pinakes/issues)
π¬ **Discussions**: [GitHub Discussions](https://github.com/fabiodalez-dev/pinakes/discussions)
---
## Contributing & License
Contributions, issues, and feature requests are welcome via GitHub pull requests. Pinakes is released under the **GNU General Public License v3.0** (see [LICENSE](LICENSE)).
If Pinakes helps your library, please β the repository!
---
## Handy Paths for Developers
- `app/Views/libri/partials/book_form.php` β Catalog form logic, ISBN ingestion
- `app/Controllers/PrestitiController.php` β Core lending workflows
- `app/Controllers/LoanApprovalController.php` β Loan approval, pickup confirmation, cancellation
- `app/Controllers/ReservationsController.php` β Queue handling
- `app/Services/ReservationReassignmentService.php` β Queue advancement on returns/cancellations
- `app/Controllers/UserWishlistController.php` β Wishlist UX
- `app/Views/frontend/catalog.php` β Public catalog filters
- `app/Controllers/SeoController.php` β Sitemap + robots.txt
- `storage/plugins/` β Plugin directory (all pre-installed plugins)