diff --git a/pages/fundamentals/data-durability.mdx b/pages/fundamentals/data-durability.mdx
index 123d1c917..6f3bc7c9a 100644
--- a/pages/fundamentals/data-durability.mdx
+++ b/pages/fundamentals/data-durability.mdx
@@ -95,6 +95,39 @@ via `--storage-snapshot-retention-count`.
enforces periodic snapshots when WAL is enabled and will fail to start if WAL is
enabled with snapshot interval set to zero.
+
WAL data integrity
+
+
+Per-transaction WAL checksums were introduced in Memgraph v3.12.
+
+WAL files written by older versions do not contain checksums and are recovered
+without integrity verification. Checksum verification applies only to WAL files
+written by Memgraph v3.12 or newer.
+
+
+To guard against silent on-disk corruption, Memgraph protects WAL files with
+[CRC32](https://en.wikipedia.org/wiki/Cyclic_redundancy_check) checksums:
+
+- The **WAL file header** (offsets and metadata such as the UUID, epoch ID and
+ sequence number) is protected by its own checksum.
+- **Each transaction** is protected by a 4-byte checksum covering the
+ transaction's bytes (transaction start, deltas and transaction end).
+
+Checksums are verified automatically during recovery. If a transaction's stored
+checksum does not match the recomputed value, the WAL is considered corrupted at
+that point and recovery stops, so corrupted data is never applied to the
+database. A mismatch in the WAL header causes recovery from that file to fail.
+
+The same checksums protect WAL files that are buffered on disk on a replica
+before being applied, so corruption introduced between the main and the replica
+is detected before the data is committed. Deltas streamed during the commit
+(`PrepareCommitRpc`) are not checksummed because the TCP transport already
+provides integrity guarantees.
+
+
+Snapshots are not yet protected by checksums.
+
+
### Snapshots
Snapshots provide a faster way to restore the states of your database. Snapshots
are created periodically based on the value defined with the
diff --git a/pages/querying/functions.mdx b/pages/querying/functions.mdx
index 2c1613f39..6ff140a23 100644
--- a/pages/querying/functions.mdx
+++ b/pages/querying/functions.mdx
@@ -182,7 +182,7 @@ All aggregation functions can be used with the `DISTINCT` operator to perform ca
| `endsWith` | `endsWith(string: string, substring: string) -> (boolean)` | Check if the first argument ends with the second. |
| `left` | `left(string: string, count: integer) -> (string)` | Returns a string containing the specified number of leftmost characters of the original string. |
| `lTrim` | `lTrim(string: string) -> (string)` | Returns the original string with leading whitespace removed. |
-| `replace` | `replace(string: string, search-string: string, replacement-string: string) -> (string)` | Returns a string in which all occurrences of a specified string in the original string have been replaced by another (specified) string. |
+| `replace` | `replace(string: string, search-string: string, replacement-string: string) -> (string)` | Returns a string in which all occurrences of a specified string in the original string have been replaced by another (specified) string. An empty `search-string` matches at every position. |
| `reverse` | `reverse(string: string) -> (string)` | Returns a string in which the order of all characters in the original string have been reversed. |
| `right` | `right(string: string, count: integer) -> (string)` | Returns a string containing the specified number of rightmost characters of the original string. |
| `rTrim` | `rTrim(string: string) -> (string)` | Returns the original string with trailing whitespace removed. |
diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx
index 9b2d57b16..517b5e040 100644
--- a/pages/release-notes.mdx
+++ b/pages/release-notes.mdx
@@ -46,6 +46,42 @@ guide.
## 🚀 Latest release
+### Memgraph v3.12.0 - July 29th, 2026
+
+{✨ New features
}
+
+- Added `--storage-light-edge` (default `false`) to opt into a compact light-edge
+ storage path for lower memory use on edge-heavy graphs. The flag must be enabled
+ at startup; when off, behavior is unchanged.
+ [#4228](https://github.com/memgraph/memgraph/pull/4228)
+- Light-edge storage (with `--storage-light-edge`) uses a dedicated edge pool and
+ graveyard reclamation for create, find, and delete, reducing per-edge memory
+ overhead while keeping transactional semantics.
+ [#4271](https://github.com/memgraph/memgraph/pull/4271)
+
+{🛠️ Improvements
}
+
+- WAL files are now protected with CRC32 checksums. The WAL header and each
+ transaction carry their own checksum, which is verified during recovery and on
+ replicas before the data is applied, so silent on-disk corruption is detected
+ instead of being recovered. WAL files written by older versions remain
+ recoverable without verification.
+ [#4225](https://github.com/memgraph/memgraph/pull/4225)
+
+{🐞 Bug fixes
}
+
+- Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. [#4269](https://github.com/memgraph/memgraph/pull/4269)
+- Fixed Bolt 4.4 clients receiving routing tables from data instances and
+ incorrectly defaulting the target database. Data instances now reject routing
+ requests, and database selection over Bolt 4.4 works as expected.
+ [#4270](https://github.com/memgraph/memgraph/pull/4270)
+
+### Lab v3.12.0 - July 29th, 2026
+
+
+
+## Previous releases
+
### Memgraph v3.11.0 - June 17th, 2026
{⚠️ Breaking changes
}
@@ -320,8 +356,6 @@ guide.
-## Previous releases
-
### Memgraph v3.10.1 - May 15th, 2026
{🐞 Bug fixes
}