diff --git a/.deadcode-out b/.deadcode-out
index c63fd9e0a..1b65e3203 100644
--- a/.deadcode-out
+++ b/.deadcode-out
@@ -341,5 +341,4 @@ package "code.gitea.io/gitea/services/repository/files"
 
 package "code.gitea.io/gitea/services/webhook"
 	func NewNotifier
-	func List
 
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 227e13419..f2aeb2a8b 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -935,9 +935,9 @@ settings.web_hook_name_discord = Discord
 settings.web_hook_name_telegram = Telegram
 settings.web_hook_name_matrix = Matrix
 settings.web_hook_name_gogs = Gogs
-settings.web_hook_name_feishu_or_larksuite = Feishu / Lark Suite
-settings.web_hook_name_feishu = Feishu
-settings.web_hook_name_larksuite = Lark Suite
+settings.web_hook_name_feishu = Feishu / Lark Suite
+settings.web_hook_name_feishu_only = Feishu
+settings.web_hook_name_larksuite_only = Lark Suite
 settings.web_hook_name_wechatwork = WeCom (Wechat Work)
 settings.web_hook_name_packagist = Packagist
 diff.file_byte_size = Размер
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index 907b5d5c4..092c25aa8 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -2308,9 +2308,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Uživatelské jméno pro Packagist
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index e974d555c..2cab9733a 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -2304,9 +2304,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Benutzername für Packagist
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index 36b7518c6..b9d2881d8 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -2293,9 +2293,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Όνομα χρήστη Packagist
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index c28ed6c37..67ec3b196 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2372,9 +2372,9 @@ settings.web_hook_name_dingtalk = DingTalk
 settings.web_hook_name_telegram = Telegram
 settings.web_hook_name_matrix = Matrix
 settings.web_hook_name_msteams = Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite = Feishu / Lark Suite
-settings.web_hook_name_feishu = Feishu
-settings.web_hook_name_larksuite = Lark Suite
+settings.web_hook_name_feishu = Feishu / Lark Suite
+settings.web_hook_name_feishu_only = Feishu
+settings.web_hook_name_larksuite_only = Lark Suite
 settings.web_hook_name_wechatwork = WeCom (Wechat Work)
 settings.web_hook_name_packagist = Packagist
 settings.packagist_username = Packagist username
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index 3dbca8738..a2794ccd3 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -2267,9 +2267,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Nombre de usuario Packagist
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index c6c64ad6c..31dca19f3 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -1184,8 +1184,8 @@ settings.web_hook_name_discord=Discord
 settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_packagist=Packagist
 settings.deploy_keys=Julkaisuavaimet
 settings.add_deploy_key=Lisää julkaisuavain
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 659615e6f..d3e015a63 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -2317,9 +2317,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Nom d'utilisateur Packagist
diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini
index 27b9a4b17..e76174cde 100644
--- a/options/locale/locale_is-IS.ini
+++ b/options/locale/locale_is-IS.ini
@@ -1065,7 +1065,7 @@ settings.web_hook_name_discord=Discord
 settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu=Feishu
+settings.web_hook_name_feishu_only =Feishu
 settings.title=Heiti
 settings.deploy_key_content=Innihald
 settings.branches=Greinar
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index dc6f4c127..d25fc0942 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -2085,9 +2085,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Nome utente Packagist
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index b46804175..4fd6641df 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -2303,9 +2303,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist ユーザー名
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index ce8f05e4b..20ca341ee 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -2253,9 +2253,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist lietotājvārds
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index b7fcfaa3d..d0564d2eb 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -2032,9 +2032,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist gebruikersnaam
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 086cea74f..f2a72c5c7 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -2236,9 +2236,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Nome de usuário no Packagist
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index 3538ac946..552695a45 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -2269,9 +2269,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Nome de utilizador no Packagist
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index eabd8b5b4..e9daba082 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -2278,9 +2278,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu или Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu или Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Имя пользователя Packagist
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 74ef77eb1..b6bb510ab 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -2252,9 +2252,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist kullanıcı adı
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index 81cf9d6d0..c5a5aabb9 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -2318,9 +2318,9 @@ settings.web_hook_name_dingtalk=钉钉
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=飞书 / Lark Suite
-settings.web_hook_name_feishu=飞书
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=飞书 / Lark Suite
+settings.web_hook_name_feishu_only =飞书
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=企业微信
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist 用户名
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index 5bfff77fd..a2e3f512f 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -2071,9 +2071,9 @@ settings.web_hook_name_dingtalk=DingTalk
 settings.web_hook_name_telegram=Telegram
 settings.web_hook_name_matrix=Matrix
 settings.web_hook_name_msteams=Microsoft Teams
-settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite
-settings.web_hook_name_feishu=Feishu
-settings.web_hook_name_larksuite=Lark Suite
+settings.web_hook_name_feishu=Feishu / Lark Suite
+settings.web_hook_name_feishu_only =Feishu
+settings.web_hook_name_larksuite_only =Lark Suite
 settings.web_hook_name_wechatwork=WeCom (Wechat Work)
 settings.web_hook_name_packagist=Packagist
 settings.packagist_username=Packagist 帳號
diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go
index 494ada432..0be734aba 100644
--- a/routers/web/org/setting.go
+++ b/routers/web/org/setting.go
@@ -26,6 +26,7 @@ import (
 	org_service "code.gitea.io/gitea/services/org"
 	repo_service "code.gitea.io/gitea/services/repository"
 	user_service "code.gitea.io/gitea/services/user"
+	webhook_service "code.gitea.io/gitea/services/webhook"
 )
 
 const (
@@ -210,6 +211,7 @@ func Webhooks(ctx *context.Context) {
 	ctx.Data["PageIsSettingsHooks"] = true
 	ctx.Data["BaseLink"] = ctx.Org.OrgLink + "/settings/hooks"
 	ctx.Data["BaseLinkNew"] = ctx.Org.OrgLink + "/settings/hooks"
+	ctx.Data["WebhookList"] = webhook_service.List()
 	ctx.Data["Description"] = ctx.Tr("org.settings.hooks_desc")
 
 	ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Org.Organization.ID})
diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go
index bf7770bfd..4469eac9e 100644
--- a/routers/web/repo/setting/webhook.go
+++ b/routers/web/repo/setting/webhook.go
@@ -45,6 +45,7 @@ func WebhookList(ctx *context.Context) {
 	ctx.Data["PageIsSettingsHooks"] = true
 	ctx.Data["BaseLink"] = ctx.Repo.RepoLink + "/settings/hooks"
 	ctx.Data["BaseLinkNew"] = ctx.Repo.RepoLink + "/settings/hooks"
+	ctx.Data["WebhookList"] = webhook_service.List()
 	ctx.Data["Description"] = ctx.Tr("repo.settings.hooks_desc", "https://forgejo.org/docs/latest/user/webhooks/")
 
 	ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{RepoID: ctx.Repo.Repository.ID})
@@ -132,13 +133,16 @@ func WebhookNew(ctx *context.Context) {
 	}
 
 	hookType := ctx.Params(":type")
-	if webhook_service.GetWebhookHandler(hookType) == nil {
+	handler := webhook_service.GetWebhookHandler(hookType)
+	if handler == nil {
 		ctx.NotFound("GetWebhookHandler", nil)
 		return
 	}
 	ctx.Data["HookType"] = hookType
+	ctx.Data["WebhookHandler"] = handler
 	ctx.Data["BaseLink"] = orCtx.LinkNew
 	ctx.Data["BaseLinkNew"] = orCtx.LinkNew
+	ctx.Data["WebhookList"] = webhook_service.List()
 
 	ctx.HTML(http.StatusOK, orCtx.NewTemplate)
 }
@@ -194,6 +198,7 @@ func WebhookCreate(ctx *context.Context) {
 	ctx.Data["PageIsSettingsHooksNew"] = true
 	ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}}
 	ctx.Data["HookType"] = hookType
+	ctx.Data["WebhookHandler"] = handler
 
 	orCtx, err := getOwnerRepoCtx(ctx)
 	if err != nil {
@@ -202,6 +207,7 @@ func WebhookCreate(ctx *context.Context) {
 	}
 	ctx.Data["BaseLink"] = orCtx.LinkNew
 	ctx.Data["BaseLinkNew"] = orCtx.LinkNew
+	ctx.Data["WebhookList"] = webhook_service.List()
 
 	if ctx.HasError() {
 		// pre-fill the form with the submitted data
@@ -336,6 +342,7 @@ func checkWebhook(ctx *context.Context) (*ownerRepoCtx, *webhook.Webhook) {
 	}
 	ctx.Data["BaseLink"] = orCtx.Link
 	ctx.Data["BaseLinkNew"] = orCtx.LinkNew
+	ctx.Data["WebhookList"] = webhook_service.List()
 
 	var w *webhook.Webhook
 	if orCtx.RepoID > 0 {
@@ -358,6 +365,7 @@ func checkWebhook(ctx *context.Context) (*ownerRepoCtx, *webhook.Webhook) {
 
 	if handler := webhook_service.GetWebhookHandler(w.Type); handler != nil {
 		ctx.Data["HookMetadata"] = handler.Metadata(w)
+		ctx.Data["WebhookHandler"] = handler
 	}
 
 	ctx.Data["History"], err = w.History(ctx, 1)
diff --git a/routers/web/user/setting/webhooks.go b/routers/web/user/setting/webhooks.go
index 4423b6278..3cc67d9de 100644
--- a/routers/web/user/setting/webhooks.go
+++ b/routers/web/user/setting/webhooks.go
@@ -11,6 +11,7 @@ import (
 	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/setting"
 	"code.gitea.io/gitea/services/context"
+	webhook_service "code.gitea.io/gitea/services/webhook"
 )
 
 const (
@@ -23,6 +24,7 @@ func Webhooks(ctx *context.Context) {
 	ctx.Data["PageIsSettingsHooks"] = true
 	ctx.Data["BaseLink"] = setting.AppSubURL + "/user/settings/hooks"
 	ctx.Data["BaseLinkNew"] = setting.AppSubURL + "/user/settings/hooks"
+	ctx.Data["WebhookList"] = webhook_service.List()
 	ctx.Data["Description"] = ctx.Tr("settings.hooks.desc")
 
 	ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Doer.ID})
diff --git a/services/webhook/default.go b/services/webhook/default.go
index f725f8a78..be3b9b3c7 100644
--- a/services/webhook/default.go
+++ b/services/webhook/default.go
@@ -10,6 +10,7 @@ import (
 	"crypto/sha256"
 	"encoding/hex"
 	"fmt"
+	"html/template"
 	"io"
 	"net/http"
 	"net/url"
@@ -17,6 +18,7 @@ import (
 
 	webhook_model "code.gitea.io/gitea/models/webhook"
 	"code.gitea.io/gitea/modules/log"
+	"code.gitea.io/gitea/modules/svg"
 	webhook_module "code.gitea.io/gitea/modules/webhook"
 	"code.gitea.io/gitea/services/forms"
 )
@@ -34,6 +36,14 @@ func (dh defaultHandler) Type() webhook_module.HookType {
 	return webhook_module.GITEA
 }
 
+func (dh defaultHandler) Icon(size int) template.HTML {
+	if dh.forgejo {
+		// forgejo.svg is not in web_src/svg/, so svg.RenderHTML does not work
+		return imgIcon("forgejo.svg", size)
+	}
+	return svg.RenderHTML("gitea-gitea", size, "img")
+}
+
 func (defaultHandler) Metadata(*webhook_model.Webhook) any { return nil }
 
 func (defaultHandler) FormFields(bind func(any)) FormFields {
diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go
index f4bc715e0..0a0160ac4 100644
--- a/services/webhook/dingtalk.go
+++ b/services/webhook/dingtalk.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 	"strings"
@@ -22,6 +23,8 @@ type dingtalkHandler struct{}
 
 func (dingtalkHandler) Type() webhook_module.HookType       { return webhook_module.DINGTALK }
 func (dingtalkHandler) Metadata(*webhook_model.Webhook) any { return nil }
+func (dingtalkHandler) Icon(size int) template.HTML         { return imgIcon("dingtalk.ico", size) }
+
 func (dingtalkHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
 		forms.WebhookForm
diff --git a/services/webhook/discord.go b/services/webhook/discord.go
index 3a0a97386..2efb46f5b 100644
--- a/services/webhook/discord.go
+++ b/services/webhook/discord.go
@@ -7,6 +7,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -26,6 +27,7 @@ import (
 type discordHandler struct{}
 
 func (discordHandler) Type() webhook_module.HookType { return webhook_module.DISCORD }
+func (discordHandler) Icon(size int) template.HTML   { return imgIcon("discord.png", size) }
 
 func (discordHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/feishu.go b/services/webhook/feishu.go
index b27acc907..eba54fa09 100644
--- a/services/webhook/feishu.go
+++ b/services/webhook/feishu.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"strings"
 
@@ -19,6 +20,7 @@ import (
 type feishuHandler struct{}
 
 func (feishuHandler) Type() webhook_module.HookType { return webhook_module.FEISHU }
+func (feishuHandler) Icon(size int) template.HTML   { return imgIcon("feishu.png", size) }
 
 func (feishuHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/general.go b/services/webhook/general.go
index c41f58fe8..454efc649 100644
--- a/services/webhook/general.go
+++ b/services/webhook/general.go
@@ -6,7 +6,9 @@ package webhook
 import (
 	"fmt"
 	"html"
+	"html/template"
 	"net/url"
+	"strconv"
 	"strings"
 
 	webhook_model "code.gitea.io/gitea/models/webhook"
@@ -352,3 +354,9 @@ func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) {
 		Created:             w.CreatedUnix.AsTime(),
 	}, nil
 }
+
+func imgIcon(name string, size int) template.HTML {
+	s := strconv.Itoa(size)
+	src := html.EscapeString(setting.StaticURLPrefix + "/assets/img/" + name)
+	return template.HTML(`<img width="` + s + `" height="` + s + `" src="` + src + `">`)
+}
diff --git a/services/webhook/gogs.go b/services/webhook/gogs.go
index e23673ed3..f616f5e2f 100644
--- a/services/webhook/gogs.go
+++ b/services/webhook/gogs.go
@@ -4,6 +4,7 @@
 package webhook
 
 import (
+	"html/template"
 	"net/http"
 
 	webhook_model "code.gitea.io/gitea/models/webhook"
@@ -14,6 +15,7 @@ import (
 type gogsHandler struct{ defaultHandler }
 
 func (gogsHandler) Type() webhook_module.HookType { return webhook_module.GOGS }
+func (gogsHandler) Icon(size int) template.HTML   { return imgIcon("gogs.ico", size) }
 
 func (gogsHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go
index d04f0f367..322b4d666 100644
--- a/services/webhook/matrix.go
+++ b/services/webhook/matrix.go
@@ -9,6 +9,7 @@ import (
 	"crypto/sha1"
 	"encoding/hex"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 	"regexp"
@@ -20,6 +21,7 @@ import (
 	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
+	"code.gitea.io/gitea/modules/svg"
 	"code.gitea.io/gitea/modules/util"
 	webhook_module "code.gitea.io/gitea/modules/webhook"
 	"code.gitea.io/gitea/services/forms"
@@ -29,6 +31,10 @@ type matrixHandler struct{}
 
 func (matrixHandler) Type() webhook_module.HookType { return webhook_module.MATRIX }
 
+func (matrixHandler) Icon(size int) template.HTML {
+	return svg.RenderHTML("gitea-matrix", size, "img")
+}
+
 func (matrixHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
 		forms.WebhookForm
diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go
index 849093e9b..940a6c49a 100644
--- a/services/webhook/msteams.go
+++ b/services/webhook/msteams.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 	"strings"
@@ -22,6 +23,7 @@ type msteamsHandler struct{}
 
 func (msteamsHandler) Type() webhook_module.HookType       { return webhook_module.MSTEAMS }
 func (msteamsHandler) Metadata(*webhook_model.Webhook) any { return nil }
+func (msteamsHandler) Icon(size int) template.HTML         { return imgIcon("msteams.png", size) }
 
 func (msteamsHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/packagist.go b/services/webhook/packagist.go
index d8bf9ea23..f1f330610 100644
--- a/services/webhook/packagist.go
+++ b/services/webhook/packagist.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 
@@ -19,6 +20,7 @@ import (
 type packagistHandler struct{}
 
 func (packagistHandler) Type() webhook_module.HookType { return webhook_module.PACKAGIST }
+func (packagistHandler) Icon(size int) template.HTML   { return imgIcon("packagist.png", size) }
 
 func (packagistHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/slack.go b/services/webhook/slack.go
index 683ef4101..0b4c4b664 100644
--- a/services/webhook/slack.go
+++ b/services/webhook/slack.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"regexp"
 	"strings"
@@ -26,6 +27,7 @@ import (
 type slackHandler struct{}
 
 func (slackHandler) Type() webhook_module.HookType { return webhook_module.SLACK }
+func (slackHandler) Icon(size int) template.HTML   { return imgIcon("slack.png", size) }
 
 type slackForm struct {
 	forms.WebhookForm
diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go
index 2ede28dbd..daa986baf 100644
--- a/services/webhook/telegram.go
+++ b/services/webhook/telegram.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"net/url"
 	"strings"
@@ -22,6 +23,7 @@ import (
 type telegramHandler struct{}
 
 func (telegramHandler) Type() webhook_module.HookType { return webhook_module.TELEGRAM }
+func (telegramHandler) Icon(size int) template.HTML   { return imgIcon("telegram.png", size) }
 
 func (telegramHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go
index a7802d27d..f27bffc29 100644
--- a/services/webhook/webhook.go
+++ b/services/webhook/webhook.go
@@ -7,6 +7,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"html/template"
 	"net/http"
 	"strings"
 
@@ -35,6 +36,7 @@ type Handler interface {
 	// If form implements the [binding.Validator] interface, the Validate method will be called
 	FormFields(bind func(form any)) FormFields
 	NewRequest(context.Context, *webhook_model.Webhook, *webhook_model.HookTask) (req *http.Request, body []byte, err error)
+	Icon(size int) template.HTML
 }
 
 type FormFields struct {
diff --git a/services/webhook/wechatwork.go b/services/webhook/wechatwork.go
index 2ad2acd01..eff5b9b52 100644
--- a/services/webhook/wechatwork.go
+++ b/services/webhook/wechatwork.go
@@ -6,6 +6,7 @@ package webhook
 import (
 	"context"
 	"fmt"
+	"html/template"
 	"net/http"
 	"strings"
 
@@ -21,6 +22,10 @@ type wechatworkHandler struct{}
 func (wechatworkHandler) Type() webhook_module.HookType       { return webhook_module.WECHATWORK }
 func (wechatworkHandler) Metadata(*webhook_model.Webhook) any { return nil }
 
+func (wechatworkHandler) Icon(size int) template.HTML {
+	return imgIcon("wechatwork.png", size)
+}
+
 func (wechatworkHandler) FormFields(bind func(any)) FormFields {
 	var form struct {
 		forms.WebhookForm
diff --git a/templates/repo/settings/webhook/link_menu.tmpl b/templates/repo/settings/webhook/link_menu.tmpl
index 811e262db..2edc5af4a 100644
--- a/templates/repo/settings/webhook/link_menu.tmpl
+++ b/templates/repo/settings/webhook/link_menu.tmpl
@@ -3,52 +3,10 @@
 	{{$size = .Size}}
 {{end}}
 <div class="menu">
-	<a class="item" href="{{.BaseLinkNew}}/forgejo/new">
-		{{template "shared/webhook/icon" (dict "HookType" "forgejo" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_forgejo"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/gitea/new">
-		{{template "shared/webhook/icon" (dict "HookType" "gitea" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_gitea"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/gogs/new">
-		{{template "shared/webhook/icon" (dict "HookType" "gogs" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_gogs"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/slack/new">
-		{{template "shared/webhook/icon" (dict "HookType" "slack" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_slack"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/discord/new">
-		{{template "shared/webhook/icon" (dict "HookType" "discord" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_discord"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/dingtalk/new">
-		{{template "shared/webhook/icon" (dict "HookType" "dingtalk" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_dingtalk"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/telegram/new">
-		{{template "shared/webhook/icon" (dict "HookType" "telegram" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_telegram"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/msteams/new">
-		{{template "shared/webhook/icon" (dict "HookType" "msteams" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_msteams"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/feishu/new">
-		{{template "shared/webhook/icon" (dict "HookType" "feishu" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_feishu_or_larksuite"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/matrix/new">
-		{{template "shared/webhook/icon" (dict "HookType" "matrix" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_matrix"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/wechatwork/new">
-		{{template "shared/webhook/icon" (dict "HookType" "wechatwork" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_wechatwork"}}
-	</a>
-	<a class="item" href="{{.BaseLinkNew}}/packagist/new">
-		{{template "shared/webhook/icon" (dict "HookType" "packagist" "Size" $size)}}
-		{{ctx.Locale.Tr "repo.settings.web_hook_name_packagist"}}
-	</a>
+	{{range .WebhookList}}
+		<a class="item" href="{{$.BaseLinkNew}}/{{.Type}}/new">
+			{{.Icon $size}}
+			{{ctx.Locale.Tr (print "repo.settings.web_hook_name_" .Type)}}
+		</a>
+	{{end}}
 </div>
diff --git a/templates/webhook/new.tmpl b/templates/webhook/new.tmpl
index 17eb578b0..8afdb1fa5 100644
--- a/templates/webhook/new.tmpl
+++ b/templates/webhook/new.tmpl
@@ -2,7 +2,7 @@
 	{{.CustomHeaderTitle}}
 	<div class="ui right type dropdown">
 		<div class="text tw-flex tw-items-center">
-			{{template "shared/webhook/icon" (dict "Size" 20 "HookType" .ctxData.HookType)}}
+			{{.ctxData.WebhookHandler.Icon 20}}
 			{{ctx.Locale.Tr (print "repo.settings.web_hook_name_" .ctxData.HookType)}}
 		</div>
 		{{svg "octicon-triangle-down" 14 "dropdown icon"}}
diff --git a/templates/webhook/new/feishu.tmpl b/templates/webhook/new/feishu.tmpl
index b691c3f18..ead11770d 100644
--- a/templates/webhook/new/feishu.tmpl
+++ b/templates/webhook/new/feishu.tmpl
@@ -1,5 +1,5 @@
-<p>{{ctx.Locale.Tr "repo.settings.add_web_hook_desc" "https://feishu.cn" (ctx.Locale.Tr "repo.settings.web_hook_name_feishu")}}</p>
-<p>{{ctx.Locale.Tr "repo.settings.add_web_hook_desc" "https://larksuite.com" (ctx.Locale.Tr "repo.settings.web_hook_name_larksuite")}}</p>
+<p>{{ctx.Locale.Tr "repo.settings.add_web_hook_desc" "https://feishu.cn" (ctx.Locale.Tr "repo.settings.web_hook_name_feishu_only")}}</p>
+<p>{{ctx.Locale.Tr "repo.settings.add_web_hook_desc" "https://larksuite.com" (ctx.Locale.Tr "repo.settings.web_hook_name_larksuite_only")}}</p>
 <form class="ui form" action="{{.BaseLink}}/{{or .Webhook.ID "feishu/new"}}" method="post">
 	{{.CsrfTokenHtml}}
 	<div class="required field {{if .Err_PayloadURL}}error{{end}}">