diff --git a/CHANGELOG.md b/CHANGELOG.md
index f23c37e..7850664 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,11 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
---
+## [1.20.39] — 2026-08-19
+
+### Changed
+- **Low-memory devices now receive conservative batch concurrency.** Shared frontend worker pools cap themselves at two concurrent tasks when the browser reports approximately 4 GB RAM or less, reducing memory spikes during bulk operations.
+
## [1.20.38] — 2026-08-19
### Added
diff --git a/TODO.md b/TODO.md
index ab08e5c..22668aa 100644
--- a/TODO.md
+++ b/TODO.md
@@ -37,7 +37,7 @@ Priority levels:
- [ ] Update only affected table rows instead of rebuilding entire tables.
- [ ] Add an LRU cache for audio and images and remove old entries automatically.
- [ ] Revoke discarded object URLs with `URL.revokeObjectURL(objectUrl)`.
-- [ ] Add low-memory mode using `navigator.deviceMemory` where available.
+- [x] Add low-memory mode using `navigator.deviceMemory` where available; shared worker pools cap at two tasks on devices reporting approximately 4 GB RAM or less.
- [ ] Disable image preloading and reduce table/cache sizes on devices with approximately 4 GB RAM.
## P1 — Backend stability and bounded concurrency
diff --git a/VERSION b/VERSION
index 2bd71a6..df40f00 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.20.38
+1.20.39
diff --git a/static/index.html b/static/index.html
index b583fac..7cdb9f4 100644
--- a/static/index.html
+++ b/static/index.html
@@ -10,7 +10,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -378,7 +378,7 @@ window.toggleNavTree = function(treeId, chevronId) {
-
+