diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml
index 74fc716180..fdf8908206 100644
--- a/models/fixtures/comment.yml
+++ b/models/fixtures/comment.yml
@@ -83,3 +83,12 @@
   issue_id: 2 # in repo_id 1
   review_id: 20
   created_unix: 946684810
+
+-
+  id: 10
+  type: 0
+  poster_id: 1
+  issue_id: 1 # in repo_id 1
+  content: "test markup light/dark-mode-only ![GitHub-Mark-Light](https://user-images.githubusercontent.com/3369400/139447912-e0f43f33-6d9f-45f8-be46-2df5bbc91289.png#gh-dark-mode-only)![GitHub-Mark-Dark](https://user-images.githubusercontent.com/3369400/139448065-39a229ba-4b06-434b-bc67-616e2ed80c8f.png#gh-light-mode-only)"
+  created_unix: 946684813
+  updated_unix: 946684813
diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml
index ca5b1c6cd1..adb407f9c0 100644
--- a/models/fixtures/issue.yml
+++ b/models/fixtures/issue.yml
@@ -10,7 +10,7 @@
   priority: 0
   is_closed: false
   is_pull: false
-  num_comments: 2
+  num_comments: 3
   created_unix: 946684800
   updated_unix: 978307200
   is_locked: false
diff --git a/release-notes/8.0.0/feat/3985.md b/release-notes/8.0.0/feat/3985.md
new file mode 100644
index 0000000000..31274c2d91
--- /dev/null
+++ b/release-notes/8.0.0/feat/3985.md
@@ -0,0 +1 @@
+Added support for displaying images based on the users current color code by using an anchor of `#dark-mode-only` or `#light-mode-only` respectively. Also supporting the github variants (e.g. `#gh-dark-mode-only`).
\ No newline at end of file
diff --git a/tests/e2e/markup.test.e2e.js b/tests/e2e/markup.test.e2e.js
new file mode 100644
index 0000000000..7bc6d2b6ca
--- /dev/null
+++ b/tests/e2e/markup.test.e2e.js
@@ -0,0 +1,13 @@
+// @ts-check
+import {test, expect} from '@playwright/test';
+
+test('Test markup with #xyz-mode-only', async ({page}) => {
+  const response = await page.goto('/user2/repo1/issues/1');
+  await expect(response?.status()).toBe(200);
+  await page.waitForLoadState('networkidle');
+
+  const comment = page.locator('.comment-body>.markup', {hasText: 'test markup light/dark-mode-only'});
+  await expect(comment).toBeVisible();
+  await expect(comment.locator('[src$="#gh-light-mode-only"]')).toBeVisible();
+  await expect(comment.locator('[src$="#gh-dark-mode-only"]')).not.toBeVisible();
+});
diff --git a/tests/integration/api_comment_test.go b/tests/integration/api_comment_test.go
index 221a6ba5ce..daa7b5b910 100644
--- a/tests/integration/api_comment_test.go
+++ b/tests/integration/api_comment_test.go
@@ -39,7 +39,7 @@ func TestAPIListRepoComments(t *testing.T) {
 
 	var apiComments []*api.Comment
 	DecodeJSON(t, resp, &apiComments)
-	assert.Len(t, apiComments, 2)
+	assert.Len(t, apiComments, 3)
 	for _, apiComment := range apiComments {
 		c := &issues_model.Comment{ID: apiComment.ID}
 		unittest.AssertExistsAndLoadBean(t, c,
@@ -65,7 +65,7 @@ func TestAPIListRepoComments(t *testing.T) {
 	req = NewRequest(t, "GET", link.String())
 	resp = MakeRequest(t, req, http.StatusOK)
 	DecodeJSON(t, resp, &apiComments)
-	assert.Len(t, apiComments, 1)
+	assert.Len(t, apiComments, 2)
 	assert.EqualValues(t, 3, apiComments[0].ID)
 }
 
diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go
index 598d38fb64..33d06ed1b4 100644
--- a/tests/integration/api_nodeinfo_test.go
+++ b/tests/integration/api_nodeinfo_test.go
@@ -34,6 +34,6 @@ func TestNodeinfo(t *testing.T) {
 		assert.Equal(t, "forgejo", nodeinfo.Software.Name)
 		assert.Equal(t, 29, nodeinfo.Usage.Users.Total)
 		assert.Equal(t, 22, nodeinfo.Usage.LocalPosts)
-		assert.Equal(t, 3, nodeinfo.Usage.LocalComments)
+		assert.Equal(t, 4, nodeinfo.Usage.LocalComments)
 	})
 }
diff --git a/web_src/css/markup/dark.css b/web_src/css/markup/dark.css
new file mode 100644
index 0000000000..700a48518e
--- /dev/null
+++ b/web_src/css/markup/dark.css
@@ -0,0 +1,13 @@
+.markup [src$="#gh-light-mode-only"],
+.markup [src$="#light-mode-only"],
+.markup [href$="#gh-light-mode-only"],
+.markup [href$="#light-mode-only"] {
+  display: none;
+}
+
+.markup [src$="#gh-dark-mode-only"],
+.markup [src$="#dark-mode-only"],
+.markup [href$="#gh-dark-mode-only"],
+.markup [href$="#dark-mode-only"] {
+  display: unset;
+}
diff --git a/web_src/css/markup/light.css b/web_src/css/markup/light.css
new file mode 100644
index 0000000000..88fc4b748c
--- /dev/null
+++ b/web_src/css/markup/light.css
@@ -0,0 +1,6 @@
+.markup [src$="#gh-dark-mode-only"],
+.markup [src$="#dark-mode-only"],
+.markup [href$="#gh-dark-mode-only"],
+.markup [href$="#dark-mode-only"] {
+  display: none;
+}
diff --git a/web_src/css/themes/theme-forgejo-dark.css b/web_src/css/themes/theme-forgejo-dark.css
index b0fb7c22e1..c4d7287ff9 100644
--- a/web_src/css/themes/theme-forgejo-dark.css
+++ b/web_src/css/themes/theme-forgejo-dark.css
@@ -1,5 +1,7 @@
 @import "../chroma/dark.css";
 @import "../codemirror/dark.css";
+@import "../markup/dark.css";
+
 :root {
   --steel-900: #10161d;
   --steel-850: #131a21;
diff --git a/web_src/css/themes/theme-forgejo-light.css b/web_src/css/themes/theme-forgejo-light.css
index f2bafc148b..9ad58879ab 100644
--- a/web_src/css/themes/theme-forgejo-light.css
+++ b/web_src/css/themes/theme-forgejo-light.css
@@ -1,5 +1,6 @@
 @import "../chroma/light.css";
 @import "../codemirror/light.css";
+@import "../markup/light.css";
 
 :root {
   --steel-900: #10161d;
diff --git a/web_src/css/themes/theme-gitea-dark.css b/web_src/css/themes/theme-gitea-dark.css
index 1763f236cf..6ad6efe748 100644
--- a/web_src/css/themes/theme-gitea-dark.css
+++ b/web_src/css/themes/theme-gitea-dark.css
@@ -1,5 +1,6 @@
 @import "../chroma/dark.css";
 @import "../codemirror/dark.css";
+@import "../markup/dark.css";
 
 :root {
   --is-dark-theme: true;
diff --git a/web_src/css/themes/theme-gitea-light.css b/web_src/css/themes/theme-gitea-light.css
index fd348dfdc2..830b96febe 100644
--- a/web_src/css/themes/theme-gitea-light.css
+++ b/web_src/css/themes/theme-gitea-light.css
@@ -1,5 +1,6 @@
 @import "../chroma/light.css";
 @import "../codemirror/light.css";
+@import "../markup/light.css";
 
 :root {
   --is-dark-theme: false;