diff --git a/public/assets/img/404.png b/public/assets/img/404.png
deleted file mode 100644
index 8b66c971f4..0000000000
Binary files a/public/assets/img/404.png and /dev/null differ
diff --git a/public/assets/img/500.png b/public/assets/img/500.png
deleted file mode 100644
index dab69206ad..0000000000
Binary files a/public/assets/img/500.png and /dev/null differ
diff --git a/templates/status/404.tmpl b/templates/status/404.tmpl
index 695dd78c85..c73ee34774 100644
--- a/templates/status/404.tmpl
+++ b/templates/status/404.tmpl
@@ -2,7 +2,7 @@
 <div role="main" aria-label="{{.Title}}" class="page-content ui center gt-w-screen {{if .IsRepo}}repository{{end}}">
 	{{if .IsRepo}}{{template "repo/header" .}}{{end}}
 	<div class="ui container center">
-		<p style="margin-top: 100px"><img src="{{AssetUrlPrefix}}/img/404.png" alt="404" style="max-width: 100%"></p>
+		<h1 style="margin-top: 100px" class="error-code">404</h1>
 		<p>{{if .NotFoundPrompt}}{{.NotFoundPrompt}}{{else}}{{ctx.Locale.Tr "error404" | Safe}}{{end}}</p>
 		{{if .NotFoundGoBackURL}}<a class="ui button green" href="{{.NotFoundGoBackURL}}">{{ctx.Locale.Tr "go_back"}}</a>{{end}}
 
diff --git a/templates/status/500.tmpl b/templates/status/500.tmpl
index edcb90f9a4..30cb255643 100644
--- a/templates/status/500.tmpl
+++ b/templates/status/500.tmpl
@@ -33,7 +33,10 @@
 				<style> .ui.message.flash-message { text-align: left; } </style>
 				{{template "base/alert" .}}
 			</div>
-			<p class="gt-mt-5 center"><img src="{{AssetUrlPrefix}}/img/500.png" alt="Internal Server Error"></p>
+			<div class="ui container center">
+				<h1 class="gt-mt-5 error-code">500</h1>
+				<p>Internal Server Error</p>
+			</div>
 			<div class="divider"></div>
 			<div class="ui container gt-my-5">
 				{{if .ErrorMsg}}
diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go
index cf0bac4c8a..5d5529c36e 100644
--- a/tests/integration/compare_test.go
+++ b/tests/integration/compare_test.go
@@ -33,7 +33,7 @@ func TestCompareTag(t *testing.T) {
 
 	req = NewRequest(t, "GET", "/user2/repo1/compare/invalid")
 	resp = session.MakeRequest(t, req, http.StatusNotFound)
-	assert.False(t, strings.Contains(resp.Body.String(), "/assets/img/500.png"), "expect 404 page not 500")
+	assert.False(t, strings.Contains(resp.Body.String(), ">500<"), "expect 404 page not 500")
 }
 
 // Compare with inferred default branch (master)
diff --git a/tests/integration/links_test.go b/tests/integration/links_test.go
index 11e6146d07..6edcbbc71b 100644
--- a/tests/integration/links_test.go
+++ b/tests/integration/links_test.go
@@ -36,8 +36,6 @@ func TestLinksNoLogin(t *testing.T) {
 		"/user2/repo1/",
 		"/user2/repo1/projects",
 		"/user2/repo1/projects/1",
-		"/assets/img/404.png",
-		"/assets/img/500.png",
 		"/.well-known/security.txt",
 	}
 
diff --git a/web_src/css/base.css b/web_src/css/base.css
index 76ecfc9bf5..2620a41a34 100644
--- a/web_src/css/base.css
+++ b/web_src/css/base.css
@@ -96,6 +96,16 @@ progress::-moz-progress-bar {
   background-color: var(--color-accent);
 }
 
+h1.error-code {
+  font-size: 15em;
+  font-weight: 800;
+  color: transparent;
+  --error-code-color-1: #a2a2a2;
+  --error-code-color-2: #797979;
+  background: repeating-linear-gradient(45deg, var(--error-code-color-1), var(--error-code-color-1) 10px, var(--error-code-color-2) 10px, var(--error-code-color-2) 20px);
+  background-clip: text;
+}
+
 * {
   scrollbar-color: var(--color-primary) transparent;
   caret-color: var(--color-caret);