diff --git a/modules/structs/repo.go b/modules/structs/repo.go
index 3974c4db3a..0e4081da8e 100644
--- a/modules/structs/repo.go
+++ b/modules/structs/repo.go
@@ -287,6 +287,7 @@ const (
 	OneDevService                          // 6 onedev service
 	GitBucketService                       // 7 gitbucket service
 	CodebaseService                        // 8 codebase service
+	ForgejoService                         // 9 forgejo service
 )
 
 // Name represents the service type's name
@@ -312,6 +313,8 @@ func (gt GitServiceType) Title() string {
 		return "GitBucket"
 	case CodebaseService:
 		return "Codebase"
+	case ForgejoService:
+		return "Forgejo"
 	case PlainGitService:
 		return "Git"
 	}
@@ -353,7 +356,7 @@ type MigrateRepoOptions struct {
 // TokenAuth represents whether a service type supports token-based auth
 func (gt GitServiceType) TokenAuth() bool {
 	switch gt {
-	case GithubService, GiteaService, GitlabService:
+	case GithubService, GiteaService, GitlabService, ForgejoService:
 		return true
 	}
 	return false
@@ -364,6 +367,7 @@ func (gt GitServiceType) TokenAuth() bool {
 var SupportedFullGitService = []GitServiceType{
 	GithubService,
 	GitlabService,
+	ForgejoService,
 	GiteaService,
 	GogsService,
 	OneDevService,
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 40478a6f2c..c59e358e2d 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1088,6 +1088,7 @@ migrate.migrating_failed_no_addr = Migration failed.
 migrate.github.description = Migrate data from github.com or other GitHub instances.
 migrate.git.description = Migrate a repository only from any Git service.
 migrate.gitlab.description = Migrate data from gitlab.com or other GitLab instances.
+migrate.forgejo.description = Migrate data from codeberg.org or other Forgejo instances.
 migrate.gitea.description = Migrate data from gitea.com or other Gitea instances.
 migrate.gogs.description = Migrate data from notabug.org or other Gogs instances.
 migrate.onedev.description = Migrate data from code.onedev.io or other OneDev instances.
diff --git a/public/assets/img/svg/gitea-forgejo.svg b/public/assets/img/svg/gitea-forgejo.svg
new file mode 100644
index 0000000000..ef617c00f3
--- /dev/null
+++ b/public/assets/img/svg/gitea-forgejo.svg
@@ -0,0 +1,9 @@
+<svg width="32" height="32" viewBox="-15 0 256 256" xmlns="http://www.w3.org/2000/svg">
+  <g transform="translate(28,28)">
+    <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" fill="none" stroke="#ff6600" stroke-width="25" />
+    <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" fill="none" stroke="#d40000" stroke-width="25" />
+    <circle cx="142" cy="20" r="18" fill="none" stroke="#ff6600" stroke-width="15" />
+    <circle cx="142" cy="88" r="18" fill="none" stroke="#d40000" stroke-width="15" />
+    <circle cx="58" cy="180" r="18" fill="none" stroke="#d40000" stroke-width="15" />
+  </g>
+</svg>
diff --git a/services/convert/utils.go b/services/convert/utils.go
index cdce60831c..fe35fd2dac 100644
--- a/services/convert/utils.go
+++ b/services/convert/utils.go
@@ -36,6 +36,8 @@ func ToGitServiceType(value string) structs.GitServiceType {
 		return structs.OneDevService
 	case "gitbucket":
 		return structs.GitBucketService
+	case "forgejo":
+		return structs.ForgejoService
 	default:
 		return structs.PlainGitService
 	}
diff --git a/services/convert/utils_test.go b/services/convert/utils_test.go
index 1ac03a3097..b464d8bb68 100644
--- a/services/convert/utils_test.go
+++ b/services/convert/utils_test.go
@@ -28,6 +28,8 @@ func TestToGitServiceType(t *testing.T) {
 		typ: "gitlab", enum: 4,
 	}, {
 		typ: "gogs", enum: 5,
+	}, {
+		typ: "forgejo", enum: 9,
 	}, {
 		typ: "trash", enum: 1,
 	}}
diff --git a/templates/repo/migrate/forgejo.tmpl b/templates/repo/migrate/forgejo.tmpl
new file mode 100644
index 0000000000..3caadbee15
--- /dev/null
+++ b/templates/repo/migrate/forgejo.tmpl
@@ -0,0 +1 @@
+{{template "repo/migrate/gitea" .}}
diff --git a/web_src/svg/gitea-forgejo.svg b/web_src/svg/gitea-forgejo.svg
new file mode 100644
index 0000000000..e00e5963cf
--- /dev/null
+++ b/web_src/svg/gitea-forgejo.svg
@@ -0,0 +1,9 @@
+<svg width="64" height="64" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg" class="forgejo-logo" aria-hidden="true">
+  <g transform="translate(28,28)">
+    <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" fill="none" stroke="#ff6600" stroke-width="25" />
+    <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" fill="none" stroke="#d40000" stroke-width="25" />
+    <circle cx="142" cy="20" r="18" fill="none" stroke="#ff6600" stroke-width="15" />
+    <circle cx="142" cy="88" r="18" fill="none" stroke="#d40000" stroke-width="15" />
+    <circle cx="58" cy="180" r="18" fill="none" stroke="#d40000" stroke-width="15" />
+  </g>
+</svg>