![Discord][discord]
LibrePhotos
Mockup designed by rawpixel.com / Freepik
A self-hosted, open-source photo management service with automatic face recognition, object detection, and semantic search — powered by modern machine learning.
Repository layout
This is a monorepo that consolidates what was previously five separate repositories.
| Path | What it is | Previous repo |
|---|---|---|
| apps/backend/ | Django 5 API, machine-learning pipelines, background jobs | librephotos |
| apps/frontend/ | React 18 + Vite web client, i18next localization | librephotos-frontend |
| apps/mobile/ | Expo mobile app (Android and iOS), offline-first | librephotos-mobile |
| apps/docs/ | Docusaurus site published to https://docs.librephotos.com | librephotos.docs |
| deploy/ | Dockerfiles, Compose configs, proxy, Kubernetes manifests | librephotos-docker |
Commit history from all five repositories is preserved — git log --follow apps/ works across the move.
Installation
Step-by-step installation instructions are available in our documentation.
System Requirements
| Resource | Minimum | Recommended | |----------|---------|-------------| | RAM | 4 GB | 8 GB+ | | Storage | 10 GB (plus your photo library) | SSD recommended | | CPU | 2 cores | 4+ cores | | OS | Any Docker-compatible OS | Linux |
Note: Machine learning features (face recognition, scene classification, image captioning) are memory-intensive. 8 GB+ RAM is strongly recommended for smooth operation.
Features
- Support for all types of photos including raw photos - Support for videos - Timeline view - Scans pictures on the file system - Multiuser support - Generate albums based on events like "Thursday in Berlin" - Face recognition / Face classification - Reverse geocoding - Object / Scene detection - Semantic image search - Search by metadata
Tech Stack
Backend
- Framework: Django 5 with Django REST Framework
- Database: PostgreSQL
- Task Queue: Django-Q2
- RAW Conversion: LibRaw via rawpy
- Video Conversion: FFmpeg
- Exif Support: ExifTool
Frontend
- UI: React 18 with TypeScript
- Build Tool: Vite
- Component Library: Mantine
- Routing: TanStack Router
- Data Fetching: TanStack Query
- Maps: MapLibre GL
- Internationalization: i18next
Machine Learning
- Face detection: InsightFace
- Face classification/clustering: scikit-learn and hdbscan
- Image captioning: LFM2.5-VL, prompted with the recognised people and the place
- Tagging: MobileCLIP-S2 or SigLIP 2
- Semantic search: CLIP ViT-B/32 with FAISS
- ML runtime: ONNX Runtime for every model, no PyTorch
- Reverse geocoding: geopy
Infrastructure
- Deployment: Docker & Docker Compose
- Reverse Proxy: Nginx
API Documentation
After starting LibrePhotos, interactive API docs are available at:
- Swagger UI:
http://localhost:3000/api/swagger - ReDoc:
http://localhost:3000/api/redoc
Development
See CONTRIBUTING.md and the per-app READMEs:
The Docker Compose-based dev environment lives indeploy/compose/ and is described in the development install guide.
How to help out
- ⭐ Star this repository if you like this project!
- 🚀 Developing: Get started in less than 30 minutes by following this guide. Also see our CONTRIBUTING.md for detailed development setup, code quality standards, and PR guidelines.
- 🗒️ Documentation: Improving the documentation is as simple as submitting a pull request here
- 🧪 Testing: If you want to help find bugs, use the ``
dev`` tag and update it regularly. If you find a bug, open an issue. - 🧑🤝🧑 Outreach: Talk about this project with other people and help them to get started too!
- 🌐 Translations: Make LibrePhotos accessible to more people with weblate.
- 💸 Donate to the developers of LibrePhotos
License
This project is licensed under the MIT License.
[discord]: https://discord.gg/xwRvtSDGWb