diff --git a/CHANGELOG.md b/CHANGELOG.md
index 47dd011dc6..bba0674a49 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+# 0.204.1 (2026-04-10)
+
+### CKB Node & Light Client
+
+- [CKB@v0.204.0](https://github.com/nervosnetwork/ckb/releases/tag/v0.204.0) was released on Dec. 15th, 2025. This version of CKB node is now bundled and preconfigured in Neuron.
+- [CKB Light Client@v0.5.4](https://github.com/nervosnetwork/ckb-light-client/releases/tag/v0.5.4) was released on Jan. 2nd, 2026. This version of CKB Light Client is now bundled and preconfigured in Neuron
+
+### Assumed valid target
+
+Block before `0xa76ecc34238a30151211f63a09e6063ac7e7e760866b9be73b7560e3a95d3a50`(at height `18,298,596`) will be skipped in validation.(https://github.com/nervosnetwork/neuron/pull/3428)
+
+---
+
+## Bug fixes
+
+- #3465: Harden release notes rendering and privileged window navigation.(@zhangyaning)
+
+**Full Changelog**: https://github.com/nervosnetwork/neuron/compare/v0.204.0...v0.204.1
+
# 0.204.0 (2026-01-12)
### Caveat
diff --git a/lerna.json b/lerna.json
index 819f84c2ad..fda238f305 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,6 +1,6 @@
{
"packages": ["packages/*"],
- "version": "0.204.0",
+ "version": "0.204.1",
"npmClient": "yarn",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
diff --git a/package.json b/package.json
index 18914ec19b..54d4d80e83 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "neuron",
"productName": "Neuron",
"description": "CKB Neuron Wallet",
- "version": "0.204.0",
+ "version": "0.204.1",
"private": true,
"author": {
"name": "Nervos Core Dev",
diff --git a/packages/neuron-ui/package.json b/packages/neuron-ui/package.json
index 4aec85af4e..2bbf334c43 100644
--- a/packages/neuron-ui/package.json
+++ b/packages/neuron-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "neuron-ui",
- "version": "0.204.0",
+ "version": "0.204.1",
"private": true,
"author": {
"name": "Nervos Core Dev",
diff --git a/packages/neuron-ui/src/components/GeneralSetting/index.tsx b/packages/neuron-ui/src/components/GeneralSetting/index.tsx
index 8f77e68c4d..08b3fe0498 100644
--- a/packages/neuron-ui/src/components/GeneralSetting/index.tsx
+++ b/packages/neuron-ui/src/components/GeneralSetting/index.tsx
@@ -12,6 +12,7 @@ import { uniformTimeFormatter, bytesFormatter, clsx, wakeScreen, releaseWakeLock
import Switch from 'widgets/Switch'
import { keepScreenAwake } from 'services/localCache'
import { LanguageSelect, UnLock } from 'widgets/Icons/icon'
+import { sanitizeReleaseNotes } from 'utils/sanitizeReleaseNotes'
import styles from './generalSetting.module.scss'
import { useCheckUpdate, useUpdateDownloadStatus } from './hooks'
import LockWindowDialog from './LockWindowDialog'
@@ -67,7 +68,7 @@ const UpdateDownloadStatus = ({
if (available) {
const releaseNotesHtml = () => {
- return { __html: releaseNotes }
+ return { __html: sanitizeReleaseNotes(releaseNotes) }
}
/* eslint-disable react/no-danger */
diff --git a/packages/neuron-ui/src/tests/sanitizeReleaseNotes/index.test.ts b/packages/neuron-ui/src/tests/sanitizeReleaseNotes/index.test.ts
new file mode 100644
index 0000000000..9e5d4c53f4
--- /dev/null
+++ b/packages/neuron-ui/src/tests/sanitizeReleaseNotes/index.test.ts
@@ -0,0 +1,24 @@
+import { describe, expect, it } from 'vitest'
+import { sanitizeReleaseNotes } from 'utils/sanitizeReleaseNotes'
+
+describe('sanitizeReleaseNotes', () => {
+ it('removes interactive markup and keeps basic formatting', () => {
+ const sanitized = sanitizeReleaseNotes(`
+
safe
+
+
+
+ const ok = true
+ `)
+
+ expect(sanitized).toContain('safe
')
+ expect(sanitized).toContain('const ok = true
')
+ expect(sanitized).not.toContain('