From ccf45e7e3f330ee7b1ae6a0bfff66d17d7214868 Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Sat, 17 Dec 2022 00:20:38 -1000
Subject: [PATCH 01/16] [BRANDING] add Forgejo logo

(cherry picked from commit 04869eb95d7d21de6610d1873945437312d783ed)
---
 README.md                       |   2 +-
 assets/favicon.svg              |  56 +++++++++++++++-----------------
 assets/logo.svg                 |  56 +++++++++++++++-----------------
 public/img/apple-touch-icon.png | Bin 3162 -> 2709 bytes
 public/img/avatar_default.png   | Bin 4889 -> 3189 bytes
 public/img/favicon.png          | Bin 4351 -> 2968 bytes
 public/img/favicon.svg          |   2 +-
 public/img/forgejo.svg          |   1 +
 public/img/gitea-original.svg   |   1 +
 public/img/gitea.svg            |   2 +-
 public/img/logo.png             | Bin 14354 -> 6747 bytes
 public/img/logo.svg             |   2 +-
 12 files changed, 58 insertions(+), 64 deletions(-)
 create mode 100644 public/img/forgejo.svg
 create mode 100644 public/img/gitea-original.svg

diff --git a/README.md b/README.md
index d61bdd0ec9..fa21427674 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 <div align="center">
-    <img src="https://codeberg.org/forgejo/meta/raw/branch/readme/logo/forgejo.svg" alt="" width="192" align="center" />
+    <img src="./assets/logo.svg" alt="" width="192" align="center" />
     <h1 align="center">Welcome to Forgejo</h1>
 </div>
 
diff --git a/assets/favicon.svg b/assets/favicon.svg
index 9df6b83b56..bcacdc0200 100644
--- a/assets/favicon.svg
+++ b/assets/favicon.svg
@@ -1,31 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
-<g>
-	<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8
-		c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4
-		c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
-	<g>
-		<g>
-			<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2
-				c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5
-				c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5
-				c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3
-				c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1
-				C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4
-				c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7
-				S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55
-				c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8
-				l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
-			<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4
-				c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1
-				c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9
-				c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3
-				c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3
-				c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29
-				c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8
-				C343.2,346.5,335,363.3,326.8,380.1z"/>
-		</g>
-	</g>
-</g>
+<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
+  <style type="text/css">
+    circle {
+      fill: none;
+      stroke: #000;
+      stroke-width: 15;
+    }
+    path {
+      fill: none;
+      stroke: #000;
+      stroke-width: 25;
+    }
+    .orange {
+      stroke:#ff6600;
+    }
+    .red {
+      stroke:#d40000;
+    }
+  </style>
+  <g transform="translate(6,6)">
+    <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
+    <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
+    <circle cx="142" cy="20" r="18" class="orange" />
+    <circle cx="142" cy="88" r="18" class="red" />
+    <circle cx="58" cy="180" r="18" class="red" />
+  </g>
 </svg>
diff --git a/assets/logo.svg b/assets/logo.svg
index 9df6b83b56..bcacdc0200 100644
--- a/assets/logo.svg
+++ b/assets/logo.svg
@@ -1,31 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
-<g>
-	<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8
-		c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4
-		c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
-	<g>
-		<g>
-			<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2
-				c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5
-				c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5
-				c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3
-				c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1
-				C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4
-				c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7
-				S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55
-				c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8
-				l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
-			<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4
-				c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1
-				c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9
-				c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3
-				c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3
-				c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29
-				c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8
-				C343.2,346.5,335,363.3,326.8,380.1z"/>
-		</g>
-	</g>
-</g>
+<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
+  <style type="text/css">
+    circle {
+      fill: none;
+      stroke: #000;
+      stroke-width: 15;
+    }
+    path {
+      fill: none;
+      stroke: #000;
+      stroke-width: 25;
+    }
+    .orange {
+      stroke:#ff6600;
+    }
+    .red {
+      stroke:#d40000;
+    }
+  </style>
+  <g transform="translate(6,6)">
+    <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
+    <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
+    <circle cx="142" cy="20" r="18" class="orange" />
+    <circle cx="142" cy="88" r="18" class="red" />
+    <circle cx="58" cy="180" r="18" class="red" />
+  </g>
 </svg>
diff --git a/public/img/apple-touch-icon.png b/public/img/apple-touch-icon.png
index 0c803d35dc34c01281a52c460cee9e65e29ad60f..1f6c1544f80bcd94adfa05ef4683537266de020c 100644
GIT binary patch
delta 2702
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
IM6N<$f-tASLI3~&

delta 3158
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

diff --git a/public/img/avatar_default.png b/public/img/avatar_default.png
index 129967112d13ef602f6ec42f28b264c4666be2e0..f335e51dad13df7ceb19701a71f8efe192173286 100644
GIT binary patch
literal 3189
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
I1NZ2E0VOn}g8%>k

literal 4889
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
BTF?Lh

diff --git a/public/img/favicon.png b/public/img/favicon.png
index dcd4edb1a30bf93049fd24c31317e3344e08d95b..eda0347effabb1b681c3816cfd3580b82227c063 100644
GIT binary patch
literal 2968
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

literal 4351
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

diff --git a/public/img/favicon.svg b/public/img/favicon.svg
index afeeacb77c..804b05e284 100644
--- a/public/img/favicon.svg
+++ b/public/img/favicon.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
\ No newline at end of file
diff --git a/public/img/forgejo.svg b/public/img/forgejo.svg
new file mode 100644
index 0000000000..804b05e284
--- /dev/null
+++ b/public/img/forgejo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
\ No newline at end of file
diff --git a/public/img/gitea-original.svg b/public/img/gitea-original.svg
new file mode 100644
index 0000000000..dca9b4f4db
--- /dev/null
+++ b/public/img/gitea-original.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg>
\ No newline at end of file
diff --git a/public/img/gitea.svg b/public/img/gitea.svg
index dca9b4f4db..804b05e284 100644
--- a/public/img/gitea.svg
+++ b/public/img/gitea.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
\ No newline at end of file
diff --git a/public/img/logo.png b/public/img/logo.png
index c7971f91835e889ed15a0e5252734400c5c65cae..1b2d9b4023427395448912e39a9883c279dc1618 100644
GIT binary patch
literal 6747
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

literal 14354
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

diff --git a/public/img/logo.svg b/public/img/logo.svg
index afeeacb77c..804b05e284 100644
--- a/public/img/logo.svg
+++ b/public/img/logo.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
\ No newline at end of file

From 1224b202bf6c55c040dab8b6159d0e4148e22088 Mon Sep 17 00:00:00 2001
From: Gusted <gusted@noreply.codeberg.org>
Date: Sun, 18 Dec 2022 19:03:34 +0000
Subject: [PATCH 02/16] [BRANDING] Rebrand systemd service (#137)

- We can rebrand this quite safely, as only new installations would likely look into this file and configure the correct folders(to use forgejo instead of gitea).

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/137
(cherry picked from commit 43e6d3cdf0d0ed74f0f0629e4684ee5314a819ac)
---
 .../{gitea.service => forgejo.service}        | 36 +++++++++----------
 1 file changed, 18 insertions(+), 18 deletions(-)
 rename contrib/systemd/{gitea.service => forgejo.service} (59%)

diff --git a/contrib/systemd/gitea.service b/contrib/systemd/forgejo.service
similarity index 59%
rename from contrib/systemd/gitea.service
rename to contrib/systemd/forgejo.service
index d205c6ee8b..04ef69adc0 100644
--- a/contrib/systemd/gitea.service
+++ b/contrib/systemd/forgejo.service
@@ -1,5 +1,5 @@
 [Unit]
-Description=Gitea (Git with a cup of tea)
+Description=Forgejo (Beyond coding. We forge.)
 After=syslog.target
 After=network.target
 ###
@@ -25,21 +25,21 @@ After=network.target
 # If using socket activation for main http/s
 ###
 #
-#After=gitea.main.socket
-#Requires=gitea.main.socket
+#After=forgejo.main.socket
+#Requires=forgejo.main.socket
 #
 ###
-# (You can also provide gitea an http fallback and/or ssh socket too)
+# (You can also provide forgejo an http fallback and/or ssh socket too)
 #
-# An example of /etc/systemd/system/gitea.main.socket
+# An example of /etc/systemd/system/forgejo.main.socket
 ###
 ##
 ## [Unit]
-## Description=Gitea Web Socket
-## PartOf=gitea.service
+## Description=Forgejo Web Socket
+## PartOf=forgejo.service
 ##
 ## [Socket]
-## Service=gitea.service
+## Service=forgejo.service
 ## ListenStream=<some_port>
 ## NoDelay=true
 ##
@@ -55,28 +55,28 @@ RestartSec=2s
 Type=simple
 User=git
 Group=git
-WorkingDirectory=/var/lib/gitea/
-# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
-# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
-#RuntimeDirectory=gitea
-ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
+WorkingDirectory=/var/lib/forgejo/
+# If using Unix socket: tells systemd to create the /run/forgejo folder, which will contain the forgejo.sock file
+# (manually creating /run/forgejo doesn't work, because it would not persist across reboots)
+#RuntimeDirectory=forgejo
+ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
 Restart=always
-Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
+Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/forgejo
 # If you install Git to directory prefix other than default PATH (which happens
 # for example if you install other versions of Git side-to-side with
 # distribution version), uncomment below line and add that prefix to PATH
 # Don't forget to place git-lfs binary on the PATH below if you want to enable
 # Git LFS support
 #Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin
-# If you want to bind Gitea to a port below 1024, uncomment
-# the two values below, or use socket activation to pass Gitea its ports as above
+# If you want to bind Forgejo to a port below 1024, uncomment
+# the two values below, or use socket activation to pass Forgejo its ports as above
 ###
 #CapabilityBoundingSet=CAP_NET_BIND_SERVICE
 #AmbientCapabilities=CAP_NET_BIND_SERVICE
 ###
 # In some cases, when using CapabilityBoundingSet and AmbientCapabilities option, you may want to
-# set the following value to false to allow capabilities to be applied on gitea process. The following
-# value if set to true sandboxes gitea service and prevent any processes from running with privileges
+# set the following value to false to allow capabilities to be applied on Forgejo process. The following
+# value if set to true sandboxes Forgejo service and prevent any processes from running with privileges
 # in the host user namespace.
 ###
 #PrivateUsers=false

From 2baac9684e5a4691f4e62c9cdd19ade73eb2b6fe Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Sun, 18 Dec 2022 23:03:28 -1000
Subject: [PATCH 03/16] [BRANDING] Rebrand footer "powered by" links

(cherry picked from commit 02890c31f2eb0b08076bf2175040a0de0679b7a8)
---
 templates/base/footer_content.tmpl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl
index 89be609225..81505c43dc 100644
--- a/templates/base/footer_content.tmpl
+++ b/templates/base/footer_content.tmpl
@@ -1,7 +1,7 @@
 <footer>
 	<div class="ui container">
 		<div class="ui left">
-			<a target="_blank" rel="noopener noreferrer" href="https://gitea.io">{{.locale.Tr "powered_by" "Gitea"}}</a>
+			<a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">{{.locale.Tr "powered_by" "Forgejo"}}</a>
 			{{if (or .ShowFooterVersion .PageIsAdmin)}}
 				{{.locale.Tr "version"}}:
 				{{if .IsAdmin}}
@@ -17,7 +17,7 @@
 		</div>
 		<div class="ui right links">
 			{{if .ShowFooterBranding}}
-				<a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea">{{svg "octicon-mark-github"}}<span class="sr-only">GitHub</span></a>
+				<a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo">{{svg "octicon-git-branch"}}<span class="sr-only">Codeberg</span></a>
 			{{end}}
 			<div class="ui language bottom floating slide up dropdown link item">
 				{{svg "octicon-globe"}}

From 9bc830f1b453ad087e6f043604af07114599a89a Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Mon, 19 Dec 2022 00:05:51 -1000
Subject: [PATCH 04/16] [BRANDING] Add `forgejo` emoji

(cherry picked from commit 00603b03fe0daada4c4be6113870ce2b617f943f)
---
 modules/setting/setting.go   |   4 ++--
 public/img/emoji/forgejo.png | Bin 0 -> 3189 bytes
 2 files changed, 2 insertions(+), 2 deletions(-)
 create mode 100644 public/img/emoji/forgejo.png

diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 8217d07722..d9be3147ce 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -290,8 +290,8 @@ var (
 		DefaultTheme:        `auto`,
 		Themes:              []string{`auto`, `gitea`, `arc-green`},
 		Reactions:           []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
-		CustomEmojis:        []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`},
-		CustomEmojisMap:     map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"},
+		CustomEmojis:        []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
+		CustomEmojisMap:     map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
 		Notification: struct {
 			MinTimeout            time.Duration
 			TimeoutStep           time.Duration
diff --git a/public/img/emoji/forgejo.png b/public/img/emoji/forgejo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f335e51dad13df7ceb19701a71f8efe192173286
GIT binary patch
literal 3189
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
I1NZ2E0VOn}g8%>k

literal 0
HcmV?d00001


From 5f47458a28cae32861d3ad7878e09072b329b91a Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@noreply.codeberg.org>
Date: Mon, 19 Dec 2022 20:01:46 +0000
Subject: [PATCH 05/16] [BRANDING] Rebrand default config settings for new
 installs (#140)

Replaces `Gitea` with `Forgejo` in the default config settings for new installs.

This will not affect existing installs.

Co-authored-by: Caesar Schinas <caesar@caesarschinas.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/140
Co-authored-by: Caesar Schinas <caesar@noreply.codeberg.org>
Co-committed-by: Caesar Schinas <caesar@noreply.codeberg.org>
(cherry picked from commit bd7c0766239a98bbef5f61d986fb5e6c6da158cd)
---
 custom/conf/app.example.ini    | 2 +-
 modules/setting/database.go    | 2 +-
 modules/setting/repository.go  | 2 +-
 modules/setting/setting.go     | 2 +-
 routers/install/install.go     | 2 +-
 web_src/js/features/install.js | 4 ++--
 6 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 3ca49cf730..244ae96e9c 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -331,7 +331,7 @@ USER = root
 ;; SQLite Configuration
 ;;
 ;DB_TYPE = sqlite3
-;PATH= ; defaults to data/gitea.db
+;PATH= ; defaults to data/forgejo.db
 ;SQLITE_TIMEOUT = ; Query timeout defaults to: 500
 ;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode
 ;;
diff --git a/modules/setting/database.go b/modules/setting/database.go
index 4e55457395..d8d4d12d7a 100644
--- a/modules/setting/database.go
+++ b/modules/setting/database.go
@@ -90,7 +90,7 @@ func InitDBConfig() {
 		log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
 	}
 
-	Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db"))
+	Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "forgejo.db"))
 	Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)
 	Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
 
diff --git a/modules/setting/repository.go b/modules/setting/repository.go
index 0947cc00cf..b6aa89909a 100644
--- a/modules/setting/repository.go
+++ b/modules/setting/repository.go
@@ -276,7 +276,7 @@ func newRepository() {
 	Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
 	Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
 	Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
-	RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "gitea-repositories"))
+	RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "forgejo-repositories"))
 	forcePathSeparator(RepoRootPath)
 	if !filepath.IsAbs(RepoRootPath) {
 		RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index d9be3147ce..fff2452ce7 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -663,7 +663,7 @@ func loadFromConf(allowEmpty bool, extraConfig string) {
 	forcePathSeparator(LogRootPath)
 
 	sec := Cfg.Section("server")
-	AppName = Cfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea")
+	AppName = Cfg.Section("").Key("APP_NAME").MustString("Forgejo: Beyond coding. We Forge.")
 
 	Domain = sec.Key("DOMAIN").MustString("localhost")
 	HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
diff --git a/routers/install/install.go b/routers/install/install.go
index 25b272b854..d205102389 100644
--- a/routers/install/install.go
+++ b/routers/install/install.go
@@ -186,7 +186,7 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool {
 	if err = db.InitEngine(ctx); err != nil {
 		if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
 			ctx.Data["Err_DbType"] = true
-			ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://docs.gitea.io/en-us/install-from-binary/"), tplInstall, form)
+			ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://forgejo.org/download#installation-from-binary"), tplInstall, form)
 		} else {
 			ctx.Data["Err_DbSetting"] = true
 			ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, form)
diff --git a/web_src/js/features/install.js b/web_src/js/features/install.js
index 9468ba9c42..51255fd99a 100644
--- a/web_src/js/features/install.js
+++ b/web_src/js/features/install.js
@@ -5,8 +5,8 @@ export function initInstall() {
     return;
   }
 
-  const defaultDbUser = 'gitea';
-  const defaultDbName = 'gitea';
+  const defaultDbUser = 'forgejo';
+  const defaultDbName = 'forgejo';
 
   const defaultDbHosts = {
     mysql: '127.0.0.1:3306',

From 97b9024336282dc6dd14f04b3ecc39168d2bf60a Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Sun, 25 Dec 2022 02:35:04 -1000
Subject: [PATCH 06/16] [BRANDING] Custom loading animation for Forgejo

(cherry picked from commit 6372a5b1c1edef41562d796272cb8ff4829153b2)
---
 public/img/failed.png                 | Bin 11009 -> 0 bytes
 public/img/forgejo-loading.svg        |  14 ++++++++++++++
 public/img/loading.png                | Bin 12629 -> 0 bytes
 templates/install.tmpl                |   2 +-
 templates/post-install.tmpl           |   2 +-
 templates/repo/migrate/migrating.tmpl |   4 ++--
 6 files changed, 18 insertions(+), 4 deletions(-)
 delete mode 100644 public/img/failed.png
 create mode 100644 public/img/forgejo-loading.svg
 delete mode 100644 public/img/loading.png

diff --git a/public/img/failed.png b/public/img/failed.png
deleted file mode 100644
index b37545f90ca3b304357516661efb9e1431fa96aa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11009
zcmW-n1yCH#5`ZDN6Wqy<2MO+$KyVKd+_}TuCAhoW;T{O?ZoxU+;cy6UK@WMCw^h4S
zyE9uW)7{hkbw{cy%V43Cp~Jz!VadsU{RV4iVS5lNGVI7roYn+u5M3nXG*DriFRFP2
z>>SNeR>uW44&mPpe;Ydpg<T|dmC|-qcL2D0m^fR&d3bnyva+{vF*9+r_~hUW%sv+(
zgM<43C-?P>h9~GO#|M<-=6ATcxp@OxGq-O`_#A|eH>&uKXs|nknIjWzTEo?Vb<ui7
ztFqqWBS1o@rbBsYJZMbu^RD%;cDG;6rc1i*G_nk8iwbKcO)2KcF-WY4BcbN!hj-6n
z&|wz<7h2l{s4XWMbRX>%x|DhI{A1HAck}+ypqsxa%Id@#W1#eKjb_dpKONmCv`_wn
zw&e;@1S98<s0U$!jk%7;D<F|>{v48?CH&a-&kkLq_g=5beON*CaLDokI@+oJGpDM!
z%$_V8@KU`kl(v4g4gSLtV{SsKngi8l<47!fMe*-?;<xdXe`1(t!r>_|+zwB?e^;N#
zsqY#ig-`ussTge6awp!MP@glV@q5|kM2OK&=|~xP_a*X4BO)t!<XhRvJNqbtPEKtO
z>8LOYB>atv{L4hB{Ys9W<%%*dvti<n1?U_en%Y}TFQ>yWEfKA$xhK-8>d5>R!1d#R
z=0(fSJ<EVuH&MuY@ul?A2%d<SzLPifr(+~bwj|Q9ai2Ly*h=gg-`Ufu#JKBE)y!yG
zle6fhA7u0R8U5VfoNsyQvpA1F7bEEKIR_Fuhyi!&_mc0=Ho?^Fjphp~zp*BptD8A2
zy<ZiA-V&Tmb;j^DKq(7KbY@17l=umb*M4d;pW(P_#s&<w@4V`2lCHZOmFjIwS8iMF
ziXYPGMYYuMa)nTLKZ8kPF}K3oI(zP9E_`e)3-*6%F#|H}JAK@ksp)%YT_+1av&ub=
zy+0>7FouvY3*m~(g@zjST%>ITW3Z|7?hxt1!G-J>4t@`*uE6;{n}s(?9-Umsx!u>w
zN*s#Qe5*g-InAX>OX##bJv09#7emhdrIYa|XHRjkXGQu=^B9wR=V>fU_tl=q{XVg7
zwY6y<u=tLRjeoqAjZ~JGURNLsKX+&v;jU6E;=FASBb|;&x76D73$Xas<JTF-)Y1T4
zT3Kh?s<-_YITTzpbjUAd;^@Pd^AhN*_b|5g;>E{W<0#h!;9`}=ARjPICoyjQ=+stM
zt{8#IyJ)NJvSQ+T9)EMK#je2OCo<93#MSmyiKL?Ypr%hsUJ7gv?;3^#kj*6$V`F4H
z&q1+3k*mG?ySE#Oam^#v5nODtyf;KgFG-2{h35liYy_~ZmqaqktE->Kcq;7YlyF~Q
z{JhI`JKLgGL^73{)jI=qIFI_6IV^g`V}I~>VpF|*m^k6EUu&<1?7tL&|0Z$Ib^pAR
zLZTjiH1FD0NVeSiaP&0?fBR#*2xV-{iw?@=ZlIK#9nR*1qY3PNzaHFPp&<FAT-KK&
zY8HL<ayXq7%$-E0U=@(=B6QC6^P0+?DLhhz)G?CRvJ)pn|J;kuLUs$Zltqm(vLPey
zGAr1x&^S;^6gt;$Fx<iUrpyzvV8TwuER;JgXhBP}MSkGtvxvic>wd?+xwz6}t!7}*
zB~pXpXHym7FLvlDb~5s$u27JboLh_^p>*P-Tdim5#hmEnwUh3ams8<_B}|{=qNSVW
znCjolp}~WFKuHqcHu3}7r|0o97umh(1RQ^KK1aykgzqoLS3-08iTIy%&|!UG{NRVE
zPvvLnaps1A;uzj;m7Vq9k;kfqRs7fo6v)E(keAib6jbB2UoY|Z?&sd&GBv#qz7V}1
zM&K*`MXSFA+Sf?P(a8|_$qcCV_oaTH-x_!>_A>2H+&19bdWR6@zS$IJab}5He(I5;
zs_-TIwe|Z`*H8Y}uP@=b50KY4mvdf)?x41OrXLop&XI|Qqk^p4%p?0hvgq_hxc9q+
z?<@XZZ!?~6-tUH{Rea01X_2q{)BgU5ew102##n$WifZ5#Uswp5$J&wunT!{oTU%-Q
zsHT{Uu>RhJ7R5OZ*q}_CsP-$4KROv#DCDTfZsSCYy-_5!AH@7^IBl^qfPW#B#sEn{
zC?GHhO(13bu>(-lg<|hx?%)92geF(lqVK*)trQ>#4(C?gNFr4V`Ed=-7W0c(alc7f
z>r4j->aQBSDFr1KSlkPl9bKpV?ElY=j!QZU{JG`rGM>uEm~Rc@w~5il*xm9b!`3tN
zEZ&I|jzk>qRZ0F)DAPo)$ht64G8naJ>kQ=L-+np@`_i|D&@`)p%m&h<P|;sK!1}Zy
zT#PCqNJsFMEl-LH{dsPs*m;M={Z{j2huC`pe0J`-(SZgOGrbgQCV|eMlG!j7h7-}A
zTFCR>zYa|U7G&Z}S;Gu&>_Y^C5gT98%m|Ywcc$2lzr#~{u*=3KLW?L@y`9UZfdY1$
zi^X$wdM*VM$&`5x_Wnl5{nwHmOro+K^-fdOR+oZ(9m|8g+ohSgdY$E*Xne8esPFJo
z00hF{+7Lpp*PpZvXsP$c(|OYgsA4i(D{K7=zQ4!gRyDPo8|N?nkz0e4Bz7JsIU@CE
z5HRdmQb(OhA8G0j)H$whB;jbO#o@TeANB|)fI%YP`s+1Ap1kP$jI8gaU77>!{ybcF
zhZOzoEgt9XZp=%KZZ&#mmwCf~JZIQr^Msw|f^+<El)tB)^vGTIbK7h(|NSqYus95H
zkwgoiTQ575TP0WjT2lG+sq>KSD`U^`yxC&9yFBA22CKb%IWtVWYyX5KvJ|SQ>_hD~
zYz)sP-e{$vFjK7JrBzC+RV*5dwms-&xZcwZJQFTs85ec<Z*{TlWU7YbPe-rg5-k-e
zGwhEcbS3ad5%LKlF_1}+PPhB3oU9S+=7ySTg?o>7KsVnNSy?drL>C>Cu2cVMd~yfw
z&Q`g5S%TD+{+H?)Z>C!(!X~^}_d~6g|3o82%DLSY>I0?zr1#l`(xa)<upS4YhEvsm
z$p+o;w<pMlbSf_M9-u-wHvdbIQgje_tES!e20y)?QjWdL()+pZzam_L`_T$t@l@9q
zV^ABNmo0tJgQusCJTl_JSrIqh^mMb*i~ri%ibn<McMK}Bk7Pdef!KQ#kLVc%pvW*p
z<(>7?nHdkZMiGp@s@VJS_9^hZ&Py`*G{!nJ*7?0i9!A2$?A@fFIvL!V=&yL>(nU>D
z|Jn5ESCCnwB}C8qC=Q%QnbkJPNx5Oeo_;jYyMW4tHbdZ@gdrd)SIc<fyJvSnBFX+X
zdQdh@q@48#T(tMg;q6pkz8(sxL8lM$<a;MYg#6~myy*aQUcRu&@i#%!Tm!a2<JCEl
zAejcco9b|HVQBT2bKZ;%VJ#lfbgbocw>_efRb%8>G>V~2H=a(QNwKy7K<fXCOw1bv
zNw*j%mgq1S6yMdE=vQ=~Cgaa}%fgm%oNfB;{g~kB`=t)A!_9v-uBfwvq!l=k?Jq_S
zn~V|m&x#s;TTWr->#pr>*ppE-I=he)I>S|5@9%67vtTcjtsJDhjALHmc6S1#H?2!`
z?$bR5ls@$6Io0{2hL^>hxAnD^dm<S}_#GP^mA~s5FgKvU%a;P6O6`pRzW8G}$LBA~
zF49mW`=_f8-ic2)+vl2UXosYr$Gi4sru#_$B*q7WN?3=$mX74+Ao0~}n5`o(SDD&Q
zl$h7ykCoNh^jy2iOB%0D>65$vzdIn4e*7bi*t<~L#5(>9o;*XmX!*bx$cjUbGN%G}
z?hoPSDyZh@o1fnwousO`6-y%srxwp>M|8_(yNj;i8sA^gn{&L+d}hg%yo@_5ZAHM#
zN&qKLSjP{&L$HHV$ysx*8!^&DyqxVI1D3=tal{%-51`ksA`FWTR*$WtVj1qHUf!>K
zDk||v*Yx}RW*W1o%Wxb4EBSK45<P>bqyxEqHyXI1@uH4vv_6MQBRYVgsQGS-vpm|a
zvkBLa)jj>A7`fzFy?^<;a$er5L3~2qx^G{G=quyC(ZRQk2xxHZcaiQycV$CM8?OvE
zH?H}(q38({h)&Cqqy*+ML|2Iu@NdF|1Q5O)(=kdt-4^+Ep1gD20V&!;EHsg;$Xs*J
z1UjkZIw14zhg`831LOFS2dG8(Y2NwKs?HVK3$T%-<Cxn<OIoUno=}xg9+5+vDYTsV
z!BcR_q19&Nr1QSUaF1uZo?G9Qg874qY(`9BK|H%?$D5hDm5bk0))Ltruwax;;i%l_
zW0u5vU#A&e{fV<$Axf*&&ui)MA$zPWZgQ09bBo)^$CZJ_@WR*S7ZPI{!>1u}>6u|F
zawLc78|8GlJDU%Rj`?zrce#t<fju&-MAD;>e=CzY_$|VUtBACst8Aav*Z^4Ut4a6B
zgqll<f#}=Q(r}UGylQ!2^@zPp4x2wZ`HKb7x`7i|x4<hn6M7tcvGF+mv8Ao#mKy7m
z5X(NBNFRok1E@e2@LFh>P32?$^Q`8=zH2n*mqJouH+tt)S4?L(h~JsYnd+!ERvhQ~
z^Ntwk?fgzDUbH!(K2H5E#`T3C4f}N40G^3bLk4%!xDP&Kw3J7kVlpfjLsxXBDf2VF
zJdZBA691o-=C+F-<(A2R0`#B1lb-}gHWDr?d8e%^a}R=Mn`KQM$#nJ0RQtgeY<4?G
z=m_t~F#APcq&<YNi<9ijq8`_w9fBjF^Tyf6uQ&5c;A8FO?UCo%RQtrf;X{9JTI>ke
zkU%S3Se1^1Eh~W9cCGWI;CeN}9!cM9=Tc7;8+l$^jLEkY#7FtM(3>K0m8>iv8DW&8
zOpUXCH)1%*j*%)(N|`<#IrR1PgRlG08tKQW!p|AIG^BcXYNjeaD&rn7LELP_Eeo~q
zU~0REvqoj{mqX#eJ(S@<v6z%jzi-U77{dC9vb(@tpO_d=DfrsB-clf^#Bq!AKEQ-W
zxr25X!%)+7PZ&)a#O`P{=Hkv!Um~Z%@Bz^$cxz4E*80rm!Vntw$eN~=M$@#>^<-PT
z1bn9{MdGE#K_QrVHRo&^0*41^fg3FX&<4;Xrc(cBect9osuGnSVZPj$%ss}U&MWs{
zX&`*Ggp)M0sU}1HP{=T8C8uATm+N2RGf|tjODv<-V*BcSCWXXz)ZO?43*Sd=c{Dh1
z4>TdRe^-SUc`}}r3M6;KnFSqoD<XSlpfY|csVsT~d;S5JwCb`ng2z~+ilt|BN4rne
zZgK-!j8#H+_4{}vJdA^5u6tQ{R6t#%b{|*Qy~8uTMMLp)KNX|I5V>c2<8TyBdi+t6
zI1r-vT6e`o$9`j?@@hvYFJD;r1}Snh@`q7CiuR9xmThRo$eh-!)$`ej3JrUI5@A64
zQoL+#_*L3&5LI3CvJ-#+oKC@I;fAm&ds2WR|4zd614ZcER?uJh33QHh=Fy^$e0SZ>
zELcI#j7#pRNL_?UJ4SERO7~w8H^-yXeR?7PP!#eX$XT|>8K@%W3+@Io0S@6hC(?uz
z%-Z{^0T?zq?dFQ6RLcA$FW{9s3hj}3=ms-MFODT~c9;dB>9FU;8!Y;{1NflKX43WK
z9}LsAgs4cO21Yy#yvpC!_8VtJ`0n&Zz|}bWLoFo1zaNYWJ|ZFHYJg2^sZdV_29({*
z66@Fxmy@yn`hLm}AmrF+wR3sPQz|>d@~G}2F*7sx@UtWZY>Q9ADi=kV8SynA@v<O>
z_j%x-YXzu`xB56c)bYIx*Fi}@11lF(@`@a?cYAdNxFwY_^fwM0+OX-2NgN4z7(UC1
zf3Ym(a(CPAe8kBv7?K;B4Mv*Np7EWzNg>U1iCVm~KYrV3+~*eysV!w5J>W?%rT}GL
zFQyP=EN0EU{a+eaEPZs5S8NHoA^B}$<-Wlo#F&IvLH-8r?r%nEbJA-DzlgUUn}o_D
z`N6VZJGVV1<mGp%`D*+c<k+y#ICEp&8!ZXCNWtfSHX2V5_M5x9ea?h3U;S)9SAWDC
z9PcWfPIg}o1St^3vbQ)`bvYi5b*}-E;H`AIlQLhhKN}FTo`gkXv%4@rzqau+Mf|l7
zcp8;~NHI>oHnOCYfMjrm4_}D6E1YIUDI?}c;)(RTeHbRQcY_0Ls)7!AH;XB%WPQ@3
zFv{JiJlk(;fb|Yp^)y{~alBZ)L$3Kz6E%F9o(|?zp4P@{2R0VGG>Tvdo)C|H0A+N{
zh}npkI3>>MZXL|)BM-zlL9i7;+tW5D5IL~O%ZnTz*Ys%Wepk~{nj>JKd{U}lTuZaR
z`_k=XH$-;6=6Qd7MBb4ZMpKgH&PHQ^#V9_2BtuX$bk4-jt1)bFVi+sH&3)wRT&~U4
zi|6-)Z;$7%(d4u_?ZxLlG+N;W3ZG%xB(Z?)EM_`s+gjroA~WE8)G7%HtCDg^hJI!=
z9!{g30l!`PU<LcxL^TRCWL$61hnD-UIH*5;+<sVw5-xKVBJr6|B8aj<?at{X=T}eQ
z)z7ET_?${+iHY|lv&7WLAj80h(Z<_GQ1EG33VsFp3i-bI>6CEpII@T+SuJqlu}f#T
zuai@Q$2pPBGAsNynu-<LGub%Q!2w1qtc8|Tj%o|+PTIZEf0&JFzSi5f{$WDu^Rotw
zv+JQGuyzTcL*Te2-#my02PvqBRACl4=DV}t7&Kp?$jl9RC-znQW5fHw|NhjS#pa<>
zu}3w%U(8}tc9!M;XaP<Ft9bfP9Xi@5dy5P?&e)AeMb^+jgf!Q7QwTneJla?kpD@3m
zYI3N4&PRwoCVCl-S>@u*${b?RB$D@U-vj7lSW2p#AmgMjpqQ?I=R8qREBV7RH+jX8
zd3S#E{Xa;iYpUit+inQ=s88i)ciYANkoczKQhWLnlQp~{l75<G`hL`TOaV=usUYia
z{-=z*iF$>keuWt6yR^96rnk;m19ka0ZhEPtqe){z2U6-dOm^-Vl}(@Bfg)~e#e=xZ
z4W^f)16gpnLGM5~XT?XS<$cQ!)E7O7EmOsI124cY^|PnafCQ)Ih*n2QkMU3(`|~&A
zfNyYn?17Q}_9rb>I%dn7o*fMAi-$Bslw&A#2z5-j(ftFZL2brzW9lQw%$|O(ut^nP
z`*AXAFs}S_m;AyohpWM;Cdncvpg<q&Z$A_(NIqz`OX@ibPl8(E!Z2KXrl(s2SFKOL
zQO7?fePtVR<Ud(#Z#SHVp*6DNgBQp=i{mUJw3MC0vGV$FabN7Hcx!;USP)#S7`Eh7
zB>|{+-`YrD5DOuJql=bmFZ{TAA`+_0Q$rjZaaG0`FC*P|%$k()sR^%_n@qLKL2|c;
zaq6y%x`NDR#u{o94zk}ZOdK<~7r;;B+5<0kqHKpLOB~e5^8{3casPGRt54N=DEhjx
z&}<NBl~S8C2lUeQt(B7bwiKO=p59G%bkB8IEv=m#AE%jl$9GbZej@W3dPg}TTqvko
z-fQe6k8MjD)$LlJobd6P^BfB<6a5}Al0Fn?zL^($7vy_Bg(Z!Q9`3@*$GB6^7BP-s
zd-%lmt3`=%vE&TAs1R656k30E`}%e0`@>V*q_9Uii^DKbFU@p4#qk?Gdmk|pS8)1s
zZQHHeT-P0hoSN!vWB%<oWb%bL^AvshE-^`hlDSn!T&sqKjUK7yqSfXM4LFm`k~Bvy
z8IE^TJClv3X4PR*T92}8PUZX7gZ;seE@`Fjd0V_&a9bz$4pDk_kWofPCil-Ddp`%g
zCBdWQCQ<=0OveynNs}j1qxjJ4X1Ut(ItgHr(@;(heU}}>+2G?8RCogFUhu}R&5=7U
zB+eJwT76V2aD;{#|D40fwV10aD%4!%MZZ%*+5#6@T&8pc-?l<7n~rmLKk~P0yU@w;
zTZE(#F3^IeMc~K@Fm7&(mc`wpy}98%2Mg5W1Y(w9Hf%nuW3j8ctLzpBu}6)6^n&eh
z_vQWNuOonO&P3Rn5yZSyPa>RogGGG%gKN?Ngo2npgLKW_&lXCE@RDx&G*H+w<0t4b
z*pT(n$u`-eKMh#4Cld$l!sp$ws6iRg_`<w%MS{Wz&icjI(SCWGDdj+PO2SOy)6h4F
zyc7_|5jPYQJnULZs%K<*-Lclv*y#hqs^n`vy5ecEc+k#!9QZs*?cL(J#&24*nUD3(
zr?I<p72*Vo%LG~j7&t^o8OA!xe|^_%8<!SBFJM!qLrtI?NF66$xw0y}5KeQHP>@~I
zeG`;UaU#s9Q@gV8K{Lwj`D;wLn=Id1(|u&?{ZP0J%E@sxk?rJTtL05WkdiHEVrQ!^
zmGn2dMU})IV;fT)@q=oAMYrI8X(b}#3>HO`Du^i8IY)ct!dcC~PLAJaOG++mDPo2r
zV1`awKitRZxr?8nXt|=EfW17$$RAdOR&3&w2uDqE{Vuh8#H(qV><qrgU#+^TQhwx4
zy1MG*cO94+ugtu@jKv{t_PE<Po%W8DLBW7=EieutPIed8Z}ikSeV5tY7!5OtDn%a~
zMbG1RlqTWi%w&UaN-U}umhzf-#Qa)nse>W-1<9Y6CWo%=x&DQ!|4<6yig0u{fsP19
z8Sc>s_ZGb8*E&GSE_2ej)QJ)u^9+@f2$|$X$glOysy6}RGx6n>o&lUH&(yxj#M3QU
zSTm)q`mOwGAnt*~M3bRV(CL{`yS@UIsY7GWVgm?NY-i(WEJx=mR|Yhvd&tancrAVB
zcu`ifbog}HP&Z+th>9O6q3S#HAk;StHo!`#xSVSrWtEQz86|((d+N~rlo>7N?s~>#
ze{#A;_K$P9RuV%^L%GDYIi8C}=ObkWM-aLChT^80S=nUL8f|>}mq{0R$YZ&?F=MA4
zz?#&s=y5aQ0Y}ONdfgYJAZ79Hy@2_SsElwE)psTHC%41m<dT_RbQHBb^uPqyTnLsZ
zo1M$T(*JqbuZA9BG7{n8EdaaEfok8?X~vCYXa&~EtnCHUYGvu#+dl^k^bCEMTodLC
zkxAxAbW9>$f|0<3iS-^om$xM>v9$PFVrT9=LKqBMuD9j%z1f?JU%CFLQ1ixaIhEbl
zp>m9AjI`WU5VN(_4!yU%pHo#jg5O`x{&;hB{AzGGNrG=#jqxC?v;5f{6KVC8HOs!o
zEALs<goPZ><=CCCY+jJGp8HO`;b6Ay6u4H}9dGRGLl<RM2<R{D4VD9+q6#l_5{~-#
z)2njUvCh#G_GTW9l;lthbrco)6q+fVEZ(WKblX-xb(Yxxf57f%&%82simC{VE}1))
z{h<qir2B3sg%sbTsHQf|2<!p~S-hquNW*+Nz2o}=gOT`)UcMP8H~}E7Pi}b~j#m$d
z!y0svEdROBS7}M0jL+qAf6Faam)K!==kD>h@khlkpN-?T<L^6xg%i$<nW>1FG9$*~
z!9XPzo+2yPy|Z4yTe&vo)&A~?VtlY%1V7l#Nci>7)k{P+?Kbv4(0z$3aQG`tV)X0F
z18}$!<ZfYHPIm2`7o+$Atmq?5OPJ`4j&$MrFuZu*=xfJ!lNF0Uv=SPHg6`hG`U}B}
z_8P!-zB<!XB(QK-^Tq%VpyrXp(sV8K7CEK}n_2yFk90WcX0*n4{}O6)AOBSgeV#Qw
ziBwYgdFTPi{;jxDtN~EccWhnZ#iPju4|6Hg%0!M-!L=>fM~QLgO`EHZhpW-R%Dju7
zmWx9MsPatqe!LR~ZC_xgS?!;M2dgncG2Waz9Fe(eqCpli1o1?UlB`UQny)kKpDu<t
zq3m!7+{-M#%XGK|o8qZcI%N|J3sdi8Ebi53ii2B+z)`JZ`S{)q9^S289k-AqkGq)G
z&azupL4$0}Y0nUAI+!K7Jk{>yHVc%FLf+|+TR$no$KG5B9XK68wl2@-xXw(#?!^o|
zkV<T}TYbcd=%Hi-+iHy=255I)9Pttla1zKZ+iXWzTb0pOd<G?6gHo^Nk+@=Pa&{SE
ziH4q@?vDL2=QXT4af#wM*;b<n1p%T#bq45Wkc|(F!FBoHfQd`z?r^enAtBmpxKFzp
z+|^>3iE%0y)l4P6*-$a1JUEiv>!7FKG1P;C7^_<(1qaCKLdpH=orog>XpCtkU%w0)
z_mM>Yfm@q~Y&@AwpTShuUw8qL#4b<FKU0!F%t<lfi$0cFxut}6aZAJ7PGqxC8GEJL
zDmlIKFJLnEptiXQ*HJax>y-X|%ddtv#*>!Dzwuw~mAKV(hE5~(14|XQ%1Mvv&l|WS
zjN~*6U{MjBBCC?OR!J9c2vy8D2Q(X&1rxW~tiOAz*o$&D@vJmfQ#W<~BoZ;cc)dAR
z5yq)JoR(%2sBk<maMYnpID}F{N_n$TX7V<N!NUJzG=GnMB%07lZQ2!0+Vkgme5r(S
zt-wbZJhnka0ua;qx#$<f!5XFec6wR<@MIbd+CJ3+4J@<#w;CWrrXMOy7;X85sN{ls
z69zSJ7Jy%T3Acf!`ATGA0uKMyym%4<$jLVW(D<1vgR7J4-cP5{AdJNB$KZps92kJ*
zr#NfU=h%2RPc2CP+s$V3X2!YF1kTmgs!M)n_NjNRLN|+^Fg(A;2D;bIeOS~JE(Fcx
z-KB2melD6auM++AU9pLxN#?o+Uj3S9g<2`pGwhm&egZj~L!*&5sHVO2uzl4>_YFD=
zf4{Iz-{#u=haU+Z-=`>YRq^tM9(cdOjZaD^W}9ECZtK948G~Pxp+nMyV3ZdxW^tEa
z{Qc0^t86|H-#FvukjklT;uG4&`T=I87AW!{1PEgkr6H(W6kE|KSw%*BQIX>5I_h(D
z?570+4^!s8z6|>k@<$!j<-$n!(#fRvg-(E*W)<gIzJO$}0*d&ng}_d1mf8QiB0HeD
zt9%n7f&7o#Iy#32F8%n%ES%L?3}>-B&$|bco)Y0&6Q^h1F@FupXaXar=}6P3zUR@B
zJ-si?V42G$P_9Bh+sBV0pid@-*E(7WVn$+l0cFM!T041q@<r_?P00D03Z09~sMiAx
znwSJY-6t9hq{a~o`$Isb^gP=i-k6>uMh9XaBTxc4gk5&71WsuLK+yc5QPL=<egS7V
zICSTKwEz@8^~zM)0{y8w^;~cnIUfHcV!v^t+08&SZYsM#UOr4bJw@cp1hK9105b#a
zt`SXqs_-U?(_I`reiU6a;YTO*2Zu@WD3($jB6&IV8>giH(&BhK%voqOSbPC8=MDXT
z-lu{O8pf{wjd<^tExCy&wEmLEi(&NY9!H-qe&c))JG@bm7zMl0d^YGyO^j$aP_A<h
zscwAG0pkfpK}Q^e3#{m+m-ZL2RH_#mW%4=-BOYvL8;3PQYA!Hgt05z$e5sh`y)Cd5
z`2q=7j}5^G;F&@Ibc!7xl)VhFulhh~q=VoDaZ77bFrs-{nQ|TqKa3M15&SOd%JCzH
z;Rq^g`!2(s9{59cl}9xH-!mg5tQpr%%U}BjyOLg+6HW#QQ7%oA-*t@@ZSt(}W?0G_
zmp#D`)GcSb>~&(X>#Qt^B+r2>W@qM{Gi#~&8Kulf?|mG=iLtf<h!0n@yzC8y7S^dX
z<BWW*cQ5--=Zhr(+nnc)Z_J;_qhksR>FW~>fPkgnKI?EhLA?TsnV%O^E<x4dVsa=e
z5l_J?Emfhdf5-Jr9}cAg^1fITNQxmc?HN=G%Fd^`aSsi>9K|`Ya|ezf7M2TqF`o%e
z-&PF4o()tctvPp=)3x3EdzI@4CalnwjcE^&;bNL2{H9$c3!Z0=S&iX|25o7DA)9>I
zNvK^F%~Le(7geeO#lIH1euDAg(-ZoE-gw45`#{*p%K38(ok26zchJ<wKkRm2<f6y?
z3R3&Q@EpQZm^tVL;}~(LwLX%u^|C^kb5b`m-}^e~9a~Wc{&I@M3~?v9+7}*_>lR7K
z3Vn7T^7RY~&*g?6Q~Il((#f6cWM^PkP>?=<D#ObhdWEl`AnnrKd85rj;r=;?D2T}&
z30mTEJ5}=zLm9=W`mtA@x4JZgwtk3{#6z9C4dbwr`$!_cD!5rrImHKr;rdDO&it2}
znMq~_W$_KHQ^rTTR7OQ(6)W>^BfdRhiinQQd^y}Ze1Pl_%RznKT?e}Wj+0@VAjJ)R
z4@TcE_A@$@e}iVxkbVNk1gVQKt<)=WfOBPUI$pp}Tq6JDgd8;0=)-JE-;Zi_3+IP1
zs5uD&C&wyX&a0_HrTzcsdVj&a#m+7Q2O|9sOX2n_T~j9WfMPO285*&wI;O<zWYCsU
zQPBmLr<|lVgq$6ZfR=kO9-d+uJ;B<G%vuA_<YRd7Fu*VGZ~K%%>+%+D;Ana_g!ORu
zUGK;bOk8xfYD%67DnL{6#ftH|!Q}HPwE&&V?_WWLN@!!%JYsl^idSD~p2*?C%RRK*
z=w)p{J25@$lk05_EB4T|wCupmYK*UKQmcsOw8>lHn{NZdcW?rvSiE|+vGTMWf&Uex
zPiSRRirQ?(omPh=8-ZBGEu9-l%5=F`jN<$cFpq&!V`QB4Wecmv_6H$X1|UKy>&@9G
zv4WZ~2C%F*fAZOcqkdYMHtLN(@2gIP+V`8MYPCp20FfMfjvV<vB%K;CMN_RH;3{nm
zu*!2uOvNTUwZYk__t|_nR32vW*C`r$ho6PJsI9zFTq%A#CUw%GC!8!T?r31}L94is
z^iY{P0!YgqZ7(jdn8~YGG_?L+=tGbzgD+aG4fB$|+xHWesKgg#^U!RpG=V+hGL7c@
ze)DU{h;&$tPqTyfX&tS3j?)QmT<^{`9WMZ$Kewk(W>~ZMABf3B>S1nJ+PV!JX#gt<
zgp(nt_?g}*7PAv5exQzsr+(?EZDy%fs|dkwrt4@c>S#h}U{FP^!WCMpO-D@|EEBG~
zo=?S_FbA|{JgCkj!pd;gu8j|?iRmrSa(I|6vnG{o<}<Julow-cke1@|LbD3sXnAz{
ze_tt#K5Posg-dfGqaR@9Vxw=%#NFmhXH&)$XVFaJ8J3c2v{rFOhTyYsJ5>dlWTald
zO_s^j8vBE{LlL0y|B?kGb=?P;hL=Bc{HKVj)1an{9P$<8tbEf#8TYFO>;x2oI1FM7
zYi%dpyM9yuVdwscbUKV%RXCbADL1aWBJA$jJMG2+{pnD?EDn)s8Wv~Kp0v14F)p@*
z6_Y4>)BJb8n7sd=N0__hqXnBaMWpq6Kg}swbBYn+z+Ao?^7GBko6ux~-Mt4vip2LN
zLzv~0vJ0@Zi$H=4iOAXZHHt9x+fs%8;Y6r7!pNi-d@LC+Gci1@7D5s!yl;xu^>-Zj
zm9fmb>!fRc#>n`Y>%@liFA(Xb394;D&~>E`{)oNU;FJ7idtpwECc{yCp}BB4s_8$~
zT^@<v&ogz5hZ;;-y{`{Zfd&rk|LT(F>{t+0%{RG*g~Oub4(7_|O=IWMZOvhyLMQ@|
zHlq9CKYU;ye#X|&g}XIY(0%ceU*UEyJ7WmR=*@|9B9!SAGk+)oW5yZQdc`sV1+Ejo
z1WQ$8Uehx@J~J(Sry~xOCVlLp5p!2w6NG{|C^vDwpiVmW70QYaZ;?>GGw@{b2JTLM
z?3v!*QQ132SbqsO>Oc+~&#O9Ft>INKLCULmb>XhU+t0lW?$@?B%iYVScfSW|`P^SJ
z{E#sk)~gCWCy^Qhl%0+{ukt6ZAfVskS4*bR9prCsNwY%HHzZkoM_XXJ-!iL`i50k+
z@KOWa6kpHHaMqvx^h`=q<C_q4U7Wqm-Lctha(vsvDsWM3!F3eLw=;G0p``jlh0XHW
zO4Wz*)mLAqxHSc64q*4rNe^ZsBTLkQCqYK<%{RGrL=EigoAtoSq`Z^I{ef${!#bx}
z)bE_U3Py_+3Zk{e^lCtn_zU1BR(xImI=gEGI-RZ>jRU#jMR<R((57T!8_6hVG5v^g
zdrcQ0{q<edOz~&H@Kw6Vqa9`fKer36O*sQgvAjG9OCHNc<FbK_%tyQZEhHU>7{XXJ
zhi}io7<4}+bg?e88}LTM%I15Iw%rCc1<l&C-cYpg*-w1z^2q@B9gA3*qy!X}F2?aA
zUkwgsvynj#CKlV?X(sK(T1g4B&qTXhgIm1hmyr5EtHE)sEEa$gS@U$g*%#+3`@!pB
zmro+8N5}o5t<U|XdzN)-;A48;kT`FLW)c-q>8?oROft@_%lYh?4{Gr<m^|7PXsYZ?
zECW^nBFKQNvH4U2Tm2bK$KBs$j09YFfBC*{l^UI@4x*9YKt`Yfhx*{*?WV!dFRyZ!
zC9c{Jx`HTZ>f2IWEijfsy?6U1)1SDWJMPI1V!TX_z<?D*&PPH-hKL;S-k8K}q*k&Q
zb+)$8anDs1NnBzU2Y&(Q;?MI+LEA&H^#s+w96LVdQn*_Cms0O!hbYw|e5{Ox@p2hf
zqIqFU)vAEluq=)x<LlVZUA03;ca#DA$+2Zo<VO8epETg9Xz`++6G;mvN&fyB_Uzy<
z*n+I+cIQOwvh>teigg^Y2G3h2i0}~6g;RH5ZTIVAXzb4KHF;E7l~)!OsG^>*Mr6GU
z!i1Dru%>DU)e&e1*>aYXYGYcb=@fZ!0g4G7q>dHIzI9@Xo7Wm$hD0)k-s)Jw3T`lj
ip&jiROR=wSD8zsWV}8L1Cs?^EoSc;M*J=slp#K48eBxaI

diff --git a/public/img/forgejo-loading.svg b/public/img/forgejo-loading.svg
new file mode 100644
index 0000000000..919552ebb5
--- /dev/null
+++ b/public/img/forgejo-loading.svg
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212">
+  <style>
+    @keyframes draw-orange{0%{stroke-dashoffset:200}25%{stroke-dashoffset:200;stroke-width:0}50%{stroke-dashoffset:0;stroke-width:25}to{stroke-dashoffset:0}}@keyframes draw-red{0%{stroke-dashoffset:130;stroke-width:0}25%{stroke-dashoffset:0;stroke-width:25}50%,to{stroke-dashoffset:0}}@keyframes red-circle{0%{opacity:0}20%{opacity:0;stroke-width:0}25%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes orange-circle{0%{opacity:0}45%{opacity:0;stroke-width:0}50%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes fade{0%,90%{opacity:1}to{opacity:0}}circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}
+  </style>
+  <g transform="translate(6 6)">
+    <g style="animation:fade 2000ms ease-in-out 5ms infinite">
+      <path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange" style="stroke-dasharray:200;stroke-dashoffset:200;animation:draw-orange 2000ms ease-out 5ms infinite"/>
+      <path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red" style="stroke-dasharray:130;stroke-dashoffset:130;animation:draw-red 2000ms ease-out 5ms infinite"/>
+      <circle cx="142" cy="20" r="18" class="orange" style="opacity:0;animation:orange-circle 2000ms ease-out 5ms infinite"/>
+      <circle cx="142" cy="88" r="18" class="red" style="opacity:0;animation:red-circle 2000ms ease-out 5ms infinite"/>
+    </g>
+    <circle cx="58" cy="180" r="18" class="red"/>
+  </g>
+</svg>
diff --git a/public/img/loading.png b/public/img/loading.png
deleted file mode 100644
index c5ba3d9cd79960a3990d5c61fa68c98c632a1a50..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12629
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
M1x@*SxepQl5Au-}zW@LL

diff --git a/templates/install.tmpl b/templates/install.tmpl
index 36f58218d4..8f577ed02f 100644
--- a/templates/install.tmpl
+++ b/templates/install.tmpl
@@ -339,5 +339,5 @@
 		</div>
 	</div>
 </div>
-<img style="display: none" src="{{AssetUrlPrefix}}/img/loading.png"/>
+<img style="display: none" src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
 {{template "base/footer" .}}
diff --git a/templates/post-install.tmpl b/templates/post-install.tmpl
index 4abfe171dd..134c8bcf37 100644
--- a/templates/post-install.tmpl
+++ b/templates/post-install.tmpl
@@ -7,7 +7,7 @@
 					<div class="ui stackable middle very relaxed page grid">
 						<div id="repo_migrating" class="sixteen wide center aligned centered column">
 							<div>
-								<img src="{{AssetUrlPrefix}}/img/loading.png"/>
+								<img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
 							</div>
 						</div>
 					</div>
diff --git a/templates/repo/migrate/migrating.tmpl b/templates/repo/migrate/migrating.tmpl
index c06f4b5729..3c729b7750 100644
--- a/templates/repo/migrate/migrating.tmpl
+++ b/templates/repo/migrate/migrating.tmpl
@@ -9,12 +9,12 @@
 					<div class="ui stackable middle very relaxed page grid">
 						<div id="repo_migrating" class="sixteen wide center aligned centered column" task="{{.MigrateTask.ID}}">
 							<div>
-								<img src="{{AssetUrlPrefix}}/img/loading.png"/>
+								<img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
 							</div>
 						</div>
 						<div id="repo_migrating_failed_image" class="sixteen wide center aligned centered column" style="display: none;">
 							<div>
-								<img src="{{AssetUrlPrefix}}/img/failed.png"/>
+								<span class="red">{{svg "octicon-git-pull-request-closed" 256 "ui red icon"}}</span>
 							</div>
 						</div>
 					</div>

From 1d6499c888e618759696fb57d154b9c22fc94742 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Dachary?= <loic@dachary.org>
Date: Sun, 25 Dec 2022 16:25:25 +0100
Subject: [PATCH 07/16] [BRANDING] container images: set APP_NAME

(cherry picked from commit 7f4e98d3ab173dcdac15f418a53ffe7123e20c46)
---
 docker/root/etc/s6/gitea/setup                | 2 +-
 docker/rootless/usr/local/bin/docker-setup.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker/root/etc/s6/gitea/setup b/docker/root/etc/s6/gitea/setup
index d8f6a3b319..958d50a798 100755
--- a/docker/root/etc/s6/gitea/setup
+++ b/docker/root/etc/s6/gitea/setup
@@ -24,7 +24,7 @@ if [ ! -f ${GITEA_CUSTOM}/conf/app.ini ]; then
     fi
 
     # Substitute the environment variables in the template
-    APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \
+    APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \
     RUN_MODE=${RUN_MODE:-"prod"} \
     DOMAIN=${DOMAIN:-"localhost"} \
     SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \
diff --git a/docker/rootless/usr/local/bin/docker-setup.sh b/docker/rootless/usr/local/bin/docker-setup.sh
index feab02a379..b480685863 100755
--- a/docker/rootless/usr/local/bin/docker-setup.sh
+++ b/docker/rootless/usr/local/bin/docker-setup.sh
@@ -26,7 +26,7 @@ if [ ! -f ${GITEA_APP_INI} ]; then
     fi
 
     # Substitute the environment variables in the template
-    APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \
+    APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \
     RUN_MODE=${RUN_MODE:-"prod"} \
     RUN_USER=${USER:-"git"} \
     SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \

From 2716d78a43b0c93f28a9849af0e95c49bbe62c47 Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Sun, 25 Dec 2022 01:44:04 -1000
Subject: [PATCH 08/16] [BRANDING] Add Forgejo light, dark, and auto themes

(cherry picked from commit 009bb07ad80a328bc9a1b50a949fbb4f14d5e6a9)
---
 modules/setting/setting.go                   |   4 +-
 web_src/less/_home.less                      |   4 +-
 web_src/less/themes/theme-forgejo-auto.less  |   5 +
 web_src/less/themes/theme-forgejo-dark.less  | 294 +++++++++++++++++++
 web_src/less/themes/theme-forgejo-light.less | 277 +++++++++++++++++
 5 files changed, 580 insertions(+), 4 deletions(-)
 create mode 100644 web_src/less/themes/theme-forgejo-auto.less
 create mode 100644 web_src/less/themes/theme-forgejo-dark.less
 create mode 100644 web_src/less/themes/theme-forgejo-light.less

diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index fff2452ce7..6d82d20d6a 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -287,8 +287,8 @@ var (
 		ReactionMaxUserNum:  10,
 		ThemeColorMetaTag:   `#6cc644`,
 		MaxDisplayFileSize:  8388608,
-		DefaultTheme:        `auto`,
-		Themes:              []string{`auto`, `gitea`, `arc-green`},
+		DefaultTheme:        `forgejo-auto`,
+		Themes:              []string{`forgejo-auto`, `forgejo-light`, `forgejo-dark`, `auto`, `gitea`, `arc-green`},
 		Reactions:           []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
 		CustomEmojis:        []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
 		CustomEmojisMap:     map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
diff --git a/web_src/less/_home.less b/web_src/less/_home.less
index fb31bedfa9..fb6b2d2a35 100644
--- a/web_src/less/_home.less
+++ b/web_src/less/_home.less
@@ -25,7 +25,7 @@
     }
 
     .svg {
-      color: var(--color-green);
+      color: var(--color-primary);
       height: 40px;
       width: 50px;
       vertical-align: bottom;
@@ -45,7 +45,7 @@
   }
 
   a {
-    color: var(--color-green);
+    color: var(--color-primary);
   }
 }
 
diff --git a/web_src/less/themes/theme-forgejo-auto.less b/web_src/less/themes/theme-forgejo-auto.less
new file mode 100644
index 0000000000..903b4eae8e
--- /dev/null
+++ b/web_src/less/themes/theme-forgejo-auto.less
@@ -0,0 +1,5 @@
+@import "theme-forgejo-light.less";
+
+@media (prefers-color-scheme: dark) {
+  @import "theme-forgejo-dark.less";
+}
diff --git a/web_src/less/themes/theme-forgejo-dark.less b/web_src/less/themes/theme-forgejo-dark.less
new file mode 100644
index 0000000000..8a03fda40b
--- /dev/null
+++ b/web_src/less/themes/theme-forgejo-dark.less
@@ -0,0 +1,294 @@
+@import "../chroma/dark.less";
+@import "../codemirror/dark.less";
+
+:root {
+  --steel-900: #10161D;
+  --steel-850: #131A21;
+  --steel-800: #171E26;
+  --steel-750: #1D262F;
+  --steel-700: #242D38;
+  --steel-650: #2B3642;
+  --steel-600: #374351;
+  --steel-550: #445161;
+  --steel-500: #515F70;
+  --steel-450: #5F6E80;
+  --steel-400: #6D7D8F;
+  --steel-350: #7C8C9F;
+  --steel-300: #8C9CAF;
+  --steel-250: #9DADC0;
+  --steel-200: #AEBED0;
+  --steel-150: #C0CFE0;
+  --steel-100: #D2E0F0;
+
+  --is-dark-theme: true;
+  --color-primary: #fb923c;
+  --color-primary-contrast: #000;
+  --color-primary-dark-1: #fdba74;
+  --color-primary-dark-2: #fdba74;
+  --color-primary-dark-3: #fed7aa;
+  --color-primary-dark-4: #fed7aa;
+  --color-primary-dark-5: #ffedd5;
+  --color-primary-dark-6: #ffedd5;
+  --color-primary-dark-7: #fff7ed;
+  --color-primary-light-1: #f97316;
+  --color-primary-light-2: #ea580c;
+  --color-primary-light-3: #c2410c;
+  --color-primary-light-4: #9a3412;
+  --color-primary-light-5: #9a3412;
+  --color-primary-light-6: #7c2d12;
+  --color-primary-light-7: #7c2d12;
+  --color-primary-alpha-10: #ea580c19;
+  --color-primary-alpha-20: #ea580c33;
+  --color-primary-alpha-30: #ea580c4b;
+  --color-primary-alpha-40: #ea580c66;
+  --color-primary-alpha-50: #ea580c80;
+  --color-primary-alpha-60: #ea580c99;
+  --color-primary-alpha-70: #ea580cb3;
+  --color-primary-alpha-80: #ea580ccc;
+  --color-primary-alpha-90: #ea580ce1;
+  --color-secondary: var(--steel-700);
+  --color-secondary-dark-1: var(--steel-550);
+  --color-secondary-dark-2: var(--steel-500);
+  --color-secondary-dark-3: var(--steel-450);
+  --color-secondary-dark-4: var(--steel-400);
+  --color-secondary-dark-5: var(--steel-350);
+  --color-secondary-dark-6: var(--steel-300);
+  --color-secondary-dark-7: var(--steel-250);
+  --color-secondary-dark-8: var(--steel-200);
+  --color-secondary-dark-9: var(--steel-150);
+  --color-secondary-dark-10: var(--steel-100);
+  --color-secondary-dark-11: var(--steel-100);
+  --color-secondary-dark-12: var(--steel-100);
+  --color-secondary-dark-13: var(--steel-100);
+  --color-secondary-light-1: var(--steel-650);
+  --color-secondary-light-2: var(--steel-700);
+  --color-secondary-light-3: var(--steel-750);
+  --color-secondary-light-4: var(--steel-800);
+  --color-secondary-alpha-10: #2B364219;
+  --color-secondary-alpha-20: #2B364233;
+  --color-secondary-alpha-30: #2B36424b;
+  --color-secondary-alpha-40: #2B364266;
+  --color-secondary-alpha-50: #2B364280;
+  --color-secondary-alpha-60: #2B364299;
+  --color-secondary-alpha-70: #2B3642b3;
+  --color-secondary-alpha-80: #2B3642cc;
+  --color-secondary-alpha-90: #2B3642e1;
+
+  /* colors */
+  --color-red: #b91c1c;
+  --color-orange: #ea580c;
+  --color-yellow: #ca8a04;
+  --color-olive: #91a313;
+  --color-green: #15803d;
+  --color-teal: #0d9488;
+  --color-blue: #2563eb;
+  --color-violet: #7c3aed;
+  --color-purple: #9333ea;
+  --color-pink: #db2777;
+  --color-brown: #a47252;
+  --color-grey: var(--steel-500);
+  --color-black: #111827;
+
+  /* light variants */
+  --color-red-light: #dc2626;
+  --color-orange-light: #f97316;
+  --color-yellow-light: #eab308;
+  --color-olive-light: #839311;
+  --color-green-light: #16a34a;
+  --color-teal-light: #14b8a6;
+  --color-blue-light: #3b82f6;
+  --color-violet-light: #8b5cf6;
+  --color-purple-light: #a855f7;
+  --color-pink-light: #ec4899;
+  --color-brown-light: #94674a;
+  --color-grey-light: var(--steel-300);
+  --color-black-light: #1f2937;
+
+  /* other colors */
+  --color-gold: #b1983b;
+  --color-white: #ffffff;
+  --color-diff-removed-word-bg: #783030;
+  --color-diff-added-word-bg: #255C39;
+  --color-diff-removed-row-bg: #432121;
+  --color-diff-moved-row-bg: #825718;
+  --color-diff-added-row-bg: #1B3625;
+  --color-diff-removed-row-border: #783030;
+  --color-diff-moved-row-border: #A67A1D;
+  --color-diff-added-row-border: #255C39;
+  --color-diff-inactive: var(--steel-650);
+  --color-error-border: #783030;
+  --color-error-bg: #5F2525;
+  --color-error-bg-active: #783030;
+  --color-error-bg-hover: #783030;
+  --color-error-text: #fef2f2;
+  --color-success-border: #1F6E3C;
+  --color-success-bg: #1D462C;
+  --color-success-text: #f0fdf4;
+  --color-warning-border: #A67A1D;
+  --color-warning-bg: #644821;
+  --color-warning-text: #fefce8;
+  --color-info-border: #2E50B0;
+  --color-info-bg: #2A396B;
+  --color-info-text: var(--steel-100);
+  --color-red-badge: #B91C1C;
+  --color-red-badge-bg: #B91C1C22;
+  --color-red-badge-hover-bg: #B91C1C44;
+  --color-green-badge: #16a34a;
+  --color-green-badge-bg: #16a34a22;
+  --color-green-badge-hover-bg: #16a34a44;
+  --color-yellow-badge: #ca8a04;
+  --color-yellow-badge-bg: #ca8a0422;
+  --color-yellow-badge-hover-bg: #ca8a0444;
+  --color-orange-badge: #ea580c;
+  --color-orange-badge-bg: #ea580c22;
+  --color-orange-badge-hover-bg: #ea580c44;
+  --color-git: #f05133;
+
+  /* target-based colors */
+  --color-body: var(--steel-800);
+  --color-box-header: var(--steel-700);
+  --color-box-body: var(--steel-750);
+  --color-box-body-highlight: var(--steel-650);
+  --color-text-dark: #fff;
+  --color-text: var(--steel-100);
+  --color-text-light: var(--steel-150);
+  --color-text-light-1: var(--steel-150);
+  --color-text-light-2: var(--steel-200);
+  --color-text-light-3: var(--steel-200);
+  --color-footer: var(--steel-900);
+  --color-timeline: var(--steel-650);
+  --color-input-text: var(--steel-100);
+  --color-input-background: var(--steel-650);
+  --color-input-toggle-background: var(--steel-650);
+  --color-input-border: var(--steel-550);
+  --color-input-border-hover: var(--steel-450);
+  --color-navbar: var(--steel-850);
+  --color-navbar-transparent: #242D3800;
+  --color-light: #00000028;
+  --color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled)));
+  --color-light-border: #ffffff28;
+  --color-hover: var(--steel-600);
+  --color-active: var(--steel-650);
+  --color-menu: var(--steel-700);
+  --color-card: var(--steel-700);
+  --color-markup-table-row: #ffffff06;
+  --color-markup-code-block: var(--steel-800);
+  --color-button: var(--steel-600);
+  --color-code-bg: var(--steel-750);
+  --color-code-sidebar-bg: var(--steel-600);
+  --color-shadow: #00000060;
+  --color-secondary-bg: var(--steel-700);
+  --color-text-focus: #fff;
+  --color-expand-button: #3c404d;
+  --color-placeholder-text: var(--steel-450);
+  --color-editor-line-highlight: var(--steel-700);
+  --color-project-board-bg: var(--color-secondary-light-3);
+  --color-project-board-dark-label: var(--color-text-light-3);
+  --color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */
+  --color-reaction-bg: #ffffff12;
+  --color-reaction-active-bg: var(--color-primary-alpha-30);
+  --color-header-bar: var(--steel-900);
+  --color-label-active-bg: #4c525e;
+  --color-accent: var(--color-primary-light-1);
+  --color-small-accent: var(--color-primary-light-5);
+  --color-active-line: #534d1b;
+
+  accent-color: var(--color-accent);
+  color-scheme: dark;
+}
+
+/* invert emojis that are hard to read otherwise */
+.emoji[aria-label="check mark"],
+.emoji[aria-label="currency exchange"],
+.emoji[aria-label="TOP arrow"],
+.emoji[aria-label="END arrow"],
+.emoji[aria-label="ON! arrow"],
+.emoji[aria-label="SOON arrow"],
+.emoji[aria-label="heavy dollar sign"],
+.emoji[aria-label="copyright"],
+.emoji[aria-label="registered"],
+.emoji[aria-label="trade mark"],
+.emoji[aria-label="multiply"],
+.emoji[aria-label="plus"],
+.emoji[aria-label="minus"],
+.emoji[aria-label="divide"],
+.emoji[aria-label="curly loop"],
+.emoji[aria-label="double curly loop"],
+.emoji[aria-label="wavy dash"],
+.emoji[aria-label="paw prints"],
+.emoji[aria-label="musical note"],
+.emoji[aria-label="musical notes"] {
+  filter: invert(100%) hue-rotate(180deg);
+}
+
+.following.bar.light{
+  border-bottom-color: #ffffff11 !important;
+}
+.text.green.svg {
+  color: #16a34a !important;
+}
+i.grey.icon.icon.icon.icon {
+  color: var(--steel-350) !important;
+}
+
+.ui.red.button,
+.ui.negative.button {
+  background-color: #7f1d1d !important;
+  color: #fff !important;
+  border-color: var(--color-light-border) !important;
+  &:hover {
+    background-color: #991b1b !important;
+  }
+}
+
+.ui.secondary.vertical.menu {
+  border-radius: 0.28571429rem !important;
+  overflow: hidden;
+}
+.ui.secondary.vertical.menu > .item {
+  border-radius: 0 !important;
+}
+.ui.basic.primary.button.item {
+  background-color: var(--color-active) !important;
+  color: var(--color-text) !important;
+  box-shadow: none !important;
+}
+
+.ui.red.label.notification_count,
+.ui.primary.label, .ui.primary.labels .label {
+  background-color: var(--color-primary-light-3) !important;
+}
+
+.repository.view.issue .comment-list .code-comment + .code-comment {
+  margin: 1.25rem 0 !important;
+  padding-top: 1.25rem !important;
+  border-top-color: var(--steel-650) !important;
+}
+
+.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon {
+  background-color: rgba(0, 0, 0, 0.05) !important;
+}
+
+#review-box .review-comments-counter {
+  background-color: #00000088 !important;
+  color: #fff !important;
+  margin-left: 0.5em;
+}
+
+.ui.tabs .ui.primary.label,
+.ui.menu .ui.primary.label {
+  background-color: rgba(192,192,255, 0.2) !important;
+  // background-color: var(--zinc-300) !important;
+  color: var(--color-text-dark) !important;
+}
+
+.ui.basic.yellow.label.pending-label {
+  background: var(--color-light) !important;
+}
+
+.ui.tertiary.button {
+  color: #fff9;
+  &:hover {
+    color: #ccc;
+  }
+}
diff --git a/web_src/less/themes/theme-forgejo-light.less b/web_src/less/themes/theme-forgejo-light.less
new file mode 100644
index 0000000000..e9124ca804
--- /dev/null
+++ b/web_src/less/themes/theme-forgejo-light.less
@@ -0,0 +1,277 @@
+// @import "../chroma/light.less";
+// @import "../codemirror/light.less";
+
+:root {
+  --steel-900: #10161D;
+  --steel-850: #131A21;
+  --steel-800: #171E26;
+  --steel-750: #1D262F;
+  --steel-700: #242D38;
+  --steel-650: #2B3642;
+  --steel-600: #374351;
+  --steel-550: #445161;
+  --steel-500: #515F70;
+  --steel-450: #5F6E80;
+  --steel-400: #6D7D8F;
+  --steel-350: #7C8C9F;
+  --steel-300: #8C9CAF;
+  --steel-250: #9DADC0;
+  --steel-200: #AEBED0;
+  --steel-150: #C0CFE0;
+  --steel-100: #D2E0F0;
+
+  --zinc-50: #FAFAFA;
+  --zinc-100: #F4F4F5;
+  --zinc-150: #ECECEE;
+  --zinc-200: #E4E4E7;
+  --zinc-250: #DCDCE0;
+  --zinc-300: #D4D4D8;
+  --zinc-350: #BABAC1;
+  --zinc-400: #A1A1AA;
+  --zinc-450: #898992;
+  --zinc-500: #71717A;
+  --zinc-550: #61616A;
+  --zinc-600: #52525B;
+  --zinc-650: #484850;
+  --zinc-700: #3F3F46;
+  --zinc-750: #333338;
+  --zinc-800: #27272A;
+  --zinc-850: #1F1F23;
+  --zinc-900: #18181B;
+
+  // --is-dark-theme: true;
+  --color-primary: #c2410c;
+  --color-primary-contrast: #ffffff;
+  --color-primary-dark-1: #c2410c;
+  --color-primary-dark-2: #9a3412;
+  --color-primary-dark-3: #9a3412;
+  --color-primary-dark-4: #7c2d12;
+  --color-primary-dark-5: #7c2d12;
+  --color-primary-dark-6: #7c2d12;
+  --color-primary-dark-7: #7c2d12;
+  --color-primary-light-1: #ea580c;
+  --color-primary-light-2: #f97316;
+  --color-primary-light-3: #fb923c;
+  --color-primary-light-4: #fdba74;
+  --color-primary-light-5: #fed7aa;
+  --color-primary-light-6: #ffedd5;
+  --color-primary-light-7: #fff7ed;
+  --color-primary-alpha-10: #c2410c19;
+  --color-primary-alpha-20: #c2410c33;
+  --color-primary-alpha-30: #c2410c4b;
+  --color-primary-alpha-40: #c2410c66;
+  --color-primary-alpha-50: #c2410c80;
+  --color-primary-alpha-60: #c2410c99;
+  --color-primary-alpha-70: #c2410cb3;
+  --color-primary-alpha-80: #c2410ccc;
+  --color-primary-alpha-90: #c2410ce1;
+  --color-secondary: var(--zinc-200);
+  --color-secondary-dark-1: var(--zinc-200);
+  --color-secondary-dark-2: var(--zinc-300);
+  --color-secondary-dark-3: var(--zinc-300);
+  --color-secondary-dark-4: var(--zinc-400);
+  --color-secondary-dark-5: var(--zinc-400);
+  --color-secondary-dark-6: var(--zinc-500);
+  --color-secondary-dark-7: var(--zinc-500);
+  --color-secondary-dark-8: var(--zinc-600);
+  --color-secondary-dark-9: var(--zinc-600);
+  --color-secondary-dark-10: var(--zinc-700);
+  --color-secondary-dark-11: var(--zinc-700);
+  --color-secondary-dark-12: var(--zinc-800);
+  --color-secondary-dark-13: var(--zinc-800);
+  --color-secondary-light-1: var(--zinc-200);
+  --color-secondary-light-2: var(--zinc-100);
+  --color-secondary-light-3: var(--zinc-100);
+  --color-secondary-light-4: var(--zinc-50);
+  --color-secondary-alpha-10: #d4d4d819;
+  --color-secondary-alpha-20: #d4d4d833;
+  --color-secondary-alpha-30: #d4d4d84b;
+  --color-secondary-alpha-40: #d4d4d866;
+  --color-secondary-alpha-50: #d4d4d880;
+  --color-secondary-alpha-60: #d4d4d899;
+  --color-secondary-alpha-70: #d4d4d8b3;
+  --color-secondary-alpha-80: #d4d4d8cc;
+  --color-secondary-alpha-90: #d4d4d8e1;
+
+  /* colors */
+  --color-red: #dc2626;
+  --color-orange: #ea580c;
+  --color-yellow: #ca8a04;
+  --color-olive: #91a313;
+  --color-green: #15803d;
+  --color-teal: #0d9488;
+  --color-blue: #2563eb;
+  --color-violet: #7c3aed;
+  --color-purple: #9333ea;
+  --color-pink: #db2777;
+  --color-brown: #a47252;
+  --color-grey: #4b5563;
+  --color-black: #000000;
+
+  /* light variants */
+  --color-red-light: #ef4444;
+  --color-orange-light: #f97316;
+  --color-yellow-light: #eab308;
+  --color-olive-light: #839311;
+  --color-green-light: #16a34a;
+  --color-teal-light: #14b8a6;
+  --color-blue-light: #3b82f6;
+  --color-violet-light: #8b5cf6;
+  --color-purple-light: #a855f7;
+  --color-pink-light: #ec4899;
+  --color-brown-light: #94674a;
+  --color-grey-light: #6b7280;
+  --color-black-light: #181818;
+
+  /* other colors */
+  --color-gold: #b1983b;
+  --color-white: #ffffff;
+  --color-diff-removed-word-bg: #fca5a5;
+  --color-diff-added-word-bg: #86efac;
+  --color-diff-removed-row-bg: #fee2e2;
+  --color-diff-moved-row-bg: #fef9c3;
+  --color-diff-added-row-bg: #dcfce7;
+  --color-diff-removed-row-border: #fca5a5;
+  --color-diff-moved-row-border: #fde047;
+  --color-diff-added-row-border: #86efac;
+  --color-diff-inactive: var(--zinc-100);
+  --color-error-border: #fecaca;
+  --color-error-bg: #fee2e2;
+  --color-error-bg-active: #fca5a5;
+  --color-error-bg-hover: #fecaca;
+  --color-error-text: #7f1d1d;
+  --color-success-border: #bbf7d0;
+  --color-success-bg: #dcfce7;
+  --color-success-text: #14532d;
+  --color-warning-border: #fde047;
+  --color-warning-bg: #fef3c7;
+  --color-warning-text: #78350f;
+  --color-info-border: #bae6fd;
+  --color-info-bg: #e0f2fe;
+  --color-info-text: #0c4a6e;
+  --color-red-badge: #B91C1C;
+  --color-red-badge-bg: #B91C1C22;
+  --color-red-badge-hover-bg: #B91C1C44;
+  --color-green-badge: #16a34a;
+  --color-green-badge-bg: #16a34a22;
+  --color-green-badge-hover-bg: #16a34a44;
+  --color-yellow-badge: #ca8a04;
+  --color-yellow-badge-bg: #ca8a0422;
+  --color-yellow-badge-hover-bg: #ca8a0444;
+  --color-orange-badge: #ea580c;
+  --color-orange-badge-bg: #ea580c22;
+  --color-orange-badge-hover-bg: #ea580c44;
+  --color-git: #f05133;
+
+  /* target-based colors */
+  --color-body: #fff;
+  --color-box-header: var(--zinc-100);
+  --color-box-body: var(--zinc-50);
+  --color-box-body-highlight: var(--zinc-200);
+  --color-text-dark: #000;
+  --color-text: var(--zinc-900);
+  --color-text-light: var(--zinc-700);
+  --color-text-light-1: var(--zinc-650);
+  --color-text-light-2: var(--zinc-600);
+  --color-text-light-3: var(--zinc-550);
+  --color-footer: var(--zinc-100);
+  --color-timeline: var(--zinc-200);
+  --color-input-text: var(--zinc-800);
+  --color-input-background: #fff;
+  --color-input-toggle-background: #fff;
+  --color-input-border: var(--zinc-300);
+  --color-input-border-hover: var(--zinc-400);
+  --color-navbar: var(--zinc-50);
+  --color-navbar-transparent: #D2E0F000;
+  --color-light: #ffffffcc;
+  --color-light-mimic-enabled: rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled)));
+  --color-light-border: #0000001d;
+  --color-hover: #e4e4e4aa;
+  --color-active: #d4d4d8aa;
+  --color-menu: var(--zinc-100);
+  --color-card: var(--zinc-50);
+  --color-markup-table-row: #ffffff06;
+  --color-markup-code-block: var(--zinc-150);
+  --color-button: var(--zinc-150);
+  --color-code-bg: var(--zinc-50);
+  --color-code-sidebar-bg: var(--zinc-100);
+  --color-shadow: #00000060;
+  --color-secondary-bg: var(--zinc-100);
+  --color-text-focus: #fff;
+  --color-expand-button: var(--zinc-200);
+  --color-placeholder-text: var(--zinc-400);
+  --color-editor-line-highlight: var(--zinc-100);
+  --color-project-board-bg: var(--color-secondary-light-2);
+  --color-project-board-dark-label: var(--color-text-light-3);
+  --color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */
+  --color-reaction-bg: #0000000a;
+  --color-reaction-active-bg: var(--color-primary-alpha-20);
+  --color-header-bar: var(--zinc-100);
+  --color-label-active-bg: #4c525e;
+  --color-accent: var(--color-primary-light-1);
+  --color-small-accent: var(--color-primary-light-5);
+  --color-active-line: #534d1b;
+
+  accent-color: var(--color-accent);
+  color-scheme: light;
+}
+
+.text.green.svg {
+  color: #16a34a !important;
+}
+// .ui.red.button,
+// .ui.negative.button {
+//   background-color: var(--color-red) !important;
+//   color: #fff !important;
+//   border-color: var(--color-light-border) !important;
+//   &:hover {
+//     background-color: var(--color-red-light) !important;
+//   }
+// }
+
+.ui.secondary.vertical.menu {
+  border-radius: 0.28571429rem !important;
+  overflow: hidden;
+}
+.ui.secondary.vertical.menu > .item {
+  border-radius: 0 !important;
+}
+.ui.basic.primary.button.item {
+  background-color: var(--color-active) !important;
+  color: var(--color-text) !important;
+  box-shadow: none !important;
+}
+
+.ui.red.label.notification_count,
+.ui.primary.label, .ui.primary.labels .label {
+  background-color: var(--color-primary-dark-1) !important;
+}
+
+.repository.view.issue .comment-list .code-comment + .code-comment {
+  margin: 1.25rem 0 !important;
+  padding-top: 1.25rem !important;
+  border-top-color: var(--zinc-250) !important;
+}
+
+.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon {
+  background-color: rgba(0, 0, 0, 0.05) !important;
+}
+
+#review-box .review-comments-counter {
+  background-color: #ffffffaa !important;
+  color: #000 !important;
+  margin-left: 0.5em;
+}
+
+.ui.tabs .ui.primary.label,
+.ui.menu .ui.primary.label {
+  background-color: rgba(0, 0, 0, 0.15) !important;
+  // background-color: var(--zinc-300) !important;
+  color: var(--color-text-dark) !important;
+}
+
+.ui.basic.yellow.label.pending-label {
+  background: var(--color-warning-bg) !important;
+  color: var(--color-warning-text) !important;
+  border-color: #eab308 !important;
+}

From 9578a1d83a612c78634fb20849f027505233d218 Mon Sep 17 00:00:00 2001
From: Caesar Schinas <caesar@caesarschinas.com>
Date: Wed, 28 Dec 2022 00:28:39 -1000
Subject: [PATCH 09/16] [BRANDING] Rebrand default meta tags

(cherry picked from commit fedeadb738a960d920256eddc5b03bc2ac4ad8b2)
---
 modules/setting/setting.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 6d82d20d6a..e32e3fc679 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -334,9 +334,9 @@ var (
 			Description string
 			Keywords    string
 		}{
-			Author:      "Gitea - Git with a cup of tea",
-			Description: "Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go",
-			Keywords:    "go,git,self-hosted,gitea",
+			Author:      "Forgejo – Beyond coding. We forge.",
+			Description: "Forgejo is a self-hosted lightweight software forge. Easy to install and low maintenance, it just does the job.",
+			Keywords:    "git,forge,forgejo",
 		},
 	}
 

From 2b59a901464dc33b50061d0aef02ee71b5e24d0a Mon Sep 17 00:00:00 2001
From: TomZ <tom@flowee.org>
Date: Mon, 9 Jan 2023 14:01:00 +0100
Subject: [PATCH 10/16] [BRANDING] Rename usage of Gitea in user-visible places

As the docs of codeberg refer to the strings printed by the Forgejo
ssh servers, this is user-facing and is nice to update to the new
product name.

(cherry picked from commit 9c65f0d2ef44ae9a44960b827aee23a1a91192a9)
---
 cmd/serv.go | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/cmd/serv.go b/cmd/serv.go
index 06561f348a..d19020e5c3 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -149,13 +149,13 @@ func runServ(c *cli.Context) error {
 		}
 		switch key.Type {
 		case asymkey_model.KeyTypeDeploy:
-			println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Gitea does not provide shell access.")
+			println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Forgejo does not provide shell access.")
 		case asymkey_model.KeyTypePrincipal:
-			println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Gitea does not provide shell access.")
+			println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Forgejo does not provide shell access.")
 		default:
-			println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Gitea does not provide shell access.")
+			println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Forgejo does not provide shell access.")
 		}
-		println("If this is unexpected, please log in with password and setup Gitea under another user.")
+		println("If this is unexpected, please log in with password and setup Forgejo under another user.")
 		return nil
 	} else if c.Bool("debug") {
 		log.Debug("SSH_ORIGINAL_COMMAND: %s", os.Getenv("SSH_ORIGINAL_COMMAND"))

From 5c4cd14c4f785c9a12ee85dd7732114f0e6bce67 Mon Sep 17 00:00:00 2001
From: Gusted <postmaster@gusted.xyz>
Date: Mon, 9 Jan 2023 22:28:04 +0100
Subject: [PATCH 11/16] [BRANDING] Replace branding in Swagger

- "Gitea" is automatically being determined in Swagger and cannot be
overridden, therefor we override it after `swagger generate spec` is run.
- Resolves https://codeberg.org/forgejo/forgejo/issues/226

(cherry picked from commit ffc2db3d693e92cf48f95f8b722242a1c03ee01a)
---
 Makefile                       | 2 ++
 templates/swagger/v1_json.tmpl | 4 ++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 8745cd8d16..d92ebe93dd 100644
--- a/Makefile
+++ b/Makefile
@@ -157,6 +157,7 @@ SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEs
 SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
 SWAGGER_EXCLUDE := code.gitea.io/sdk
 SWAGGER_NEWLINE_COMMAND := -e '$$a\'
+SWAGGER_SPEC_BRANDING := s|Gitea API|Forgejo API|g
 
 TEST_MYSQL_HOST ?= mysql:3306
 TEST_MYSQL_DBNAME ?= testgitea
@@ -331,6 +332,7 @@ $(SWAGGER_SPEC): $(GO_SOURCES_NO_BINDATA)
 	$(GO) run $(SWAGGER_PACKAGE) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)'
 	$(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)'
 	$(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)'
+	$(SED_INPLACE) '$(SWAGGER_SPEC_BRANDING)' './$(SWAGGER_SPEC)'
 
 .PHONY: swagger-check
 swagger-check: generate-swagger
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 5df9f2bd2b..9ce8a02e9d 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -13,8 +13,8 @@
   ],
   "swagger": "2.0",
   "info": {
-    "description": "This documentation describes the Gitea API.",
-    "title": "Gitea API.",
+    "description": "This documentation describes the Forgejo API.",
+    "title": "Forgejo API.",
     "license": {
       "name": "MIT",
       "url": "http://opensource.org/licenses/MIT"

From b032259089a0b5a0eff6592ce9c1038f15e6a551 Mon Sep 17 00:00:00 2001
From: Earl Warren <contact@earl-warren.org>
Date: Thu, 12 Jan 2023 22:56:56 +0100
Subject: [PATCH 12/16] [BRANDING] parse FORGEJO__* in the container
 environment

Add the FORGEJO__ prefix as equivalent to GITEA__ when interpreted by
environment-to-ini. It is used when running the Forgejo container like
so:

  docker run --name forgejo -e FORGEJO__security__INSTALL_LOCK=true \
             -d codeberg.org/forgejo/forgejo:1.18

Signed-off-by: Earl Warren <contact@earl-warren.org>
(cherry picked from commit b4665b0796cf582d761797df2be45e3574839dda)
---
 .woodpecker/testing-amd64.yml                 |  8 ++++
 .../environment-to-ini/environment-to-ini.go  | 48 ++++++++++---------
 .../environment-to-ini_test.go                | 21 ++++++++
 3 files changed, 55 insertions(+), 22 deletions(-)
 create mode 100644 contrib/environment-to-ini/environment-to-ini_test.go

diff --git a/.woodpecker/testing-amd64.yml b/.woodpecker/testing-amd64.yml
index 6c0ba08196..c321a4bd78 100644
--- a/.woodpecker/testing-amd64.yml
+++ b/.woodpecker/testing-amd64.yml
@@ -75,6 +75,14 @@ pipeline:
     commands:
     - ./build/test-env-prepare.sh
 
+  environment-to-ini:
+    image: *golang_image
+    environment:
+      GOPROXY_OVERRIDE: *goproxy_override
+    commands:
+      - *goproxy_setup
+      - go test contrib/environment-to-ini/environment-to-ini.go contrib/environment-to-ini/environment-to-ini_test.go
+
   build:
     image: *test_image
     environment:
diff --git a/contrib/environment-to-ini/environment-to-ini.go b/contrib/environment-to-ini/environment-to-ini.go
index ccda03fa92..0baba5902b 100644
--- a/contrib/environment-to-ini/environment-to-ini.go
+++ b/contrib/environment-to-ini/environment-to-ini.go
@@ -1,3 +1,4 @@
+// Copyright 2023 The Forgejo Authors. All rights reserved.
 // Copyright 2019 The Gitea Authors. All rights reserved.
 // Use of this source code is governed by a MIT-style
 // license that can be found in the LICENSE file.
@@ -19,17 +20,17 @@ import (
 )
 
 // EnvironmentPrefix environment variables prefixed with this represent ini values to write
-const EnvironmentPrefix = "GITEA"
+const prefixRegexpString = "^(FORGEJO|GITEA)"
 
 func main() {
 	app := cli.NewApp()
 	app.Name = "environment-to-ini"
 	app.Usage = "Use provided environment to update configuration ini"
-	app.Description = `As a helper to allow docker users to update the gitea configuration
+	app.Description = `As a helper to allow docker users to update the forgejo configuration
 	through the environment, this command allows environment variables to
 	be mapped to values in the ini.
 
-	Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME"
+	Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
 	will be mapped to the ini section "[section_name]" and the key
 	"KEY_NAME" with the value as provided.
 
@@ -47,9 +48,8 @@ func main() {
 		...
 		"""
 
-	You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false"
-	and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
-	on the configuration cheat sheet.`
+	You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
+	and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false".`
 	app.Flags = []cli.Flag{
 		cli.StringFlag{
 			Name:  "custom-path, C",
@@ -77,7 +77,7 @@ func main() {
 		},
 		cli.StringFlag{
 			Name:  "prefix, p",
-			Value: EnvironmentPrefix,
+			Value: prefixRegexpString,
 			Usage: "Environment prefix to look for - will be suffixed by __ (2 underscores)",
 		},
 	}
@@ -90,6 +90,19 @@ func main() {
 	}
 }
 
+func splitEnvironmentVariable(prefixRegexp *regexp.Regexp, kv string) (string, string) {
+	idx := strings.IndexByte(kv, '=')
+	if idx < 0 {
+		return "", ""
+	}
+	k := kv[:idx]
+	loc := prefixRegexp.FindStringIndex(k)
+	if loc == nil {
+		return "", ""
+	}
+	return k[loc[1]:], kv[idx+1:]
+}
+
 func runEnvironmentToIni(c *cli.Context) error {
 	providedCustom := c.String("custom-path")
 	providedConf := c.String("config")
@@ -112,19 +125,13 @@ func runEnvironmentToIni(c *cli.Context) error {
 
 	changed := false
 
-	prefix := c.String("prefix") + "__"
+	prefixRegexp := regexp.MustCompile(c.String("prefix") + "__")
 
 	for _, kv := range os.Environ() {
-		idx := strings.IndexByte(kv, '=')
-		if idx < 0 {
+		eKey, value := splitEnvironmentVariable(prefixRegexp, kv)
+		if eKey == "" {
 			continue
 		}
-		eKey := kv[:idx]
-		value := kv[idx+1:]
-		if !strings.HasPrefix(eKey, prefix) {
-			continue
-		}
-		eKey = eKey[len(prefix):]
 		sectionName, keyName := DecodeSectionKey(eKey)
 		if len(keyName) == 0 {
 			continue
@@ -164,14 +171,11 @@ func runEnvironmentToIni(c *cli.Context) error {
 	}
 	if c.Bool("clear") {
 		for _, kv := range os.Environ() {
-			idx := strings.IndexByte(kv, '=')
-			if idx < 0 {
+			eKey, _ := splitEnvironmentVariable(prefixRegexp, kv)
+			if eKey == "" {
 				continue
 			}
-			eKey := kv[:idx]
-			if strings.HasPrefix(eKey, prefix) {
-				_ = os.Unsetenv(eKey)
-			}
+			_ = os.Unsetenv(eKey)
 		}
 	}
 	return nil
diff --git a/contrib/environment-to-ini/environment-to-ini_test.go b/contrib/environment-to-ini/environment-to-ini_test.go
new file mode 100644
index 0000000000..6abbb67eff
--- /dev/null
+++ b/contrib/environment-to-ini/environment-to-ini_test.go
@@ -0,0 +1,21 @@
+// Copyright 2023 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package main
+
+import (
+	"regexp"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func Test_splitEnvironmentVariable(t *testing.T) {
+	prefixRegexp := regexp.MustCompile(prefixRegexpString + "__")
+	k, v := splitEnvironmentVariable(prefixRegexp, "FORGEJO__KEY=VALUE")
+	assert.Equal(t, k, "KEY")
+	assert.Equal(t, v, "VALUE")
+	k, v = splitEnvironmentVariable(prefixRegexp, "nothing=interesting")
+	assert.Equal(t, k, "")
+	assert.Equal(t, v, "")
+}

From fd245037ea9b3114a902e3964ad28a6c4a89431d Mon Sep 17 00:00:00 2001
From: Earl Warren <contact@earl-warren.org>
Date: Sat, 14 Jan 2023 08:16:30 +0100
Subject: [PATCH 13/16] [BRANDING] add X-Forgejo-* headers

(cherry picked from commit de86c5e6ef57cf8fb9dd36abe1d83d3ade4cb12f)
---
 modules/httpcache/httpcache.go      |  1 +
 modules/httpcache/httpcache_test.go |  3 +++
 routers/api/v1/api.go               |  2 +-
 routers/api/v1/repo/file.go         |  7 ++++++-
 services/mailer/mail.go             | 10 ++++++++++
 services/webhook/deliver.go         |  4 ++++
 6 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/modules/httpcache/httpcache.go b/modules/httpcache/httpcache.go
index 750233d4a7..882f207ef7 100644
--- a/modules/httpcache/httpcache.go
+++ b/modules/httpcache/httpcache.go
@@ -31,6 +31,7 @@ func AddCacheControlToHeader(h http.Header, maxAge time.Duration, additionalDire
 
 		// to remind users they are using non-prod setting.
 		h.Add("X-Gitea-Debug", "RUN_MODE="+setting.RunMode)
+		h.Add("X-Forgejo-Debug", "RUN_MODE="+setting.RunMode)
 	}
 
 	h.Set("Cache-Control", strings.Join(append(directives, additionalDirectives...), ", "))
diff --git a/modules/httpcache/httpcache_test.go b/modules/httpcache/httpcache_test.go
index 49e54d147e..e7965d6af8 100644
--- a/modules/httpcache/httpcache_test.go
+++ b/modules/httpcache/httpcache_test.go
@@ -30,6 +30,9 @@ func countFormalHeaders(h http.Header) (c int) {
 		if strings.HasPrefix(k, "X-Gitea-") {
 			continue
 		}
+		if strings.HasPrefix(k, "X-Forgejo-") {
+			continue
+		}
 		c++
 	}
 	return c
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index b0a864d199..38cd8e87bd 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -611,7 +611,7 @@ func Routes(ctx gocontext.Context) *web.Route {
 			// setting.CORSConfig.AllowSubdomain // FIXME: the cors middleware needs allowSubdomain option
 			AllowedMethods:   setting.CORSConfig.Methods,
 			AllowCredentials: setting.CORSConfig.AllowCredentials,
-			AllowedHeaders:   []string{"Authorization", "X-Gitea-OTP"},
+			AllowedHeaders:   []string{"Authorization", "X-Gitea-OTP", "X-Forgejo-OTP"},
 			MaxAge:           int(setting.CORSConfig.MaxAge.Seconds()),
 		}))
 	}
diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go
index aba5b1f9e7..3dcd28ccd0 100644
--- a/routers/api/v1/repo/file.go
+++ b/routers/api/v1/repo/file.go
@@ -33,7 +33,10 @@ import (
 	files_service "code.gitea.io/gitea/services/repository/files"
 )
 
-const giteaObjectTypeHeader = "X-Gitea-Object-Type"
+const (
+	giteaObjectTypeHeader   = "X-Gitea-Object-Type"
+	forgejoObjectTypeHeader = "X-Forgejo-Object-Type"
+)
 
 // GetRawFile get a file by path on a repository
 func GetRawFile(ctx *context.APIContext) {
@@ -80,6 +83,7 @@ func GetRawFile(ctx *context.APIContext) {
 	}
 
 	ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
+	ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
 
 	if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil {
 		ctx.Error(http.StatusInternalServerError, "ServeBlob", err)
@@ -129,6 +133,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
 	}
 
 	ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
+	ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
 
 	// LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file
 	if blob.Size() > 1024 {
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index eece83ca43..23de3dc531 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -373,6 +373,16 @@ func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient
 		"X-Gitea-Issue-ID":          strconv.FormatInt(ctx.Issue.Index, 10),
 		"X-Gitea-Issue-Link":        ctx.Issue.HTMLURL(),
 
+		"X-Forgejo-Reason":            reason,
+		"X-Forgejo-Sender":            ctx.Doer.DisplayName(),
+		"X-Forgejo-Recipient":         recipient.DisplayName(),
+		"X-Forgejo-Recipient-Address": recipient.Email,
+		"X-Forgejo-Repository":        repo.Name,
+		"X-Forgejo-Repository-Path":   repo.FullName(),
+		"X-Forgejo-Repository-Link":   repo.HTMLURL(),
+		"X-Forgejo-Issue-ID":          strconv.FormatInt(ctx.Issue.Index, 10),
+		"X-Forgejo-Issue-Link":        ctx.Issue.HTMLURL(),
+
 		"X-GitHub-Reason":            reason,
 		"X-GitHub-Sender":            ctx.Doer.DisplayName(),
 		"X-GitHub-Recipient":         recipient.DisplayName(),
diff --git a/services/webhook/deliver.go b/services/webhook/deliver.go
index 74a69c297c..af45369d53 100644
--- a/services/webhook/deliver.go
+++ b/services/webhook/deliver.go
@@ -116,6 +116,10 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error {
 
 	event := t.EventType.Event()
 	eventType := string(t.EventType)
+	req.Header.Add("X-Forgejo-Delivery", t.UUID)
+	req.Header.Add("X-Forgejo-Event", event)
+	req.Header.Add("X-Forgejo-Event-Type", eventType)
+	req.Header.Add("X-Forgejo-Signature", signatureSHA256)
 	req.Header.Add("X-Gitea-Delivery", t.UUID)
 	req.Header.Add("X-Gitea-Event", event)
 	req.Header.Add("X-Gitea-Event-Type", eventType)

From 0f12ca9222243e05ae992515125f13f2b39ca7da Mon Sep 17 00:00:00 2001
From: Earl Warren <contact@earl-warren.org>
Date: Sat, 14 Jan 2023 10:07:01 +0100
Subject: [PATCH 14/16] [BRANDING] define the forgejo webhook type

templates/swagger/v1_json.tmpl updated with `make generate-swagger`

(cherry picked from commit 0f9842fc582057068e907ef2c7b3129848288f56)
---
 models/webhook/webhook.go                     |  1 +
 modules/setting/webhook.go                    |  2 +-
 modules/structs/hook.go                       |  2 +-
 routers/web/repo/webhook.go                   | 28 +++++++++++++
 routers/web/web.go                            |  6 +++
 services/webhook/webhook.go                   |  4 +-
 templates/admin/hook_new.tmpl                 |  7 +++-
 templates/org/settings/hook_new.tmpl          |  6 ++-
 .../repo/settings/webhook/base_list.tmpl      |  5 ++-
 templates/repo/settings/webhook/forgejo.tmpl  | 40 +++++++++++++++++++
 templates/repo/settings/webhook/new.tmpl      |  7 +++-
 templates/swagger/v1_json.tmpl                |  1 +
 tests/integration/links_test.go               | 38 ++++++++++++++++++
 13 files changed, 136 insertions(+), 11 deletions(-)
 create mode 100644 templates/repo/settings/webhook/forgejo.tmpl

diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go
index aebe0d6e72..108330bca2 100644
--- a/models/webhook/webhook.go
+++ b/models/webhook/webhook.go
@@ -155,6 +155,7 @@ type HookType = string
 
 // Types of webhooks
 const (
+	FORGEJO    HookType = "forgejo"
 	GITEA      HookType = "gitea"
 	GOGS       HookType = "gogs"
 	SLACK      HookType = "slack"
diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go
index 0bfd7dcb4d..be78066a3d 100644
--- a/modules/setting/webhook.go
+++ b/modules/setting/webhook.go
@@ -36,7 +36,7 @@ func newWebhookService() {
 	Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
 	Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
 	Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("")
-	Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
+	Webhook.Types = []string{"forgejo", "gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
 	Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10)
 	Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("")
 	if Webhook.ProxyURL != "" {
diff --git a/modules/structs/hook.go b/modules/structs/hook.go
index 8321a15a8f..503f983151 100644
--- a/modules/structs/hook.go
+++ b/modules/structs/hook.go
@@ -40,7 +40,7 @@ type CreateHookOptionConfig map[string]string
 // CreateHookOption options when create a hook
 type CreateHookOption struct {
 	// required: true
-	// enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
+	// enum: forgejo,dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
 	Type string `json:"type" binding:"Required"`
 	// required: true
 	Config       CreateHookOptionConfig `json:"config" binding:"Required"`
diff --git a/routers/web/repo/webhook.go b/routers/web/repo/webhook.go
index ee980333b7..f37454a42c 100644
--- a/routers/web/repo/webhook.go
+++ b/routers/web/repo/webhook.go
@@ -297,6 +297,34 @@ func editWebhook(ctx *context.Context, params webhookParams) {
 	ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID))
 }
 
+// ForgejoHooksNewPost response for creating Forgejo webhook
+func ForgejoHooksNewPost(ctx *context.Context) {
+	createWebhook(ctx, forgejoHookParams(ctx))
+}
+
+// ForgejoHooksEditPost response for editing Forgejo webhook
+func ForgejoHooksEditPost(ctx *context.Context) {
+	editWebhook(ctx, forgejoHookParams(ctx))
+}
+
+func forgejoHookParams(ctx *context.Context) webhookParams {
+	form := web.GetForm(ctx).(*forms.NewWebhookForm)
+
+	contentType := webhook.ContentTypeJSON
+	if webhook.HookContentType(form.ContentType) == webhook.ContentTypeForm {
+		contentType = webhook.ContentTypeForm
+	}
+
+	return webhookParams{
+		Type:        webhook.FORGEJO,
+		URL:         form.PayloadURL,
+		ContentType: contentType,
+		Secret:      form.Secret,
+		HTTPMethod:  form.HTTPMethod,
+		WebhookForm: form.WebhookForm,
+	}
+}
+
 // GiteaHooksNewPost response for creating Gitea webhook
 func GiteaHooksNewPost(ctx *context.Context) {
 	createWebhook(ctx, giteaHookParams(ctx))
diff --git a/routers/web/web.go b/routers/web/web.go
index 7757e9c30c..3f41592a17 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -534,6 +534,7 @@ func RegisterRoutes(m *web.Route) {
 				m.Get("", repo.WebHooksEdit)
 				m.Post("/replay/{uuid}", repo.ReplayWebhook)
 			})
+			m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
 			m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 			m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 			m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
@@ -549,6 +550,7 @@ func RegisterRoutes(m *web.Route) {
 
 		m.Group("/{configType:default-hooks|system-hooks}", func() {
 			m.Get("/{type}/new", repo.WebhooksNew)
+			m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
 			m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 			m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 			m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -712,6 +714,7 @@ func RegisterRoutes(m *web.Route) {
 					m.Get("", org.Webhooks)
 					m.Post("/delete", org.DeleteWebhook)
 					m.Get("/{type}/new", repo.WebhooksNew)
+					m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
 					m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 					m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 					m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -726,6 +729,7 @@ func RegisterRoutes(m *web.Route) {
 						m.Get("", repo.WebHooksEdit)
 						m.Post("/replay/{uuid}", repo.ReplayWebhook)
 					})
+					m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
 					m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 					m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 					m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
@@ -835,6 +839,7 @@ func RegisterRoutes(m *web.Route) {
 				m.Get("", repo.Webhooks)
 				m.Post("/delete", repo.DeleteWebhook)
 				m.Get("/{type}/new", repo.WebhooksNew)
+				m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
 				m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 				m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 				m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -851,6 +856,7 @@ func RegisterRoutes(m *web.Route) {
 					m.Post("/test", repo.TestWebhook)
 					m.Post("/replay/{uuid}", repo.ReplayWebhook)
 				})
+				m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
 				m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 				m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 				m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go
index 342e764f4d..5205cbcdc8 100644
--- a/services/webhook/webhook.go
+++ b/services/webhook/webhook.go
@@ -74,7 +74,7 @@ func RegisterWebhook(name string, webhook *webhook) {
 
 // IsValidHookTaskType returns true if a webhook registered
 func IsValidHookTaskType(name string) bool {
-	if name == webhook_model.GITEA || name == webhook_model.GOGS {
+	if name == webhook_model.FORGEJO || name == webhook_model.GITEA || name == webhook_model.GOGS {
 		return true
 	}
 	_, ok := webhooks[name]
@@ -170,7 +170,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook
 	// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
 	// Integration webhooks (e.g. drone) still receive the required data.
 	if pushEvent, ok := p.(*api.PushPayload); ok &&
-		w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
+		w.Type != webhook_model.FORGEJO && w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
 		len(pushEvent.Commits) == 0 {
 		return nil
 	}
diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl
index c5196fce4e..f197dda55f 100644
--- a/templates/admin/hook_new.tmpl
+++ b/templates/admin/hook_new.tmpl
@@ -14,8 +14,10 @@
 				{{.locale.Tr "admin.defaulthooks.update_webhook"}}
 			{{end}}
 			<div class="ui right">
-				{{if eq .HookType "gitea"}}
-					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
+				{{if eq .HookType "forgejo"}}
+					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
+				{{else if eq .HookType "gitea"}}
+					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
 				{{else if eq .HookType "gogs"}}
 					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
 				{{else if eq .HookType "slack"}}
@@ -40,6 +42,7 @@
 			</div>
 		</h4>
 		<div class="ui attached segment">
+			{{template "repo/settings/webhook/forgejo" .}}
 			{{template "repo/settings/webhook/gitea" .}}
 			{{template "repo/settings/webhook/gogs" .}}
 			{{template "repo/settings/webhook/slack" .}}
diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl
index 7308cafa20..a30ed6dfd9 100644
--- a/templates/org/settings/hook_new.tmpl
+++ b/templates/org/settings/hook_new.tmpl
@@ -9,8 +9,10 @@
 				<h4 class="ui top attached header">
 					{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
 					<div class="ui right">
-						{{if eq .HookType "gitea"}}
-							<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
+						{{if eq .HookType "forgejo"}}
+							<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
+						{{else if eq .HookType "gitea"}}
+							<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
 						{{else if eq .HookType "gogs"}}
 							<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
 						{{else if eq .HookType "slack"}}
diff --git a/templates/repo/settings/webhook/base_list.tmpl b/templates/repo/settings/webhook/base_list.tmpl
index fa68e12ce9..c9f0a3bd7b 100644
--- a/templates/repo/settings/webhook/base_list.tmpl
+++ b/templates/repo/settings/webhook/base_list.tmpl
@@ -4,8 +4,11 @@
 		<div class="ui floating1 jump dropdown">
 			<div class="ui primary tiny button">{{.locale.Tr "repo.settings.add_webhook"}}</div>
 			<div class="menu">
+				<a class="item" href="{{.BaseLinkNew}}/forgejo/new">
+					<img width="20" height="20" src="{{AssetUrlPrefix}}/img/forgejo.svg">{{.locale.Tr "repo.settings.web_hook_name_forgejo"}}
+				</a>
 				<a class="item" href="{{.BaseLinkNew}}/gitea/new">
-					<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
+					<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea-original.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
 				</a>
 				<a class="item" href="{{.BaseLinkNew}}/gogs/new">
 					<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gogs.ico">{{.locale.Tr "repo.settings.web_hook_name_gogs"}}
diff --git a/templates/repo/settings/webhook/forgejo.tmpl b/templates/repo/settings/webhook/forgejo.tmpl
new file mode 100644
index 0000000000..0d733f3362
--- /dev/null
+++ b/templates/repo/settings/webhook/forgejo.tmpl
@@ -0,0 +1,40 @@
+{{if eq .HookType "forgejo"}}
+	<p>{{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_forgejo") | Str2html}}</p>
+	<form class="ui form" action="{{.BaseLink}}/forgejo/{{or .Webhook.ID "new"}}" method="post">
+		{{template "base/disable_form_autofill"}}
+		{{.CsrfTokenHtml}}
+		<div class="required field {{if .Err_PayloadURL}}error{{end}}">
+			<label for="payload_url">{{.locale.Tr "repo.settings.payload_url"}}</label>
+			<input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required>
+		</div>
+		<div class="field">
+			<label>{{.locale.Tr "repo.settings.http_method"}}</label>
+			<div class="ui selection dropdown">
+				<input type="hidden" id="http_method" name="http_method" value="{{if .Webhook.HTTPMethod}}{{.Webhook.HTTPMethod}}{{else}}POST{{end}}">
+				<div class="default text"></div>
+				{{svg "octicon-triangle-down" 14 "dropdown icon"}}
+				<div class="menu">
+					<div class="item" data-value="POST">POST</div>
+					<div class="item" data-value="GET">GET</div>
+				</div>
+			</div>
+		</div>
+		<div class="field">
+			<label>{{.locale.Tr "repo.settings.content_type"}}</label>
+			<div class="ui selection dropdown">
+				<input type="hidden" id="content_type" name="content_type" value="{{if .Webhook.ContentType}}{{.Webhook.ContentType}}{{else}}1{{end}}">
+				<div class="default text"></div>
+				{{svg "octicon-triangle-down" 14 "dropdown icon"}}
+				<div class="menu">
+					<div class="item" data-value="1">application/json</div>
+					<div class="item" data-value="2">application/x-www-form-urlencoded</div>
+				</div>
+			</div>
+		</div>
+		<div class="field {{if .Err_Secret}}error{{end}}">
+			<label for="secret">{{.locale.Tr "repo.settings.secret"}}</label>
+			<input id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off">
+		</div>
+		{{template "repo/settings/webhook/settings" .}}
+	</form>
+{{end}}
diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl
index ea5a3eca3c..066d0045d0 100644
--- a/templates/repo/settings/webhook/new.tmpl
+++ b/templates/repo/settings/webhook/new.tmpl
@@ -7,8 +7,10 @@
 		<h4 class="ui top attached header">
 			{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
 			<div class="ui right">
-				{{if eq .HookType "gitea"}}
-					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
+				{{if eq .HookType "forgejo"}}
+					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
+				{{else if eq .HookType "gitea"}}
+					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
 				{{else if eq .HookType "gogs"}}
 					<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
 				{{else if eq .HookType "slack"}}
@@ -33,6 +35,7 @@
 			</div>
 		</h4>
 		<div class="ui attached segment">
+			{{template "repo/settings/webhook/forgejo" .}}
 			{{template "repo/settings/webhook/gitea" .}}
 			{{template "repo/settings/webhook/gogs" .}}
 			{{template "repo/settings/webhook/slack" .}}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 9ce8a02e9d..7080e7e794 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -14465,6 +14465,7 @@
         "type": {
           "type": "string",
           "enum": [
+            "forgejo",
             "dingtalk",
             "discord",
             "gitea",
diff --git a/tests/integration/links_test.go b/tests/integration/links_test.go
index 4eb29f0cee..d40419a018 100644
--- a/tests/integration/links_test.go
+++ b/tests/integration/links_test.go
@@ -174,3 +174,41 @@ func TestLinksLogin(t *testing.T) {
 
 	testLinksAsUser("user2", t)
 }
+
+func TestRedirectsWebhooks(t *testing.T) {
+	defer tests.PrepareTestEnv(t)()
+
+	//
+	// A redirect means the route exists but not if it performs as intended.
+	//
+	for _, kind := range []string{"forgejo", "gitea"} {
+		{
+			redirects := map[string]string{
+				"/user2/repo1/settings/hooks/" + kind + "/new": "/user/login",
+				"/admin/system-hooks/" + kind + "/new":         "/user/login",
+				"/admin/default-hooks/" + kind + "/new":        "/user/login",
+			}
+			for link, redirectLink := range redirects {
+				req := NewRequest(t, "GET", link)
+				resp := MakeRequest(t, req, http.StatusSeeOther)
+				assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp))
+			}
+		}
+
+		{
+			redirects := map[string]string{
+				"/user2/repo1/settings/hooks/" + kind + "/new": "/",
+				"/admin/system-hooks/" + kind + "/new":         "/",
+				"/admin/default-hooks/" + kind + "/new":        "/",
+
+				"/user2/repo1/settings/hooks/" + kind + "/1": "/",
+				"/admin/hooks/" + kind + "/1":                "/",
+			}
+			for link, redirectLink := range redirects {
+				req := NewRequest(t, "POST", link)
+				resp := MakeRequest(t, req, http.StatusSeeOther)
+				assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp))
+			}
+		}
+	}
+}

From 7eb46fbc6b94ea8ac142d2eb6ae45670bcad7c73 Mon Sep 17 00:00:00 2001
From: Gusted <postmaster@gusted.xyz>
Date: Sat, 4 Feb 2023 11:20:21 +0100
Subject: [PATCH 15/16] [BRANDING] Update nodeinfo branding

- Change the values for the nodeinfo API, to use branded values.
- Resolves https://codeberg.org/forgejo/forgejo/issues/257

(cherry picked from commit fa5130a6633d1ae41e0d717f2d94b7f28a618954)
---
 routers/api/v1/misc/nodeinfo.go        | 6 +++---
 tests/integration/api_nodeinfo_test.go | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go
index bd629b87ca..9a4bd36203 100644
--- a/routers/api/v1/misc/nodeinfo.go
+++ b/routers/api/v1/misc/nodeinfo.go
@@ -66,10 +66,10 @@ func NodeInfo(ctx *context.APIContext) {
 	nodeInfo := &structs.NodeInfo{
 		Version: "2.1",
 		Software: structs.NodeInfoSoftware{
-			Name:       "gitea",
+			Name:       "forgejo",
 			Version:    setting.AppVer,
-			Repository: "https://github.com/go-gitea/gitea.git",
-			Homepage:   "https://gitea.io/",
+			Repository: "https://codeberg.org/forgejo/forgejo.git",
+			Homepage:   "https://forgejo.org/",
 		},
 		Protocols: []string{"activitypub"},
 		Services: structs.NodeInfoServices{
diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go
index 2446acec94..669bccad23 100644
--- a/tests/integration/api_nodeinfo_test.go
+++ b/tests/integration/api_nodeinfo_test.go
@@ -31,7 +31,7 @@ func TestNodeinfo(t *testing.T) {
 		var nodeinfo api.NodeInfo
 		DecodeJSON(t, resp, &nodeinfo)
 		assert.True(t, nodeinfo.OpenRegistrations)
-		assert.Equal(t, "gitea", nodeinfo.Software.Name)
+		assert.Equal(t, "forgejo", nodeinfo.Software.Name)
 		assert.Equal(t, 24, nodeinfo.Usage.Users.Total)
 		assert.Equal(t, 17, nodeinfo.Usage.LocalPosts)
 		assert.Equal(t, 2, nodeinfo.Usage.LocalComments)

From f1f7c119f3332ce1dc662cefa284a4cf083b627a Mon Sep 17 00:00:00 2001
From: crystal <crystal@noreply.codeberg.org>
Date: Sun, 19 Feb 2023 12:41:04 -0700
Subject: [PATCH 16/16] [BRANDING] Change Swagger title to Forgejo API

(cherry picked from commit 79f6a70b53421be9984a9ad96ebd0d06ab5af02e)
---
 templates/swagger/ui.tmpl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/templates/swagger/ui.tmpl b/templates/swagger/ui.tmpl
index d4d0889f9d..1a3a18b12b 100644
--- a/templates/swagger/ui.tmpl
+++ b/templates/swagger/ui.tmpl
@@ -2,7 +2,7 @@
 <html lang="en">
 	<head>
 		<meta charset="UTF-8">
-		<title>Gitea API</title>
+		<title>Forgejo API</title>
 		<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
 	</head>
 	<body>