docs: update release notes

This commit is contained in:
jakeaturner 2026-06-09 19:02:05 +00:00
parent 37ad684fbd
commit 5eb208fb50
No known key found for this signature in database
GPG Key ID: B1072EBDEECE328D
5 changed files with 211 additions and 0 deletions

29
NEXT_RELEASE.md Normal file
View File

@ -0,0 +1,29 @@
https://github.com/Crosstalk-Solutions/project-nomad/pull/976
https://github.com/Crosstalk-Solutions/project-nomad/pull/989
https://github.com/Crosstalk-Solutions/project-nomad/pull/990
https://github.com/Crosstalk-Solutions/project-nomad/pull/861
https://github.com/Crosstalk-Solutions/project-nomad/pull/939
https://github.com/Crosstalk-Solutions/project-nomad/pull/961
https://github.com/Crosstalk-Solutions/project-nomad/pull/991
https://github.com/Crosstalk-Solutions/project-nomad/pull/977
https://github.com/Crosstalk-Solutions/project-nomad/pull/975
https://github.com/Crosstalk-Solutions/project-nomad/pull/978
https://github.com/Crosstalk-Solutions/project-nomad/pull/980
https://github.com/Crosstalk-Solutions/project-nomad/pull/983
https://github.com/Crosstalk-Solutions/project-nomad/pull/985
https://github.com/Crosstalk-Solutions/project-nomad/pull/991
https://github.com/Crosstalk-Solutions/project-nomad/pull/986
https://github.com/Crosstalk-Solutions/project-nomad/pull/993
https://github.com/Crosstalk-Solutions/project-nomad/pull/995
https://github.com/Crosstalk-Solutions/project-nomad/pull/994
https://github.com/Crosstalk-Solutions/project-nomad/pull/997
https://github.com/Crosstalk-Solutions/project-nomad/pull/998
https://github.com/Crosstalk-Solutions/project-nomad/pull/999
https://github.com/Crosstalk-Solutions/project-nomad/pull/1000
https://github.com/Crosstalk-Solutions/project-nomad/pull/940
https://github.com/Crosstalk-Solutions/project-nomad/pull/981
https://github.com/Crosstalk-Solutions/project-nomad/pull/954
https://github.com/Crosstalk-Solutions/project-nomad/pull/996
https://github.com/Crosstalk-Solutions/project-nomad/pull/1001
https://github.com/Crosstalk-Solutions/project-nomad/pull/1002
https://github.com/Crosstalk-Solutions/project-nomad/pull/1003

37
NEXT_RELEASE_NOTES.md Normal file
View File

@ -0,0 +1,37 @@
## Version 1.33.0 - June 9, 2026
> Note: version number and date are a best guess for review — adjust as needed before publishing.
### Features
- **Automatic App Updates**: Installed apps (the "Supply Depot" sibling containers) can now keep themselves up to date with opt-in, hands-off minor/patch updates, mirroring the core auto-update feature. Updates are gated behind a two-level opt-in — a global master switch in Settings → Updates **and** a per-app toggle in the Supply Depot — and respect the shared update window, cool-off period, disk/in-progress pre-flight checks, and per-app failure backoff. Major versions are never auto-applied. Thanks @jakeaturner for the contribution!
- **Automatic Content Updates**: Completing the auto-update trilogy, installed Kiwix ZIM files and PMTiles maps can now update themselves on an opt-in basis. Content updates run on their own dedicated overnight window and bandwidth cap (separate from the app/core schedule, since content downloads are multi-GB), check the upstream Kiwix and PMTiles catalogs directly, and keep the AI Knowledge Base in sync when a ZIM is replaced. Thanks @jakeaturner for the contribution!
- **Supply Depot — Custom Launch URLs**: You can now override an app's "Open" link with a reverse-proxy or local-DNS address (e.g. `https://jellyfin.myhomelab.net`). The override is stored separately so the default link is always recoverable, survives reseeds/upgrades, and is validated on both client and server. Thanks @jakeaturner for the contribution!
- **Supply Depot — Version & Update visibility**: App cards now show the installed version next to the app name (e.g. `Kiwix · 3.7.0`), and the "Update available" pill now stands out with a solid desert-orange fill so available updates actually draw the eye. Thanks @chriscrosstalk for the contribution!
- **Maps — Persistent View**: The Maps page now remembers your position and zoom across refreshes instead of resetting to the default US-wide view. The saved view is bounds-checked, so a corrupt value safely falls back to the default. Thanks @chriscrosstalk for the contribution!
- **Configuration — Redis database selection**: Added a `REDIS_DB` environment variable so operators can pick a Redis logical database (015) for the job queue and live-update transport. This prevents key collisions when a single Redis instance is shared across multiple stacks (common in homelabs). Defaults to db 0, preserving existing behavior. Thanks @johno10661 for the contribution!
### Bug Fixes
- **Storage**: When the admin storage volume is relocated to another disk, child apps (Kiwix, Ollama, Qdrant, Flatnotes, Kolibri) now automatically follow to the new location instead of mounting the old, empty path. The host storage root is now derived from the admin's actual mount, with an explicit `NOMAD_STORAGE_PATH` override and clearer compose comments. Thanks @chriscrosstalk for the fix!
- **System**: A failed service update now rolls back to the previous container if the new one fails to start, so the service stays up on the old version instead of being left down. Also clears any stale leftover container so a retry can't wedge indefinitely. Thanks @chriscrosstalk for the fix!
- **System**: Service install failures caused by a host port conflict (commonly a native Ollama install already on port 11434) now show a clear, actionable message with the exact commands to resolve it, instead of a raw Docker error. Thanks @chriscrosstalk for the fix!
- **System**: The per-service Update button is now disabled and shows "Updating..." while an update is in flight, preventing double-clicks that previously raced into Docker errors. The in-progress state is durable, so it survives a page reload during a multi-GB pull. Thanks @chriscrosstalk for the fix!
- **System Updates**: Update checks no longer crash for images with more than 1,000 tags (Ollama, Filebrowser). Registry pagination URLs are now resolved correctly, so the "Check for Updates" flow returns versions instead of failing silently — fixing Ollama appearing pinned at an old version. Thanks @chriscrosstalk for the fix!
- **System**: Internet status checks no longer report "No internet connection" on networks that block or hijack Cloudflare's 1.1.1.1. The check now probes additional hosts the app already contacts (GitHub and the Project N.O.M.A.D. API) in parallel and accepts any HTTP response as "online." Thanks @akashsalan for the fix!
- **AI Assistant**: Oversized embedding chunks are now truncated and retried instead of being silently dropped, ending the retry storm that could peg the GPU and flood logs (the "api/embed for weeks" issue). The OpenAI-compatible fallback path now also passes context and truncation settings. Thanks @chriscrosstalk for the fix!
- **AI Assistant**: Chat suggestions now use your selected model (falling back to the *smallest* installed model) instead of the largest. This prevents a flagship model that exceeds available VRAM from hanging the chat page and returning a 500 error. Thanks @johno10661 for the fix!
- **Knowledge Base**: The embedded-chunk count for batched ZIM ingestion is now persisted accurately across continuation batches, instead of reporting only the final batch's count. Thanks @Metbcy for the fix!
- **Knowledge Base**: The "ingestion may have stalled" (partial-stall) warning no longer fires falsely on link-out- or PDF-heavy ZIMs that legitimately have little embeddable text. Thanks @chriscrosstalk for the fix!
- **Knowledge Base**: ZIM ingestion progress no longer freezes at 99% on multi-page archives (e.g. iFixit). Progress now creeps forward monotonically and only reports 100% on the genuinely final batch. Thanks @chriscrosstalk for the fix!
- **Content**: Installing a newer version of a curated map or ZIM now removes the superseded file from disk, preventing silent accumulation of orphaned content (potentially hundreds of GB). Deletion is gated behind strict safety rails — only tracked, genuinely-replaced, strictly-newer files within the content store are ever removed; sideloaded files are never touched. Thanks @chriscrosstalk for the fix!
- **Content**: Curated Wikipedia-themed ZIMs (e.g. `wikipedia_en_medicine_maxi` from Medicine → Comprehensive) are no longer wiped on restart. Reconciliation now skips only the single file actually managed by the Wikipedia selector, matched by exact filename. Thanks @chriscrosstalk for the fix!
- **Maps**: Having both an old and new copy of the same map region on disk no longer blanks the entire map. Map sources are now de-duplicated to the newest file per region, and already-broken installs recover automatically on the next page load. Thanks @chriscrosstalk for the fix!
- **Information Library (Kiwix)**: Kiwix now self-heals a missing or corrupt library file on startup by rebuilding it from the ZIM files on disk, instead of coming up with an empty library and no path to recovery. Thanks @chriscrosstalk for the fix!
- **Docker**: Failed image pulls (dropped/metered connection, bad manifest, disk full mid-pull) are now correctly treated as failures across all pull paths, instead of proceeding to create a container from a missing or partial image and surfacing a confusing downstream error. Thanks @chriscrosstalk for the fix!
- **Security**: Hardened the private-URL/SSRF guard by replacing the regex blocklist with proper IP-range classification (`ipaddr.js`) and normalizing the host first. This blocks alternate IP encodings and trailing-dot bypasses (e.g. `localhost.`) while no longer over-blocking legitimate public addresses. RFC1918 ranges and bare LAN hostnames remain allowed for local appliances. Thanks @chriscrosstalk for the fix!
- **Install**: Hardened the install script — the NVIDIA toolkit GPG step now runs non-interactively so it doesn't silently skip on non-TTY installs, and helper-script downloads now retry to reduce transient partial-install failures. Thanks @Gujiassh for the fix!
### Improvements
- **License & Docs**: Corrected the package license metadata to `Apache-2.0` (the project has been Apache-2.0 for some time), added a real project description, and fixed a dead Troubleshooting link plus several README typos. Thanks @chriscrosstalk for the contribution!
- **Dependencies**: Bumped React and React DOM. Thanks @jakeaturner for the contribution!
- **Dependencies**: Bumped autoprefixer. Thanks @jakeaturner for the contribution!
- **Dependencies**: Bumped BullMQ to 5.77.6 and updated affected job calls to the new arguments shape. Thanks @jakeaturner for the contribution!

56
NEXT_RELEASE_OVERVIEW.md Normal file
View File

@ -0,0 +1,56 @@
# Next Release — Overview for RC/Beta Testers
This release's headline is the **automatic-update trilogy** finally coming together, plus a batch of reliability fixes for updates, content management, the Knowledge Base, and maps. A lot of this cycle was hardening real-world failure modes reported by the community.
## Headline: Auto-Update Trilogy is complete
NOMAD can now keep itself current at three layers, each **opt-in and off by default**:
1. **Core / Admin** — already shipped previously.
2. **Installed Apps (Supply Depot)***new this release.* Hands-off minor/patch updates for sibling-container apps.
3. **Installed Content (ZIM + Maps)***new this release.* Opt-in updater for Kiwix ZIM files and PMTiles maps.
Key design points testers should understand:
- **App updates use a two-level opt-in**: a global master switch (Settings → Updates) **and** a per-app toggle (Supply Depot). Both must be on. This is deliberate — third-party app images are outside our control, so each app's auto-update requires an explicit choice.
- **Content updates are separate on purpose**: they run on their own overnight window and bandwidth cap because ZIM downloads are multi-GB. The UI strongly recommends setting a cap.
- **Major versions are never auto-applied.** Only minor/patch.
- Both features have **failure backoff / self-disable** so a misbehaving upstream can't loop forever, and **pre-flight checks** (disk space, no downloads in progress) gate every run.
- When content auto-updates replace a ZIM, the **AI Knowledge Base mirrors the prior indexed state** (re-indexes if it was indexed, leaves it alone if not).
## Update reliability fixes (these unblock the above)
- **Update checks no longer crash on high-tag-count images** (Ollama, Filebrowser had >1000 tags). Previously Ollama appeared "stuck" at an old version because the check failed before evaluating newer tags.
- **Failed service updates now roll back** to the previous container instead of leaving the service down — and no longer wedge on retry.
- **The Update button now disables + shows "Updating..."** during in-flight updates and survives a page reload, preventing double-click races.
- **Port-conflict errors are now human-readable** (e.g. a native Ollama already on :11434 now gives you the exact fix commands).
- **App cards now show the installed version** and a much more visible orange "Update available" pill.
## Knowledge Base / AI Assistant
- **Embed retry storm fixed**: oversized chunks are truncated-and-retried instead of silently dropped and re-embedded 30× (the "pegged GPU / api/embed for weeks" issue).
- **ZIM ingestion progress no longer freezes at 99%** on multi-page archives (iFixit).
- **Accurate embedded-chunk counts** across batched ZIM ingestion.
- **No more false "ingestion stalled" warnings** on link-out/PDF-heavy ZIMs that legitimately have little text.
- **Chat suggestions** now use your selected model (or the smallest installed), so a too-large flagship model can't hang the chat page.
## Maps
- **View persists across refresh** (position + zoom).
- **Duplicate region files no longer blank the entire map**; broken installs self-recover on next load.
## Content management
- **Superseded curated files are now cleaned up** when a newer version installs (no more silent multi-GB orphan accumulation), behind strict safety rails so sideloaded files are never touched.
- **Curated Wikipedia-themed ZIMs no longer get wiped on restart.**
## Storage / Install / System / Security
- **Relocating the admin storage volume now moves child apps with it** (Kiwix no longer comes up empty after moving storage to another disk).
- **Kiwix self-heals a missing/corrupt library file on startup.**
- **Failed Docker image pulls are now treated as failures** instead of proceeding with a partial image.
- **False "No internet connection" reports fixed** on networks that block Cloudflare 1.1.1.1.
- **Install script hardened** (non-interactive NVIDIA GPG step, download retries).
- **SSRF / private-URL guard hardened** with proper IP-range classification and host normalization.
- **New `REDIS_DB` env var** to pick a Redis logical database (homelab shared-Redis scenarios).
## Also
- License metadata corrected to Apache-2.0; README link/typo fixes.
- Dependency bumps: React / React DOM, autoprefixer, BullMQ 5.77.6.
## Honesty notes for testers
Several fixes were verified by logic/typecheck and unit tests but flagged for **live validation on a real NOMAD host** by their authors — particularly: dense-ZIM embedding (no retry storm), multi-page ZIM progress, superseded-file cleanup (two-version install), storage relocation on a moved-disk box, and the post-#999 update-check flow. These are good targets for hands-on testing.

47
NEXT_RELEASE_QA.md Normal file
View File

@ -0,0 +1,47 @@
# Next Release — QA / Smoke-Test Checklist for RC/Beta Testers
High-level things to poke at. No need to go deep on internals — just confirm the happy path works and the new toggles behave. Items marked ⭐ are the highest-value live tests (authors specifically asked for real-host validation).
## Automatic Updates (new)
- [ ] **Settings → Updates** loads and shows the new sections: Core, Automatic App Updates, and Content Updates.
- [ ] **App auto-updates are off by default.** Confirm the global master switch and each per-app toggle (Supply Depot → Manage) start off.
- [ ] With the master switch **off**, a per-app toggle reads "App auto-updates off — open Settings" and takes you to the Updates page.
- [ ] Turn on the master switch + one app's toggle; confirm it persists across a reload and shows eligibility / cool-off / last-run status.
- [ ] **Content Updates**: enable the opt-in switch, confirm it prompts/recommends setting a bandwidth cap and uses its own overnight window.
- [ ] (If feasible) ⭐ Let an eligible app or content item actually auto-update in its window and confirm it succeeds and reflects the new version.
## Update reliability
- [ ] ⭐ **Check for Updates** on a box with **Ollama** installed — it should return versions (not silently fail / appear pinned).
- [ ] Trigger a service update (e.g. AI Assistant/Ollama). The **Update button disables and shows "Updating..."**, and the activity feed shows live progress.
- [ ] Reload the page mid-update — the button stays disabled (state is durable).
- [ ] Click Update twice quickly — the second click is rejected cleanly, no Docker error.
- [ ] **Port conflict message**: with a native Ollama running on :11434, attempt to install/start nomad_ollama and confirm you get a clear message with fix commands (not a raw Docker error).
- [ ] ⭐ Force a service update to fail to start and confirm the **old container is restored** (service stays up) and a retry isn't wedged.
- [ ] App cards show the **installed version** (e.g. `Kiwix · 3.7.0`) and a visible **orange "Update available"** pill where applicable.
## AI Assistant / Knowledge Base
- [ ] ⭐ Ingest a **dense ZIM** (e.g. medlineplus / a stackexchange ZIM) on a CPU/low-VRAM box — confirm **no endless `api/embed` loop**, no pegged GPU, and Qdrant point count grows.
- [ ] ⭐ Ingest a **multi-page ZIM** (iFixit) — progress should climb smoothly and **not freeze at 99%**; it completes.
- [ ] Ingest a **link-out/PDF-heavy ZIM** — confirm it does **not** show a false "ingestion may have stalled" warning.
- [ ] After batched ZIM ingestion, the reported **embedded-chunk count looks right** (not absurdly low vs. what was stored).
- [ ] **Chat suggestions** load quickly and don't error, even with a large model on disk; they use your selected model.
## Maps
- [ ] Pan/zoom the map, **refresh** — the view is restored (not reset to US-wide).
- [ ] If you have an old + new copy of the same region on disk, the **map still renders** (doesn't go fully blank).
## Content management
- [ ] ⭐ Install a curated map or ZIM, then install a **newer version** — confirm the **old file is removed**, the new one is present and served, and any **sideloaded** same-resource file is left untouched.
- [ ] Install a curated **Wikipedia-themed ZIM** (e.g. Medicine → Comprehensive), **restart**, and confirm it's **still listed** (not wiped, tier not downgraded).
## Storage / Install / System
- [ ] ⭐ **Relocate the admin storage volume** to another disk (via compose) and confirm Kiwix and other child apps find their content at the new location (Kiwix not empty).
- [ ] Delete/corrupt the Kiwix library file, restart — Kiwix **self-heals** and serves content again.
- [ ] On a network that blocks Cloudflare 1.1.1.1, confirm NOMAD does **not** show "No internet connection" while downloads work.
- [ ] Run the install script on a non-TTY / scripted environment — NVIDIA toolkit setup is **not** silently skipped.
- [ ] (Homelab) Set `REDIS_DB=10` and confirm queue jobs and live updates work without colliding with other Redis users.
## Sanity / regression
- [ ] Default install (no storage relocation, no auto-update opt-in) behaves exactly as before — none of the new gates change default behavior.
- [ ] App "Open" links work; setting a **custom URL** on an app overrides the link and shows the live "Opens as:" preview; clearing it restores the default.
- [ ] General UI smoke: dashboard, Supply Depot, Content Manager, Maps, AI chat all load without console errors.

View File

@ -1,5 +1,47 @@
# Release Notes
## Unreleased
### Features
- **Supply Depot — Custom Apps**: The Supply Depot is NOMAD's new home for installable apps, and it now lets you run your *own* custom Docker containers — not just the curated catalog. Specify an image, port mappings, volume binds, environment variables, and memory/CPU limits, and NOMAD spins it up as a managed sibling container. A live, debounced pre-flight check warns about port conflicts and resource limits as you type and hard-blocks unsafe configurations, with an "install anyway" override for warning-only cases (e.g. an untrusted registry or a `:latest` tag). Installed custom apps can be edited, updated (re-pull latest + recreate with a safe rollback if the new container fails), and removed (optionally deleting the image), and every installed app — curated or custom — gets per-container **Logs** and **Stats** modals. Host-path binds are hardened against escapes and logs/stats are scoped to NOMAD-managed containers only. Thanks @jakeaturner for the contribution!
- **Supply Depot — Curated App Onboarding & Fixes**: Each curated app now ships with NOMAD-specific getting-started docs (first run, default logins, where data lives, what does and doesn't work offline), deep-linked from a **Manage Docs** item on the card. Alongside it is a round of install fixes so the nine documented apps — Stirling PDF, File Browser, Calibre-Web, IT Tools, Excalidraw, Homebox, Vaultwarden, Jellyfin, Meshtastic Web — work out of the box: seeded logins instead of random passwords buried in logs, a bundled Calibre library, HTTPS-by-default where the app requires a secure context (Vaultwarden), corrected internal ports (Meshtastic Web), pre-created media folders (Jellyfin), and a swap to a maintained image (Homebox). You can now also **edit curated apps**, not just custom ones — edits are merged into the app's existing config (preserving advanced settings like GPU device requests) and flag the app so the seeder stops overwriting it, while untouched apps still receive catalog updates. Thanks @chriscrosstalk for the contribution!
- **Automatic Core Updates**: NOMAD's own admin/core image can now update itself hands-off, gated by layered safety checks. It's opt-in and off by default, runs only inside a user-configured time window, and applies only same-major, strictly-newer GA releases (major bumps stay manual) past a configurable cool-off — behind pre-flight checks for the update sidecar, no in-flight updates/downloads/installs, and sufficient host disk. It auto-disables after repeated genuine failures, while transient offline release lookups are treated as harmless skips. Settings → Updates exposes the toggle, window, cool-off, and live status. This is the first leg of the auto-update trilogy. Thanks @jakeaturner for the contribution!
- **Automatic App Updates**: Installed apps (the "Supply Depot" sibling containers) can now keep themselves up to date with opt-in, hands-off minor/patch updates, mirroring the core auto-update feature. Updates are gated behind a two-level opt-in — a global master switch in Settings → Updates **and** a per-app toggle in the Supply Depot — and respect the shared update window, cool-off period, disk/in-progress pre-flight checks, and per-app failure backoff. Major versions are never auto-applied. Thanks @jakeaturner for the contribution!
- **Automatic Content Updates**: Completing the auto-update trilogy, installed Kiwix ZIM files and PMTiles maps can now update themselves on an opt-in basis. Content updates run on their own dedicated overnight window and bandwidth cap (separate from the app/core schedule, since content downloads are multi-GB), check the upstream Kiwix and PMTiles catalogs directly (no more reliance on external Project N.O.M.A.D. API), and keep the AI Knowledge Base in sync when a ZIM is replaced. Thanks @jakeaturner for the contribution!
- **Supply Depot — Custom Launch URLs**: You can now override an app's "Open" link with a reverse-proxy or local-DNS address (e.g. `https://jellyfin.myhomelab.net`). The override is stored separately so the default link is always recoverable, survives reseeds/upgrades, and is validated on both client and server. Thanks @jakeaturner for the contribution!
- **Supply Depot — Version & Update visibility**: App cards now show the installed version next to the app name (e.g. `Kiwix · 3.7.0`), and the "Update available" pill now stands out with a solid desert-orange fill so available updates actually draw the eye. Thanks @chriscrosstalk for the contribution!
- **Maps — Persistent View**: The Maps page now remembers your position and zoom across refreshes instead of resetting to the default US-wide view. The saved view is bounds-checked, so a corrupt value safely falls back to the default. Thanks @chriscrosstalk for the contribution!
- **Content Manager — Rescan Library**: A new "Rescan Library" button rebuilds the Kiwix index from the ZIM files currently on disk, so files **sideloaded** outside NOMAD's download flow (USB stick, SSH, network share) can be served without dropping to a terminal. It reports how many new books were found and, in library mode, hot-reloads without a container restart. Thanks @chriscrosstalk for the contribution!
- **Configuration — Redis database selection**: Added a `REDIS_DB` environment variable so operators can pick a Redis logical database (015) for the job queue and live-update transport. This prevents key collisions when a single Redis instance is shared across multiple stacks (common in homelabs). Defaults to db 0, preserving existing behavior. Thanks @johno10661 for the contribution!
### Bug Fixes
- **Storage**: When the admin storage volume is relocated to another disk, child apps (Kiwix, Ollama, Qdrant, Flatnotes, Kolibri) now automatically follow to the new location instead of mounting the old, empty path. The host storage root is now derived from the admin's actual mount, with an explicit `NOMAD_STORAGE_PATH` override and clearer compose comments. Thanks @chriscrosstalk for the fix!
- **System**: A failed service update now rolls back to the previous container if the new one fails to start, so the service stays up on the old version instead of being left down. Also clears any stale leftover container so a retry can't wedge indefinitely. Thanks @chriscrosstalk for the fix!
- **System**: Service install failures caused by a host port conflict (commonly a native Ollama install already on port 11434) now show a clear, actionable message with the exact commands to resolve it, instead of a raw Docker error. Thanks @chriscrosstalk for the fix!
- **System**: The per-service Update button is now disabled and shows "Updating..." while an update is in flight, preventing double-clicks that previously raced into Docker errors. The in-progress state is durable, so it survives a page reload during a multi-GB pull. Thanks @chriscrosstalk for the fix!
- **System Updates**: Update checks no longer crash for images with more than 1,000 tags (e.g Ollama). Registry pagination URLs are now resolved correctly, so the "Check for Updates" flow returns versions instead of failing silently — fixing Ollama appearing pinned at an old version. Thanks @chriscrosstalk for the fix!
- **System**: Internet status checks no longer report "No internet connection" on networks that block or hijack Cloudflare's 1.1.1.1. The check now probes additional hosts the app already contacts (GitHub and the Project N.O.M.A.D. API) in parallel and accepts any HTTP response as "online." Thanks @akashsalan for the fix!
- **AI Assistant**: Oversized embedding chunks are now truncated and retried instead of being silently dropped, ending the retry storm that could peg the GPU and flood logs (the "api/embed for weeks" issue). The OpenAI-compatible fallback path now also passes context and truncation settings. Thanks @chriscrosstalk for the fix!
- **AI Assistant**: Chat suggestions now use your selected model (falling back to the *smallest* installed model) instead of the largest. This prevents a flagship model that exceeds available VRAM from hanging the chat page and returning a 500 error. Thanks @johno10661 for the fix!
- **AI Assistant**: The assistant no longer disclaims "Sorry, I couldn't find specific context regarding X..." when relevant material was actually retrieved. The RAG prompt now treats retrieved context as the authoritative source and falls back to general knowledge silently, the model-visible relevance scores that primed smaller models to distrust correct context were replaced with neutral source-title labels, and a conservative heading-match boost improves the ranking of already-retrieved chunks. Thanks @jakeaturner for the fix!
- **Knowledge Base**: The embedded-chunk count for batched ZIM ingestion is now persisted accurately across continuation batches, instead of reporting only the final batch's count. Thanks @Metbcy for the fix!
- **Knowledge Base**: The "ingestion may have stalled" (partial-stall) warning no longer fires falsely on link-out- or PDF-heavy ZIMs that legitimately have little embeddable text. Thanks @chriscrosstalk for the fix!
- **Knowledge Base**: ZIM ingestion progress no longer freezes at 99% on multi-page archives (e.g. iFixit). Progress now creeps forward monotonically and only reports 100% on the genuinely final batch. Thanks @chriscrosstalk for the fix!
- **Content**: Installing a newer version of a curated map or ZIM now removes the superseded file from disk, preventing silent accumulation of orphaned content (potentially hundreds of GB). Deletion is gated behind strict safety rails — only tracked, genuinely-replaced, strictly-newer files within the content store are ever removed; sideloaded files are never touched. Thanks @chriscrosstalk for the fix!
- **Content**: Curated Wikipedia-themed ZIMs (e.g. `wikipedia_en_medicine_maxi` from Medicine → Comprehensive) are no longer wiped on restart. Reconciliation now skips only the single file actually managed by the Wikipedia selector, matched by exact filename. Thanks @chriscrosstalk for the fix!
- **Maps**: Having both an old and new copy of the same map region on disk no longer blanks the entire map. Map sources are now de-duplicated to the newest file per region, and already-broken installs recover automatically on the next page load. Thanks @chriscrosstalk for the fix!
- **Information Library (Kiwix)**: Kiwix now self-heals a missing or corrupt library file on startup by rebuilding it from the ZIM files on disk, instead of coming up with an empty library and no path to recovery. Thanks @chriscrosstalk for the fix!
- **Docker**: Failed image pulls (dropped/metered connection, bad manifest, disk full mid-pull) are now correctly treated as failures across all pull paths, instead of proceeding to create a container from a missing or partial image and surfacing a confusing downstream error. Thanks @chriscrosstalk for the fix!
- **Security**: Hardened the private-URL/SSRF guard by replacing the regex blocklist with proper IP-range classification (`ipaddr.js`) and normalizing the host first. This blocks alternate IP encodings and trailing-dot bypasses (e.g. `localhost.`) while no longer over-blocking legitimate public addresses. RFC1918 ranges and bare LAN hostnames remain allowed for local appliances. Thanks @chriscrosstalk for the fix!
- **Install**: Hardened the install script — the NVIDIA toolkit GPG step now runs non-interactively so it doesn't silently skip on non-TTY installs, and helper-script downloads now retry to reduce transient partial-install failures. Thanks @Gujiassh for the fix!
### Improvements
- **License & Docs**: Corrected the package license metadata to `Apache-2.0` (the project has been Apache-2.0 for some time), added a real project description, and fixed a dead Troubleshooting link plus several README typos. Thanks @aqilaziz for the contribution!
- **Docs**: Fixed a few typos and punctuation in the README. Thanks @teccdev for the contribution!
- **Dependencies**: Bumped React and React DOM. Thanks @jakeaturner for the contribution!
- **Dependencies**: Bumped autoprefixer. Thanks @jakeaturner for the contribution!
- **Dependencies**: Bumped BullMQ to 5.77.6 and updated affected job calls to the new arguments shape. Thanks @jakeaturner for the contribution!
## Version 1.32.1 - May 27, 2026
### Features