This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| [booklore-app/BookLore](https://github.com/booklore-app/BookLore) | minor | `v2.1.0` → `v2.2.0` |
| [ghcr.io/booklore-app/booklore](https://github.com/booklore-app/booklore) | minor | `v2.1.0` → `v2.2.0` |
---
### Release Notes
<details>
<summary>booklore-app/BookLore (booklore-app/BookLore)</summary>
### [`v2.2.0`](https://github.com/booklore-app/booklore/releases/tag/v2.2.0)
[Compare Source](https://github.com/booklore-app/BookLore/compare/v2.1.0...v2.2.0)
#### 🌟 What's New in v2.2.0
This release introduces (or brings back) two new library organization modes: **Book per File** and **Book per Folder**, giving you explicit control over how Booklore groups files into books during scanning.
When Booklore first started, the philosophy was simple: don't worry about how files are organized on disk, just scan everything and figure it out. This worked well when libraries only contained single-file formats like EPUB and PDF. But as support grew for multi-format books and multi-file audiobooks, that approach started to break down. The existing Auto-detect mode uses fuzzy filename matching and heuristics to guess how files should be grouped, and while it works in many cases, it has some real problems: files can get missed during scans, multi-file audiobooks sometimes show up as separate books (one per file), and the grouping behavior is unpredictable since it depends on how your files happen to be named.
Rather than continuing to patch Auto-detect, I'm introducing two new modes that are simple, predictable, and thoroughly-tested:
- **Book per File**: Every file becomes its own book. One file, one book, no guessing. This is now the default for new libraries.
- **Book per Folder**: Files in the same folder are grouped into a single book. Great for organized libraries with an `Author/Title/` structure, and it handles multi-format books and folder-based audiobooks naturally. If you have a folder with an EPUB, a MOBI, and an `audiobook/` subfolder, they all become one book.
**Auto-detect is not going away.** Existing libraries using it will continue to work as before. But it's now marked as legacy, and I strongly recommend switching to one of the new modes. They're simpler, more reliable, and will be the focus of ongoing development and support going forward.
You can set the organization mode when creating a new library, but cannot change it on an existing library. For a detailed breakdown of each mode with examples, check out the [documentation](https://booklore.org/docs/library/organization-modes).
#### 🚀 New Features
- Scanner organization modes and monitoring rework ([#​3279](https://github.com/booklore-app/BookLore/issues/3279)) by [@​acx10](https://github.com/acx10)
#### ✨ Enhancements
- Add configurable magnifier zoom and lens size for CBX reader ([#​3260](https://github.com/booklore-app/BookLore/issues/3260)) ([#​3268](https://github.com/booklore-app/BookLore/issues/3268)) by [@​acx10](https://github.com/acx10)
#### 🐛 Bug Fixes
- Make OIDC scopes configurable ([#​3261](https://github.com/booklore-app/BookLore/issues/3261)) ([#​3265](https://github.com/booklore-app/BookLore/issues/3265)) by [@​acx10](https://github.com/acx10)
#### 🛠️ Refactoring & Maintenance
- Lock organization mode dropdown for AUTO\_DETECT libraries ([#​3284](https://github.com/booklore-app/BookLore/issues/3284)) by [@​acx10](https://github.com/acx10)
- Lock organization mode for AUTO\_DETECT libraries ([#​3283](https://github.com/booklore-app/BookLore/issues/3283)) by [@​acx10](https://github.com/acx10)
- Translations update from Hosted Weblate ([#​3248](https://github.com/booklore-app/BookLore/issues/3248)) by [@​acx10](https://github.com/acx10)
#### 🐳 Docker Images
- **Docker Hub:** `booklore/booklore:v2.2.0`
- **GitHub Container Registry:** `ghcr.io/booklore-app/booklore:v2.2.0`
**Full Changelog**: <https://github.com/booklore-app/booklore/compare/v2.1.0...v2.2.0>
<img width="728" height="942" alt="Screenshot 2026-03-11 at 8 51 59 AM" src="https://github.com/user-attachments/assets/a8decbd8-e80f-4865-b6ee-bbb612fd20b7" />
<img width="728" height="942" alt="Screenshot 2026-03-11 at 8 51 20 AM" src="https://github.com/user-attachments/assets/51a11cb8-d4ec-47b8-ac09-61cc222a8ab4" />
</details>
<details>
<summary>booklore-app/booklore (ghcr.io/booklore-app/booklore)</summary>
### [`v2.2.0`](https://github.com/booklore-app/booklore/releases/tag/v2.2.0)
[Compare Source](https://github.com/booklore-app/booklore/compare/v2.1.0...v2.2.0)
#### 🌟 What's New in v2.2.0
This release introduces (or brings back) two new library organization modes: **Book per File** and **Book per Folder**, giving you explicit control over how Booklore groups files into books during scanning.
When Booklore first started, the philosophy was simple: don't worry about how files are organized on disk, just scan everything and figure it out. This worked well when libraries only contained single-file formats like EPUB and PDF. But as support grew for multi-format books and multi-file audiobooks, that approach started to break down. The existing Auto-detect mode uses fuzzy filename matching and heuristics to guess how files should be grouped, and while it works in many cases, it has some real problems: files can get missed during scans, multi-file audiobooks sometimes show up as separate books (one per file), and the grouping behavior is unpredictable since it depends on how your files happen to be named.
Rather than continuing to patch Auto-detect, I'm introducing two new modes that are simple, predictable, and thoroughly-tested:
- **Book per File**: Every file becomes its own book. One file, one book, no guessing. This is now the default for new libraries.
- **Book per Folder**: Files in the same folder are grouped into a single book. Great for organized libraries with an `Author/Title/` structure, and it handles multi-format books and folder-based audiobooks naturally. If you have a folder with an EPUB, a MOBI, and an `audiobook/` subfolder, they all become one book.
**Auto-detect is not going away.** Existing libraries using it will continue to work as before. But it's now marked as legacy, and I strongly recommend switching to one of the new modes. They're simpler, more reliable, and will be the focus of ongoing development and support going forward.
You can set the organization mode when creating a new library, but cannot change it on an existing library. For a detailed breakdown of each mode with examples, check out the [documentation](https://booklore.org/docs/library/organization-modes).
#### 🚀 New Features
- Scanner organization modes and monitoring rework ([#​3279](https://github.com/booklore-app/booklore/issues/3279)) by [@​acx10](https://github.com/acx10)
#### ✨ Enhancements
- Add configurable magnifier zoom and lens size for CBX reader ([#​3260](https://github.com/booklore-app/booklore/issues/3260)) ([#​3268](https://github.com/booklore-app/booklore/issues/3268)) by [@​acx10](https://github.com/acx10)
#### 🐛 Bug Fixes
- Make OIDC scopes configurable ([#​3261](https://github.com/booklore-app/booklore/issues/3261)) ([#​3265](https://github.com/booklore-app/booklore/issues/3265)) by [@​acx10](https://github.com/acx10)
#### 🛠️ Refactoring & Maintenance
- Lock organization mode dropdown for AUTO\_DETECT libraries ([#​3284](https://github.com/booklore-app/booklore/issues/3284)) by [@​acx10](https://github.com/acx10)
- Lock organization mode for AUTO\_DETECT libraries ([#​3283](https://github.com/booklore-app/booklore/issues/3283)) by [@​acx10](https://github.com/acx10)
- Translations update from Hosted Weblate ([#​3248](https://github.com/booklore-app/booklore/issues/3248)) by [@​acx10](https://github.com/acx10)
#### 🐳 Docker Images
- **Docker Hub:** `booklore/booklore:v2.2.0`
- **GitHub Container Registry:** `ghcr.io/booklore-app/booklore:v2.2.0`
**Full Changelog**: <https://github.com/booklore-app/booklore/compare/v2.1.0...v2.2.0>
<img width="728" height="942" alt="Screenshot 2026-03-11 at 8 51 59 AM" src="https://github.com/user-attachments/assets/a8decbd8-e80f-4865-b6ee-bbb612fd20b7" />
<img width="728" height="942" alt="Screenshot 2026-03-11 at 8 51 20 AM" src="https://github.com/user-attachments/assets/51a11cb8-d4ec-47b8-ac09-61cc222a8ab4" />
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->
Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4633
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| [harbor.alexlebens.net/images/site-profile](https://gitea.alexlebens.dev/alexlebens/site-profile) | minor | `3.0.0` → `3.1.0` |
---
### Release Notes
<details>
<summary>alexlebens/site-profile (harbor.alexlebens.net/images/site-profile)</summary>
### [`v3.1.0`](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.0.0...3.1.0)
[Compare Source](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.0.0...3.1.0)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->
Reviewed-on: #4631
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| [harbor.alexlebens.net/images/site-profile](https://gitea.alexlebens.dev/alexlebens/site-profile) | major | `2.25.0` → `3.0.0` |
---
### Release Notes
<details>
<summary>alexlebens/site-profile (harbor.alexlebens.net/images/site-profile)</summary>
### [`v3.0.0`](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/2.25.0...3.0.0)
[Compare Source](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/2.25.0...3.0.0)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->
Reviewed-on: #4628
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| goharbor/harbor-exporter | patch | `v2.14.2` → `v2.14.3` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYXV0b21lcmdlIiwiaW1hZ2UiXX0=-->
Reviewed-on: #4605
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.