diff --git a/docs/.vitepress/config.base.ts b/docs/.vitepress/config.base.ts index e9e5a9a6..85da19ba 100644 --- a/docs/.vitepress/config.base.ts +++ b/docs/.vitepress/config.base.ts @@ -95,6 +95,7 @@ export default defineConfig({ { text: 'Embed API', link: '/api/integrations/embed-api' }, { text: 'Dashy', link: '/api/integrations/dashy' }, { text: 'Glance', link: '/api/integrations/glance' }, + { text: 'Heimdall', link: '/api/integrations/heimdall' }, { text: 'Home Assistant', link: '/api/integrations/homeassistant' }, { text: 'Homarr', link: '/api/integrations/homarr' }, { text: 'Homepage', link: '/api/integrations/homepage' }, diff --git a/docs/api/integrations/heimdall.md b/docs/api/integrations/heimdall.md new file mode 100644 index 00000000..e0ec5dcc --- /dev/null +++ b/docs/api/integrations/heimdall.md @@ -0,0 +1,46 @@ +# Heimdall + +LibrisLog can be integrated into [Heimdall](https://github.com/linuxserver/Heimdall), +an application dashboard and launcher for your self-hosted services, as a +[LibrisLog enhanced app](https://github.com/linuxserver/Heimdall-Apps). + +The enhanced app displays your reading statistics (books read, currently +reading, want-to-read, and total counts) directly on your Heimdall tile. + +## Prerequisites + +- A running LibrisLog instance reachable **from the Heimdall server** + (Heimdall fetches the statistics server-side, so no + [CORS](/guide/configuration#core-settings) configuration is needed) +- An [API key](/api/integrations/#api-keys) with access to the + statistics endpoint + +## Configuration + +1. In Heimdall, add a new item and pick **LibrisLog** as the application type + (it is listed as an *enhanced app*). +2. In the config section of the app, enter the address of your LibrisLog + instance in the **URL** field. The URL **must end with a trailing slash**: + + ``` + http:/// + ``` + +3. Enter your API key into the **Password (API key)** field. +4. Select which values the tile should display under **Stats to show**: + **Read**, **Reading**, **Want to read**, and/or **Total**. Hold + Ctrl (or Cmd) to select multiple entries. +5. Click **Test** to verify the connection. If everything is configured + correctly, Heimdall reports *"Successfully communicated with the API"*. + +::: tip The URL field needs a trailing slash +The config section of a Heimdall enhanced app can be confusing: the **URL** +field needs the address of your LibrisLog instance **followed by a slash**, +e.g. `http://192.168.1.100:8000/`. Without the trailing slash the app cannot +fetch your statistics: the tile stays empty and the **Test** button fails. + +::: + +## Result + +![Heimdall Widget](/screenshots/integrations-heimdall.png) diff --git a/docs/api/integrations/index.md b/docs/api/integrations/index.md index 055f0f8e..806e63f9 100644 --- a/docs/api/integrations/index.md +++ b/docs/api/integrations/index.md @@ -39,6 +39,9 @@ headers. For these integrations you need an **embed token**, used with the - [Glance](/api/integrations/glance) — Display your LibrisLog statistics on a [Glance](https://github.com/glanceapp/glance) dashboard using the custom API widget. +- [Heimdall](/api/integrations/heimdall): Display your LibrisLog statistics + on a [Heimdall](https://github.com/linuxserver/Heimdall) dashboard using the + LibrisLog enhanced app. - [Home Assistant](/api/integrations/homeassistant) — Expose your LibrisLog reading statistics as sensors in [Home Assistant](https://www.home-assistant.io/) using the RESTful diff --git a/docs/guide/using-librislog/library.md b/docs/guide/using-librislog/library.md index 439e30de..7b998972 100644 --- a/docs/guide/using-librislog/library.md +++ b/docs/guide/using-librislog/library.md @@ -63,26 +63,26 @@ Search external sources for book metadata: - **Google Books** — Requires API key (set in `.env`) - **Hardcover.app** — Requires API token (set in `.env`) -Open Library and Hardcover (if an API token is configured) are queried **in parallel** for both title and ISBN searches. Google Books is only used as a **fallback** when the other sources return no results — or on demand via the **Search Google Books too** button, which adds Google Books results to the current results. +Open Library and Hardcover (if an API token is configured) are queried **in parallel** for both title and ISBN searches. Google Books is only used as a **fallback** when the other sources return no results, or on demand via the **Search Google Books too** button, which adds Google Books results to the current results. While a search is running, the **Search** button changes to **Cancel**, so you can stop the request at any time and refine your query. #### How results are grouped -Different providers often describe the same book slightly differently (title language, page count, publisher, cover). Instead of dropping these variants, LibrisLog keeps every result and groups the ones that represent the same book. Each group shows a **"N results"** badge with a **Show editions** toggle — expand it to review the individual records and pick the one you want to import. +Different providers often describe the same book slightly differently (title language, page count, publisher, cover). Instead of dropping these variants, LibrisLog keeps every result and groups the ones that represent the same book. Each group shows a **"N results"** badge with a **Show editions** toggle: expand it to review the individual records and pick the one you want to import. Results are grouped by this rule: -- **Same ISBN** — if two results carry the same ISBN, they are grouped together. ISBN-10 and ISBN-13 forms of the same ISBN count as equal (e.g. `0441013597` and `9780441013593`). -- **No ISBN — same title + same authors** — results without an ISBN are grouped by a normalized title (case- and whitespace-insensitive) together with the same sorted author names. +- **Same ISBN**: if two results carry the same ISBN, they are grouped together. ISBN-10 and ISBN-13 forms of the same ISBN count as equal (e.g. `0441013597` and `9780441013593`). +- **No ISBN, same title + same authors**: results without an ISBN are grouped by a normalized title (case- and whitespace-insensitive) together with the same sorted author names. Consequences you may notice: -- Two results with the *same title* but **different ISBNs** are **not** grouped — they are different editions (different language, publisher, or page count) and appear as separate entries. +- Two results with the *same title* but **different ISBNs** are **not** grouped: they are different editions (different language, publisher, or page count) and appear as separate entries. - A result with an ISBN and a result without one are never grouped, even if the title and authors match. - Results that differ only in metadata (cover, publisher, page count, description) but share an ISBN or title+author are grouped so you can compare them side by side. -Because an ISBN can only be owned once per user, a group with a shared ISBN always represents a single book — importing one variant is enough. +Because an ISBN can only be owned once per user, a group with a shared ISBN always represents a single book, so importing one variant is enough. ### ISBN Barcode Scan diff --git a/docs/public/screenshots/integrations-heimdall.png b/docs/public/screenshots/integrations-heimdall.png new file mode 100644 index 00000000..0d1b0c35 Binary files /dev/null and b/docs/public/screenshots/integrations-heimdall.png differ diff --git a/docs/releases.md b/docs/releases.md index 2f86aa1d..97d1bda6 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -16,25 +16,51 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner | Version | Date | Type | |---|---|---| -| [v1.8.0](#v1-8-0-—-camera-zoom-control-optional-telemetry) | 2026-09-02 | Feature release | -| [v1.7.0](#v1-7-0-—-reading-streaks-goals) | 2026-08-26 | Feature release | -| [v1.6.0](#v1-6-0-—-reading-progress-possession-tracking) | 2026-08-23 | Feature release | -| [v1.5.2](#v1-5-2-—-maintenance) | 2026-06-22 | Maintenance | -| [v1.5.1](#v1-5-1-—-maintenance) | 2026-06-22 | Maintenance | -| [v1.5.0](#v1-5-0-—-password-reset-usability) | 2026-06-22 | Feature release | -| [v1.4.0](#v1-4-0-—-embeddable-views-arm64) | 2026-06-14 | Feature release | -| [v1.3.1](#v1-3-1-—-maintenance) | 2026-06-09 | Maintenance | -| [v1.3.0](#v1-3-0-—-more-languages) | 2026-06-09 | Feature release | -| [v1.2.2](#v1-2-2-—-maintenance) | 2026-06-08 | Maintenance | -| [v1.2.1](#v1-2-1-—-import-reliability-multi-user-consistency) | 2026-06-08 | Feature release | -| [v1.2.0](#v1-2-0-—-startup-screen-update-checks) | 2026-06-01 | Feature release | -| [v1.1.1](#v1-1-1-—-maintenance) | 2026-06-01 | Maintenance | -| [v1.1.0](#v1-1-0-—-polish-missing-covers) | 2026-05-31 | Feature release | -| [v1.0.0](#v1-0-0-—-initial-release) | 2026-05-28 | Initial release | +| [v1.9.0](#v1-9-0-smarter-import-search-input-ux) | Unreleased | Feature release | +| [v1.8.0](#v1-8-0-camera-zoom-control-optional-telemetry) | 2026-09-02 | Feature release | +| [v1.7.0](#v1-7-0-reading-streaks-goals) | 2026-08-26 | Feature release | +| [v1.6.0](#v1-6-0-reading-progress-possession-tracking) | 2026-08-23 | Feature release | +| [v1.5.2](#v1-5-2-maintenance) | 2026-06-22 | Maintenance | +| [v1.5.1](#v1-5-1-maintenance) | 2026-06-22 | Maintenance | +| [v1.5.0](#v1-5-0-password-reset-usability) | 2026-06-22 | Feature release | +| [v1.4.0](#v1-4-0-embeddable-views-arm64) | 2026-06-14 | Feature release | +| [v1.3.1](#v1-3-1-maintenance) | 2026-06-09 | Maintenance | +| [v1.3.0](#v1-3-0-more-languages) | 2026-06-09 | Feature release | +| [v1.2.2](#v1-2-2-maintenance) | 2026-06-08 | Maintenance | +| [v1.2.1](#v1-2-1-import-reliability-multi-user-consistency) | 2026-06-08 | Feature release | +| [v1.2.0](#v1-2-0-startup-screen-update-checks) | 2026-06-01 | Feature release | +| [v1.1.1](#v1-1-1-maintenance) | 2026-06-01 | Maintenance | +| [v1.1.0](#v1-1-0-polish-missing-covers) | 2026-05-31 | Feature release | +| [v1.0.0](#v1-0-0-initial-release) | 2026-05-28 | Initial release | --- -## v1.8.0 — Camera & Zoom Control, Optional Telemetry +## v1.9.0: Smarter Import Search & Input UX + + + +**Summary:** Groups duplicate import-search results into expandable edition groups, makes running searches cancelable, introduces an adaptive date input with a native picker, detects insecure camera contexts, and fixes timezone handling in the daily page statistics. + +**Features** +- 📚 **Edition groups in the import search**: results from different providers that describe the same book (same ISBN, or same title and authors) are now grouped into expandable entries with an "N results" badge. Compare the variants side by side and import the one you want; no result is dropped anymore. See the [Library guide](/guide/using-librislog/library#how-results-are-grouped) for the exact grouping rules +- 🛑 **Cancelable book search**: while an import search is running, the Search button becomes a Cancel button, so you can stop the request and refine your query +- ⌨️ **Escape closes dialogs and drawers**: overlays such as the sidebar, the book drawer, and the import modal can now be closed with the Escape key +- 📅 **Adaptive date input**: date fields in the book form now use a segmented year/month/day input that no longer assumes the month or day after the first keystroke, validates values as you type, and accepts pasting a complete date. A calendar button next to the field opens the native date picker +- 🌐 **Searchable timezone picker**: the timezone setting on the profile page is now a searchable dropdown covering all IANA timezones +- 📷 **Secure context detection in the barcode scanner**: if LibrisLog is served outside a secure context (plain HTTP on a remote host), the scan button is hidden and the scanner explains why the camera cannot start, instead of showing a black box. See the [Library guide](/guide/using-librislog/library#isbn-barcode-scan) for details +- 🔗 **Heimdall dashboard integration**: new documentation for the LibrisLog enhanced app, which shows your reading statistics directly on [Heimdall](https://github.com/linuxserver/Heimdall) tiles + +**Bug fixes** +- 🗓️ **Timezone-correct daily page statistics**: pages read between two progress updates are now attributed to calendar days in the user's timezone instead of fixed 24h slots, so the pages-per-day view matches your local days. Your heatmap may shift slightly after the upgrade +- 🏷️ **Better contrast for selected suggestion items**: the selected entry in tag and author suggestion dropdowns now has stronger contrast and a visible border in all themes + +**Breaking changes:** None. + +[Compare with v1.8.0](https://github.com/codebude/librislog/compare/v1.8.0...main) + +--- + +## v1.8.0: Camera & Zoom Control, Optional Telemetry @@ -57,7 +83,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.7.0 — Reading Streaks & Goals +## v1.7.0: Reading Streaks & Goals @@ -90,7 +116,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.6.0 — Reading Progress & Possession Tracking +## v1.6.0: Reading Progress & Possession Tracking @@ -112,7 +138,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.2 — Maintenance +## v1.5.2: Maintenance @@ -128,7 +154,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.1 — Maintenance +## v1.5.1: Maintenance @@ -143,7 +169,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.0 — Password Reset & Usability +## v1.5.0: Password Reset & Usability @@ -165,7 +191,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.4.0 — Embeddable Views & ARM64 +## v1.4.0: Embeddable Views & ARM64 @@ -187,7 +213,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.3.1 — Maintenance +## v1.3.1: Maintenance @@ -202,7 +228,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.3.0 — More Languages +## v1.3.0: More Languages @@ -219,7 +245,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.2 — Maintenance +## v1.2.2: Maintenance @@ -234,7 +260,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.1 — Import Reliability & Multi-User Consistency +## v1.2.1: Import Reliability & Multi-User Consistency @@ -256,7 +282,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.0 — Startup Screen & Update Checks +## v1.2.0: Startup Screen & Update Checks @@ -272,7 +298,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.1.1 — Maintenance +## v1.1.1: Maintenance @@ -289,7 +315,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.1.0 — Polish & Missing Covers +## v1.1.0: Polish & Missing Covers @@ -307,7 +333,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.0.0 — Initial Release +## v1.0.0: Initial Release